@@ -45,34 +45,53 @@ contract HorizonStakingLegacySlashTest is HorizonStakingTest {
45
45
// before
46
46
uint256 beforeStakingBalance = token.balanceOf (address (staking));
47
47
uint256 beforeRewardsDestinationBalance = token.balanceOf (_beneficiary);
48
+ ServiceProviderInternal memory beforeIndexer = _getStorage_ServiceProviderInternal (_indexer);
49
+
50
+ // calculate slashable stake
51
+ uint256 slashableStake = beforeIndexer.tokensStaked - beforeIndexer.tokensProvisioned;
52
+ uint256 actualTokens = _tokens;
53
+ uint256 actualRewards = _rewards;
54
+ if (slashableStake == 0 ) {
55
+ actualTokens = 0 ;
56
+ actualRewards = 0 ;
57
+ } else if (_tokens > slashableStake) {
58
+ actualRewards = (_rewards * slashableStake) / _tokens;
59
+ actualTokens = slashableStake;
60
+ }
48
61
49
62
// slash
50
63
vm.expectEmit (address (staking));
51
- emit IHorizonStakingExtension.StakeSlashed (_indexer, _tokens, _rewards , _beneficiary);
64
+ emit IHorizonStakingExtension.StakeSlashed (_indexer, actualTokens, actualRewards , _beneficiary);
52
65
staking.slash (_indexer, _tokens, _rewards, _beneficiary);
53
66
54
67
// after
55
68
uint256 afterStakingBalance = token.balanceOf (address (staking));
56
69
uint256 afterRewardsDestinationBalance = token.balanceOf (_beneficiary);
70
+ ServiceProviderInternal memory afterIndexer = _getStorage_ServiceProviderInternal (_indexer);
57
71
58
- assertEq (beforeStakingBalance - _tokens, afterStakingBalance);
59
- assertEq (beforeRewardsDestinationBalance, afterRewardsDestinationBalance - _rewards);
72
+ assertEq (beforeStakingBalance - actualTokens, afterStakingBalance);
73
+ assertEq (beforeRewardsDestinationBalance, afterRewardsDestinationBalance - actualRewards);
74
+ assertEq (afterIndexer.tokensStaked, beforeIndexer.tokensStaked - actualTokens);
60
75
}
61
76
62
77
/*
63
78
* TESTS
64
79
*/
65
-
66
- function testSlash_Legacy (
67
- uint256 tokens ,
80
+ function testSlash_LegacyOnly (
81
+ uint256 tokensStaked ,
82
+ uint256 tokensProvisioned ,
68
83
uint256 slashTokens ,
69
84
uint256 reward
70
85
) public useIndexer useLegacySlasher (users.legacySlasher) {
71
- vm.assume (tokens > 1 );
72
- slashTokens = bound (slashTokens, 1 , tokens);
86
+ vm.assume (tokensStaked > 0 );
87
+ vm.assume (tokensStaked <= MAX_STAKING_TOKENS);
88
+ vm.assume (tokensProvisioned > 0 );
89
+ vm.assume (tokensProvisioned <= tokensStaked);
90
+ slashTokens = bound (slashTokens, 1 , tokensStaked);
73
91
reward = bound (reward, 0 , slashTokens);
74
92
75
- _createProvision (users.indexer, subgraphDataServiceLegacyAddress, tokens, 0 , 0 );
93
+ _stake (tokensStaked);
94
+ _provision (users.indexer, subgraphDataServiceLegacyAddress, tokensProvisioned, 0 , 0 );
76
95
77
96
resetPrank (users.legacySlasher);
78
97
_legacySlash (users.indexer, slashTokens, reward, makeAddr ("fisherman " ));
0 commit comments