@@ -39,7 +39,11 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
39
39
return abi.encodePacked (r, s, v);
40
40
}
41
41
42
- function _getQueryFeeEncodedData (address indexer , uint128 tokens ) private view returns (bytes memory ) {
42
+ function _getQueryFeeEncodedData (
43
+ address indexer ,
44
+ uint128 tokens ,
45
+ uint256 tokensToCollect
46
+ ) private view returns (bytes memory ) {
43
47
IGraphTallyCollector.ReceiptAggregateVoucher memory rav = _getRAV (
44
48
indexer,
45
49
bytes32 (uint256 (uint160 (allocationID))),
@@ -49,7 +53,7 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
49
53
(uint8 v , bytes32 r , bytes32 s ) = vm.sign (signerPrivateKey, messageHash);
50
54
bytes memory signature = abi.encodePacked (r, s, v);
51
55
IGraphTallyCollector.SignedRAV memory signedRAV = IGraphTallyCollector.SignedRAV (rav, signature);
52
- return abi.encode (signedRAV);
56
+ return abi.encode (signedRAV, tokensToCollect );
53
57
}
54
58
55
59
function _getRAV (
@@ -109,7 +113,7 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
109
113
_authorizeSigner ();
110
114
111
115
resetPrank (users.indexer);
112
- bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokensPayment));
116
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokensPayment), 0 );
113
117
_collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data);
114
118
}
115
119
@@ -129,14 +133,14 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
129
133
uint256 accTokensPayment = 0 ;
130
134
for (uint i = 0 ; i < numPayments; i++ ) {
131
135
accTokensPayment = accTokensPayment + tokensPayment;
132
- bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (accTokensPayment));
136
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (accTokensPayment), 0 );
133
137
_collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data);
134
138
}
135
139
}
136
140
137
141
function testCollect_RevertWhen_NotAuthorized (uint256 tokens ) public useIndexer useAllocation (tokens) {
138
142
IGraphPayments.PaymentTypes paymentType = IGraphPayments.PaymentTypes.QueryFee;
139
- bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokens));
143
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokens), 0 );
140
144
resetPrank (users.operator);
141
145
vm.expectRevert (
142
146
abi.encodeWithSelector (
@@ -157,7 +161,7 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
157
161
_createAndStartAllocation (newIndexer, tokens);
158
162
159
163
// This data is for user.indexer allocationId
160
- bytes memory data = _getQueryFeeEncodedData (newIndexer, uint128 (tokens));
164
+ bytes memory data = _getQueryFeeEncodedData (newIndexer, uint128 (tokens), 0 );
161
165
162
166
resetPrank (newIndexer);
163
167
vm.expectRevert (
@@ -173,7 +177,7 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
173
177
// Setup new indexer
174
178
address newIndexer = makeAddr ("newIndexer " );
175
179
_createAndStartAllocation (newIndexer, tokens);
176
- bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokens));
180
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokens), 0 );
177
181
vm.expectRevert (
178
182
abi.encodeWithSelector (ISubgraphService.SubgraphServiceIndexerMismatch.selector , users.indexer, newIndexer)
179
183
);
@@ -193,4 +197,47 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
193
197
);
194
198
subgraphService.collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data);
195
199
}
200
+
201
+ function testCollect_QueryFees_PartialCollect (
202
+ uint256 tokensAllocated ,
203
+ uint256 tokensPayment
204
+ ) public useIndexer useAllocation (tokensAllocated) {
205
+ vm.assume (tokensAllocated > minimumProvisionTokens * stakeToFeesRatio);
206
+ uint256 maxTokensPayment = tokensAllocated / stakeToFeesRatio > type (uint128 ).max
207
+ ? type (uint128 ).max
208
+ : tokensAllocated / stakeToFeesRatio;
209
+ tokensPayment = bound (tokensPayment, minimumProvisionTokens, maxTokensPayment);
210
+
211
+ resetPrank (users.gateway);
212
+ _deposit (tokensPayment);
213
+ _authorizeSigner ();
214
+
215
+ uint256 beforeGatewayBalance = escrow.getBalance (users.gateway, address (graphTallyCollector), users.indexer);
216
+ uint256 beforeTokensCollected = graphTallyCollector.tokensCollected (address (subgraphService), bytes32 (uint256 (uint160 (allocationID))), users.indexer, users.gateway);
217
+
218
+ // Collect the RAV in two steps
219
+ resetPrank (users.indexer);
220
+ uint256 tokensToCollect = tokensPayment / 2 ;
221
+ bool oddTokensPayment = tokensPayment % 2 == 1 ;
222
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokensPayment), tokensToCollect);
223
+ _collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data);
224
+
225
+ uint256 intermediateGatewayBalance = escrow.getBalance (users.gateway, address (graphTallyCollector), users.indexer);
226
+ assertEq (intermediateGatewayBalance, beforeGatewayBalance - tokensToCollect);
227
+ uint256 intermediateTokensCollected = graphTallyCollector.tokensCollected (address (subgraphService), bytes32 (uint256 (uint160 (allocationID))), users.indexer, users.gateway);
228
+ assertEq (intermediateTokensCollected, beforeTokensCollected + tokensToCollect);
229
+
230
+ bytes memory data2 = _getQueryFeeEncodedData (
231
+ users.indexer,
232
+ uint128 (tokensPayment),
233
+ oddTokensPayment ? tokensToCollect + 1 : tokensToCollect
234
+ );
235
+ _collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data2);
236
+
237
+ // Check the indexer received the correct amount of tokens
238
+ uint256 afterGatewayBalance = escrow.getBalance (users.gateway, address (graphTallyCollector), users.indexer);
239
+ assertEq (afterGatewayBalance, beforeGatewayBalance - tokensPayment);
240
+ uint256 afterTokensCollected = graphTallyCollector.tokensCollected (address (subgraphService), bytes32 (uint256 (uint160 (allocationID))), users.indexer, users.gateway);
241
+ assertEq (afterTokensCollected, intermediateTokensCollected + tokensToCollect + (oddTokensPayment ? 1 : 0 ));
242
+ }
196
243
}
0 commit comments