Skip to content

Commit c5ca097

Browse files
committed
fix(horizon): add explicit check of provision existance before accepting parameters
Signed-off-by: Tomás Migone <[email protected]>
1 parent 57c5acc commit c5ca097

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

packages/horizon/contracts/staking/HorizonStaking.sol

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain {
229229
newThawingPeriod <= _maxThawingPeriod,
230230
HorizonStakingInvalidThawingPeriod(newThawingPeriod, _maxThawingPeriod)
231231
);
232+
233+
// Provision must exist
232234
Provision storage prov = _provisions[serviceProvider][verifier];
233235
require(prov.createdAt != 0, HorizonStakingInvalidProvision(serviceProvider, verifier));
234236

@@ -244,7 +246,11 @@ contract HorizonStaking is HorizonStakingBase, IHorizonStakingMain {
244246
*/
245247
function acceptProvisionParameters(address serviceProvider) external override notPaused {
246248
address verifier = msg.sender;
249+
250+
// Provision must exist
247251
Provision storage prov = _provisions[serviceProvider][verifier];
252+
require(prov.createdAt != 0, HorizonStakingInvalidProvision(serviceProvider, verifier));
253+
248254
if ((prov.maxVerifierCutPending != prov.maxVerifierCut) || (prov.thawingPeriodPending != prov.thawingPeriod)) {
249255
prov.maxVerifierCut = prov.maxVerifierCutPending;
250256
prov.thawingPeriod = prov.thawingPeriodPending;

packages/horizon/test/staking/provision/parameters.t.sol

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { HorizonStakingTest } from "../HorizonStaking.t.sol";
77
import { IHorizonStakingMain } from "../../../contracts/interfaces/internal/IHorizonStakingMain.sol";
88

99
contract HorizonStakingProvisionParametersTest is HorizonStakingTest {
10-
1110
/*
1211
* MODIFIERS
1312
*/
@@ -83,6 +82,20 @@ contract HorizonStakingProvisionParametersTest is HorizonStakingTest {
8382
vm.stopPrank();
8483
}
8584

85+
86+
function test_ProvisionParametersAccept_SameParameters(
87+
uint256 amount,
88+
uint32 maxVerifierCut,
89+
uint64 thawingPeriod
90+
) public useIndexer useProvision(amount, maxVerifierCut, thawingPeriod) {
91+
_setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod);
92+
93+
vm.startPrank(subgraphDataServiceAddress);
94+
_acceptProvisionParameters(users.indexer);
95+
_acceptProvisionParameters(users.indexer);
96+
vm.stopPrank();
97+
}
98+
8699
function test_ProvisionParameters_RevertIf_InvalidMaxVerifierCut(
87100
uint256 amount,
88101
uint32 maxVerifierCut,
@@ -91,10 +104,7 @@ contract HorizonStakingProvisionParametersTest is HorizonStakingTest {
91104
maxVerifierCut = uint32(bound(maxVerifierCut, MAX_PPM + 1, type(uint32).max));
92105
vm.assume(thawingPeriod <= MAX_THAWING_PERIOD);
93106
vm.expectRevert(
94-
abi.encodeWithSelector(
95-
IHorizonStakingMain.HorizonStakingInvalidMaxVerifierCut.selector,
96-
maxVerifierCut
97-
)
107+
abi.encodeWithSelector(IHorizonStakingMain.HorizonStakingInvalidMaxVerifierCut.selector, maxVerifierCut)
98108
);
99109
staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod);
100110
}
@@ -115,4 +125,16 @@ contract HorizonStakingProvisionParametersTest is HorizonStakingTest {
115125
);
116126
staking.setProvisionParameters(users.indexer, subgraphDataServiceAddress, maxVerifierCut, thawingPeriod);
117127
}
128+
129+
function test_ProvisionParametersAccept_RevertWhen_ProvisionNotExists() public useIndexer {
130+
resetPrank(subgraphDataServiceAddress);
131+
vm.expectRevert(
132+
abi.encodeWithSignature(
133+
"HorizonStakingInvalidProvision(address,address)",
134+
users.indexer,
135+
subgraphDataServiceAddress
136+
)
137+
);
138+
staking.acceptProvisionParameters(users.indexer);
139+
}
118140
}

0 commit comments

Comments
 (0)