Skip to content

Commit 7a09716

Browse files
committed
chore: update gas snapshots and refactor TrailsRouter and TrailsRouterShim
- Updated gas usage values for various test cases in TrailsRouter and TrailsRouterShim to reflect recent performance metrics. - Refactored TrailsRouter to include a new internal function `_validateRouterCall` for validating function selectors. - Removed the redundant `_validateRouterCall` function from TrailsRouterShim as validation is no longer enforced. - Adjusted test cases to utilize the new `aggregate3Value` function in IMulticall3, ensuring consistency across tests.
1 parent e525140 commit 7a09716

File tree

6 files changed

+238
-141
lines changed

6 files changed

+238
-141
lines changed

.gas-snapshot

Lines changed: 45 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -41,36 +41,37 @@ TrailsIntentEntrypointTest:testInvalidNonceReverts() (gas: 54680)
4141
TrailsIntentEntrypointTest:testNonceIncrementsOnDeposit() (gas: 113066)
4242
TrailsIntentEntrypointTest:testUsedIntentsMapping() (gas: 113936)
4343
TrailsIntentEntrypointTest:testVersionConstant() (gas: 10271)
44-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1559871)
45-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1550871)
46-
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1550667)
47-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 6683217)
48-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4320770)
49-
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4320816)
50-
TrailsRouterShimTest:testConstructorValidation() (gas: 69386)
51-
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 750442)
52-
TrailsRouterShimTest:testRouterAddressImmutable() (gas: 1428747)
53-
TrailsRouterShimTest:test_constructor_revert_zeroRouter() (gas: 69034)
54-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1554508)
55-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 38562)
56-
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82200)
57-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1536737)
58-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20876)
44+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1605820)
45+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1596715)
46+
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1596511)
47+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 6783023)
48+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4374911)
49+
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4374957)
50+
TrailsRouterShimTest:testConstructorValidation() (gas: 69336)
51+
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 713355)
52+
TrailsRouterShimTest:testRouterAddressImmutable() (gas: 1391679)
53+
TrailsRouterShimTest:test_constructor_revert_zeroRouter() (gas: 68984)
54+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1599952)
55+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 38392)
56+
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82109)
57+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1582181)
58+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20706)
5959
TrailsRouterShimTest:test_direct_handleSequenceDelegateCall_reverts_not_delegatecall() (gas: 9840)
60-
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 766351)
61-
TrailsRouterShimTest:test_forwardToRouter_revert_with_custom_error() (gas: 724461)
62-
TrailsRouterShimTest:test_handleSequenceDelegateCall_empty_calldata() (gas: 13917)
63-
TrailsRouterShimTest:test_handleSequenceDelegateCall_large_calldata() (gas: 1682519)
64-
TrailsRouterShimTest:test_handleSequenceDelegateCall_max_call_value() (gas: 31893)
65-
TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 32194)
66-
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26964)
67-
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36731)
60+
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 729052)
61+
TrailsRouterShimTest:test_forwardToRouter_revert_with_custom_error() (gas: 687245)
62+
TrailsRouterShimTest:test_handleSequenceDelegateCall_allows_arbitrary_selector() (gas: 18502)
63+
TrailsRouterShimTest:test_handleSequenceDelegateCall_empty_calldata() (gas: 13826)
64+
TrailsRouterShimTest:test_handleSequenceDelegateCall_large_calldata() (gas: 1682428)
65+
TrailsRouterShimTest:test_handleSequenceDelegateCall_max_call_value() (gas: 31802)
66+
TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 32103)
67+
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26873)
68+
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36405)
6869
TrailsRouterTest:testDelegateCallWithETH() (gas: 325931)
69-
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 362156)
70+
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 448836)
7071
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72380)
7172
TrailsRouterTest:testHandleSequenceDelegateCall_RefundAndSweep() (gas: 85168)
72-
TrailsRouterTest:testHandleSequenceDelegateCall_Sweep() (gas: 48462)
73-
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59243)
73+
TrailsRouterTest:testHandleSequenceDelegateCall_Sweep() (gas: 48473)
74+
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59353)
7475
TrailsRouterTest:testInjectAndCall_NoReplacementNeeded() (gas: 989253)
7576
TrailsRouterTest:testInjectAndCall_WithReplacement() (gas: 995844)
7677
TrailsRouterTest:testInjectAndCall_WithTokenZeroBalance() (gas: 646871)
@@ -80,7 +81,7 @@ TrailsRouterTest:testInjectSweepAndCall_WithETH_TargetCallFails() (gas: 57426)
8081
TrailsRouterTest:testInjectSweepAndCall_WithETH_ZeroBalance() (gas: 12478)
8182
TrailsRouterTest:testInjectSweepAndCall_WithToken_TargetCallFails() (gas: 995508)
8283
TrailsRouterTest:testInjectSweepAndCall_WithToken_ZeroBalance() (gas: 648027)
83-
TrailsRouterTest:testInsufficientEthValidation() (gas: 23236)
84+
TrailsRouterTest:testInsufficientEthValidation() (gas: 23750)
8485
TrailsRouterTest:testNativeTransferFailure() (gas: 86531)
8586
TrailsRouterTest:testRefundAndSweep_FullRefund() (gas: 55956)
8687
TrailsRouterTest:testRefundAndSweep_PartialRefundERC20() (gas: 88241)
@@ -91,36 +92,36 @@ TrailsRouterTest:testRevertWhen_injectSweepAndCall_InsufficientAllowance() (gas:
9192
TrailsRouterTest:testRevertWhen_injectSweepAndCall_NoEthSent() (gas: 15624)
9293
TrailsRouterTest:testSweepAndCallETH() (gas: 78440)
9394
TrailsRouterTest:testValidateOpHashAndSweep_WithoutSentinel() (gas: 16278)
94-
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 22408)
95-
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 27053)
96-
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 27513)
95+
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 23089)
96+
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 27733)
97+
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 28381)
9798
TrailsRouterTest:test_Multicall3Address_IsCorrect() (gas: 6460)
9899
TrailsRouterTest:test_ReceiveETH_ShouldAcceptETH() (gas: 17988)
99-
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 26626)
100-
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 29403)
100+
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 27134)
101+
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 29911)
101102
TrailsRouterTest:test_amount_offset_out_of_bounds() (gas: 278776)
102103
TrailsRouterTest:test_direct_sweep_reverts_not_delegatecall() (gas: 12007)
103-
TrailsRouterTest:test_handleSequenceDelegateCall_dispatches_to_sweep_native() (gas: 50304)
104+
TrailsRouterTest:test_handleSequenceDelegateCall_dispatches_to_sweep_native() (gas: 50315)
104105
TrailsRouterTest:test_handleSequenceDelegateCall_invalid_selector_reverts() (gas: 10223)
105106
TrailsRouterTest:test_native_transfer_failed() (gas: 89488)
106-
TrailsRouterTest:test_no_tokens_to_pull() (gas: 646915)
107+
TrailsRouterTest:test_no_tokens_to_pull() (gas: 651011)
107108
TrailsRouterTest:test_no_tokens_to_sweep() (gas: 908971)
108109
TrailsRouterTest:test_placeholder_mismatch() (gas: 279364)
109-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 24897)
110-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 35264)
111-
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 71793)
112-
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 71463)
113-
TrailsRouterTest:test_pullAndExecute_WithETH_NoEthSent() (gas: 18208)
114-
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 36088)
115-
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 406679)
116-
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 70639)
110+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 25411)
111+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 35947)
112+
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 72472)
113+
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 72142)
114+
TrailsRouterTest:test_pullAndExecute_WithETH_NoEthSent() (gas: 18721)
115+
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 36768)
116+
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 492940)
117+
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 71182)
117118
TrailsRouterTest:test_refundAndSweep_erc20_partialRefund() (gas: 110365)
118119
TrailsRouterTest:test_refundAndSweep_native_partialRefund() (gas: 92029)
119120
TrailsRouterTest:test_success_sentinel_not_set() (gas: 15640)
120121
TrailsRouterTest:test_sweep_erc20Token() (gas: 77571)
121122
TrailsRouterTest:test_sweep_nativeToken() (gas: 49829)
122-
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 61632)
123-
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 129383)
123+
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 61741)
124+
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 129588)
124125
TrailsSentinelLibTest:test_Constants_DoNotChange() (gas: 735)
125126
TrailsSentinelLibTest:test_SentinelNamespace_Computation() (gas: 328)
126127
TrailsSentinelLibTest:test_SentinelNamespace_Constant() (gas: 548)

