diff --git a/test/bonding/BondDepositorty.t.sol b/test/bonding/BondDepositorty.t.sol index 5bfee6e..e982c23 100644 --- a/test/bonding/BondDepositorty.t.sol +++ b/test/bonding/BondDepositorty.t.sol @@ -14,31 +14,32 @@ import {WETH9} from "../../src/mocks/WETH9.sol"; import {GhostBondingCalculator} from "../../src/StandardBondingCalculator.sol"; import {ITreasury} from "../../src/interfaces/ITreasury.sol"; +import {IERC20} from "@openzeppelin-contracts/token/ERC20/IERC20.sol"; contract GhostBondDepositoryTest is Test { uint256 public constant TOTAL_INITIAL_SUPPLY = 5000000000000000; - uint256 public constant LARGE_APPROVAL = 100000000000000000000000000000000; - uint256 public constant INITIAL_INDEX = 10819917194513808e56; - uint48 public constant EPOCH_LENGTH = 2200; - uint48 public constant EPOCH_NUMBER = 1; - uint48 public constant EPOCH_END_TIME = 1337; + uint256 public constant LARGE_APPROVAL = 100000000000000000000000000000000; + uint256 public constant INITIAL_INDEX = 10819917194513808e56; + uint48 public constant EPOCH_LENGTH = 2200; + uint48 public constant EPOCH_NUMBER = 1; + uint48 public constant EPOCH_END_TIME = 1337; - uint256 public constant INITIAL_MINT = 1000000000000000000000000; - uint256 public constant CAPACITY = 10000e9; - uint256 public constant INITIAL_PRICE = 400e9; - uint256 public constant BUFFER = 2e5; + uint256 public constant INITIAL_MINT = 1000000000000000000000000; + uint256 public constant CAPACITY = 10000e9; + uint256 public constant INITIAL_PRICE = 400e9; + uint256 public constant BUFFER = 2e5; - address constant INITIALIZER = 0x0000000000000000000000000000000000000001; - address constant GOVERNOR = 0x0000000000000000000000000000000000000003; - address constant GUARDIAN = 0x0000000000000000000000000000000000000004; - address constant POLICY = 0x0000000000000000000000000000000000000005; - address constant VAULT = 0x0000000000000000000000000000000000000006; - address constant ALICE = 0x0000000000000000000000000000000000000007; + address constant INITIALIZER = 0x0000000000000000000000000000000000000001; + address constant GOVERNOR = 0x0000000000000000000000000000000000000003; + address constant GUARDIAN = 0x0000000000000000000000000000000000000004; + address constant POLICY = 0x0000000000000000000000000000000000000005; + address constant VAULT = 0x0000000000000000000000000000000000000006; + address constant ALICE = 0x0000000000000000000000000000000000000007; - uint256 public constant VESTING = 100; - uint256 public constant TIME_TO_CONCLUSION = 60 * 60 * 24; - uint256 public constant DEPOSIT_INTERVAL = 60 * 60 * 4; - uint256 public constant TUNE_INTERVAL = 60 * 60; + uint256 public constant VESTING = 100; + uint256 public constant TIME_TO_CONCLUSION = 60 * 60 * 24; + uint256 public constant DEPOSIT_INTERVAL = 60 * 60 * 4; + uint256 public constant TUNE_INTERVAL = 60 * 60; uint256 public conclusion; @@ -121,6 +122,31 @@ contract GhostBondDepositoryTest is Test { ); } + function _createNativeBond() internal returns (uint256) { + vm.startPrank(GOVERNOR); + authority.pushVault(address(treasury)); + treasury.enable(ITreasury.STATUS.REWARDMANAGER, address(depository), address(0)); + treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, ALICE, address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(weth), address(calculator)); + vm.stopPrank(); + + uint256 amount = 69 * 1e18; + vm.deal(ALICE, amount); + + conclusion = block.timestamp + TIME_TO_CONCLUSION; + + vm.prank(POLICY); + depository.create( + [CAPACITY, INITIAL_PRICE, BUFFER], + [VESTING, conclusion], + address(weth), + [uint32(DEPOSIT_INTERVAL), uint32(TUNE_INTERVAL)], // forge-lint: disable-line(unsafe-typecast) + [false, true] + ); + + return amount; + } + function test_shouldCreateMarket() public view { assertEq(depository.isLive(0), true); } @@ -393,4 +419,46 @@ contract GhostBondDepositoryTest is Test { (uint256 newCap, , , , , ,) = depository.markets(0); assertEq(newCap, 0); } + + function test_abilityToPurchaseWithNative() public { + uint256 amount = _createNativeBond(); + uint256 halfAmount = amount / 2; + + assertEq(ALICE.balance, amount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), 0); + + vm.prank(ALICE); + depository.deposit{value: halfAmount}(1, halfAmount, halfAmount, ALICE, ALICE); + assertEq(ALICE.balance, halfAmount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), halfAmount); + } + + function test_nativeValueWillBeTaken() public { + uint256 amount = _createNativeBond(); + uint256 halfAmount = amount / 2; + + assertEq(ALICE.balance, amount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), 0); + + vm.prank(ALICE); + (uint256 payout,,) = depository.deposit{value: halfAmount}(1, 0, halfAmount, ALICE, ALICE); + assertEq(ALICE.balance, halfAmount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), halfAmount); + assertEq(payout, 0); + } + + function test_nativeValueLessThenAmountFails() public { + uint256 amount = _createNativeBond(); + uint256 halfAmount = amount / 2; + + assertEq(ALICE.balance, amount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), 0); + + vm.expectRevert(); + vm.prank(ALICE); + depository.deposit{value: halfAmount}(1, amount, amount, ALICE, ALICE); + + assertEq(ALICE.balance, amount); + assertEq(IERC20(address(weth)).balanceOf(address(treasury)), 0); + } }