diff --git a/src/WanderStaking.sol b/src/WanderStaking.sol index 89fd48b..759a9a6 100644 --- a/src/WanderStaking.sol +++ b/src/WanderStaking.sol @@ -13,6 +13,7 @@ contract WanderStaking is Initializable, PausableUpgradeable, OwnableUpgradeable event Stake(address indexed user, uint256 amount); event Unstake(address indexed user, uint256 amount); + event SpendFromStake(address indexed user, address indexed to, uint256 amount); error ZeroAmount(); error InsufficientBalance(); @@ -74,6 +75,24 @@ contract WanderStaking is Initializable, PausableUpgradeable, OwnableUpgradeable token.safeTransfer(msg.sender, amount); } + function spendFromStake(address to, uint256 amount) external whenNotPaused { + if (amount == 0) { + revert ZeroAmount(); + } + + if (userStake[msg.sender] < amount) { + revert InsufficientBalance(); + } + + userStake[msg.sender] -= amount; + totalStaked -= amount; + + emit Unstake(msg.sender, amount); + emit SpendFromStake(msg.sender, to, amount); + + token.safeTransfer(to, amount); + } + function getTotalStaked() external view returns (uint256) { return totalStaked; } diff --git a/test/WanderStaking.t.sol b/test/WanderStaking.t.sol index b667642..340cd02 100644 --- a/test/WanderStaking.t.sol +++ b/test/WanderStaking.t.sol @@ -89,4 +89,41 @@ contract WanderStakingTest is Test { vm.expectRevert(); staking.unstake(unstakeAmount); } + + function test_spend(uint64 _amount, uint64 _spendAmount) public { + // hello nick + address to = 0x6F4E4664E9B519DEAB043676D9Aafe6c9621C088; + + vm.assume(_amount > 0); + vm.assume(_spendAmount > 0); + vm.assume(_amount >= _spendAmount); + uint256 amount = uint256(_amount) * (10 ** 18); + uint256 spendAmount = uint256(_spendAmount) * (10 ** 18); + + token.mint(address(this), amount); + staking.stake(amount); + + staking.spendFromStake(to, spendAmount); + + assert(token.balanceOf(to) == spendAmount); + assert(staking.getAmountStaked(address(this)) == amount - spendAmount); + assert(token.balanceOf(address(staking)) == amount - spendAmount); + } + + function test_spend_over(uint64 _amount, uint64 _spendAmount) public { + // hello nick + address to = 0x6F4E4664E9B519DEAB043676D9Aafe6c9621C088; + + vm.assume(_amount > 0); + vm.assume(_spendAmount > 0); + vm.assume(_amount < _spendAmount); + uint256 amount = uint256(_amount) * (10 ** 18); + uint256 spendAmount = uint256(_spendAmount) * (10 ** 18); + + token.mint(address(this), amount); + staking.stake(amount); + + vm.expectRevert(WanderStaking.InsufficientBalance.selector); + staking.spendFromStake(to, spendAmount); + } }