Skip to content

Commit a49828a

Browse files
committed
gas estimation
1 parent 24a5f83 commit a49828a

File tree

4 files changed

+248
-28
lines changed

4 files changed

+248
-28
lines changed

.gas-snapshot

Lines changed: 28 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@ CrossRatePriceFeedTest:test_latestRoundData_invalidDenominatorPrice(int256) (run
4040
CrossRatePriceFeedTest:test_latestRoundData_invalidNumeratorPrice(int256) (runs: 256, μ: 907390, ~: 907952)
4141
CrossRatePriceFeedTest:test_latestRoundData_realValuesFork() (gas: 70243)
4242
CrossRatePriceFeedTest:test_latestRoundData_realValuesFuzz18(int256,int256) (runs: 256, μ: 1301519, ~: 1301597)
43-
CrossRatePriceFeedTest:test_latestRoundData_realValuesFuzz8(int256,int256) (runs: 256, μ: 1301321, ~: 1301621)
44-
CrossRatePriceFeedTest:test_latestRoundData_revertsOnOverflow(int256) (runs: 256, μ: 935241, ~: 935235)
43+
CrossRatePriceFeedTest:test_latestRoundData_realValuesFuzz8(int256,int256) (runs: 256, μ: 1301315, ~: 1301621)
44+
CrossRatePriceFeedTest:test_latestRoundData_revertsOnOverflow(int256) (runs: 256, μ: 935243, ~: 935235)
4545
CrossRatePriceFeedTest:test_latestRoundData_roundIdOne() (gas: 60318)
46-
CrossRatePriceFeedTest:test_latestRoundData_staleDenominatorPrice(uint256) (runs: 256, μ: 906856, ~: 907132)
47-
CrossRatePriceFeedTest:test_latestRoundData_staleNumeratorPrice(uint256) (runs: 256, μ: 906770, ~: 907046)
46+
CrossRatePriceFeedTest:test_latestRoundData_staleDenominatorPrice(uint256) (runs: 256, μ: 906851, ~: 907132)
47+
CrossRatePriceFeedTest:test_latestRoundData_staleNumeratorPrice(uint256) (runs: 256, μ: 906765, ~: 907046)
4848
CrossRatePriceFeedTest:test_latestRoundData_startedAtZero() (gas: 60332)
4949
CrossRatePriceFeedTest:test_latestRoundData_usesEarlierUpdatedAt() (gas: 68898)
5050
DeactivateInstruction:test_deactivateInstruction_alreadyDeactivated() (gas: 20424)
@@ -74,33 +74,35 @@ DeploymentAddressesTest:test_transferOnceERC20Action_deployedAddress() (gas: 650
7474
DeploymentAddressesTest:test_treasury_deployedAddress() (gas: 389464)
7575
DeploymentAddressesTest:test_uniswapV3ExactInputAction_deployedAddress() (gas: 1826284)
7676
DeploymentAddressesTest:test_withdrawERC4626Action_deployedAddress() (gas: 864746)
77-
DepositERC4626Test:test_depositERC4626_happyPath() (gas: 481909)
78-
DepositERC4626Test:test_depositERC4626_insufficientBalance() (gas: 258567)
77+
DepositERC4626Test:test_depositERC4626_happyPath() (gas: 437754)
78+
DepositERC4626Test:test_depositERC4626_insufficientBalance() (gas: 247856)
7979
DepositERC4626Test:test_depositERC4626_maxDepositReached() (gas: 150609)
8080
DepositERC4626Test:test_depositERC4626_maxDepositTooLow() (gas: 38646)
8181
DepositERC4626Test:test_depositERC4626_minTotalSharesZero() (gas: 36832)
8282
DepositERC4626Test:test_depositERC4626_recipientZero() (gas: 36769)
8383
DepositERC4626Test:test_depositERC4626_totalSharesTooLow() (gas: 39187)
8484
DepositERC4626Test:test_depositERC4626_valueZero() (gas: 36815)
8585
DepositERC4626Test:test_depositERC4626_vaultZero() (gas: 36798)
86-
EstimateCallOnceGasConstant:testFuzz_callOnce_gasConstant(uint256,(address,bool,uint256,uint256,uint16,bytes4,bytes,(address,uint256,uint256,uint256))) (runs: 256, μ: 4185, ~: 3876)
87-
EstimateDeactivateInstructionGasConstant:testFuzz_deactivateInstruction_gasConstant(uint256,(bytes32,(address,uint256,uint256,uint256))) (runs: 256, μ: 1963, ~: 1959)
88-
EstimateDepositERC4626GasConstant:testFuzz_depositERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4505, ~: 4452)
89-
EstimateRefuelERC20GasConstant:testFuzz_refuelERC20_gasConstant(uint256,uint256,(address,address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3021, ~: 3024)
90-
EstimateRefuelGasConstant:testFuzz_refuel_gasConstant(uint256,uint256,(address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2892, ~: 2835)
91-
EstimateSweepCCTPGasConstant:testFuzz_sweepCCTP_gasConstant(uint256,uint256,(address,uint32,bytes32,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3336, ~: 3306)
92-
EstimateSweepDepositERC4626GasConstant:testFuzz_sweepDepositERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3537, ~: 3516)
93-
EstimateSweepERC20GasConstant:testFuzz_sweepERC20_gasConstant(uint256,uint256,(address,address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3019, ~: 3024)
94-
EstimateSweepGasConstant:testFuzz_sweep_gasConstant(uint256,uint256,(address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2849, ~: 2808)
95-
EstimateSweepUniswapV3GasConstant:testFuzz_sweepUniswapV3_gasConstant(uint256,uint256,(address,address,address,uint24,uint256,uint256,uint256,uint32,uint32,(address,uint256,uint256,uint256))) (runs: 256, μ: 4421, ~: 4398)
96-
EstimateSweepWithdrawERC4626GasConstant:testFuzz_sweepWithdrawERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3285, ~: 3288)
97-
EstimateTransferCCTPGasConstant:testFuzz_transferCCTP_gasConstant(uint256,uint256,(address,uint256,uint32,bytes32,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4225, ~: 4206)
98-
EstimateTransferERC20GasConstant:testFuzz_transferERC20_gasConstant(uint256,uint256,(address,address,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4006, ~: 3978)
99-
EstimateTransferGasConstant:testFuzz_transfer_gasConstant(uint256,uint256,(address,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 3764, ~: 3762)
100-
EstimateTransferOnceERC20GasConstant:testFuzz_transferERC20Once_gasConstant(uint256,(address,address,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2571, ~: 2586)
101-
EstimateTransferOnceGasConstant:testFuzz_transferOnce_gasConstant(uint256,(address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2326, ~: 2289)
102-
EstimateUniswapV3ExactInputGasConstant:testFuzz_uniswapV3ExactInput_gasConstant(uint256,uint256,(address,address,address,uint24,uint256,uint256,uint32,uint32,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 5311, ~: 5316)
103-
EstimateWithdrawERC4626GasConstant:testFuzz_withdrawERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4226, ~: 4206)
86+
EstimateCallOnceGasConstant:testFuzz_callOnce_gasConstant(uint256,(address,bool,uint256,uint256,uint16,bytes4,bytes,(address,uint256,uint256,uint256))) (runs: 256, μ: 4173, ~: 3876)
87+
EstimateDeactivateInstructionGasConstant:testFuzz_deactivateInstruction_gasConstant(uint256,(bytes32,(address,uint256,uint256,uint256))) (runs: 256, μ: 1947, ~: 1887)
88+
EstimateDepositERC4626GasConstant:testFuzz_depositERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4551, ~: 4461)
89+
EstimateRefuelERC20GasConstant:testFuzz_refuelERC20_gasConstant(uint256,uint256,(address,address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3023, ~: 3024)
90+
EstimateRefuelGasConstant:testFuzz_refuel_gasConstant(uint256,uint256,(address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2884, ~: 2826)
91+
EstimateRequestDepositERC7540GasConstant:testFuzz_requestDepositERC7540_gasConstant(uint256,uint256,(address,uint256,address,address,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 257, μ: 4845, ~: 4806)
92+
EstimateSweepCCTPGasConstant:testFuzz_sweepCCTP_gasConstant(uint256,uint256,(address,uint32,bytes32,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3350, ~: 3279)
93+
EstimateSweepDepositERC4626GasConstant:testFuzz_sweepDepositERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3583, ~: 3534)
94+
EstimateSweepERC20GasConstant:testFuzz_sweepERC20_gasConstant(uint256,uint256,(address,address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3027, ~: 3042)
95+
EstimateSweepGasConstant:testFuzz_sweep_gasConstant(uint256,uint256,(address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2853, ~: 2799)
96+
EstimateSweepRequestDepositERC7540GasConstant:testFuzz_sweepRequestDepositERC7540_gasConstant(uint256,uint256,(address,address,address,uint256,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 257, μ: 3884, ~: 3834)
97+
EstimateSweepUniswapV3GasConstant:testFuzz_sweepUniswapV3_gasConstant(uint256,uint256,(address,address,address,uint24,uint256,uint256,uint256,uint32,uint32,(address,uint256,uint256,uint256))) (runs: 256, μ: 4407, ~: 4371)
98+
EstimateSweepWithdrawERC4626GasConstant:testFuzz_sweepWithdrawERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 3288, ~: 3288)
99+
EstimateTransferCCTPGasConstant:testFuzz_transferCCTP_gasConstant(uint256,uint256,(address,uint256,uint32,bytes32,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4218, ~: 4206)
100+
EstimateTransferERC20GasConstant:testFuzz_transferERC20_gasConstant(uint256,uint256,(address,address,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 3970, ~: 3951)
101+
EstimateTransferGasConstant:testFuzz_transfer_gasConstant(uint256,uint256,(address,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 3734, ~: 3780)
102+
EstimateTransferOnceERC20GasConstant:testFuzz_transferERC20Once_gasConstant(uint256,(address,address,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2570, ~: 2586)
103+
EstimateTransferOnceGasConstant:testFuzz_transferOnce_gasConstant(uint256,(address,uint256,uint256,(address,uint256,uint256,uint256))) (runs: 256, μ: 2322, ~: 2298)
104+
EstimateUniswapV3ExactInputGasConstant:testFuzz_uniswapV3ExactInput_gasConstant(uint256,uint256,(address,address,address,uint24,uint256,uint256,uint32,uint32,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 5343, ~: 5298)
105+
EstimateWithdrawERC4626GasConstant:testFuzz_withdrawERC4626_gasConstant(uint256,uint256,(address,address,uint256,uint256,(uint256,uint256,uint256,uint256),(address,uint256,uint256,uint256))) (runs: 256, μ: 4215, ~: 4206)
104106
FeeTokenRegistryTest:test_addFeeToken_alreadyRegistered() (gas: 1898)
105107
FeeTokenRegistryTest:test_addFeeToken_happyPath() (gas: 37590)
106108
FeeTokenRegistryTest:test_addFeeToken_roundIdZero() (gas: 12004)
@@ -113,10 +115,10 @@ FeeTokenRegistryTest:test_removeFeeToken_notRegistered() (gas: 10331)
113115
FeeTokenRegistryTest:test_weiToToken_correctnessDAI() (gas: 4222)
114116
FeeTokenRegistryTest:test_weiToToken_correctnessUSDT() (gas: 4222)
115117
FeeTokenRegistryTest:test_weiToToken_latestPriceNegative() (gas: 3973)
116-
FeeTokenRegistryTest:test_weiToToken_overflow(int256,uint256,uint64) (runs: 256, μ: 4097, ~: 4217)
118+
FeeTokenRegistryTest:test_weiToToken_overflow(int256,uint256,uint64) (runs: 256, μ: 4098, ~: 4217)
117119
FeeTokenRegistryTest:test_weiToToken_stalePriceFeed() (gas: 4085)
118120
FeeTokenRegistryTest:test_weiToToken_tokenNotRegistered() (gas: 8891)
119-
FeeTokenRegistryTest:test_weiToToken_underflow(int256,uint256,uint64) (runs: 256, μ: 4080, ~: 4184)
121+
FeeTokenRegistryTest:test_weiToToken_underflow(int256,uint256,uint64) (runs: 256, μ: 4081, ~: 4184)
120122
GatewayTest:test_isDelegated_false() (gas: 13206)
121123
GatewayTest:test_isDelegated_true() (gas: 10386)
122124
GatewayTest:test_safeDeactivateInstruction_happyPath() (gas: 43658)

.github/deployment/networks/.env-gas-constants

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ REFUEL_ERC20_ACTION_GAS_CONSTANT=104500
88
SWEEP_ACTION_GAS_CONSTANT=104000
99
SWEEP_CCTP_ACTION_GAS_CONSTANT=104500
1010
SWEEP_DEPOSIT_ERC4626_ACTION_GAS_CONSTANT=104500
11-
REQUEST_DEPOSIT_ERC7540_ACTION_GAS_CONSTANT=
12-
SWEEP_REQUEST_DEPOSIT_ERC7540_ACTION_GAS_CONSTANT=
11+
REQUEST_DEPOSIT_ERC7540_ACTION_GAS_CONSTANT=106500
12+
SWEEP_REQUEST_DEPOSIT_ERC7540_ACTION_GAS_CONSTANT=105000
1313
SWEEP_ERC20_ACTION_GAS_CONSTANT=104000
1414
SWEEP_UNISWAP_V3_ACTION_GAS_CONSTANT=106000
1515
SWEEP_WITHDRAW_ERC4626_ACTION_GAS_CONSTANT=104500
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// SPDX-License-Identifier: MIT OR Apache-2.0
2+
pragma solidity ^0.8.26;
3+
4+
import {VmSafe} from "forge-std/src/Vm.sol";
5+
6+
import {IERC20} from "@openzeppelin-contracts/token/ERC20/IERC20.sol";
7+
import {MockV3Aggregator} from "@chainlink-contracts/src/v0.8/shared/mocks/MockV3Aggregator.sol";
8+
import {IWETH9} from "../../src/actions/external/IWETH9.sol";
9+
10+
import {InstructionLib} from "../../src/libraries/Instruction.sol";
11+
12+
import {InstructionForkTestContext} from "../utils/InstructionForkTestContext.sol";
13+
14+
import {FeeTokenRegistry} from "../../src/infrastructure/FeeTokenRegistry.sol";
15+
import {Treasury} from "../../src/infrastructure/Treasury.sol";
16+
17+
import {RequestDepositERC7540Action} from "../../src/actions/RequestDepositERC7540Action.sol";
18+
import {IRequestDepositERC7540Action} from "../../src/actions/interfaces/IRequestDepositERC7540Action.sol";
19+
20+
import {ERC20MockWithDecimals} from "../mocks/ERC20MockWithDecimals.sol";
21+
import {ERC4626Mock} from "../mocks/ERC4626Mock.sol";
22+
import {ERC7540DepositMock} from "../mocks/ERC7540DepositMock.sol";
23+
24+
contract EstimateRequestDepositERC7540GasConstant is InstructionForkTestContext {
25+
using InstructionLib for InstructionLib.Instruction;
26+
27+
Treasury treasury;
28+
FeeTokenRegistry feeTokenRegistry;
29+
30+
RequestDepositERC7540Action requestDepositERC7540Action;
31+
32+
ERC20MockWithDecimals public mockUSDC;
33+
ERC4626Mock public underlyingVault;
34+
ERC7540DepositMock public mockVault;
35+
36+
uint256 public constant REQUEST_DEPOSIT_ERC7540_GAS_CONSTANT = 106_500;
37+
uint256 public constant USER_MINT_AMOUNT = 100_000e6;
38+
39+
constructor() {
40+
string memory rpcUrl = vm.envOr("MAINNET_RPC_URL", vm.rpcUrl("mainnet"));
41+
vm.createSelectFork(rpcUrl);
42+
43+
treasury = new Treasury(address(this));
44+
feeTokenRegistry = new FeeTokenRegistry(address(this));
45+
46+
MockV3Aggregator priceFeed = new MockV3Aggregator(18, 1e18);
47+
feeTokenRegistry.addFeeToken(MAINNET_WETH9, address(priceFeed), type(uint40).max);
48+
49+
requestDepositERC7540Action = new RequestDepositERC7540Action(
50+
address(feeTokenRegistry), address(treasury), REQUEST_DEPOSIT_ERC7540_GAS_CONSTANT
51+
);
52+
53+
mockUSDC = new ERC20MockWithDecimals(6);
54+
underlyingVault = new ERC4626Mock(IERC20(mockUSDC));
55+
mockVault = new ERC7540DepositMock(IERC20(underlyingVault));
56+
57+
mockUSDC.mint(address(user), USER_MINT_AMOUNT);
58+
vm.startPrank(address(user));
59+
mockUSDC.approve(address(underlyingVault), USER_MINT_AMOUNT);
60+
underlyingVault.deposit(USER_MINT_AMOUNT, address(user));
61+
vm.stopPrank();
62+
63+
actionManager.addAction(address(requestDepositERC7540Action));
64+
}
65+
66+
function testFuzz_requestDepositERC7540_gasConstant(
67+
uint256 salt,
68+
uint256 maxExecutions,
69+
IRequestDepositERC7540Action.RequestDepositERC7540 memory arguments
70+
) public {
71+
arguments.vault = address(mockVault);
72+
arguments.recipient = address(user);
73+
arguments.controller = address(user);
74+
arguments.minTotalShares = 1;
75+
76+
uint256 userBalance = IERC20(underlyingVault).balanceOf(address(user));
77+
vm.assume(arguments.assets > 0 && arguments.assets <= userBalance);
78+
vm.assume(arguments.minDeposit <= arguments.assets);
79+
80+
vm.assume(arguments.schedule.startAt < block.timestamp && arguments.schedule.startBy > block.timestamp);
81+
vm.assume(arguments.schedule.interval < type(uint40).max && arguments.schedule.timeout < type(uint40).max);
82+
83+
arguments.fee.token = MAINNET_WETH9;
84+
vm.assume(arguments.fee.maxBaseFeePerGas > 0 && arguments.fee.maxBaseFeePerGas < type(uint64).max);
85+
vm.assume(arguments.fee.maxPriorityFeePerGas > 0 && arguments.fee.maxPriorityFeePerGas < type(uint64).max);
86+
vm.assume(arguments.fee.maxBaseFeePerGas + arguments.fee.maxPriorityFeePerGas < type(uint64).max);
87+
vm.assume(arguments.fee.executionFee > 0 && arguments.fee.executionFee < 100 ether);
88+
89+
vm.fee(arguments.fee.maxBaseFeePerGas);
90+
vm.txGasPrice(arguments.fee.maxBaseFeePerGas + arguments.fee.maxPriorityFeePerGas);
91+
92+
vm.deal(address(user), type(uint248).max - 1);
93+
vm.prank(address(user));
94+
IWETH9(MAINNET_WETH9).deposit{value: address(user).balance}();
95+
96+
buildInstruction(salt, maxExecutions, address(requestDepositERC7540Action), abi.encode(arguments));
97+
98+
uint256 gasUsed = gasleft();
99+
gateway.safeExecuteInstruction(address(user), instruction, instructionSig);
100+
gasUsed -= gasleft();
101+
102+
uint256 feeCollected = IERC20(MAINNET_WETH9).balanceOf(address(treasury));
103+
uint256 executionCost = gasUsed * tx.gasprice;
104+
105+
assertGe(feeCollected, executionCost + arguments.fee.executionFee);
106+
107+
vm.resetGasMetering();
108+
}
109+
}

0 commit comments

Comments
 (0)