@@ -120,6 +120,11 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
120120 _;
121121 }
122122
123+ modifier onlyStakingManager () {
124+ require (msg .sender == settings.getContractAddress (SQContracts.StakingManager), 'G016 ' );
125+ _;
126+ }
127+
123128 modifier onlyIndexerRegistry () {
124129 require (msg .sender == settings.getContractAddress (SQContracts.IndexerRegistry), 'G017 ' );
125130 _;
@@ -174,7 +179,7 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
174179 //make sure the eraReward be 0, when runner reregister
175180 rewardsDistributor.resetEraReward (_runner, currentEra);
176181
177- _updateTotalStakingAmount (stakingManager, _runner, 0 , false );
182+ _updateTotalStakingAmount (stakingManager, _runner, 0 , currentEra, false );
178183
179184 //apply first onICRChgange
180185 uint256 newCommissionRate = IIndexerRegistry (
@@ -254,7 +259,8 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
254259 IStakingManager stakingManager = IStakingManager (
255260 settings.getContractAddress (SQContracts.StakingManager)
256261 );
257- uint256 newDelegation = stakingManager.getAfterDelegationAmount (staker, runner);
262+ uint256 currentEra = _getCurrentEra ();
263+ uint256 newDelegation = stakingManager.getEraDelegationAmount (staker, runner, currentEra);
258264
259265 // test whether it is runner's Stake Change
260266 if (staker == runner) {
@@ -277,7 +283,7 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
277283 pendingStakerNos[runner][lastStaker] = stakerIndex;
278284 pendingStakeChangeLength[runner]-- ;
279285
280- _updateTotalStakingAmount (stakingManager, runner, lastClaimEra, true );
286+ _updateTotalStakingAmount (stakingManager, runner, lastClaimEra, currentEra, true );
281287 emit StakeChanged (runner, staker, newDelegation);
282288
283289 // notify stake allocation
@@ -287,6 +293,47 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
287293 stakingAllocation.onStakeUpdate (runner);
288294 }
289295
296+ function applyRedelegation (address runner , address staker ) external onlyStakingManager {
297+ IRewardsDistributor rewardsDistributor = _getRewardsDistributor ();
298+ IndexerRewardInfo memory rewardInfo = rewardsDistributor.getRewardInfo (runner);
299+ uint256 currentEra = _getCurrentEra ();
300+
301+ require (lastSettledEra[runner] == currentEra - 1 , 'RS007 ' );
302+
303+ // run hook for delegation change
304+ IStakingManager stakingManager = IStakingManager (
305+ settings.getContractAddress (SQContracts.StakingManager)
306+ );
307+ uint256 newDelegation = stakingManager.getEraDelegationAmount (staker, runner, currentEra);
308+
309+ // test whether it is runner's Stake Change
310+ if (staker == runner) {
311+ uint256 _runnerStakeWeight = runnerStakeWeight ();
312+ newDelegation = MathUtil.mulDiv (newDelegation, _runnerStakeWeight, PER_MILL);
313+ if (_previousRunnerStakeWeights[runner] != _runnerStakeWeight) {
314+ _setPreviousRunnerStakeWeights (runner, _runnerStakeWeight);
315+ }
316+ }
317+ delegation[staker][runner] = newDelegation;
318+
319+ uint256 newRewardDebt = MathUtil.mulDiv (
320+ delegation[staker][runner],
321+ rewardInfo.accSQTPerStake,
322+ PER_TRILL
323+ );
324+ rewardsDistributor.setRewardDebt (runner, staker, newRewardDebt);
325+
326+ // since lastSettledEra is (currentEra - 1), lastClaimedEra must equal to lastSettledEra
327+ _updateTotalStakingAmount (stakingManager, runner, lastSettledEra[runner], currentEra, true );
328+ emit StakeChanged (runner, staker, delegation[staker][runner]);
329+
330+ // notify stake allocation
331+ IStakingAllocation stakingAllocation = IStakingAllocation (
332+ settings.getContractAddress (SQContracts.StakingAllocation)
333+ );
334+ stakingAllocation.onStakeUpdate (runner);
335+ }
336+
290337 /**
291338 * @dev Apply the CommissionRate change and update the commissionRates stored in contract states.
292339 */
@@ -310,7 +357,13 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
310357 ).getCommissionRate (runner);
311358 commissionRates[runner] = newCommissionRate;
312359 pendingCommissionRateChange[runner] = 0 ;
313- _updateTotalStakingAmount (stakingManager, runner, rewardInfo.lastClaimEra, true );
360+ _updateTotalStakingAmount (
361+ stakingManager,
362+ runner,
363+ rewardInfo.lastClaimEra,
364+ currentEra,
365+ true
366+ );
314367 emit ICRChanged (runner, newCommissionRate);
315368 }
316369
@@ -382,10 +435,11 @@ contract RewardsStaking is IRewardsStaking, Initializable, OwnableUpgradeable {
382435 IStakingManager stakingManager ,
383436 address runner ,
384437 uint256 lastClaimEra ,
438+ uint256 currentEra ,
385439 bool doCheck
386440 ) private {
387441 if (! doCheck || checkAndReflectSettlement (runner, lastClaimEra)) {
388- uint256 runnerStake = stakingManager.getAfterDelegationAmount (runner, runner);
442+ uint256 runnerStake = stakingManager.getEraDelegationAmount (runner, runner, currentEra );
389443 totalStakingAmount[runner] =
390444 stakingManager.getTotalStakingAmount (runner) +
391445 MathUtil.mulDiv (runnerStake, (runnerStakeWeight () - PER_MILL), PER_MILL);
0 commit comments