Skip to content

Commit

Permalink
Emit rewards and fees on delegator exit
Browse files Browse the repository at this point in the history
  • Loading branch information
geoff-vball committed Sep 19, 2024
1 parent 6b1e9c0 commit db44dab
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 25 deletions.

Large diffs are not rendered by default.

Large diffs are not rendered by default.

5 changes: 3 additions & 2 deletions contracts/staking/PoSValidatorManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -528,12 +528,13 @@ abstract contract PoSValidatorManager is
$._redeemableValidatorRewards[validationID] += validatorFees;

// Reward the remaining tokens to the delegator.
_reward(delegator.owner, rewards - validatorFees);
uint256 delegatorRewards = rewards - validatorFees;
_reward(delegator.owner, delegatorRewards);

// Unlock the delegator's stake.
_unlock(delegator.owner, weightToValue(delegator.weight));

emit DelegationEnded(delegationID, validationID, nonce);
emit DelegationEnded(delegationID, validationID, nonce, delegatorRewards, validatorFees);
}

function _reward(address account, uint256 amount) internal virtual;
Expand Down
6 changes: 5 additions & 1 deletion contracts/staking/interfaces/IPoSValidatorManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,11 @@ interface IPoSValidatorManager is IValidatorManager {
* @param nonce The message nonce used to update the validator weight, as returned by the P-Chain
*/
event DelegationEnded(
bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce
bytes32 indexed delegationID,
bytes32 indexed validationID,
uint64 indexed nonce,
uint256 rewards,
uint256 fees
);

/**
Expand Down
21 changes: 15 additions & 6 deletions contracts/staking/tests/PoSValidatorManagerTests.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
);

event DelegationEnded(
bytes32 indexed delegationID, bytes32 indexed validationID, uint64 indexed nonce
bytes32 indexed delegationID,
bytes32 indexed validationID,
uint64 indexed nonce,
uint256 rewards,
uint256 fees
);

function testDelegationFeeBipsTooLow() public {
Expand Down Expand Up @@ -548,15 +552,16 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
endSupply: 0
});

uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000;
uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward;
uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000;
uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees;

_setUpCompleteEndDelegation({
validationID: validationID,
delegationID: delegationID,
delegator: DEFAULT_DELEGATOR_ADDRESS,
delegatorWeight: DEFAULT_DELEGATOR_WEIGHT,
expectedReward: expectedDelegatorReward,
expectedFees: expectedValidatorFees,
validatorWeight: DEFAULT_WEIGHT,
expectedValidatorWeight: DEFAULT_WEIGHT,
expectedNonce: 2
Expand Down Expand Up @@ -713,8 +718,8 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
endSupply: 0
});

uint256 expectedValidatorReward = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000;
uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorReward;
uint256 expectedValidatorFees = expectedTotalReward * DEFAULT_DELEGATION_FEE_BIPS / 10000;
uint256 expectedDelegatorReward = expectedTotalReward - expectedValidatorFees;

// Complete delegation1 by delivering the weight update from nonce 4 (delegator2's nonce)
_setUpCompleteEndDelegation({
Expand All @@ -723,6 +728,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
delegator: DEFAULT_DELEGATOR_ADDRESS,
delegatorWeight: DEFAULT_DELEGATOR_WEIGHT,
expectedReward: expectedDelegatorReward,
expectedFees: expectedValidatorFees,
validatorWeight: DEFAULT_WEIGHT,
expectedValidatorWeight: DEFAULT_WEIGHT,
expectedNonce: 4
Expand Down Expand Up @@ -939,6 +945,7 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
address delegator,
uint64 delegatorWeight,
uint256 expectedReward,
uint256 expectedFees,
uint64 validatorWeight,
uint64 expectedValidatorWeight,
uint64 expectedNonce
Expand All @@ -949,7 +956,9 @@ abstract contract PoSValidatorManagerTest is ValidatorManagerTest {
_mockGetVerifiedWarpMessage(weightUpdateMessage, true);

vm.expectEmit(true, true, true, true, address(posValidatorManager));
emit DelegationEnded(delegationID, validationID, expectedNonce);
emit DelegationEnded(
delegationID, validationID, expectedNonce, expectedReward, expectedFees
);
uint256 balanceBefore = _getStakeAssetBalance(delegator);

_expectStakeUnlock(delegator, _weightToValue(delegatorWeight));
Expand Down

0 comments on commit db44dab

Please sign in to comment.