diff --git a/test/bonding/BondDepositorty.t.sol b/test/bonding/BondDepositorty.t.sol index 8b39f76..b44c1d0 100644 --- a/test/bonding/BondDepositorty.t.sol +++ b/test/bonding/BondDepositorty.t.sol @@ -11,6 +11,7 @@ import "../../src/Treasury.sol"; import "../../src/Staking.sol"; import "../../src/BondDepository.sol"; import "../../src/mocks/ERC20Mock.sol"; +import "../../src/StandardBondingCalculator.sol"; contract GhostBondDepositoryTest is Test { uint256 public constant TOTAL_INITIAL_SUPPLY = 5000000000000000; @@ -20,8 +21,8 @@ contract GhostBondDepositoryTest is Test { uint48 public constant EPOCH_NUMBER = 1; uint48 public constant EPOCH_END_TIME = 1337; - uint256 public constant initialMint = 10000000000000000000000000; - uint256 public constant initialDeposit = 1000000000000000000000000; + uint256 public constant initialMint = 1000000000000000000000000; + uint256 public constant initialDeposit = 100000000000000000000000; uint256 public constant capacity = 10000e9; uint256 public constant initialPrice = 400e9; uint256 public constant buffer = 2e5; @@ -49,6 +50,7 @@ contract GhostBondDepositoryTest is Test { GhostTreasury treasury; GhostAuthority authority; GhostBondDepository depository; + GhostBondingCalculator calculator; function setUp() public { vm.startPrank(initializer); @@ -72,6 +74,7 @@ contract GhostBondDepositoryTest is Test { address(authority) ); treasury = new GhostTreasury(address(ftso), 69, address(authority)); + calculator = new GhostBondingCalculator(address(ftso), 1, 1); stnk.initialize(address(staking), address(treasury), address(ghst)); ghst.initialize(address(staking)); depository = new GhostBondDepository( @@ -90,7 +93,7 @@ contract GhostBondDepositoryTest is Test { 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(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); vm.startPrank(alice); diff --git a/test/staking/Staking.t.sol b/test/staking/Staking.t.sol index dc12cf9..e89db2f 100644 --- a/test/staking/Staking.t.sol +++ b/test/staking/Staking.t.sol @@ -11,6 +11,7 @@ import "../../src/Treasury.sol"; import "../../src/Staking.sol"; import "../../src/mocks/ERC20Mock.sol"; import "../../src/Gatekeeper.sol"; +import "../../src/StandardBondingCalculator.sol"; contract StakingTest is Test { address constant initializer = 0x0000000000000000000000000000000000000001; @@ -35,6 +36,7 @@ contract StakingTest is Test { GhostTreasury treasury; GhostAuthority authority; Gatekeeper gatekeeper; + GhostBondingCalculator calculator; uint256 public constant amount = 69; uint256 public constant bigAmount = amount * 1e9; @@ -67,6 +69,7 @@ contract StakingTest is Test { stnk.initialize(address(staking), address(treasury), address(ghst)); ghst.initialize(address(staking)); gatekeeper = new Gatekeeper(address(staking), 0); + calculator = new GhostBondingCalculator(address(ftso), 1, 1); vm.stopPrank(); } @@ -423,7 +426,7 @@ contract StakingTest is Test { treasury.enable(ITreasury.STATUS.REWARDMANAGER, address(distributor), address(0)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, bob, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); vm.startPrank(bob); @@ -479,7 +482,7 @@ contract StakingTest is Test { distributor.setBounty(bounty); treasury.enable(ITreasury.STATUS.REWARDMANAGER, address(distributor), address(0)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); vm.startPrank(alice); diff --git a/test/staking/StakingDistributor.t.sol b/test/staking/StakingDistributor.t.sol index 27f77b6..3d9ee9d 100644 --- a/test/staking/StakingDistributor.t.sol +++ b/test/staking/StakingDistributor.t.sol @@ -10,6 +10,7 @@ import "../../src/StakingDistributor.sol"; import "../../src/Treasury.sol"; import "../../src/Staking.sol"; import "../../src/mocks/ERC20Mock.sol"; +import "../../src/StandardBondingCalculator.sol"; contract StakingDistributorTest is Test { address public constant owner = 0x0000000000000000000000000000000000000001; @@ -35,6 +36,7 @@ contract StakingDistributorTest is Test { GhostStaking staking; GhostDistributor distributor; GhostAuthority authority; + GhostBondingCalculator calculator; uint256 public constant TEN_PERCENT = 1e5; @@ -60,6 +62,7 @@ contract StakingDistributorTest is Test { address(authority) ); treasury = new GhostTreasury(address(ftso), 69, address(authority)); + calculator = new GhostBondingCalculator(address(ftso), 1, 1); distributor = new GhostDistributor( address(treasury), address(ftso), @@ -250,7 +253,7 @@ contract StakingDistributorTest is Test { treasury.enable(ITreasury.STATUS.REWARDMANAGER, address(distributor), address(0)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, bob, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); vm.startPrank(alice); diff --git a/test/treasury/Treasury.t.sol b/test/treasury/Treasury.t.sol index 91cb346..2ed8d88 100644 --- a/test/treasury/Treasury.t.sol +++ b/test/treasury/Treasury.t.sol @@ -1,6 +1,7 @@ pragma solidity 0.8.20; import {Test} from "forge-std/Test.sol"; +import {StdChains} from "forge-std/StdChains.sol"; import "../../src/FatsoERC20.sol"; import "../../src/GhostAuthority.sol"; @@ -63,7 +64,7 @@ contract GhostTreasuryTest is Test { treasury.deposit(address(reserve), amount, 0); vm.prank(governor); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.prank(alice); uint256 send = treasury.deposit(address(reserve), amount, 0); @@ -74,7 +75,7 @@ contract GhostTreasuryTest is Test { function test_withdraw_onlyIfApprovedTokenAndApprovedAddress() public { vm.startPrank(governor); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); vm.prank(alice); @@ -98,7 +99,7 @@ contract GhostTreasuryTest is Test { function test_manage_onlyIfApprovedTokenAndApprovedAddress() public { vm.startPrank(governor); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); uint256 tokenValue = treasury.tokenValue(address(reserve), amount); @@ -123,7 +124,7 @@ contract GhostTreasuryTest is Test { function test_mint_onlyIfApprovedTokenAndApprovedAddress() public { vm.startPrank(governor); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); uint256 tokenValue = treasury.tokenValue(address(reserve), amount); @@ -147,7 +148,7 @@ contract GhostTreasuryTest is Test { function test_auditTreasuryReserves() public { vm.startPrank(governor); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, alice, address(0)); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); vm.stopPrank(); uint256 tokenValue = treasury.tokenValue(address(reserve), amount); @@ -182,7 +183,7 @@ contract GhostTreasuryTest is Test { function test_enableStatusAndCalculator() public { vm.startPrank(governor); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); treasury.enable(ITreasury.STATUS.LIQUIDITYTOKEN, address(liquidity), address(calculator)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, msg.sender, address(0)); vm.stopPrank(); @@ -202,7 +203,7 @@ contract GhostTreasuryTest is Test { vm.assume(who != governor && who != guardian); vm.startPrank(governor); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); treasury.enable(ITreasury.STATUS.LIQUIDITYTOKEN, address(liquidity), address(calculator)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, msg.sender, address(0)); vm.stopPrank(); @@ -222,7 +223,7 @@ contract GhostTreasuryTest is Test { function test_disableStatusByAddress() public { vm.startPrank(governor); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); treasury.enable(ITreasury.STATUS.LIQUIDITYTOKEN, address(liquidity), address(calculator)); treasury.enable(ITreasury.STATUS.RESERVEDEPOSITOR, msg.sender, address(0)); vm.stopPrank(); @@ -239,13 +240,23 @@ contract GhostTreasuryTest is Test { } function test_tokenValueIsCorret() public { + address realDexPair = 0xB20bd5D04BE54f870D5C0d3cA85d82b34B836405; + vm.startPrank(governor); - treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(0)); - treasury.enable(ITreasury.STATUS.LIQUIDITYTOKEN, 0xB20bd5D04BE54f870D5C0d3cA85d82b34B836405, address(calculator)); + treasury.enable(ITreasury.STATUS.RESERVETOKEN, address(reserve), address(calculator)); + treasury.enable(ITreasury.STATUS.LIQUIDITYTOKEN, realDexPair, address(calculator)); vm.stopPrank(); + uint256 totalSupply = IUniswapV2Pair(realDexPair).totalSupply(); assertEq(treasury.tokenValue(address(reserve), 1e18), 1e9); - assertEq(treasury.tokenValue(address(liquidity), 1e18), 1e9); + + (uint256 reserve0, uint256 reserve1,) = IUniswapV2Pair(realDexPair).getReserves(); + uint256 reserves = reserve0 * reserve1 / 1e6; + uint256 reserveEps = reserves * 1e5 / 1e7; // 1% + uint256 liquidityValue = (treasury.tokenValue(realDexPair, totalSupply) / 2)**2; + + assertEq(liquidityValue + reserveEps >= reserves, true); + assertEq(liquidityValue - reserveEps <= reserves, true); } function test_randomAddressCouldNotTriggerTimelock(address who) public { diff --git a/tester.sh b/tester.sh new file mode 100644 index 0000000..0b8a89f --- /dev/null +++ b/tester.sh @@ -0,0 +1,14 @@ +# exclude all tests dependant on rpc +forge test --no-match-test test_tokenValueIsCorret + +echo "" +echo "#####################################" +echo "## Running mainnet dependant tests ##" +echo "#####################################" +echo "" + +# url from the foundry, forge-std/StdChains.sol +FORK_URL="${1:-https://eth-mainnet.alchemyapi.io/v2/pwc5rmJhrdoaSEfimoKEmsvOjKSmPDrP}" + +# run tests where rpc to the mainnet is needed +forge test --match-test test_tokenValueIsCorret --fork-url $FORK_URL