@@ -36,7 +36,7 @@ contract RecurringCollector is EIP712, GraphDirectory, Authorizable, IRecurringC
36
36
* @param dataService The address of the dataService
37
37
*/
38
38
modifier onlyDataService (address dataService ) {
39
- require (dataService == msg . sender , RecurringCollectorCallerNotDataService (msg .sender , dataService));
39
+ require (msg . sender == dataService , RecurringCollectorCallerNotDataService (msg .sender , dataService));
40
40
_;
41
41
}
42
42
@@ -77,32 +77,7 @@ contract RecurringCollector is EIP712, GraphDirectory, Authorizable, IRecurringC
77
77
* @dev Caller must be the data service the RCV was issued to.
78
78
*/
79
79
function accept (SignedRCV memory signedRCV ) external onlyDataService (signedRCV.rcv.dataService) {
80
- require (
81
- signedRCV.rcv.acceptDeadline >= block .timestamp ,
82
- RecurringCollectorAgreementAcceptanceElapsed (signedRCV.rcv.acceptDeadline)
83
- );
84
-
85
- // check that the voucher is signed by the payer (or proxy)
86
- _requireAuthorizedRCVSigner (signedRCV);
87
-
88
- AgreementKey memory key = AgreementKey ({
89
- dataService: signedRCV.rcv.dataService,
90
- payer: signedRCV.rcv.payer,
91
- serviceProvider: signedRCV.rcv.serviceProvider,
92
- agreementId: signedRCV.rcv.agreementId
93
- });
94
- AgreementData storage agreement = _getForUpdateAgreement (key);
95
- // check that the agreement is not already accepted
96
- require (agreement.acceptedAt == 0 , RecurringCollectorAgreementAlreadyAccepted (key));
97
-
98
- // accept the agreement
99
- agreement.acceptedAt = block .timestamp ;
100
- // FIX-ME: These need to be validated to something that makes sense for the contract
101
- agreement.duration = signedRCV.rcv.duration;
102
- agreement.maxInitialTokens = signedRCV.rcv.maxInitialTokens;
103
- agreement.maxOngoingTokensPerSecond = signedRCV.rcv.maxOngoingTokensPerSecond;
104
- agreement.minSecondsPerCollection = signedRCV.rcv.minSecondsPerCollection;
105
- agreement.maxSecondsPerCollection = signedRCV.rcv.maxSecondsPerCollection;
80
+ _accept (signedRCV);
106
81
}
107
82
108
83
/**
@@ -111,15 +86,37 @@ contract RecurringCollector is EIP712, GraphDirectory, Authorizable, IRecurringC
111
86
* @dev Caller must be the data service for the agreement.
112
87
*/
113
88
function cancel (address payer , address serviceProvider , bytes16 agreementId ) external {
89
+ _cancel (msg .sender , payer, serviceProvider, agreementId);
90
+ }
91
+
92
+ /**
93
+ * @notice Upgrade an indexing agreement.
94
+ * See {IRecurringCollector.upgrade}.
95
+ * @dev Caller must be the data service the RCV was issued to.
96
+ */
97
+ function upgrade (
98
+ bytes16 oldAgreementId ,
99
+ SignedRCV memory signedRCV
100
+ ) external onlyDataService (signedRCV.rcv.dataService) {
101
+ _cancel (signedRCV.rcv.dataService, signedRCV.rcv.payer, signedRCV.rcv.serviceProvider, oldAgreementId);
102
+ _accept (signedRCV);
103
+ AgreementKey memory oldKey = AgreementKey ({
104
+ dataService: signedRCV.rcv.dataService,
105
+ payer: signedRCV.rcv.payer,
106
+ serviceProvider: signedRCV.rcv.serviceProvider,
107
+ agreementId: oldAgreementId
108
+ });
109
+ AgreementData memory oldAgreement = _getAgreement (oldKey);
114
110
AgreementKey memory key = AgreementKey ({
115
- dataService: msg . sender ,
116
- payer: payer,
117
- serviceProvider: serviceProvider,
118
- agreementId: agreementId
111
+ dataService: signedRCV.rcv.dataService ,
112
+ payer: signedRCV.rcv. payer,
113
+ serviceProvider: signedRCV.rcv. serviceProvider,
114
+ agreementId: signedRCV.rcv. agreementId
119
115
});
120
116
AgreementData storage agreement = _getForUpdateAgreement (key);
121
- require (agreement.acceptedAt > 0 , RecurringCollectorAgreementNeverAccepted (key));
122
- agreement.acceptedAt = CANCELED;
117
+ agreement.acceptedAt = oldAgreement.acceptedAt;
118
+ agreement.lastCollectionAt = oldAgreement.lastCollectionAt;
119
+ agreement.updatedFromAgreementId = oldAgreementId;
123
120
}
124
121
125
122
/**
@@ -185,6 +182,53 @@ contract RecurringCollector is EIP712, GraphDirectory, Authorizable, IRecurringC
185
182
return _params.tokens;
186
183
}
187
184
185
+ /**
186
+ * @notice See {IRecurringCollector.accept}
187
+ */
188
+ function _accept (SignedRCV memory _signedRCV ) private {
189
+ require (
190
+ _signedRCV.rcv.acceptDeadline >= block .timestamp ,
191
+ RecurringCollectorAgreementAcceptanceElapsed (_signedRCV.rcv.acceptDeadline)
192
+ );
193
+
194
+ // check that the voucher is signed by the payer (or proxy)
195
+ _requireAuthorizedRCVSigner (_signedRCV);
196
+
197
+ AgreementKey memory key = AgreementKey ({
198
+ dataService: _signedRCV.rcv.dataService,
199
+ payer: _signedRCV.rcv.payer,
200
+ serviceProvider: _signedRCV.rcv.serviceProvider,
201
+ agreementId: _signedRCV.rcv.agreementId
202
+ });
203
+ AgreementData storage agreement = _getForUpdateAgreement (key);
204
+ // check that the agreement is not already accepted
205
+ require (agreement.acceptedAt == 0 , RecurringCollectorAgreementAlreadyAccepted (key));
206
+
207
+ // accept the agreement
208
+ agreement.acceptedAt = block .timestamp ;
209
+ // FIX-ME: These need to be validated to something that makes sense for the contract
210
+ agreement.duration = _signedRCV.rcv.duration;
211
+ agreement.maxInitialTokens = _signedRCV.rcv.maxInitialTokens;
212
+ agreement.maxOngoingTokensPerSecond = _signedRCV.rcv.maxOngoingTokensPerSecond;
213
+ agreement.minSecondsPerCollection = _signedRCV.rcv.minSecondsPerCollection;
214
+ agreement.maxSecondsPerCollection = _signedRCV.rcv.maxSecondsPerCollection;
215
+ }
216
+
217
+ /**
218
+ * @notice See {IRecurringCollector.cancel}
219
+ */
220
+ function _cancel (address _dataService , address _payer , address _serviceProvider , bytes16 _agreementId ) private {
221
+ AgreementKey memory key = AgreementKey ({
222
+ dataService: _dataService,
223
+ payer: _payer,
224
+ serviceProvider: _serviceProvider,
225
+ agreementId: _agreementId
226
+ });
227
+ AgreementData storage agreement = _getForUpdateAgreement (key);
228
+ require (agreement.acceptedAt > 0 , RecurringCollectorAgreementNeverAccepted (key));
229
+ agreement.acceptedAt = CANCELED;
230
+ }
231
+
188
232
/**
189
233
* @notice Requires that the agreement is valid for collection.
190
234
*/
@@ -257,4 +301,11 @@ contract RecurringCollector is EIP712, GraphDirectory, Authorizable, IRecurringC
257
301
function _getForUpdateAgreement (AgreementKey memory _key ) private view returns (AgreementData storage ) {
258
302
return agreements[_key.dataService][_key.payer][_key.serviceProvider][_key.agreementId];
259
303
}
304
+
305
+ /**
306
+ * @notice Gets an agreement.
307
+ */
308
+ function _getAgreement (AgreementKey memory _key ) private view returns (AgreementData memory ) {
309
+ return agreements[_key.dataService][_key.payer][_key.serviceProvider][_key.agreementId];
310
+ }
260
311
}
0 commit comments