From 6e9bbaae8df47c654ecbe21a39984e3b5e868ed3 Mon Sep 17 00:00:00 2001 From: gozzy Date: Wed, 15 Mar 2023 16:35:14 +0000 Subject: [PATCH] vesting stake redemption --- src/DelegatedVesting.sol | 23 +++++++++++++++-------- src/interfaces/IERC20.sol | 2 -- src/interfaces/IGovernance.sol | 6 +++--- src/interfaces/IStaking.sol | 9 +++++++++ src/interfaces/IUniswapV2Router02.sol | 2 -- 5 files changed, 27 insertions(+), 15 deletions(-) create mode 100644 src/interfaces/IStaking.sol diff --git a/src/DelegatedVesting.sol b/src/DelegatedVesting.sol index 504346e..fea506f 100755 --- a/src/DelegatedVesting.sol +++ b/src/DelegatedVesting.sol @@ -1,6 +1,7 @@ pragma solidity 0.8.0; import "./interfaces/IERC20.sol"; +import "./interfaces/IStaking.sol"; import "./interfaces/IGovernance.sol"; contract DelegatedInstance { @@ -18,6 +19,7 @@ contract DelegatedInstance { address tokenAddress, uint256 stakeAmount ) { + _stakingAddress = IGovernance(governanceAddress).Staking(); _governanceAddress = governanceAddress; _tokenAddress = tokenAddress; @@ -48,13 +50,18 @@ contract DelegatedInstance { IGovernance(_governanceAddress).delegate(to); } - function unlockAndRedeem() public isSpender { + function unlockAndRedeem() public { + require(msg.sender == _sender, "INVALID SENDER"); + + uint256 reward = IStaking(_stakingAddress).checkReward(); uint256 stake = _balance; - delete balance; + delete _balance; IGovernance(_governanceAddress).unlock(stake); - IERC20(_tokenAddress).transfer(_spender, stake); + IStaking(_stakingAddress).getReward(); + + IERC20(_tokenAddress).transfer(_spender, stake + reward); } } @@ -66,7 +73,7 @@ contract DelegatedVesting { address public _tokenAddress; mapping(address => uint256) _balances; - mapping(address => address) _instance; + mapping(address => address) _instances; mapping(address => uint256) _commitments; constructor( @@ -85,7 +92,7 @@ contract DelegatedVesting { } function isDelegatedCommitment(address stakeholder) public view returns (bool) { - return isActiveCommitment(stakeholder) && _instance[stakeholder] != address(0x0); + return isActiveCommitment(stakeholder) && _instances[stakeholder] != address(0x0); } function isFulfilledCommitment(address stakeholder) public view returns (bool) { @@ -120,7 +127,7 @@ contract DelegatedVesting { v, r, s ); - _instance[msg.sender] = address(e); + _instances[msg.sender] = address(e); IERC20(_tokenAddress).approve(address(e), _balances[msg.sender]); e.lockAndDelegate(delegateAddress, _balances[msg.sender], deadline, v, r, s); @@ -131,10 +138,10 @@ contract DelegatedVesting { require(isFulfilledCommitment(msg.sender), "INVALID FULFILLMENT"); uint256 stake = _balances[msg.sender]; - address delegated = _instance[msg.sender]; + address delegated = _instances[msg.sender]; delete _balances[msg.sender]; - delete _instance[msg.sender]; + delete _instances[msg.sender]; if(delegated != address(0x0)){ DelegatedInstance(delegated).unlockAndRedeem(); diff --git a/src/interfaces/IERC20.sol b/src/interfaces/IERC20.sol index a0b0405..2b1ce04 100755 --- a/src/interfaces/IERC20.sol +++ b/src/interfaces/IERC20.sol @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: Unlicense - pragma solidity 0.8.0; interface IERC20 { diff --git a/src/interfaces/IGovernance.sol b/src/interfaces/IGovernance.sol index 8c7c2d2..6f03d6a 100755 --- a/src/interfaces/IGovernance.sol +++ b/src/interfaces/IGovernance.sol @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: Unlicense - pragma solidity 0.8.0; interface IGovernance { @@ -17,6 +15,8 @@ interface IGovernance { function undelegate() external; - function unlock(address to) external; + function unlock(uint256 amount) external; + + function Staking() external returns (address); } diff --git a/src/interfaces/IStaking.sol b/src/interfaces/IStaking.sol new file mode 100644 index 0000000..d6f4061 --- /dev/null +++ b/src/interfaces/IStaking.sol @@ -0,0 +1,9 @@ +pragma solidity 0.8.0; + +interface IStaking { + + function checkReward(address owner) external returns (uint256); + + function getReward() external; + +} diff --git a/src/interfaces/IUniswapV2Router02.sol b/src/interfaces/IUniswapV2Router02.sol index 4c162f1..4083d57 100755 --- a/src/interfaces/IUniswapV2Router02.sol +++ b/src/interfaces/IUniswapV2Router02.sol @@ -1,5 +1,3 @@ -// SPDX-License-Identifier: Unlicense - pragma solidity >=0.6.2; interface IUniswapV2Router02 {