diff --git a/src/Treasury.sol b/src/Treasury.sol index 40f31e3..2ea7a83 100644 --- a/src/Treasury.sol +++ b/src/Treasury.sol @@ -221,6 +221,34 @@ contract GhostTreasury is GhostAccessControlled, ITreasury { return (y2 - y1) * 1000 / 1994; } + function forfeitReserves( + address router, + uint256 liquidity, + bool destroyerMode + ) external onlyGovernor { + address weth = IUniswapV2Router01(router).WETH(); + address pair = IUniswapV2Factory(IUniswapV2Router01(router).factory()).getPair(ftso, weth); + + IUniswapV2Pair(pair).transfer(pair, liquidity); + (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(address(this)); + + if (destroyerMode) { + uint256 amountToDestroy; + address token0 = IUniswapV2Pair(pair).token0(); + address token1 = IUniswapV2Pair(pair).token1(); + + if (token0 == ftso) { + amountToDestroy = amount0; + } + + if (token1 == ftso) { + amountToDestroy = amount1; + } + + IFTSO(ftso).burn(amountToDestroy); + } + } + function redeemReserve( address router, // could be an issue uint256 amount diff --git a/test/treasury/TreasuryRedemption.t.sol b/test/treasury/TreasuryRedemption.t.sol index 1e46371..442d3f2 100644 --- a/test/treasury/TreasuryRedemption.t.sol +++ b/test/treasury/TreasuryRedemption.t.sol @@ -15,8 +15,8 @@ contract GhostTreasuryRedemptionTest is Test { address public constant guardian = 0x0000000000000000000000000000000000000003; uint256 public constant amount = 69 * 1e18; - address public constant usdc = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; - address public constant pair = 0xB4e16d0168e52d35CaCD2c6185b44281Ec28C9Dc; + address public constant dai = 0x6B175474E89094C44Da98b954EedeAC495271d0F; + address public constant pair = 0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11; address public constant router = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public constant weth = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; @@ -32,8 +32,8 @@ contract GhostTreasuryRedemptionTest is Test { owner, owner ); - treasury = new GhostTreasury(usdc, 69, address(authority)); - calculator = new GhostBondingCalculator(usdc, 4000, 1); + treasury = new GhostTreasury(dai, 69, address(authority)); + calculator = new GhostBondingCalculator(dai, 4000, 1); vm.stopPrank(); vm.startPrank(governor); @@ -63,12 +63,16 @@ contract GhostTreasuryRedemptionTest is Test { vm.prank(governor); treasury.redeemReserve(router, amount); - assertEq(IERC20(usdc).balanceOf(address(treasury)), 0); + assertEq(IERC20(dai).balanceOf(address(treasury)), 0); assertEq(IERC20(weth).balanceOf(address(treasury)), 0); assertEq(IERC20(pair).balanceOf(address(treasury)) > 0, true); + uint256 liquidity = IERC20(pair).balanceOf(address(treasury)); vm.prank(governor); - treasury.auditReserves(); - assertEq(treasury.totalReserves() > prevTotalReserves, true); + treasury.forfeitReserves(router, liquidity, false); + + assertEq(IERC20(dai).balanceOf(address(treasury)) > 0, true); + assertEq(IERC20(weth).balanceOf(address(treasury)) > 0, true); + assertEq(IERC20(pair).balanceOf(address(treasury)), 0); } }