src/TrailsRouter.sol

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
3232

3333
error NativeTransferFailed();
3434
error InvalidDelegatedSelector(bytes4 selector);
35+
error InvalidFunctionSelector(bytes4 selector);
3536
error SuccessSentinelNotSet();
3637
error NoEthSent();
3738
error NoTokensToPull();
@@ -55,6 +56,7 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
5556

5657
/// @inheritdoc ITrailsRouter
5758
function execute(bytes calldata data) public payable returns (IMulticall3.Result[] memory returnResults) {
59+
_validateRouterCall(data);
5860
(bool success, bytes memory returnData) = MULTICALL3.delegatecall(data);
5961
if (!success) revert TargetCallFailed(returnData);
6062
return abi.decode(returnData, (IMulticall3.Result[]));
@@ -66,6 +68,7 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
6668
payable
6769
returns (IMulticall3.Result[] memory returnResults)
6870
{
71+
_validateRouterCall(data);
6972
if (token == address(0)) {
7073
if (msg.value == 0) revert NoEthSent();
7174
} else {
@@ -85,6 +88,7 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
8588
payable
8689
returns (IMulticall3.Result[] memory returnResults)
8790
{
91+
_validateRouterCall(data);
8892
if (token == address(0)) {
8993
if (msg.value < amount) revert InsufficientEth(amount, msg.value);
9094
} else {
@@ -365,4 +369,20 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
365369
if (!success) revert TargetCallFailed(result);
366370
}
367371
}
372+
373+
/// forge-lint: disable-next-line(mixed-case-function)
374+
function _validateRouterCall(bytes memory callData) internal pure {
375+
// Extract function selector
376+
if (callData.length < 4) revert InvalidFunctionSelector(bytes4(0));
377+
378+
bytes4 selector;
379+
assembly {
380+
selector := mload(add(callData, 32))
381+
}
382+
383+
// Only allow `aggregate3Value` calls (0x174dea71)
384+
if (selector != 0x174dea71) {
385+
revert InvalidFunctionSelector(selector);
386+
}
387+
}
368388
}

src/TrailsRouterShim.sol

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ contract TrailsRouterShim is ITrailsRouterShim, DelegatecallGuard, Tstorish {
2424

2525
error RouterCallFailed(bytes data);
2626
error ZeroRouterAddress();
27-
error InvalidFunctionSelector(bytes4 selector);
2827

2928
// -------------------------------------------------------------------------
3029
// Constructor
@@ -55,9 +54,7 @@ contract TrailsRouterShim is ITrailsRouterShim, DelegatecallGuard, Tstorish {
5554
// Decode the inner call data and call value forwarded to the router
5655
(bytes memory inner, uint256 callValue) = abi.decode(data, (bytes, uint256));
5756

58-
// Validate that only aggregate3Value() is called
59-
_validateRouterCall(inner);
60-
57+
// Forward the call to the router
6158
bytes memory routerReturn = _forwardToRouter(inner, callValue);
6259

6360
// Set the success sentinel storage slot for the opHash
@@ -73,22 +70,6 @@ contract TrailsRouterShim is ITrailsRouterShim, DelegatecallGuard, Tstorish {
7370
// Internal Helpers
7471
// -------------------------------------------------------------------------
7572

76-
/// forge-lint: disable-next-line(mixed-case-function)
77-
function _validateRouterCall(bytes memory callData) internal pure {
78-
// Extract function selector
79-
if (callData.length < 4) revert InvalidFunctionSelector(bytes4(0));
80-
81-
bytes4 selector;
82-
assembly {
83-
selector := mload(add(callData, 32))
84-
}
85-
86-
// Only allow `aggregate3Value` calls (0x174dea71)
87-
if (selector != 0x174dea71) {
88-
revert InvalidFunctionSelector(selector);
89-
}
90-
}
91-
9273
/// forge-lint: disable-next-line(mixed-case-function)
9374
function _forwardToRouter(bytes memory forwardData, uint256 callValue) internal returns (bytes memory) {
9475
(bool success, bytes memory ret) = ROUTER.call{value: callValue}(forwardData);

0 commit comments

Comments
 (0)