Skip to content

Commit

Permalink
161 add tests for penalizeablestaking module in contracts (#42)
Browse files Browse the repository at this point in the history
* Penalizeable change + tests

* make ban functionality cheaper and cleaner + add tests

* add some space between delete

* remove unused function

* update docs + remove unessesry check
  • Loading branch information
SamBorisov authored Jul 18, 2024
1 parent 54de75c commit 24487c3
Show file tree
Hide file tree
Showing 11 changed files with 142 additions and 111 deletions.
7 changes: 5 additions & 2 deletions contracts/HydraChain/modules/Inspector/Inspector.sol
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@ abstract contract Inspector is IInspector, ValidatorManager {
* @param validator The address of the validator
*/
function _ban(address validator) private {
uint256 validatorStake = hydraStakingContract.stakeOf(validator);
if (validators[validator].status == ValidatorStatus.Active) {
PenalizedStakeDistribution[] memory rewards;
if (msg.sender != owner()) {
Expand All @@ -95,7 +94,11 @@ abstract contract Inspector is IInspector, ValidatorManager {
rewards[0] = PenalizedStakeDistribution({account: address(0), amount: validatorPenalty});
}

hydraStakingContract.penalizeStaker(validator, validatorStake, rewards);
hydraStakingContract.penalizeStaker(validator, rewards);
}

if (validators[validator].status == ValidatorStatus.Active) {
activeValidatorsCount--;
}

validators[validator].status = ValidatorStatus.Banned;
Expand Down
2 changes: 1 addition & 1 deletion contracts/HydraStaking/Staking.sol
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ contract Staking is IStaking, Governed, Withdrawal, APRCalculatorConnector {
totalStake -= amount;
withdrawAmount = amount;

emit Unstaked(msg.sender, amount);
emit Unstaked(account, amount);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,17 @@ struct WithdrawalInfo {
}

interface IPenalizeableStaking is IStaking {
error ValidatorNotBanned(address staker);
error NoFundsToWithdraw();
error StakeLeftLow();

/**
* @notice Penalizes a staker by reducing their stake and distributing the penalty
* @dev Only the validator manager can call this function
* @param staker The address of the staker to penalize
* @param unstakeAmount The amount to unstake
* @param stakeDistributions The distribution of the penalty
*/
function penalizeStaker(
address staker,
uint256 unstakeAmount,
PenalizedStakeDistribution[] calldata stakeDistributions
) external;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,11 @@ contract PenalizeableStaking is IPenalizeableStaking, HydraChainConnector, Staki
*/
function penalizeStaker(
address staker,
uint256 unstakeAmount,
PenalizedStakeDistribution[] calldata stakeDistributions
) external onlyHydraChain {
uint256 accountStake = stakeOf(staker);
if (isStakeLeftLow(accountStake, unstakeAmount)) {
// It is HydraChain responsibility to execute penalize with proper values
revert StakeLeftLow();
}

uint256 unstakeAmount = stakeOf(staker);
(uint256 stakeLeft, uint256 withdrawAmount) = _executeUnstake(staker, unstakeAmount);
if (stakeLeft == 0) {
hydraChainContract.deactivateValidator(msg.sender);
}
assert(stakeLeft == 0);

uint256 leftForStaker = _distributePenalizedStake(withdrawAmount, stakeDistributions);
if (leftForStaker > 0) {
Expand All @@ -50,12 +42,13 @@ contract PenalizeableStaking is IPenalizeableStaking, HydraChainConnector, Staki
* @inheritdoc IPenalizeableStaking
*/
function withdrawBannedFunds() external {
if (!hydraChainContract.isValidatorBanned(msg.sender)) {
revert ValidatorNotBanned(msg.sender);
uint256 leftToWithdraw = leftToWithdrawPerStaker[msg.sender];
if (leftToWithdraw == 0) {
revert NoFundsToWithdraw();
}

uint256 leftToWithdraw = leftToWithdrawPerStaker[msg.sender];
delete leftToWithdrawPerStaker[msg.sender];

_withdraw(msg.sender, leftToWithdraw);
_afterWithdrawBannedFundsHook(msg.sender, leftToWithdraw);
}
Expand Down Expand Up @@ -128,12 +121,6 @@ contract PenalizeableStaking is IPenalizeableStaking, HydraChainConnector, Staki
}
}

function isStakeLeftLow(uint256 accountStake, uint256 unstakeAmount) private view returns (bool) {
uint256 stakeLeft = accountStake - unstakeAmount;
if (stakeLeft < minStake && stakeLeft != 0) {
return true;
}

return false;
}
// slither-disable-next-line unused-state,naming-convention
uint256[50] private __gap;
}
4 changes: 2 additions & 2 deletions contracts/common/Withdrawal/Withdrawal.sol
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ abstract contract Withdrawal is IWithdrawal, ReentrancyGuardUpgradeable, Ownable
_changeWithdrawalWaitPeriod(newWaitPeriod);
}

// _______________ Internal functions _______________

function _registerWithdrawal(address account, uint256 amount) internal {
_withdrawals[account].append(amount, block.timestamp + withdrawWaitPeriod);
emit WithdrawalRegistered(account, amount);
}

// _______________ Internal functions _______________

function _withdraw(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}("");
require(success, "WITHDRAWAL_FAILED");
Expand Down
30 changes: 12 additions & 18 deletions docs/HydraStaking/HydraStaking.md
Original file line number Diff line number Diff line change
Expand Up @@ -567,7 +567,7 @@ function owner() external view returns (address)
### penalizeStaker

```solidity
function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
function penalizeStaker(address staker, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
```


Expand All @@ -579,7 +579,6 @@ function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDis
| Name | Type | Description |
|---|---|---|
| staker | address | undefined |
| unstakeAmount | uint256 | undefined |
| stakeDistributions | PenalizedStakeDistribution[] | undefined |

### pendingOwner
Expand Down Expand Up @@ -1264,6 +1263,17 @@ error InvalidWaitPeriod()



### NoFundsToWithdraw

```solidity
error NoFundsToWithdraw()
```






### NoRewards

```solidity
Expand Down Expand Up @@ -1330,20 +1340,4 @@ error Unauthorized(string only)
|---|---|---|
| only | string | undefined |

### ValidatorNotBanned

```solidity
error ValidatorNotBanned(address staker)
```





#### Parameters

| Name | Type | Description |
|---|---|---|
| staker | address | undefined |


30 changes: 12 additions & 18 deletions docs/HydraStaking/IHydraStaking.md
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ Called by the delegation contract when a user undelegates from a staker
### penalizeStaker

```solidity
function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
function penalizeStaker(address staker, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
```


Expand All @@ -135,7 +135,6 @@ function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDis
| Name | Type | Description |
|---|---|---|
| staker | address | undefined |
| unstakeAmount | uint256 | undefined |
| stakeDistributions | PenalizedStakeDistribution[] | undefined |

### pendingWithdrawals
Expand Down Expand Up @@ -452,6 +451,17 @@ error InvalidWaitPeriod()



### NoFundsToWithdraw

```solidity
error NoFundsToWithdraw()
```






### NoRewards

```solidity
Expand Down Expand Up @@ -502,20 +512,4 @@ error StakeRequirement(string src, string msg)
| src | string | undefined |
| msg | string | undefined |

### ValidatorNotBanned

```solidity
error ValidatorNotBanned(address staker)
```





#### Parameters

| Name | Type | Description |
|---|---|---|
| staker | address | undefined |


Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ Claims staking rewards for the sender.
### penalizeStaker

```solidity
function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
function penalizeStaker(address staker, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
```


Expand All @@ -68,7 +68,6 @@ function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDis
| Name | Type | Description |
|---|---|---|
| staker | address | undefined |
| unstakeAmount | uint256 | undefined |
| stakeDistributions | PenalizedStakeDistribution[] | undefined |

### pendingWithdrawals
Expand Down Expand Up @@ -346,6 +345,17 @@ error InvalidWaitPeriod()



### NoFundsToWithdraw

```solidity
error NoFundsToWithdraw()
```






### NoRewards

```solidity
Expand Down Expand Up @@ -396,20 +406,4 @@ error StakeRequirement(string src, string msg)
| src | string | undefined |
| msg | string | undefined |

### ValidatorNotBanned

```solidity
error ValidatorNotBanned(address staker)
```





#### Parameters

| Name | Type | Description |
|---|---|---|
| staker | address | undefined |


Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ function owner() external view returns (address)
### penalizeStaker

```solidity
function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
function penalizeStaker(address staker, PenalizedStakeDistribution[] stakeDistributions) external nonpayable
```


Expand All @@ -265,7 +265,6 @@ function penalizeStaker(address staker, uint256 unstakeAmount, PenalizedStakeDis
| Name | Type | Description |
|---|---|---|
| staker | address | undefined |
| unstakeAmount | uint256 | undefined |
| stakeDistributions | PenalizedStakeDistribution[] | undefined |

### pendingOwner
Expand Down Expand Up @@ -826,6 +825,17 @@ error InvalidWaitPeriod()



### NoFundsToWithdraw

```solidity
error NoFundsToWithdraw()
```






### NoRewards

```solidity
Expand Down Expand Up @@ -892,20 +902,4 @@ error Unauthorized(string only)
|---|---|---|
| only | string | undefined |

### ValidatorNotBanned

```solidity
error ValidatorNotBanned(address staker)
```





#### Parameters

| Name | Type | Description |
|---|---|---|
| staker | address | undefined |


Loading

0 comments on commit 24487c3

Please sign in to comment.