diff --git a/contracts/staking/contracts/src/fees/MixinExchangeFees.sol b/contracts/staking/contracts/src/fees/MixinExchangeFees.sol index 0df7cb9196..67f3306e37 100644 --- a/contracts/staking/contracts/src/fees/MixinExchangeFees.sol +++ b/contracts/staking/contracts/src/fees/MixinExchangeFees.sol @@ -129,7 +129,7 @@ contract MixinExchangeFees is /// @dev Returns the total balance of this contract, including WETH, /// minus any WETH that has been reserved for rewards. /// @return totalBalance Total balance. - function getAvailableBalance() + function getAvailableRewardsBalance() external view returns (uint256 totalBalance) diff --git a/contracts/staking/contracts/src/immutable/MixinStorage.sol b/contracts/staking/contracts/src/immutable/MixinStorage.sol index ac3a268762..05446258b2 100644 --- a/contracts/staking/contracts/src/immutable/MixinStorage.sol +++ b/contracts/staking/contracts/src/immutable/MixinStorage.sol @@ -83,7 +83,7 @@ contract MixinStorage is mapping (bytes32 => IStructs.Pool) internal _poolById; // mapping from PoolId to balance of members - mapping (bytes32 => uint256) public balanceByPoolId; + mapping (bytes32 => uint256) public rewardsByPoolId; // current epoch uint256 public currentEpoch = INITIAL_EPOCH; @@ -147,7 +147,7 @@ contract MixinStorage is IStructs.UnfinalizedState public unfinalizedState; /// @dev The WETH balance of this contract that is reserved for pool reward payouts. - uint256 _reservedWethBalance; + uint256 _wethReservedForPoolRewards; /// @dev Adds owner as an authorized address. constructor() diff --git a/contracts/staking/contracts/src/staking_pools/MixinStakingPoolRewards.sol b/contracts/staking/contracts/src/staking_pools/MixinStakingPoolRewards.sol index b2c75d5c77..8f5861ef31 100644 --- a/contracts/staking/contracts/src/staking_pools/MixinStakingPoolRewards.sol +++ b/contracts/staking/contracts/src/staking_pools/MixinStakingPoolRewards.sol @@ -203,8 +203,7 @@ contract MixinStakingPoolRewards is if (membersReward > 0) { // Increment the balance of the pool - balanceByPoolId[poolId] = balanceByPoolId[poolId].safeAdd(membersReward); - _reservedWethBalance = _reservedWethBalance.safeAdd(membersReward); + _incrementPoolRewards(poolId, membersReward); // Fetch the last epoch at which we stored an entry for this pool; // this is the most up-to-date cumulative rewards for this pool. @@ -297,8 +296,7 @@ contract MixinStakingPoolRewards is } // Decrement the balance of the pool - balanceByPoolId[poolId] = balanceByPoolId[poolId].safeSub(balance); - _reservedWethBalance = _reservedWethBalance.safeSub(balance); + _decrementPoolRewards(poolId, balance); // Withdraw the member's WETH balance _getWethContract().transfer(member, balance); @@ -432,4 +430,24 @@ contract MixinStakingPoolRewards is ); } } + + /// @dev Increments rewards for a pool. + /// @param poolId Unique id of pool. + /// @param amount Amount to increment rewards by. + function _incrementPoolRewards(bytes32 poolId, uint256 amount) + private + { + rewardsByPoolId[poolId] = rewardsByPoolId[poolId].safeAdd(amount); + _wethReservedForPoolRewards = _wethReservedForPoolRewards.safeAdd(amount); + } + + /// @dev Decrements rewards for a pool. + /// @param poolId Unique id of pool. + /// @param amount Amount to decrement rewards by. + function _decrementPoolRewards(bytes32 poolId, uint256 amount) + private + { + rewardsByPoolId[poolId] = rewardsByPoolId[poolId].safeSub(amount); + _wethReservedForPoolRewards = _wethReservedForPoolRewards.safeSub(amount); + } } diff --git a/contracts/staking/contracts/src/sys/MixinFinalizer.sol b/contracts/staking/contracts/src/sys/MixinFinalizer.sol index a8a2646de8..368423dfdf 100644 --- a/contracts/staking/contracts/src/sys/MixinFinalizer.sol +++ b/contracts/staking/contracts/src/sys/MixinFinalizer.sol @@ -257,7 +257,7 @@ contract MixinFinalizer is returns (uint256 wethBalance) { wethBalance = _getWethContract().balanceOf(address(this)) - .safeSub(_reservedWethBalance); + .safeSub(_wethReservedForPoolRewards); return wethBalance; } diff --git a/contracts/staking/test/actors/finalizer_actor.ts b/contracts/staking/test/actors/finalizer_actor.ts index c3fea29841..41f4400552 100644 --- a/contracts/staking/test/actors/finalizer_actor.ts +++ b/contracts/staking/test/actors/finalizer_actor.ts @@ -230,7 +230,7 @@ export class FinalizerActor extends BaseActor { for (const poolId of poolIds) { rewardVaultBalanceByPoolId[ poolId - ] = await this._stakingApiWrapper.stakingContract.balanceByPoolId.callAsync(poolId); + ] = await this._stakingApiWrapper.stakingContract.rewardsByPoolId.callAsync(poolId); } return rewardVaultBalanceByPoolId; } @@ -241,7 +241,7 @@ export class FinalizerActor extends BaseActor { this._stakingApiWrapper.stakingContract.getActiveStakingPoolThisEpoch.callAsync(poolId), ), ); - const totalRewards = await this._stakingApiWrapper.stakingContract.getAvailableBalance.callAsync(); + const totalRewards = await this._stakingApiWrapper.stakingContract.getAvailableRewardsBalance.callAsync(); const totalFeesCollected = BigNumber.sum(...activePools.map(p => p.feesCollected)); const totalWeightedStake = BigNumber.sum(...activePools.map(p => p.weightedStake)); if (totalRewards.eq(0) || totalFeesCollected.eq(0) || totalWeightedStake.eq(0)) { diff --git a/contracts/staking/test/rewards_test.ts b/contracts/staking/test/rewards_test.ts index 19ada9994b..76d7c39a4a 100644 --- a/contracts/staking/test/rewards_test.ts +++ b/contracts/staking/test/rewards_test.ts @@ -131,7 +131,7 @@ blockchainTests.resets('Testing Rewards', env => { // operator stakingApiWrapper.wethContract.balanceOf.callAsync(poolOperator.getOwner()), // undivided balance in reward pool - stakingApiWrapper.stakingContract.balanceByPoolId.callAsync(poolId), + stakingApiWrapper.stakingContract.rewardsByPoolId.callAsync(poolId), ]); expect(finalEndBalancesAsArray[0], 'stakerRewardBalance_1').to.be.bignumber.equal( expectedEndBalances.stakerRewardBalance_1,