@@ -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,66 @@ 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 (
217
+ address (subgraphService),
218
+ bytes32 (uint256 (uint160 (allocationID))),
219
+ users.indexer,
220
+ users.gateway
221
+ );
222
+
223
+ // Collect the RAV in two steps
224
+ resetPrank (users.indexer);
225
+ uint256 tokensToCollect = tokensPayment / 2 ;
226
+ bool oddTokensPayment = tokensPayment % 2 == 1 ;
227
+ bytes memory data = _getQueryFeeEncodedData (users.indexer, uint128 (tokensPayment), tokensToCollect);
228
+ _collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data);
229
+
230
+ uint256 intermediateGatewayBalance = escrow.getBalance (
231
+ users.gateway,
232
+ address (graphTallyCollector),
233
+ users.indexer
234
+ );
235
+ assertEq (intermediateGatewayBalance, beforeGatewayBalance - tokensToCollect);
236
+ uint256 intermediateTokensCollected = graphTallyCollector.tokensCollected (
237
+ address (subgraphService),
238
+ bytes32 (uint256 (uint160 (allocationID))),
239
+ users.indexer,
240
+ users.gateway
241
+ );
242
+ assertEq (intermediateTokensCollected, beforeTokensCollected + tokensToCollect);
243
+
244
+ bytes memory data2 = _getQueryFeeEncodedData (
245
+ users.indexer,
246
+ uint128 (tokensPayment),
247
+ oddTokensPayment ? tokensToCollect + 1 : tokensToCollect
248
+ );
249
+ _collect (users.indexer, IGraphPayments.PaymentTypes.QueryFee, data2);
250
+
251
+ // Check the indexer received the correct amount of tokens
252
+ uint256 afterGatewayBalance = escrow.getBalance (users.gateway, address (graphTallyCollector), users.indexer);
253
+ assertEq (afterGatewayBalance, beforeGatewayBalance - tokensPayment);
254
+ uint256 afterTokensCollected = graphTallyCollector.tokensCollected (
255
+ address (subgraphService),
256
+ bytes32 (uint256 (uint160 (allocationID))),
257
+ users.indexer,
258
+ users.gateway
259
+ );
260
+ assertEq (afterTokensCollected, intermediateTokensCollected + tokensToCollect + (oddTokensPayment ? 1 : 0 ));
261
+ }
196
262
}
0 commit comments