diff --git a/test/EulerSwapHook.swaps.t.sol b/test/EulerSwapHook.swaps.t.sol index 2cd8ad8..89d80ea 100644 --- a/test/EulerSwapHook.swaps.t.sol +++ b/test/EulerSwapHook.swaps.t.sol @@ -126,4 +126,81 @@ contract EulerSwapHookTest is EulerSwapTestBase { }); swapRouter.swap(key, swapParams, settings, ""); } + + + // Gas tests + + function test_gas_smallSwap() public { + { + uint256 amountIn = 1e18; + + assetTST.mint(anyone, amountIn); + + vm.startPrank(anyone); + assetTST.approve(address(minimalRouter), amountIn); + + bool zeroForOne = address(assetTST) < address(assetTST2); + minimalRouter.swap(eulerSwap.poolKey(), zeroForOne, amountIn, 0, ""); + vm.snapshotGasLastCall("hook: small swap, fresh"); + vm.stopPrank(); + } + + { + uint256 amountIn = 1e18; + + assetTST.mint(anyone, amountIn); + + vm.startPrank(anyone); + assetTST.approve(address(minimalRouter), amountIn); + + bool zeroForOne = address(assetTST) < address(assetTST2); + minimalRouter.swap(eulerSwap.poolKey(), zeroForOne, amountIn, 0, ""); + vm.snapshotGasLastCall("hook: small swap, existing"); + vm.stopPrank(); + } + + { + uint256 amountIn = 5e18; + + assetTST2.mint(anyone, amountIn); + + vm.startPrank(anyone); + assetTST2.approve(address(minimalRouter), amountIn); + + bool zeroForOne = !(address(assetTST) < address(assetTST2)); + minimalRouter.swap(eulerSwap.poolKey(), zeroForOne, amountIn, 0, ""); + vm.snapshotGasLastCall("hook: small swap, cross 0 point"); + vm.stopPrank(); + } + } + + function test_gas_bigSwap() public { + { + uint256 amountIn = 30e18; + + assetTST.mint(anyone, amountIn); + + vm.startPrank(anyone); + assetTST.approve(address(minimalRouter), amountIn); + + bool zeroForOne = address(assetTST) < address(assetTST2); + minimalRouter.swap(eulerSwap.poolKey(), zeroForOne, amountIn, 0, ""); + vm.snapshotGasLastCall("hook: big swap, fresh"); + vm.stopPrank(); + } + + { + uint256 amountIn = 60e18; + + assetTST2.mint(anyone, amountIn); + + vm.startPrank(anyone); + assetTST2.approve(address(minimalRouter), amountIn); + + bool zeroForOne = !(address(assetTST) < address(assetTST2)); + minimalRouter.swap(eulerSwap.poolKey(), zeroForOne, amountIn, 0, ""); + vm.snapshotGasLastCall("hook: big swap, cross 0 point"); + vm.stopPrank(); + } + } } diff --git a/test/GasTests.t.sol b/test/GasTests.t.sol new file mode 100644 index 0000000..9bbf663 --- /dev/null +++ b/test/GasTests.t.sol @@ -0,0 +1,74 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +pragma solidity ^0.8.24; + +import {IEVault, IEulerSwap, EulerSwapTestBase, EulerSwap, TestERC20} from "./EulerSwapTestBase.t.sol"; + +contract EulerSwapGas is EulerSwapTestBase { + EulerSwap public eulerSwap; + + function setUp() public virtual override { + super.setUp(); + + eulerSwap = createEulerSwap(60e18, 60e18, 0, 1e18, 1e18, 0.9e18, 0.9e18); + eulerSwap.activate(); + } + + function test_gas_smallSwap() public { + { + uint256 amountIn = 1e18; + uint256 amountOut = periphery.quoteExactInput(address(eulerSwap), address(assetTST), address(assetTST2), amountIn); + + assetTST.mint(address(this), amountIn); + assetTST.transfer(address(eulerSwap), amountIn); + + eulerSwap.swap(0, amountOut, address(this), ""); + vm.snapshotGasLastCall("small swap, fresh"); + } + + { + uint256 amountIn = 1e18; + uint256 amountOut = periphery.quoteExactInput(address(eulerSwap), address(assetTST), address(assetTST2), amountIn); + + assetTST.mint(address(this), amountIn); + assetTST.transfer(address(eulerSwap), amountIn); + + eulerSwap.swap(0, amountOut, address(this), ""); + vm.snapshotGasLastCall("small swap, existing"); + } + + { + uint256 amountIn = 5e18; + uint256 amountOut = periphery.quoteExactInput(address(eulerSwap), address(assetTST2), address(assetTST), amountIn); + + assetTST2.mint(address(this), amountIn); + assetTST2.transfer(address(eulerSwap), amountIn); + + eulerSwap.swap(amountOut, 0, address(this), ""); + vm.snapshotGasLastCall("small swap, cross 0 point"); + } + } + + function test_gas_bigSwap() public { + { + uint256 amountIn = 30e18; + uint256 amountOut = periphery.quoteExactInput(address(eulerSwap), address(assetTST), address(assetTST2), amountIn); + + assetTST.mint(address(this), amountIn); + assetTST.transfer(address(eulerSwap), amountIn); + + eulerSwap.swap(0, amountOut, address(this), ""); + vm.snapshotGasLastCall("big swap, fresh"); + } + + { + uint256 amountIn = 60e18; + uint256 amountOut = periphery.quoteExactInput(address(eulerSwap), address(assetTST2), address(assetTST), amountIn); + + assetTST2.mint(address(this), amountIn); + assetTST2.transfer(address(eulerSwap), amountIn); + + eulerSwap.swap(amountOut, 0, address(this), ""); + vm.snapshotGasLastCall("big swap, cross 0 point"); + } + } +}