@@ -141,45 +141,57 @@ contract HorizonStakingSlashTest is HorizonStakingTest {
141
141
_slash (users.indexer, subgraphDataServiceAddress, tokens + delegationTokens, 0 );
142
142
}
143
143
144
- function testSlash_RoundDown_TokensThawing_Provision () public useIndexer {
145
- uint256 tokens = 1 ether + 1 ;
144
+ function testSlash_RoundDown_TokensThawing_Provision (
145
+ uint256 tokens ,
146
+ uint256 slashTokens ,
147
+ uint256 tokensToThaw
148
+ ) public useIndexer {
149
+ vm.assume (slashTokens <= tokens);
150
+ vm.assume (tokensToThaw <= tokens);
151
+ vm.assume (tokensToThaw > 0 );
152
+
146
153
_useProvision (subgraphDataServiceAddress, tokens, MAX_PPM, MAX_THAWING_PERIOD);
154
+ _thaw (users.indexer, subgraphDataServiceAddress, tokensToThaw);
147
155
148
- _thaw (users.indexer, subgraphDataServiceAddress, tokens );
156
+ Provision memory beforeProvision = staking. getProvision (users.indexer, subgraphDataServiceAddress);
149
157
150
158
resetPrank (subgraphDataServiceAddress);
151
- _slash (users.indexer, subgraphDataServiceAddress, 1 , 0 );
159
+ _slash (users.indexer, subgraphDataServiceAddress, slashTokens , 0 );
152
160
153
- resetPrank (users.indexer);
154
- Provision memory provision = staking.getProvision (users.indexer, subgraphDataServiceAddress);
155
- assertEq (provision.tokens, tokens - 1 );
156
- // Tokens thawing should be rounded down
157
- assertEq (provision.tokensThawing, tokens - 2 );
161
+ Provision memory afterProvision = staking.getProvision (users.indexer, subgraphDataServiceAddress);
162
+ assertEq (afterProvision.tokens, beforeProvision.tokens - slashTokens);
163
+ assertEq (
164
+ afterProvision.tokensThawing,
165
+ (beforeProvision.tokensThawing * (beforeProvision.tokens - slashTokens)) / beforeProvision.tokens
166
+ );
158
167
}
159
168
160
169
function testSlash_RoundDown_TokensThawing_Delegation (
161
- uint256 tokens
170
+ uint256 tokens ,
171
+ uint256 delegationTokensToSlash ,
172
+ uint256 delegationTokensToUndelegate
162
173
) public useIndexer useProvision (tokens, MAX_PPM, 0 ) useDelegationSlashing {
174
+ uint256 delegationTokens = 10 ether ;
175
+
176
+ vm.assume (delegationTokensToSlash <= delegationTokens);
177
+ vm.assume (delegationTokensToUndelegate <= delegationTokens);
178
+ vm.assume (delegationTokensToUndelegate > 0 );
179
+
163
180
resetPrank (users.delegator);
164
- uint256 delegationTokens = 1 ether + 1 ;
165
181
_delegate (users.indexer, subgraphDataServiceAddress, delegationTokens, 0 );
182
+ _undelegate (users.indexer, subgraphDataServiceAddress, delegationTokensToUndelegate);
166
183
167
- DelegationInternal memory delegation = _getStorage_Delegation (
168
- users.indexer,
169
- subgraphDataServiceAddress,
170
- users.delegator,
171
- false
172
- );
173
- _undelegate (users.indexer, subgraphDataServiceAddress, delegation.shares);
184
+ DelegationPool memory beforePool = staking.getDelegationPool (users.indexer, subgraphDataServiceAddress);
174
185
186
+ // Slash
175
187
resetPrank (subgraphDataServiceAddress);
176
- // Slash 1 token from delegation
177
- _slash (users.indexer, subgraphDataServiceAddress, tokens + 1 , 0 );
188
+ _slash (users.indexer, subgraphDataServiceAddress, tokens + delegationTokensToSlash, 0 );
178
189
179
- resetPrank (users.delegator);
180
- DelegationPool memory pool = staking.getDelegationPool (users.indexer, subgraphDataServiceAddress);
181
- assertEq (pool.tokens, delegationTokens - 1 );
182
- // Tokens thawing should be rounded down
183
- assertEq (pool.tokensThawing, delegationTokens - 2 );
190
+ DelegationPool memory afterPool = staking.getDelegationPool (users.indexer, subgraphDataServiceAddress);
191
+ assertEq (afterPool.tokens, beforePool.tokens - delegationTokensToSlash);
192
+ assertEq (
193
+ afterPool.tokensThawing,
194
+ (beforePool.tokensThawing * (beforePool.tokens - delegationTokensToSlash)) / beforePool.tokens
195
+ );
184
196
}
185
197
}
0 commit comments