Skip to content

Commit 3adab90

Browse files
committed
fix: save last parameter staged timestamp on provisions (OZ M-01)
Signed-off-by: Tomás Migone <[email protected]>
1 parent f81d8ff commit 3adab90

File tree

4 files changed

+19
-4
lines changed

4 files changed

+19
-4
lines changed

packages/horizon/contracts/interfaces/internal/IHorizonStakingTypes.sol

+3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ interface IHorizonStakingTypes {
2222
* @param createdAt Timestamp when the provision was created
2323
* @param maxVerifierCutPending Pending value for `maxVerifierCut`. Verifier needs to accept it before it becomes active.
2424
* @param thawingPeriodPending Pending value for `thawingPeriod`. Verifier needs to accept it before it becomes active.
25+
* @param lastParametersStagedAt Timestamp when the provision parameters were last staged. Can be used by data service implementation to
26+
* implement arbitrary parameter update logic.
2527
* @param thawingNonce Value of the current thawing nonce. Thaw requests with older nonces are invalid.
2628
*/
2729
struct Provision {
@@ -33,6 +35,7 @@ interface IHorizonStakingTypes {
3335
uint64 createdAt;
3436
uint32 maxVerifierCutPending;
3537
uint64 thawingPeriodPending;
38+
uint256 lastParametersStagedAt;
3639
uint256 thawingNonce;
3740
}
3841

packages/horizon/contracts/staking/HorizonStaking.sol

+2
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain {
215215
if ((prov.maxVerifierCutPending != newMaxVerifierCut) || (prov.thawingPeriodPending != newThawingPeriod)) {
216216
prov.maxVerifierCutPending = newMaxVerifierCut;
217217
prov.thawingPeriodPending = newThawingPeriod;
218+
prov.lastParametersStagedAt = block.timestamp;
218219
emit ProvisionParametersStaged(serviceProvider, verifier, newMaxVerifierCut, newThawingPeriod);
219220
}
220221
}
@@ -716,6 +717,7 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain {
716717
createdAt: uint64(block.timestamp),
717718
maxVerifierCutPending: _maxVerifierCut,
718719
thawingPeriodPending: _thawingPeriod,
720+
lastParametersStagedAt: 0,
719721
thawingNonce: 0
720722
});
721723

packages/horizon/test/shared/horizon-staking/HorizonStakingShared.t.sol

+13-1
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
355355
assertEq(afterProvision.createdAt, uint64(block.timestamp));
356356
assertEq(afterProvision.maxVerifierCutPending, maxVerifierCut);
357357
assertEq(afterProvision.thawingPeriodPending, thawingPeriod);
358+
assertEq(afterProvision.lastParametersStagedAt, 0);
358359
assertEq(afterProvision.thawingNonce, 0);
359360
assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked);
360361
assertEq(afterServiceProvider.tokensProvisioned, tokens + beforeServiceProvider.tokensProvisioned);
@@ -387,6 +388,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
387388
assertEq(afterProvision.maxVerifierCut, beforeProvision.maxVerifierCut);
388389
assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriod);
389390
assertEq(afterProvision.createdAt, beforeProvision.createdAt);
391+
assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt);
390392
assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending);
391393
assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending);
392394
assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce);
@@ -461,6 +463,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
461463
assertEq(afterProvision.createdAt, beforeProvision.createdAt);
462464
assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending);
463465
assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending);
466+
assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt);
464467
assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce);
465468
assertEq(thawRequestId, expectedThawRequestId);
466469
assertEq(afterThawRequest.shares, thawingShares);
@@ -546,6 +549,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
546549
assertEq(afterProvision.createdAt, beforeProvision.createdAt);
547550
assertEq(afterProvision.maxVerifierCutPending, beforeProvision.maxVerifierCutPending);
548551
assertEq(afterProvision.thawingPeriodPending, beforeProvision.thawingPeriodPending);
552+
assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt);
549553
assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce);
550554
assertEq(afterServiceProvider.tokensStaked, beforeServiceProvider.tokensStaked);
551555
assertEq(
@@ -672,6 +676,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
672676
assertEq(afterProvision.createdAt, beforeValues.provision.createdAt);
673677
assertEq(afterProvision.maxVerifierCutPending, beforeValues.provision.maxVerifierCutPending);
674678
assertEq(afterProvision.thawingPeriodPending, beforeValues.provision.thawingPeriodPending);
679+
assertEq(afterProvision.lastParametersStagedAt, beforeValues.provision.lastParametersStagedAt);
675680
assertEq(afterProvision.thawingNonce, beforeValues.provision.thawingNonce);
676681

677682
// assert: provision new verifier
@@ -753,7 +758,9 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
753758
Provision memory beforeProvision = staking.getProvision(serviceProvider, verifier);
754759

755760
// setProvisionParameters
756-
if (beforeProvision.maxVerifierCut != maxVerifierCut || beforeProvision.thawingPeriod != thawingPeriod) {
761+
bool paramsChanged = beforeProvision.maxVerifierCut != maxVerifierCut ||
762+
beforeProvision.thawingPeriod != thawingPeriod;
763+
if (paramsChanged) {
757764
vm.expectEmit();
758765
emit IHorizonStakingMain.ProvisionParametersStaged(
759766
serviceProvider,
@@ -776,6 +783,10 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
776783
assertEq(afterProvision.createdAt, beforeProvision.createdAt);
777784
assertEq(afterProvision.maxVerifierCutPending, maxVerifierCut);
778785
assertEq(afterProvision.thawingPeriodPending, thawingPeriod);
786+
assertEq(
787+
afterProvision.lastParametersStagedAt,
788+
paramsChanged ? block.timestamp : beforeProvision.lastParametersStagedAt
789+
);
779790
assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce);
780791
}
781792

@@ -812,6 +823,7 @@ abstract contract HorizonStakingSharedTest is GraphBaseTest {
812823
assertEq(afterProvision.thawingPeriod, beforeProvision.thawingPeriodPending);
813824
assertEq(afterProvision.thawingPeriod, afterProvision.thawingPeriodPending);
814825
assertEq(afterProvision.createdAt, beforeProvision.createdAt);
826+
assertEq(afterProvision.lastParametersStagedAt, beforeProvision.lastParametersStagedAt);
815827
assertEq(afterProvision.thawingNonce, beforeProvision.thawingNonce);
816828
}
817829

packages/horizon/test/staking/slash/slash.t.sol

+1-3
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,7 @@ contract HorizonStakingSlashTest is HorizonStakingTest {
9696

9797
function testSlash_RevertWhen_NoProvision(uint256 tokens, uint256 slashTokens) public useIndexer useStake(tokens) {
9898
vm.assume(slashTokens > 0);
99-
bytes memory expectedError = abi.encodeWithSelector(
100-
IHorizonStakingMain.HorizonStakingNoTokensToSlash.selector
101-
);
99+
bytes memory expectedError = abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingNoTokensToSlash.selector);
102100
vm.expectRevert(expectedError);
103101
vm.startPrank(subgraphDataServiceAddress);
104102
staking.slash(users.indexer, slashTokens, 0, subgraphDataServiceAddress);

0 commit comments

Comments
 (0)