diff --git a/contracts/staking/contracts/test/TestMixinStakingPoolRewards.sol b/contracts/staking/contracts/test/TestMixinStakingPoolRewards.sol index b11b42b0fc..5b6cd3a8e0 100644 --- a/contracts/staking/contracts/test/TestMixinStakingPoolRewards.sol +++ b/contracts/staking/contracts/test/TestMixinStakingPoolRewards.sol @@ -116,6 +116,23 @@ contract TestMixinStakingPoolRewards is return _syncPoolRewards(poolId, reward, membersStake); } + // Expose `_computePoolRewardsSplit()` for testing. + function computePoolRewardsSplit( + uint32 operatorShare, + uint256 totalReward, + uint256 membersStake + ) + external + pure + returns (uint256 operatorReward, uint256 membersReward) + { + return _computePoolRewardsSplit( + operatorShare, + totalReward, + membersStake + ); + } + // Access `_delegatedStakeToPoolByOwner` function delegatedStakeToPoolByOwner(address member, bytes32 poolId) external diff --git a/contracts/staking/test/unit_tests/mixin_staking_pool_rewards.ts b/contracts/staking/test/unit_tests/mixin_staking_pool_rewards.ts index 6c196ebff4..39fe97ace1 100644 --- a/contracts/staking/test/unit_tests/mixin_staking_pool_rewards.ts +++ b/contracts/staking/test/unit_tests/mixin_staking_pool_rewards.ts @@ -417,5 +417,68 @@ blockchainTests.resets('MixinStakingPoolRewards unit tests', env => { verifyEventsFromLogs(logs, [], Events.Transfer); }); }); + + describe('_computePoolRewardsSplit', () => { + it("gives all rewards to operator if members' stake is zero", async () => { + const operatorShare = getRandomPortion(constants.PPM_100_PERCENT); + const totalReward = getRandomInteger(1, 1e18); + const membersStake = constants.ZERO_AMOUNT; + const [operatorReward, membersReward] = await testContract.computePoolRewardsSplit.callAsync( + operatorShare, + totalReward, + membersStake, + ); + expect(operatorReward).to.bignumber.eq(totalReward); + expect(membersReward).to.bignumber.eq(0); + }); + it("gives all rewards to operator if members' stake is zero and operator share is zero", async () => { + const operatorShare = constants.ZERO_AMOUNT; + const totalReward = getRandomInteger(1, 1e18); + const membersStake = constants.ZERO_AMOUNT; + const [operatorReward, membersReward] = await testContract.computePoolRewardsSplit.callAsync( + operatorShare, + totalReward, + membersStake, + ); + expect(operatorReward).to.bignumber.eq(totalReward); + expect(membersReward).to.bignumber.eq(0); + }); + it('gives all rewards to operator if operator share is 100%', async () => { + const operatorShare = constants.PPM_100_PERCENT; + const totalReward = getRandomInteger(1, 1e18); + const membersStake = getRandomInteger(1, 1e18); + const [operatorReward, membersReward] = await testContract.computePoolRewardsSplit.callAsync( + operatorShare, + totalReward, + membersStake, + ); + expect(operatorReward).to.bignumber.eq(totalReward); + expect(membersReward).to.bignumber.eq(0); + }); + it('gives all rewards to members if operator share is 0%', async () => { + const operatorShare = constants.ZERO_AMOUNT; + const totalReward = getRandomInteger(1, 1e18); + const membersStake = getRandomInteger(1, 1e18); + const [operatorReward, membersReward] = await testContract.computePoolRewardsSplit.callAsync( + operatorShare, + totalReward, + membersStake, + ); + expect(operatorReward).to.bignumber.eq(0); + expect(membersReward).to.bignumber.eq(totalReward); + }); + it('splits rewards between operator and members based on operator share', async () => { + const operatorShare = getRandomPortion(constants.PPM_100_PERCENT); + const totalReward = getRandomInteger(1, 1e18); + const membersStake = getRandomInteger(1, 1e18); + const [operatorReward, membersReward] = await testContract.computePoolRewardsSplit.callAsync( + operatorShare, + totalReward, + membersStake, + ); + expect(operatorReward).to.bignumber.eq(toOperatorPortion(operatorShare, totalReward)); + expect(membersReward).to.bignumber.eq(toMembersPortion(operatorShare, totalReward)); + }); + }); }); // tslint:disable: max-file-line-count