harb/onchain/test/Harb.t.sol
JulesCrown e62fb45ed5 wip
2024-03-12 11:38:16 +01:00

65 lines
2.6 KiB
Solidity

// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity ^0.8.13;
import "forge-std/Test.sol";
import "forge-std/console.sol";
import "../src/Harb.sol";
import "../src/Stake.sol";
contract BloodXTest is Test {
Harb public harb;
Stake public stake;
uint256 constant MAX_INT = 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff;
function setUp() public {
harb = new Harb("name", "SYM");
stake = new Stake(address(harb));
harb.setStakingPool(address(stake));
}
function test_MintStakeUnstake(address account, uint256 amount) public {
vm.assume(amount > 1);
vm.assume(amount < MAX_INT / 100000 ether);
vm.assume(account != address(0));
vm.assume(account != address(harb));
vm.assume(account != address(stake));
// test mint
uint256 totalSupplyBefore = harb.totalSupply();
uint256 balanceBefore = harb.balanceOf(account);
harb.purchase(account, amount);
uint256 totalAfter = harb.totalSupply();
assertEq(totalAfter, totalSupplyBefore + amount, "total supply should match");
assertEq(harb.balanceOf(account), balanceBefore + amount, "balance should match");
// test stake
uint256 newStake = amount / 2 * 100000 ether / totalAfter;
{
uint256 outstandingBefore = stake.totalSupply();
uint256 stakeBalanceBefore = stake.balanceOf(account);
vm.prank(account);
harb.stake(account, amount / 2);
assertEq(harb.totalSupply(), totalSupplyBefore + (amount - (amount / 2)), "total supply should match after stake");
assertEq(harb.balanceOf(account), balanceBefore + (amount - (amount / 2)), "balance should match after stake");
assertEq(outstandingBefore + newStake, stake.totalSupply(), "outstanding supply should match");
assertEq(stakeBalanceBefore + newStake, stake.balanceOf(account), "balance of stake account should match");
}
// test unstake
{
(uint256 totalBefore, uint256 leftBefore,) = stake.getUnstakeSlot(account);
vm.prank(account);
stake.unstake(account, newStake / 2);
uint256 timeBefore = block.timestamp;
vm.warp(timeBefore + 60 * 60 * 36);
stake.unstakeTick(account);
(uint256 total, uint256 left, uint256 start) = stake.getUnstakeSlot(account);
assertEq(total, totalBefore + (newStake / 2), "total unstake should match");
assertApproxEqAbs(left, leftBefore + (newStake / 4), 1);
assertEq(start, timeBefore, "time unstake should match");
vm.warp(timeBefore + 60 * 60 * 72);
stake.unstakeTick(account);
}
}
}