Skip to content

Commit 05f72de

Browse files
Optimise trails data slice (#67)
1 parent 9bdf43c commit 05f72de

File tree

2 files changed

+36
-48
lines changed

2 files changed

+36
-48
lines changed

.gas-snapshot

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,20 @@ TrailsIntentEntrypointTest:testPermitAmountExcessiveWithFee() (gas: 83027)
4848
TrailsIntentEntrypointTest:testPermitAmountInsufficientWithFee() (gas: 82059)
4949
TrailsIntentEntrypointTest:testUsedIntentsMapping() (gas: 113770)
5050
TrailsIntentEntrypointTest:testVersionConstant() (gas: 10381)
51-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1773856)
52-
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1764409)
53-
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1764205)
54-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 7285038)
55-
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4709602)
56-
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4709648)
51+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_SameAddress() (gas: 1722289)
52+
TrailsRouterDeploymentTest:test_DeployTrailsRouter_Success() (gas: 1712948)
53+
TrailsRouterDeploymentTest:test_DeployedRouter_HasCorrectConfiguration() (gas: 1712744)
54+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_SameAddress() (gas: 7130985)
55+
TrailsRouterShimDeploymentTest:test_DeployRouterShim_Success() (gas: 4606895)
56+
TrailsRouterShimDeploymentTest:test_DeployedContract_HasCorrectConfiguration() (gas: 4606941)
5757
TrailsRouterShimTest:testConstructorValidation() (gas: 69336)
5858
TrailsRouterShimTest:testForwardToRouterReturnValue() (gas: 713355)
5959
TrailsRouterShimTest:testRouterAddressImmutable() (gas: 1391679)
6060
TrailsRouterShimTest:test_constructor_revert_zeroRouter() (gas: 68984)
61-
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1766894)
61+
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_sstore_inactive() (gas: 1715664)
6262
TrailsRouterShimTest:test_delegatecall_forwards_and_sets_sentinel_tstore_active() (gas: 38392)
6363
TrailsRouterShimTest:test_delegatecall_router_revert_bubbles_as_RouterCallFailed() (gas: 82109)
64-
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1749120)
64+
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_sstore_when_no_tstore() (gas: 1697892)
6565
TrailsRouterShimTest:test_delegatecall_sets_sentinel_with_tstore_when_supported() (gas: 20706)
6666
TrailsRouterShimTest:test_direct_handleSequenceDelegateCall_reverts_not_delegatecall() (gas: 9840)
6767
TrailsRouterShimTest:test_forwardToRouter_return_data_handling() (gas: 729052)
@@ -74,11 +74,11 @@ TrailsRouterShimTest:test_handleSequenceDelegateCall_with_eth_value() (gas: 3210
7474
TrailsRouterShimTest:test_handleSequenceDelegateCall_zero_call_value() (gas: 26873)
7575
TrailsRouterShimTest:test_sentinel_setting_with_different_op_hashes() (gas: 36405)
7676
TrailsRouterTest:testDelegateCallWithETH() (gas: 326063)
77-
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 520730)
78-
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72512)
77+
TrailsRouterTest:testExecute_WithFailingMulticall() (gas: 450208)
78+
TrailsRouterTest:testHandleSequenceDelegateCall_InjectAndCall() (gas: 72545)
7979
TrailsRouterTest:testHandleSequenceDelegateCall_RefundAndSweep() (gas: 85300)
8080
TrailsRouterTest:testHandleSequenceDelegateCall_Sweep() (gas: 48605)
81-
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59810)
81+
TrailsRouterTest:testHandleSequenceDelegateCall_ValidateOpHashAndSweep() (gas: 59682)
8282
TrailsRouterTest:testInjectAndCall_NoReplacementNeeded() (gas: 989297)
8383
TrailsRouterTest:testInjectAndCall_WithReplacement() (gas: 995954)
8484
TrailsRouterTest:testInjectAndCall_WithTokenZeroBalance() (gas: 647003)
@@ -88,7 +88,7 @@ TrailsRouterTest:testInjectSweepAndCall_WithETH_TargetCallFails() (gas: 57470)
8888
TrailsRouterTest:testInjectSweepAndCall_WithETH_ZeroBalance() (gas: 12588)
8989
TrailsRouterTest:testInjectSweepAndCall_WithToken_TargetCallFails() (gas: 995574)
9090
TrailsRouterTest:testInjectSweepAndCall_WithToken_ZeroBalance() (gas: 648071)
91-
TrailsRouterTest:testInsufficientEthValidation() (gas: 95772)
91+
TrailsRouterTest:testInsufficientEthValidation() (gas: 25250)
9292
TrailsRouterTest:testNativeTransferFailure() (gas: 86597)
9393
TrailsRouterTest:testRefundAndSweep_FullRefund() (gas: 56088)
9494
TrailsRouterTest:testRefundAndSweep_PartialRefundERC20() (gas: 88307)
@@ -99,20 +99,20 @@ TrailsRouterTest:testRevertWhen_injectSweepAndCall_InsufficientAllowance() (gas:
9999
TrailsRouterTest:testRevertWhen_injectSweepAndCall_NoEthSent() (gas: 15756)
100100
TrailsRouterTest:testSweepAndCallETH() (gas: 78594)
101101
TrailsRouterTest:testValidateOpHashAndSweep_WithoutSentinel() (gas: 16410)
102-
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 95127)
103-
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 99771)
104-
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 156006)
102+
TrailsRouterTest:test_Execute_FromContract_ShouldPreserveContractAsSender() (gas: 24565)
103+
TrailsRouterTest:test_Execute_FromEOA_ShouldPreserveEOAAsSender() (gas: 29209)
104+
TrailsRouterTest:test_Execute_WithMultipleCalls() (gas: 30915)
105105
TrailsRouterTest:test_Multicall3Address_IsCorrect() (gas: 6570)
106106
TrailsRouterTest:test_ReceiveETH_ShouldAcceptETH() (gas: 18098)
107-
TrailsRouterTest:test_RevertWhen_allowFailure_true_allCalls() (gas: 281762)
108-
TrailsRouterTest:test_RevertWhen_allowFailure_true_firstOfMultipleCalls() (gas: 280264)
109-
TrailsRouterTest:test_RevertWhen_allowFailure_true_lastOfMultipleCalls() (gas: 280915)
110-
TrailsRouterTest:test_RevertWhen_allowFailure_true_middleOfMultipleCalls() (gas: 280480)
111-
TrailsRouterTest:test_RevertWhen_allowFailure_true_singleCall() (gas: 168096)
112-
TrailsRouterTest:test_RevertWhen_execute_withETH_allowFailure_true() (gas: 94756)
113-
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 99156)
114-
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 101836)
115-
TrailsRouterTest:test_RevertWhen_pullAndExecute_allowFailure_true() (gas: 169275)
107+
TrailsRouterTest:test_RevertWhen_allowFailure_true_allCalls() (gas: 102266)
108+
TrailsRouterTest:test_RevertWhen_allowFailure_true_firstOfMultipleCalls() (gas: 100768)
109+
TrailsRouterTest:test_RevertWhen_allowFailure_true_lastOfMultipleCalls() (gas: 101419)
110+
TrailsRouterTest:test_RevertWhen_allowFailure_true_middleOfMultipleCalls() (gas: 100984)
111+
TrailsRouterTest:test_RevertWhen_allowFailure_true_singleCall() (gas: 97574)
112+
TrailsRouterTest:test_RevertWhen_execute_withETH_allowFailure_true() (gas: 24234)
113+
TrailsRouterTest:test_RevertWhen_pullAmountAndExecute_InsufficientAllowance() (gas: 28634)
114+
TrailsRouterTest:test_RevertWhen_pullAndExecute_InsufficientAllowance() (gas: 31314)
115+
TrailsRouterTest:test_RevertWhen_pullAndExecute_allowFailure_true() (gas: 98753)
116116
TrailsRouterTest:test_amount_offset_out_of_bounds() (gas: 278820)
117117
TrailsRouterTest:test_direct_sweep_reverts_not_delegatecall() (gas: 12139)
118118
TrailsRouterTest:test_handleSequenceDelegateCall_dispatches_to_sweep_native() (gas: 50425)
@@ -121,21 +121,21 @@ TrailsRouterTest:test_native_transfer_failed() (gas: 89620)
121121
TrailsRouterTest:test_no_tokens_to_pull() (gas: 650574)
122122
TrailsRouterTest:test_no_tokens_to_sweep() (gas: 909059)
123123
TrailsRouterTest:test_placeholder_mismatch() (gas: 279474)
124-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 97367)
125-
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 107947)
126-
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 144603)
127-
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 144251)
124+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_InsufficientEthSent() (gas: 26845)
125+
TrailsRouterTest:test_pullAmountAndExecute_WithETH_ShouldTransferAndExecute() (gas: 37385)
126+
TrailsRouterTest:test_pullAmountAndExecute_WithToken_ShouldTransferAndExecute() (gas: 74041)
127+
TrailsRouterTest:test_pullAmountAndExecute_WithValidToken_ShouldTransferAndExecute() (gas: 73689)
128128
TrailsRouterTest:test_pullAndExecute_WithETH_NoEthSent() (gas: 18411)
129-
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 108961)
130-
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 564910)
131-
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 141710)
129+
TrailsRouterTest:test_pullAndExecute_WithETH_ShouldTransferAndExecute() (gas: 38399)
130+
TrailsRouterTest:test_pullAndExecute_WithFailingMulticall() (gas: 494387)
131+
TrailsRouterTest:test_pullAndExecute_WithValidToken_ShouldTransferFullBalanceAndExecute() (gas: 72465)
132132
TrailsRouterTest:test_refundAndSweep_erc20_partialRefund() (gas: 110365)
133133
TrailsRouterTest:test_refundAndSweep_native_partialRefund() (gas: 92161)
134134
TrailsRouterTest:test_success_sentinel_not_set() (gas: 15750)
135135
TrailsRouterTest:test_sweep_erc20Token() (gas: 77703)
136136
TrailsRouterTest:test_sweep_nativeToken() (gas: 49961)
137-
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 62220)
138-
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 130499)
137+
TrailsRouterTest:test_validateOpHashAndSweep_native_success() (gas: 62092)
138+
TrailsRouterTest:test_validateOpHashAndSweep_native_success_tstore() (gas: 130257)
139139
TrailsSentinelLibTest:test_Constants_DoNotChange() (gas: 735)
140140
TrailsSentinelLibTest:test_SentinelNamespace_Computation() (gas: 328)
141141
TrailsSentinelLibTest:test_SentinelNamespace_Constant() (gas: 548)

