Skip to content

Commit 9cbcf4a

Browse files
committed
feat: add collector address to the RAV
Signed-off-by: Tomás Migone <[email protected]>
1 parent 8498a09 commit 9cbcf4a

File tree

5 files changed

+73
-13
lines changed

5 files changed

+73
-13
lines changed

packages/horizon/contracts/interfaces/ITAPCollector.sol

+13-3
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,12 @@ interface ITAPCollector is IPaymentsCollector {
2727
struct ReceiptAggregateVoucher {
2828
// The address of the payer the RAV was issued by
2929
address payer;
30-
// The address of the data service the RAV was issued to
31-
address dataService;
30+
// The address of the collector where the RAV can be collected
31+
address collector;
3232
// The address of the service provider the RAV was issued to
3333
address serviceProvider;
34+
// The address of the data service the RAV was issued to
35+
address dataService;
3436
// The RAV timestamp, indicating the latest TAP Receipt in the RAV
3537
uint64 timestampNs;
3638
// Total amount owed to the service provider since the beginning of the
@@ -90,14 +92,22 @@ interface ITAPCollector is IPaymentsCollector {
9092
*/
9193
event RAVCollected(
9294
address indexed payer,
93-
address indexed dataService,
95+
address indexed collector,
9496
address indexed serviceProvider,
97+
address dataService,
9598
uint64 timestampNs,
9699
uint128 valueAggregate,
97100
bytes metadata,
98101
bytes signature
99102
);
100103

104+
/**
105+
* Thrown when attempting to collect a RAV that was not issued to this collector
106+
* @param collector The address of this collector processing the RAV
107+
* @param ravCollector The collector address noted in the RAV
108+
*/
109+
error TAPCollectorInvalidCollector(address collector, address ravCollector);
110+
101111
/**
102112
* Thrown when the signer is already authorized
103113
* @param authorizingPayer The address of the payer authorizing the signer

packages/horizon/contracts/payments/collectors/TAPCollector.sol

+14-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
2929
/// @notice The EIP712 typehash for the ReceiptAggregateVoucher struct
3030
bytes32 private constant EIP712_RAV_TYPEHASH =
3131
keccak256(
32-
"ReceiptAggregateVoucher(address payer,address dataService,address serviceProvider,uint64 timestampNs,uint128 valueAggregate,bytes metadata)"
32+
"ReceiptAggregateVoucher(address payer,address collector,address serviceProvider,address dataService,uint64 timestampNs,uint128 valueAggregate,bytes metadata)"
3333
);
3434

3535
/// @notice Authorization details for payer-signer pairs
@@ -162,8 +162,15 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
162162
bytes memory _data,
163163
uint256 _tokensToCollect
164164
) private returns (uint256) {
165-
// Ensure caller is the RAV data service
166165
(SignedRAV memory signedRAV, uint256 dataServiceCut) = abi.decode(_data, (SignedRAV, uint256));
166+
167+
// Ensure the RAV was issued to this collector
168+
require(
169+
signedRAV.rav.collector == address(this),
170+
TAPCollectorInvalidCollector(address(this), signedRAV.rav.collector)
171+
);
172+
173+
// Ensure caller is the RAV data service
167174
require(
168175
signedRAV.rav.dataService == msg.sender,
169176
TAPCollectorCallerNotDataService(msg.sender, signedRAV.rav.dataService)
@@ -222,8 +229,9 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
222229
emit PaymentCollected(_paymentType, payer, receiver, dataService, tokensToCollect);
223230
emit RAVCollected(
224231
payer,
225-
dataService,
232+
signedRAV.rav.collector,
226233
receiver,
234+
dataService,
227235
signedRAV.rav.timestampNs,
228236
signedRAV.rav.valueAggregate,
229237
signedRAV.rav.metadata,
@@ -249,8 +257,10 @@ contract TAPCollector is EIP712, GraphDirectory, ITAPCollector {
249257
keccak256(
250258
abi.encode(
251259
EIP712_RAV_TYPEHASH,
252-
_rav.dataService,
260+
_rav.payer,
261+
_rav.collector,
253262
_rav.serviceProvider,
263+
_rav.dataService,
254264
_rav.timestampNs,
255265
_rav.valueAggregate,
256266
keccak256(_rav.metadata)

packages/horizon/test/payments/tap-collector/TAPCollector.t.sol

+2-1
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,9 @@ contract TAPCollectorTest is HorizonStakingSharedTest, PaymentsEscrowSharedTest
160160
vm.expectEmit(address(tapCollector));
161161
emit ITAPCollector.RAVCollected(
162162
_payer,
163-
signedRAV.rav.dataService,
163+
address(tapCollector),
164164
signedRAV.rav.serviceProvider,
165+
signedRAV.rav.dataService,
165166
signedRAV.rav.timestampNs,
166167
signedRAV.rav.valueAggregate,
167168
signedRAV.rav.metadata,

packages/horizon/test/payments/tap-collector/collect/collect.t.sol

+42-4
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
1616
function _getQueryFeeEncodedData(
1717
uint256 _signerPrivateKey,
1818
address _payer,
19-
address _indexer,
2019
address _collector,
20+
address _indexer,
21+
address _dataService,
2122
uint128 _tokens
2223
) private view returns (bytes memory) {
23-
ITAPCollector.ReceiptAggregateVoucher memory rav = _getRAV(_payer, _indexer, _collector, _tokens);
24+
ITAPCollector.ReceiptAggregateVoucher memory rav = _getRAV(_payer, _collector, _indexer, _dataService, _tokens);
2425
bytes32 messageHash = tapCollector.encodeRAV(rav);
2526
(uint8 v, bytes32 r, bytes32 s) = vm.sign(_signerPrivateKey, messageHash);
2627
bytes memory signature = abi.encodePacked(r, s, v);
@@ -30,14 +31,16 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
3031

3132
function _getRAV(
3233
address _payer,
33-
address _indexer,
3434
address _collector,
35+
address _indexer,
36+
address _dataService,
3537
uint128 _tokens
3638
) private pure returns (ITAPCollector.ReceiptAggregateVoucher memory rav) {
3739
return
3840
ITAPCollector.ReceiptAggregateVoucher({
3941
payer: _payer,
40-
dataService: _collector,
42+
collector: _collector,
43+
dataService: _dataService,
4144
serviceProvider: _indexer,
4245
timestampNs: 0,
4346
valueAggregate: _tokens,
@@ -59,6 +62,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
5962
bytes memory data = _getQueryFeeEncodedData(
6063
signerPrivateKey,
6164
users.gateway,
65+
address(tapCollector),
6266
users.indexer,
6367
users.verifier,
6468
uint128(tokens)
@@ -84,6 +88,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
8488
bytes memory data = _getQueryFeeEncodedData(
8589
signerPrivateKey,
8690
users.gateway,
91+
address(tapCollector),
8792
users.indexer,
8893
users.verifier,
8994
uint128(payed + tokensPerStep)
@@ -93,6 +98,27 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
9398
}
9499
}
95100

101+
function testTAPCollector_Collect_RevertWhen_OtherCollector() public useGateway useSigner {
102+
address otherCollector = makeAddr("otherCollector");
103+
bytes memory data = _getQueryFeeEncodedData(
104+
signerPrivateKey,
105+
users.gateway,
106+
otherCollector,
107+
users.indexer,
108+
users.verifier,
109+
uint128(0)
110+
);
111+
112+
resetPrank(users.verifier);
113+
bytes memory expectedError = abi.encodeWithSelector(
114+
ITAPCollector.TAPCollectorInvalidCollector.selector,
115+
address(tapCollector),
116+
otherCollector
117+
);
118+
vm.expectRevert(expectedError);
119+
tapCollector.collect(IGraphPayments.PaymentTypes.QueryFee, data);
120+
}
121+
96122
function testTAPCollector_Collect_RevertWhen_NoProvision(uint256 tokens) public useGateway useSigner {
97123
tokens = bound(tokens, 1, type(uint128).max);
98124

@@ -101,6 +127,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
101127
bytes memory data = _getQueryFeeEncodedData(
102128
signerPrivateKey,
103129
users.gateway,
130+
address(tapCollector),
104131
users.indexer,
105132
users.verifier,
106133
uint128(tokens)
@@ -130,6 +157,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
130157
bytes memory data = _getQueryFeeEncodedData(
131158
signerPrivateKey,
132159
users.gateway,
160+
address(tapCollector),
133161
users.indexer,
134162
users.verifier,
135163
uint128(tokens)
@@ -164,6 +192,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
164192
bytes memory data = _getQueryFeeEncodedData(
165193
anotherSignerPrivateKey,
166194
users.gateway,
195+
address(tapCollector),
167196
users.indexer,
168197
anotherSigner,
169198
uint128(tokens)
@@ -188,6 +217,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
188217
bytes memory data = _getQueryFeeEncodedData(
189218
signerPrivateKey,
190219
users.gateway,
220+
address(tapCollector),
191221
users.indexer,
192222
users.verifier,
193223
uint128(tokens)
@@ -215,6 +245,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
215245
bytes memory data = _getQueryFeeEncodedData(
216246
signerPrivateKey,
217247
anotherPayer,
248+
address(tapCollector),
218249
users.indexer,
219250
users.verifier,
220251
uint128(tokens)
@@ -239,6 +270,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
239270
bytes memory data = _getQueryFeeEncodedData(
240271
signerPrivateKey,
241272
users.gateway,
273+
address(tapCollector),
242274
users.indexer,
243275
users.verifier,
244276
uint128(tokens)
@@ -262,6 +294,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
262294
bytes memory data = _getQueryFeeEncodedData(
263295
signerPrivateKey,
264296
users.gateway,
297+
address(tapCollector),
265298
users.indexer,
266299
users.verifier,
267300
uint128(tokens)
@@ -286,6 +319,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
286319
bytes memory data = _getQueryFeeEncodedData(
287320
signerPrivateKey,
288321
users.gateway,
322+
address(tapCollector),
289323
users.indexer,
290324
users.verifier,
291325
uint128(tokens)
@@ -308,6 +342,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
308342
bytes memory data = _getQueryFeeEncodedData(
309343
signerPrivateKey,
310344
users.gateway,
345+
address(tapCollector),
311346
users.indexer,
312347
users.verifier,
313348
uint128(tokens)
@@ -333,6 +368,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
333368
bytes memory data = _getQueryFeeEncodedData(
334369
signerPrivateKey,
335370
users.gateway,
371+
address(tapCollector),
336372
users.indexer,
337373
users.verifier,
338374
uint128(tokens)
@@ -354,6 +390,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
354390
bytes memory data = _getQueryFeeEncodedData(
355391
signerPrivateKey,
356392
users.gateway,
393+
address(tapCollector),
357394
users.indexer,
358395
users.verifier,
359396
uint128(tokens)
@@ -374,6 +411,7 @@ contract TAPCollectorCollectTest is TAPCollectorTest {
374411
bytes memory data = _getQueryFeeEncodedData(
375412
signerPrivateKey,
376413
users.gateway,
414+
address(tapCollector),
377415
users.indexer,
378416
users.verifier,
379417
uint128(tokens)

packages/subgraph-service/test/subgraphService/collect/query/query.t.sol

+2-1
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ contract SubgraphServiceRegisterTest is SubgraphServiceTest {
4747
return
4848
ITAPCollector.ReceiptAggregateVoucher({
4949
payer: users.gateway,
50-
dataService: address(subgraphService),
50+
collector: address(tapCollector),
5151
serviceProvider: indexer,
52+
dataService: address(subgraphService),
5253
timestampNs: 0,
5354
valueAggregate: tokens,
5455
metadata: abi.encode(allocationID)

0 commit comments

Comments
 (0)