diff --git a/.gas-snapshot b/.gas-snapshot index 3e679f2c..a7636a26 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,5 +1,5 @@ Vyper version: 0.4.1b2+commit.0abcf452 -Forge version: forge 0.2.0 (57bb12e 2024-11-06T00:21:40.682166819Z) +Forge version: forge 0.2.0 (58bf161 2024-11-06T16:27:58.427306827Z) Vyper config: { "optimize": "gas" @@ -614,11 +614,11 @@ MessageHashUtilsTest:testFuzzToTypedDataHash(string,string) (runs: 256, μ: 9957 MessageHashUtilsTest:testToDataWithIntendedValidatorHash() (gas: 11133) MessageHashUtilsTest:testToDataWithIntendedValidatorHashSelf() (gas: 11657) MessageHashUtilsTest:testToTypedDataHash() (gas: 8736) -MulticallTest:testMulticallRevert() (gas: 1150311) -MulticallTest:testMulticallSelfRevert() (gas: 2212951) +MulticallTest:testMulticallRevert() (gas: 1150320) +MulticallTest:testMulticallSelfRevert() (gas: 2212969) MulticallTest:testMulticallSelfSuccess() (gas: 3335144) MulticallTest:testMulticallSuccess() (gas: 1158796) -MulticallTest:testMulticallValueRevertCase1() (gas: 1209165) +MulticallTest:testMulticallValueRevertCase1() (gas: 1209174) MulticallTest:testMulticallValueRevertCase2() (gas: 1210139) MulticallTest:testMulticallValueSuccess() (gas: 1237243) MulticallTest:testMultistaticcallRevert() (gas: 1040449054) @@ -680,13 +680,13 @@ SignatureCheckerTest:testFuzzEOAWithInvalidSignature(bytes,string) (runs: 256, SignatureCheckerTest:testFuzzEOAWithInvalidSigner(string,string) (runs: 256, μ: 20409, ~: 20410) SignatureCheckerTest:testFuzzEOAWithValidSignature(string,string) (runs: 256, μ: 20341, ~: 20342) SignatureCheckerTest:testInitialSetup() (gas: 8356) -TimelockControllerInvariants:statefulFuzzExecutedLessThanOrEqualToScheduled() (runs: 256, calls: 3840, reverts: 1303) +TimelockControllerInvariants:statefulFuzzExecutedLessThanOrEqualToScheduled() (runs: 256, calls: 3840, reverts: 1302) TimelockControllerInvariants:statefulFuzzExecutedProposalCancellation() (runs: 256, calls: 3840, reverts: 1270) TimelockControllerInvariants:statefulFuzzExecutingCancelledProposal() (runs: 256, calls: 3840, reverts: 1239) -TimelockControllerInvariants:statefulFuzzExecutingNotReadyProposal() (runs: 256, calls: 3840, reverts: 1305) +TimelockControllerInvariants:statefulFuzzExecutingNotReadyProposal() (runs: 256, calls: 3840, reverts: 1306) TimelockControllerInvariants:statefulFuzzOnceProposalExecution() (runs: 256, calls: 3840, reverts: 1277) -TimelockControllerInvariants:statefulFuzzProposalsExecutedMatchCount() (runs: 256, calls: 3840, reverts: 1303) -TimelockControllerInvariants:statefulFuzzSumOfProposals() (runs: 256, calls: 3840, reverts: 1302) +TimelockControllerInvariants:statefulFuzzProposalsExecutedMatchCount() (runs: 256, calls: 3840, reverts: 1302) +TimelockControllerInvariants:statefulFuzzSumOfProposals() (runs: 256, calls: 3840, reverts: 1303) TimelockControllerTest:testAdminCannotBatchExecute() (gas: 750632) TimelockControllerTest:testAdminCannotBatchSchedule() (gas: 748419) TimelockControllerTest:testAdminCannotCancel() (gas: 13369) diff --git a/.gas-snapshot-venom b/.gas-snapshot-venom index 10aa27e2..3a045ce4 100644 --- a/.gas-snapshot-venom +++ b/.gas-snapshot-venom @@ -1,5 +1,5 @@ Vyper version: 0.4.1b2+commit.0abcf452 -Forge version: forge 0.2.0 (57bb12e 2024-11-06T00:21:40.682166819Z) +Forge version: forge 0.2.0 (58bf161 2024-11-06T16:27:58.427306827Z) Vyper config: { "optimize": "gas", @@ -615,15 +615,15 @@ MessageHashUtilsTest:testFuzzToTypedDataHash(string,string) (runs: 256, μ: 9889 MessageHashUtilsTest:testToDataWithIntendedValidatorHash() (gas: 11027) MessageHashUtilsTest:testToDataWithIntendedValidatorHashSelf() (gas: 11566) MessageHashUtilsTest:testToTypedDataHash() (gas: 8668) -MulticallTest:testMulticallRevert() (gas: 1152163) -MulticallTest:testMulticallSelfRevert() (gas: 2216613) -MulticallTest:testMulticallSelfSuccess() (gas: 3340482) -MulticallTest:testMulticallSuccess() (gas: 1160590) -MulticallTest:testMulticallValueRevertCase1() (gas: 1211519) -MulticallTest:testMulticallValueRevertCase2() (gas: 1212396) -MulticallTest:testMulticallValueSuccess() (gas: 1239518) +MulticallTest:testMulticallRevert() (gas: 1152172) +MulticallTest:testMulticallSelfRevert() (gas: 2216625) +MulticallTest:testMulticallSelfSuccess() (gas: 3340497) +MulticallTest:testMulticallSuccess() (gas: 1160596) +MulticallTest:testMulticallValueRevertCase1() (gas: 1211549) +MulticallTest:testMulticallValueRevertCase2() (gas: 1212432) +MulticallTest:testMulticallValueSuccess() (gas: 1239560) MulticallTest:testMultistaticcallRevert() (gas: 1040449072) -MulticallTest:testMultistaticcallSuccess() (gas: 1130726) +MulticallTest:testMultistaticcallSuccess() (gas: 1130729) Ownable2StepInvariants:statefulFuzzOwner() (runs: 256, calls: 3840, reverts: 3840) Ownable2StepInvariants:statefulFuzzPendingOwner() (runs: 256, calls: 3840, reverts: 3840) Ownable2StepTest:testAcceptOwnershipNonPendingOwner() (gas: 47251) @@ -682,7 +682,7 @@ SignatureCheckerTest:testFuzzEOAWithInvalidSigner(string,string) (runs: 256, μ: SignatureCheckerTest:testFuzzEOAWithValidSignature(string,string) (runs: 256, μ: 20260, ~: 20261) SignatureCheckerTest:testInitialSetup() (gas: 8374) TimelockControllerInvariants:statefulFuzzExecutedLessThanOrEqualToScheduled() (runs: 256, calls: 3840, reverts: 1264) -TimelockControllerInvariants:statefulFuzzExecutedProposalCancellation() (runs: 256, calls: 3840, reverts: 1288) +TimelockControllerInvariants:statefulFuzzExecutedProposalCancellation() (runs: 256, calls: 3840, reverts: 1287) TimelockControllerInvariants:statefulFuzzExecutingCancelledProposal() (runs: 256, calls: 3840, reverts: 1259) TimelockControllerInvariants:statefulFuzzExecutingNotReadyProposal() (runs: 256, calls: 3840, reverts: 1285) TimelockControllerInvariants:statefulFuzzOnceProposalExecution() (runs: 256, calls: 3840, reverts: 1247) diff --git a/CHANGELOG.md b/CHANGELOG.md index 46f0c632..474f3939 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - Use relative `interfaces` `import`s. ([#263](https://github.com/pcaversaccio/snekmate/pull/263)) - Use `bytes1` literal in `eip712Domain` function. ([#283](https://github.com/pcaversaccio/snekmate/pull/283)) - [`math`](https://github.com/pcaversaccio/snekmate/blob/v0.1.1/src/snekmate/utils/math.vy): Use mutable `internal` function parameters. ([#267](https://github.com/pcaversaccio/snekmate/pull/267)) + - [`multicall`](https://github.com/pcaversaccio/snekmate/blob/v0.1.1/src/snekmate/utils/multicall.vy): Optimise `Batch`-based `for` loops. ([#287](https://github.com/pcaversaccio/snekmate/pull/287)) ### 🥢 Test Coverage diff --git a/src/snekmate/utils/multicall.vy b/src/snekmate/utils/multicall.vy index aa0cfe34..de0e1564 100644 --- a/src/snekmate/utils/multicall.vy +++ b/src/snekmate/utils/multicall.vy @@ -88,11 +88,10 @@ def _multicall(data: DynArray[Batch, _DYNARRAY_BOUND]) -> DynArray[Result, _DYNA for batch: Batch in data: if batch.allow_failure: success, return_data = raw_call(batch.target, batch.calldata, max_outsize=255, revert_on_failure=False) - results.append(Result(success=success, return_data=return_data)) else: - return_data = raw_call(batch.target, batch.calldata, max_outsize=255) success = True - results.append(Result(success=success, return_data=return_data)) + return_data = raw_call(batch.target, batch.calldata, max_outsize=255) + results.append(Result(success=success, return_data=return_data)) return results @@ -127,11 +126,10 @@ def _multicall_value(data: DynArray[BatchValue, _DYNARRAY_BOUND]) -> DynArray[Re success, return_data = raw_call( batch.target, batch.calldata, max_outsize=255, value=msg_value, revert_on_failure=False ) - results.append(Result(success=success, return_data=return_data)) else: - return_data = raw_call(batch.target, batch.calldata, max_outsize=255, value=msg_value) success = True - results.append(Result(success=success, return_data=return_data)) + return_data = raw_call(batch.target, batch.calldata, max_outsize=255, value=msg_value) + results.append(Result(success=success, return_data=return_data)) assert msg.value == value_accumulator, "multicall: value mismatch" return results @@ -164,11 +162,10 @@ def _multicall_self(data: DynArray[BatchSelf, _DYNARRAY_BOUND]) -> DynArray[Resu success, return_data = raw_call( self, batch.calldata, max_outsize=255, is_delegate_call=True, revert_on_failure=False ) - results.append(Result(success=success, return_data=return_data)) else: - return_data = raw_call(self, batch.calldata, max_outsize=255, is_delegate_call=True) success = True - results.append(Result(success=success, return_data=return_data)) + return_data = raw_call(self, batch.calldata, max_outsize=255, is_delegate_call=True) + results.append(Result(success=success, return_data=return_data)) return results @@ -192,9 +189,8 @@ def _multistaticcall(data: DynArray[Batch, _DYNARRAY_BOUND]) -> DynArray[Result, success, return_data = raw_call( batch.target, batch.calldata, max_outsize=255, is_static_call=True, revert_on_failure=False ) - results.append(Result(success=success, return_data=return_data)) else: - return_data = raw_call(batch.target, batch.calldata, max_outsize=255, is_static_call=True) success = True - results.append(Result(success=success, return_data=return_data)) + return_data = raw_call(batch.target, batch.calldata, max_outsize=255, is_static_call=True) + results.append(Result(success=success, return_data=return_data)) return results