Skip to content

Commit 5f732ac

Browse files
fix: [TRST-R-5] Terms validation
1 parent 58b7a28 commit 5f732ac

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

packages/subgraph-service/contracts/libraries/IndexingAgreement.sol

Lines changed: 37 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,13 @@ library IndexingAgreement {
271271
*/
272272
error IndexingAgreementNotAuthorized(bytes16 agreementId, address unauthorizedIndexer);
273273

274+
/**
275+
* @notice Thrown when indexing agreement terms are invalid
276+
* @param tokensPerSecond The indexing agreement tokens per second
277+
* @param maxOngoingTokensPerSecond The RCA maximum tokens per second
278+
*/
279+
error IndexingAgreementInvalidTerms(uint256 tokensPerSecond, uint256 maxOngoingTokensPerSecond);
280+
274281
/**
275282
* @notice Accept an indexing agreement.
276283
*
@@ -343,7 +350,7 @@ library IndexingAgreement {
343350
agreement.allocationId = allocationId;
344351

345352
require(metadata.version == IndexingAgreementVersion.V1, IndexingAgreementInvalidVersion(metadata.version));
346-
_setTermsV1(self, agreementId, metadata.terms);
353+
_setTermsV1(self, agreementId, metadata.terms, signedRCA.rca.maxOngoingTokensPerSecond);
347354

348355
emit IndexingAgreementAccepted(
349356
signedRCA.rca.serviceProvider,
@@ -392,7 +399,12 @@ library IndexingAgreement {
392399

393400
require(wrapper.agreement.version == IndexingAgreementVersion.V1, "internal: invalid version");
394401
require(metadata.version == IndexingAgreementVersion.V1, IndexingAgreementInvalidVersion(metadata.version));
395-
_setTermsV1(self, signedRCAU.rcau.agreementId, metadata.terms);
402+
_setTermsV1(
403+
self,
404+
signedRCAU.rcau.agreementId,
405+
metadata.terms,
406+
wrapper.collectorAgreement.maxOngoingTokensPerSecond
407+
);
396408

397409
emit IndexingAgreementUpdated({
398410
indexer: wrapper.collectorAgreement.serviceProvider,
@@ -621,9 +633,16 @@ library IndexingAgreement {
621633
* @param _manager The indexing agreement storage manager
622634
* @param _agreementId The id of the agreement to update
623635
* @param _data The encoded terms data
636+
* @param maxOngoingTokensPerSecond The RCA maximum tokens per second limit for validation
624637
*/
625-
function _setTermsV1(StorageManager storage _manager, bytes16 _agreementId, bytes memory _data) private {
638+
function _setTermsV1(
639+
StorageManager storage _manager,
640+
bytes16 _agreementId,
641+
bytes memory _data,
642+
uint256 maxOngoingTokensPerSecond
643+
) private {
626644
IndexingAgreementTermsV1 memory newTerms = IndexingAgreementDecoder.decodeIndexingAgreementTermsV1(_data);
645+
_validateTermsAgainstRCA(newTerms, maxOngoingTokensPerSecond);
627646
_manager.termsV1[_agreementId].tokensPerSecond = newTerms.tokensPerSecond;
628647
_manager.termsV1[_agreementId].tokensPerEntityPerSecond = newTerms.tokensPerEntityPerSecond;
629648
}
@@ -764,4 +783,19 @@ library IndexingAgreement {
764783
collectorAgreement: _directory().recurringCollector().getAgreement(agreementId)
765784
});
766785
}
786+
787+
/**
788+
* @notice Validates indexing agreement terms against RCA limits
789+
* @param terms The indexing agreement terms to validate
790+
* @param maxOngoingTokensPerSecond The RCA maximum tokens per second limit
791+
*/
792+
function _validateTermsAgainstRCA(
793+
IndexingAgreementTermsV1 memory terms,
794+
uint256 maxOngoingTokensPerSecond
795+
) private pure {
796+
require(
797+
terms.tokensPerSecond <= maxOngoingTokensPerSecond,
798+
IndexingAgreementInvalidTerms(terms.tokensPerSecond, maxOngoingTokensPerSecond)
799+
);
800+
}
767801
}

packages/subgraph-service/test/unit/subgraphService/indexing-agreement/shared.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ contract SubgraphServiceIndexingAgreementSharedTest is SubgraphServiceTest, Boun
288288
);
289289
rcau.metadata = _encodeUpdateIndexingAgreementMetadataV1(
290290
_newUpdateIndexingAgreementMetadataV1(
291-
_ctx.ctxInternal.seed.termsV1.tokensPerSecond,
291+
bound(_ctx.ctxInternal.seed.termsV1.tokensPerSecond, 0, _rca.maxOngoingTokensPerSecond),
292292
_ctx.ctxInternal.seed.termsV1.tokensPerEntityPerSecond
293293
)
294294
);

0 commit comments

Comments
 (0)