src/TrailsRouter.sol

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -370,22 +370,19 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
370370
}
371371

372372
/// forge-lint: disable-next-line(mixed-case-function)
373-
function _validateRouterCall(bytes memory callData) internal pure {
373+
function _validateRouterCall(bytes calldata callData) internal pure {
374374
// Extract function selector
375375
if (callData.length < 4) revert InvalidFunctionSelector(bytes4(0));
376376

377-
bytes4 selector;
378-
assembly {
379-
selector := mload(add(callData, 32))
380-
}
377+
bytes4 selector = bytes4(callData[0:4]);
381378

382379
// Only allow `aggregate3Value` calls (0x174dea71)
383380
if (selector != 0x174dea71) {
384381
revert InvalidFunctionSelector(selector);
385382
}
386383

387384
// Decode and validate the Call3Value[] array to ensure allowFailure=false for all calls
388-
IMulticall3.Call3Value[] memory calls = abi.decode(_sliceCallData(callData, 4), (IMulticall3.Call3Value[]));
385+
IMulticall3.Call3Value[] memory calls = abi.decode(callData[4:], (IMulticall3.Call3Value[]));
389386

390387
// Iterate through all calls and verify allowFailure is false
391388
for (uint256 i = 0; i < calls.length; i++) {
@@ -394,13 +391,4 @@ contract TrailsRouter is IDelegatedExtension, ITrailsRouter, DelegatecallGuard,
394391
}
395392
}
396393
}
397-
398-
/// forge-lint: disable-next-line(mixed-case-function)
399-
function _sliceCallData(bytes memory data, uint256 start) internal pure returns (bytes memory) {
400-
bytes memory result = new bytes(data.length - start);
401-
for (uint256 i = 0; i < result.length; i++) {
402-
result[i] = data[start + i];
403-
}
404-
return result;
405-
}
406394
}

0 commit comments

Comments
 (0)