tests for native bond purchase

Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
This commit is contained in:
Uncle Fatso 2026-03-23 13:50:28 +03:00
parent 6fec7ed6d8
commit f2df4f600b
Signed by: f4ts0
GPG Key ID: 565F4F2860226EBB

View File

@ -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);
}
}