@@ -125,37 +125,15 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
125
125
* @notice REVERT: This function may revert if ECDSA.recover fails, check ECDSA library for details.
126
126
*/
127
127
function collect (IGraphPayments.PaymentTypes paymentType , bytes memory data ) external override returns (uint256 ) {
128
- // Ensure caller is the RAV data service
129
- (SignedRAV memory signedRAV , uint256 dataServiceCut ) = abi.decode (data, (SignedRAV, uint256 ));
130
- require (
131
- signedRAV.rav.dataService == msg .sender ,
132
- TAPCollectorCallerNotDataService (msg .sender , signedRAV.rav.dataService)
133
- );
134
-
135
- // Ensure RAV signer is authorized for a payer
136
- address signer = _recoverRAVSigner (signedRAV);
137
- require (
138
- authorizedSigners[signer].payer != address (0 ) && ! authorizedSigners[signer].revoked,
139
- TAPCollectorInvalidRAVSigner ()
140
- );
141
-
142
- // Ensure RAV payer matches the authorized payer
143
- address payer = signedRAV.rav.payer;
144
- require (
145
- authorizedSigners[signer].payer == payer,
146
- TAPCollectorInvalidRAVPayer (authorizedSigners[signer].payer, payer)
147
- );
148
-
149
- // Check the service provider has an active provision with the data service
150
- // This prevents an attack where the payer can deny the service provider from collecting payments
151
- // by using a signer as data service to syphon off the tokens in the escrow to an account they control
152
- uint256 tokensAvailable = _graphStaking ().getProviderTokensAvailable (
153
- signedRAV.rav.serviceProvider,
154
- signedRAV.rav.dataService
155
- );
156
- require (tokensAvailable > 0 , TAPCollectorUnauthorizedDataService (signedRAV.rav.dataService));
128
+ return _collect (paymentType, data, 0 );
129
+ }
157
130
158
- return _collect (paymentType, authorizedSigners[signer].payer, signedRAV, dataServiceCut);
131
+ function collect (
132
+ IGraphPayments.PaymentTypes paymentType ,
133
+ bytes memory data ,
134
+ uint256 tokensToCollect
135
+ ) external override returns (uint256 ) {
136
+ return _collect (paymentType, data, tokensToCollect);
159
137
}
160
138
161
139
/**
@@ -177,44 +155,87 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
177
155
*/
178
156
function _collect (
179
157
IGraphPayments.PaymentTypes _paymentType ,
180
- address _payer ,
181
- SignedRAV memory _signedRAV ,
182
- uint256 _dataServiceCut
158
+ bytes memory _data ,
159
+ uint256 _tokensToCollect
183
160
) private returns (uint256 ) {
184
- address dataService = _signedRAV.rav.dataService;
185
- address receiver = _signedRAV.rav.serviceProvider;
161
+ // Ensure caller is the RAV data service
162
+ (SignedRAV memory signedRAV , uint256 dataServiceCut ) = abi.decode (_data, (SignedRAV, uint256 ));
163
+ require (
164
+ signedRAV.rav.dataService == msg .sender ,
165
+ TAPCollectorCallerNotDataService (msg .sender , signedRAV.rav.dataService)
166
+ );
167
+
168
+ // Ensure RAV signer is authorized for a payer
169
+ address signer = _recoverRAVSigner (signedRAV);
170
+ require (
171
+ authorizedSigners[signer].payer != address (0 ) && ! authorizedSigners[signer].revoked,
172
+ TAPCollectorInvalidRAVSigner ()
173
+ );
186
174
187
- uint256 tokensRAV = _signedRAV.rav.valueAggregate;
188
- uint256 tokensAlreadyCollected = tokensCollected[dataService][receiver][_payer] ;
175
+ // Ensure RAV payer matches the authorized payer
176
+ address payer = authorizedSigners[signer].payer ;
189
177
require (
190
- tokensRAV > tokensAlreadyCollected ,
191
- TAPCollectorInconsistentRAVTokens (tokensRAV, tokensAlreadyCollected )
178
+ signedRAV.rav.payer == payer ,
179
+ TAPCollectorInvalidRAVPayer (payer, signedRAV.rav.payer )
192
180
);
193
181
194
- uint256 tokensToCollect = tokensRAV - tokensAlreadyCollected;
195
- uint256 tokensDataService = tokensToCollect.mulPPM (_dataServiceCut);
182
+ address dataService = signedRAV.rav.dataService;
183
+ address receiver = signedRAV.rav.serviceProvider;
184
+
185
+ // Check the service provider has an active provision with the data service
186
+ // This prevents an attack where the payer can deny the service provider from collecting payments
187
+ // by using a signer as data service to syphon off the tokens in the escrow to an account they control
188
+ {
189
+ uint256 tokensAvailable = _graphStaking ().getProviderTokensAvailable (
190
+ signedRAV.rav.serviceProvider,
191
+ signedRAV.rav.dataService
192
+ );
193
+ require (tokensAvailable > 0 , TAPCollectorUnauthorizedDataService (signedRAV.rav.dataService));
194
+ }
195
+
196
+ uint256 tokensToCollect = 0 ;
197
+ {
198
+ uint256 tokensRAV = signedRAV.rav.valueAggregate;
199
+ uint256 tokensAlreadyCollected = tokensCollected[dataService][receiver][payer];
200
+ require (
201
+ tokensRAV > tokensAlreadyCollected,
202
+ TAPCollectorInconsistentRAVTokens (tokensRAV, tokensAlreadyCollected)
203
+ );
204
+
205
+ if (_tokensToCollect == 0 ) {
206
+ tokensToCollect = tokensRAV - tokensAlreadyCollected;
207
+ } else {
208
+ require (
209
+ _tokensToCollect <= tokensRAV - tokensAlreadyCollected,
210
+ TAPCollectorInvalidTokensToCollectAmount (_tokensToCollect, tokensRAV - tokensAlreadyCollected)
211
+ );
212
+ tokensToCollect = _tokensToCollect;
213
+ }
214
+ }
215
+
216
+ uint256 tokensDataService = tokensToCollect.mulPPM (dataServiceCut);
196
217
197
218
if (tokensToCollect > 0 ) {
198
- tokensCollected[dataService][receiver][_payer] = tokensRAV ;
219
+ tokensCollected[dataService][receiver][payer] += tokensToCollect ;
199
220
_graphPaymentsEscrow ().collect (
200
221
_paymentType,
201
- _payer ,
222
+ payer ,
202
223
receiver,
203
224
tokensToCollect,
204
225
dataService,
205
226
tokensDataService
206
227
);
207
228
}
208
229
209
- emit PaymentCollected (_paymentType, _payer , receiver, tokensToCollect, dataService, tokensDataService);
230
+ emit PaymentCollected (_paymentType, payer , receiver, tokensToCollect, dataService, tokensDataService);
210
231
emit RAVCollected (
211
- _payer ,
232
+ payer ,
212
233
dataService,
213
234
receiver,
214
- _signedRAV .rav.timestampNs,
215
- _signedRAV .rav.valueAggregate,
216
- _signedRAV .rav.metadata,
217
- _signedRAV .signature
235
+ signedRAV .rav.timestampNs,
236
+ signedRAV .rav.valueAggregate,
237
+ signedRAV .rav.metadata,
238
+ signedRAV .signature
218
239
);
219
240
return tokensToCollect;
220
241
}
0 commit comments