PoolingContract: owner can disable deposit

pull/1811/head
vzotova 2020-04-09 20:45:36 +03:00
parent ba17feb926
commit 626fb70f9c
2 changed files with 58 additions and 1 deletions

View File

@ -15,6 +15,7 @@ contract PoolingStakingContract is AbstractStakingContract, Ownable {
event TokensDeposited(address indexed sender, uint256 value, uint256 depositedTokens);
event TokensWithdrawn(address indexed sender, uint256 value, uint256 depositedTokens);
event ETHWithdrawn(address indexed sender, uint256 value);
event DepositSet(address indexed sender, bool value);
struct Delegator {
uint256 depositedTokens;
@ -22,7 +23,8 @@ contract PoolingStakingContract is AbstractStakingContract, Ownable {
uint256 withdrawnETH;
}
StakingEscrow public escrow;
StakingEscrow public immutable escrow;
uint256 public totalDepositedTokens;
uint256 public totalWithdrawnReward;
uint256 public totalWithdrawnETH;
@ -32,6 +34,7 @@ contract PoolingStakingContract is AbstractStakingContract, Ownable {
uint256 public ownerWithdrawnETH;
mapping (address => Delegator) public delegators;
bool depositIsEnabled = true;
/**
* @param _router Address of the StakingInterfaceRouter contract
@ -47,11 +50,28 @@ contract PoolingStakingContract is AbstractStakingContract, Ownable {
ownerFraction = _ownerFraction;
}
/**
* @notice Enabled deposit
*/
function enableDeposit() external onlyOwner {
depositIsEnabled = true;
emit DepositSet(msg.sender, depositIsEnabled);
}
/**
* @notice Disable deposit
*/
function disableDeposit() external onlyOwner {
depositIsEnabled = false;
emit DepositSet(msg.sender, depositIsEnabled);
}
/**
* @notice Transfer tokens as delegator
* @param _value Amount of tokens to transfer
*/
function depositTokens(uint256 _value) external {
require(depositIsEnabled, "Deposit must be enabled");
require(_value > 0, "Value must be not empty");
totalDepositedTokens = totalDepositedTokens.add(_value);
Delegator storage delegator = delegators[msg.sender];

View File

@ -102,6 +102,41 @@ def test_staking(testerchain, token_economics, token, escrow, pooling_contract,
assert pooling_contract.functions.getAvailableOwnerReward().call() == 0
assert pooling_contract.functions.getAvailableReward().call() == 0
# Disable deposit
log = pooling_contract.events.DepositSet.createFilter(fromBlock='latest')
with pytest.raises((TransactionFailed, ValueError)):
tx = pooling_contract.functions.disableDeposit().transact({'from': delegators[0]})
testerchain.wait_for_receipt(tx)
tx = pooling_contract.functions.disableDeposit().transact({'from': owner})
testerchain.wait_for_receipt(tx)
events = log.get_all_entries()
assert len(events) == 1
event_args = events[-1]['args']
assert event_args['sender'] == owner
assert not event_args['value']
delegator = delegators[0]
tokens = token.functions.balanceOf(delegator).call()
tx = token.functions.approve(pooling_contract.address, tokens).transact({'from': delegator})
testerchain.wait_for_receipt(tx)
with pytest.raises((TransactionFailed, ValueError)):
tx = pooling_contract.functions.depositTokens(tokens).transact({'from': delegator})
testerchain.wait_for_receipt(tx)
tx = token.functions.approve(pooling_contract.address, 0).transact({'from': delegator})
testerchain.wait_for_receipt(tx)
# Enable deposit
with pytest.raises((TransactionFailed, ValueError)):
tx = pooling_contract.functions.enableDeposit().transact({'from': delegators[0]})
testerchain.wait_for_receipt(tx)
tx = pooling_contract.functions.enableDeposit().transact({'from': owner})
testerchain.wait_for_receipt(tx)
events = log.get_all_entries()
assert len(events) == 2
event_args = events[-1]['args']
assert event_args['sender'] == owner
assert event_args['value']
# Delegators deposit tokens to the pooling contract again
for index, delegator in enumerate(delegators):
tokens = token.functions.balanceOf(delegator).call()
@ -409,3 +444,5 @@ def test_reentrancy(testerchain, pooling_contract, token, deploy_contract):
tx = testerchain.client.send_transaction({'to': contract_address})
testerchain.wait_for_receipt(tx)
assert testerchain.w3.eth.getBalance(contract_address) == balance
# TODO reentrancy test for owner