Skip to content

Commit 07cab1d

Browse files
authored
💥 Add CREATE, CREATE2, and CREATE3 Deploy Functions (#323)
### 🕓 Changelog Vyper has recently introduced the new `raw_create` built-in function via PR [#4204](vyperlang/vyper#4204), enabling direct contract creations using the EVM opcodes [`CREATE`](https://www.evm.codes/?fork=cancun#f0) and [`CREATE2`](https://www.evm.codes/?fork=cancun#f5). In response, this PR adds [`CREATE`](https://www.evm.codes/?fork=cancun#f0), [`CREATE2`](https://www.evm.codes/?fork=cancun#f5), and [`CREATE3`](ethereum/EIPs#3171 (i.e. without an initcode factor) utility functions to the corresponding module contracts in 🐍 snekmate. Please note that the current upper limit for the contract creation code is set to `8_192` bytes (\$2^{13}\$). ```vy from snekmate.utils import create as c1 from snekmate.utils import create2 as c2 from snekmate.utils import create3 as c3 @external @payable def deploy_create(init_code: Bytes[8_192]) -> address: return c1._deploy_create(init_code) @external @payable def deploy_create2(salt: bytes32, init_code: Bytes[8_192]) -> address: return c2._deploy_create2(salt, init_code) @external @payable def deploy_create3(salt: bytes32, init_code: Bytes[8_192]) -> address: return c3._deploy_create3(salt, init_code) ``` ### ⚠️ Breaking Changes To improve clarity and maintain consistent naming conventions, the following name changes are included in this PR: - `create_address.vy` → create.vy` - `_compute_address_rlp_self` → `_compute_create_address_self` - `_compute_address_rlp` → `_compute_create_address` - `_convert_keccak256_2_address` → `_convert_keccak256_to_address` - `create2_address.vy` → `create2.vy` - `_compute_address_self` → `_compute_create2_address_self` - `_compute_address` → `_compute_create2_address` These name changes are **not** backward-compatible and may require code updates in downstream projects. Furthermore, Solidity has released its latest version [`v0.8.30`](https://github.com/ethereum/solidity/releases/tag/v0.8.30). This PR updates the Solidity test files to align with this new version (we keep `evm_version = "cancun"`). --------- Signed-off-by: Pascal Marco Caversaccio <pascal.caversaccio@hotmail.ch>
1 parent edb0477 commit 07cab1d

File tree

87 files changed

+1541
-1044
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+1541
-1044
lines changed

.gas-snapshot

Lines changed: 85 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
Vyper version: 0.4.2+commit.11522b83
2-
Forge version: forge 1.1.0-nightly (b28c2b2 2025-05-02T06:02:00.771850739Z)
1+
Vyper version: 0.4.2rc2+commit.68b68c4b
2+
Forge version: forge 1.2.0-nightly (776897b 2025-05-15T06:02:25.907738095Z)
33
Vyper config:
44
{
55
"optimize": "gas"
@@ -75,63 +75,86 @@ BatchDistributorTest:testDistributeTokenMultipleAddressesSuccess() (gas: 612703)
7575
BatchDistributorTest:testDistributeTokenOneAddressSuccess() (gas: 574660)
7676
BatchDistributorTest:testDistributeTokenRevertWithInsufficientAllowance() (gas: 569203)
7777
BatchDistributorTest:testDistributeTokenRevertWithInsufficientBalance() (gas: 569856)
78-
BatchDistributorTest:testFuzzDistributeEtherMultipleAddressesSuccess(((address,uint256)[]),uint256) (runs: 256, μ: 1745117, ~: 1779528)
79-
BatchDistributorTest:testFuzzDistributeTokenMultipleAddressesSuccess(((address,uint256)[]),address,uint256) (runs: 256, μ: 1321601, ~: 1246778)
78+
BatchDistributorTest:testFuzzDistributeEtherMultipleAddressesSuccess(((address,uint256)[]),uint256) (runs: 256, μ: 1748371, ~: 1779528)
79+
BatchDistributorTest:testFuzzDistributeTokenMultipleAddressesSuccess(((address,uint256)[]),address,uint256) (runs: 256, μ: 1321354, ~: 1246779)
8080
BlockHashTest:testBlockHashAbove8191Range() (gas: 10845)
8181
BlockHashTest:testBlockHashCurrentAndFutureBlock() (gas: 14228)
8282
BlockHashTest:testBlockHashHistoryContractNotDeployed() (gas: 46162)
8383
BlockHashTest:testBlockHashWithin256Range() (gas: 10916)
8484
BlockHashTest:testBlockHashWithin257And8191Range() (gas: 37542)
85-
BlockHashTest:testFuzzBlockHashAbove8191Range(uint256,uint256,bytes32) (runs: 256, μ: 16289, ~: 16508)
85+
BlockHashTest:testFuzzBlockHashAbove8191Range(uint256,uint256,bytes32) (runs: 256, μ: 16314, ~: 16508)
8686
BlockHashTest:testFuzzBlockHashCurrentAndFutureBlock(uint256) (runs: 256, μ: 15693, ~: 15685)
87-
BlockHashTest:testFuzzBlockHashHistoryContractNotDeployed(uint256,uint256,bytes32) (runs: 256, μ: 21029, ~: 21166)
87+
BlockHashTest:testFuzzBlockHashHistoryContractNotDeployed(uint256,uint256,bytes32) (runs: 256, μ: 21026, ~: 21160)
8888
BlockHashTest:testFuzzBlockHashWithin256Range(uint256,uint256,bytes32) (runs: 256, μ: 16162, ~: 16145)
89-
BlockHashTest:testFuzzBlockHashWithin257And8191Range(uint256,uint256,bytes32) (runs: 256, μ: 42715, ~: 42997)
90-
Create2AddressTest:testComputeAddress() (gas: 532344)
91-
Create2AddressTest:testComputeAddressSelf() (gas: 541003)
92-
Create2AddressTest:testFuzzComputeAddress(bytes32,address) (runs: 256, μ: 532938, ~: 532938)
93-
Create2AddressTest:testFuzzComputeAddressSelf(bytes32) (runs: 256, μ: 541113, ~: 541113)
94-
CreateAddressTest:testComputeAddressNonce0x00() (gas: 16304)
95-
CreateAddressTest:testComputeAddressNonce0x7f() (gas: 530401)
96-
CreateAddressTest:testComputeAddressNonceUint16() (gas: 530487)
97-
CreateAddressTest:testComputeAddressNonceUint24() (gas: 530537)
98-
CreateAddressTest:testComputeAddressNonceUint32() (gas: 530564)
99-
CreateAddressTest:testComputeAddressNonceUint40() (gas: 530549)
100-
CreateAddressTest:testComputeAddressNonceUint48() (gas: 530555)
101-
CreateAddressTest:testComputeAddressNonceUint56() (gas: 530623)
102-
CreateAddressTest:testComputeAddressNonceUint64() (gas: 530746)
103-
CreateAddressTest:testComputeAddressNonceUint8() (gas: 530482)
104-
CreateAddressTest:testComputeAddressRevertTooHighNonce() (gas: 10378)
105-
CreateAddressTest:testComputeAddressSelfNonce0x7f() (gas: 534683)
106-
CreateAddressTest:testComputeAddressSelfNonceUint16() (gas: 534871)
107-
CreateAddressTest:testComputeAddressSelfNonceUint24() (gas: 534900)
108-
CreateAddressTest:testComputeAddressSelfNonceUint32() (gas: 534974)
109-
CreateAddressTest:testComputeAddressSelfNonceUint40() (gas: 535025)
110-
CreateAddressTest:testComputeAddressSelfNonceUint48() (gas: 535053)
111-
CreateAddressTest:testComputeAddressSelfNonceUint56() (gas: 535100)
112-
CreateAddressTest:testComputeAddressSelfNonceUint64() (gas: 535181)
113-
CreateAddressTest:testComputeAddressSelfNonceUint8() (gas: 534827)
114-
CreateAddressTest:testComputeAddressSelfRevertTooHighNonce() (gas: 8860)
115-
CreateAddressTest:testFuzzComputeAddressNonce0x7f(uint64,address) (runs: 256, μ: 533344, ~: 533424)
116-
CreateAddressTest:testFuzzComputeAddressNonceUint16(uint64,address) (runs: 256, μ: 532776, ~: 533031)
117-
CreateAddressTest:testFuzzComputeAddressNonceUint24(uint64,address) (runs: 256, μ: 532909, ~: 532989)
118-
CreateAddressTest:testFuzzComputeAddressNonceUint32(uint64,address) (runs: 256, μ: 532887, ~: 533018)
119-
CreateAddressTest:testFuzzComputeAddressNonceUint40(uint64,address) (runs: 256, μ: 533029, ~: 533088)
120-
CreateAddressTest:testFuzzComputeAddressNonceUint48(uint64,address) (runs: 256, μ: 533000, ~: 533094)
121-
CreateAddressTest:testFuzzComputeAddressNonceUint56(uint64,address) (runs: 256, μ: 533064, ~: 533142)
122-
CreateAddressTest:testFuzzComputeAddressNonceUint64(uint64,address) (runs: 256, μ: 533091, ~: 533192)
123-
CreateAddressTest:testFuzzComputeAddressNonceUint8(uint64,address) (runs: 256, μ: 532815, ~: 532863)
124-
CreateAddressTest:testFuzzComputeAddressRevertTooHighNonce(uint256,address) (runs: 256, μ: 12859, ~: 13154)
125-
CreateAddressTest:testFuzzComputeAddressSelfNonce0x7f(uint64) (runs: 256, μ: 539586, ~: 539645)
126-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint16(uint64) (runs: 256, μ: 538831, ~: 539103)
127-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint24(uint64) (runs: 256, μ: 539163, ~: 539243)
128-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint32(uint64) (runs: 256, μ: 539147, ~: 539251)
129-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint40(uint64) (runs: 256, μ: 539244, ~: 539322)
130-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint48(uint64) (runs: 256, μ: 539244, ~: 539309)
131-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint56(uint64) (runs: 256, μ: 539316, ~: 539375)
132-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint64(uint64) (runs: 256, μ: 539411, ~: 539496)
133-
CreateAddressTest:testFuzzComputeAddressSelfNonceUint8(uint64) (runs: 256, μ: 538919, ~: 538969)
134-
CreateAddressTest:testFuzzComputeAddressSelfRevertTooHighNonce(uint256) (runs: 256, μ: 12695, ~: 13008)
89+
BlockHashTest:testFuzzBlockHashWithin257And8191Range(uint256,uint256,bytes32) (runs: 256, μ: 42699, ~: 42997)
90+
Create2Test:testComputeCreate2Address() (gas: 532121)
91+
Create2Test:testComputeCreate2AddressSelf() (gas: 535017)
92+
Create2Test:testDeployCreate2Revert() (gas: 1040435117)
93+
Create2Test:testDeployCreate2Success() (gas: 781114)
94+
Create2Test:testDeployCreate2ValueSuccess() (gas: 787819)
95+
Create2Test:testFuzzComputeCreate2Address(bytes32,address) (runs: 256, μ: 532955, ~: 532955)
96+
Create2Test:testFuzzComputeCreate2AddressSelf(bytes32) (runs: 256, μ: 535023, ~: 535023)
97+
Create2Test:testFuzzDeployCreate2Revert(uint256,bytes32) (runs: 256, μ: 1040434606, ~: 1040434552)
98+
Create2Test:testFuzzDeployCreate2ValueSuccess(uint256,bytes32) (runs: 256, μ: 791437, ~: 791180)
99+
Create3Test:testComputeCreate3Address() (gas: 533763)
100+
Create3Test:testComputeCreate3AddressSelf() (gas: 533637)
101+
Create3Test:testDeployCreate3ProxyCreationFails() (gas: 1040441829)
102+
Create3Test:testDeployCreate3Revert() (gas: 1024181207)
103+
Create3Test:testDeployCreate3Success() (gas: 813585)
104+
Create3Test:testDeployCreate3ValueSuccess() (gas: 826949)
105+
Create3Test:testDeployCreate3ZeroLengthBytecode() (gas: 98659)
106+
Create3Test:testFuzzComputeCreate3Address(bytes32) (runs: 256, μ: 533863, ~: 533863)
107+
Create3Test:testFuzzComputeCreate3AddressSelf(bytes32) (runs: 256, μ: 533693, ~: 533693)
108+
Create3Test:testFuzzDeployCreate3ProxyCreationFails(uint256,bytes32) (runs: 256, μ: 1040441316, ~: 1040441257)
109+
Create3Test:testFuzzDeployCreate3Revert(uint256,bytes32) (runs: 256, μ: 1024180768, ~: 1024180706)
110+
Create3Test:testFuzzDeployCreate3ValueSuccess(uint256,bytes32) (runs: 256, μ: 830480, ~: 830228)
111+
Create3Test:testFuzzDeployCreate3ZeroLengthBytecode(uint256,bytes32) (runs: 256, μ: 102321, ~: 102069)
112+
CreateTest:testComputeCreateAddressNonce0x00() (gas: 10961)
113+
CreateTest:testComputeCreateAddressNonce0x7f() (gas: 532165)
114+
CreateTest:testComputeCreateAddressNonceUint16() (gas: 532251)
115+
CreateTest:testComputeCreateAddressNonceUint24() (gas: 532277)
116+
CreateTest:testComputeCreateAddressNonceUint32() (gas: 532349)
117+
CreateTest:testComputeCreateAddressNonceUint40() (gas: 532333)
118+
CreateTest:testComputeCreateAddressNonceUint48() (gas: 532405)
119+
CreateTest:testComputeCreateAddressNonceUint56() (gas: 532431)
120+
CreateTest:testComputeCreateAddressNonceUint64() (gas: 532494)
121+
CreateTest:testComputeCreateAddressNonceUint8() (gas: 532266)
122+
CreateTest:testComputeCreateAddressRevertTooHighNonce() (gas: 10440)
123+
CreateTest:testComputeCreateAddressSelfNonce0x7f() (gas: 530348)
124+
CreateTest:testComputeCreateAddressSelfNonceUint16() (gas: 530412)
125+
CreateTest:testComputeCreateAddressSelfNonceUint24() (gas: 530483)
126+
CreateTest:testComputeCreateAddressSelfNonceUint32() (gas: 530467)
127+
CreateTest:testComputeCreateAddressSelfNonceUint40() (gas: 530560)
128+
CreateTest:testComputeCreateAddressSelfNonceUint48() (gas: 530567)
129+
CreateTest:testComputeCreateAddressSelfNonceUint56() (gas: 530592)
130+
CreateTest:testComputeCreateAddressSelfNonceUint64() (gas: 530698)
131+
CreateTest:testComputeCreateAddressSelfNonceUint8() (gas: 530383)
132+
CreateTest:testComputeCreateAddressSelfRevertTooHighNonce() (gas: 8894)
133+
CreateTest:testDeployCreateRevert() (gas: 1040435053)
134+
CreateTest:testDeployCreateSuccess() (gas: 778203)
135+
CreateTest:testDeployCreateValueSuccess() (gas: 784912)
136+
CreateTest:testFuzzComputeCreateAddressNonce0x7f(uint64,address) (runs: 256, μ: 535348, ~: 535431)
137+
CreateTest:testFuzzComputeCreateAddressNonceUint16(uint64,address) (runs: 256, μ: 534831, ~: 535067)
138+
CreateTest:testFuzzComputeCreateAddressNonceUint24(uint64,address) (runs: 256, μ: 534966, ~: 535048)
139+
CreateTest:testFuzzComputeCreateAddressNonceUint32(uint64,address) (runs: 256, μ: 534954, ~: 535052)
140+
CreateTest:testFuzzComputeCreateAddressNonceUint40(uint64,address) (runs: 256, μ: 535066, ~: 535126)
141+
CreateTest:testFuzzComputeCreateAddressNonceUint48(uint64,address) (runs: 256, μ: 535060, ~: 535152)
142+
CreateTest:testFuzzComputeCreateAddressNonceUint56(uint64,address) (runs: 256, μ: 535078, ~: 535155)
143+
CreateTest:testFuzzComputeCreateAddressNonceUint64(uint64,address) (runs: 256, μ: 535111, ~: 535252)
144+
CreateTest:testFuzzComputeCreateAddressNonceUint8(uint64,address) (runs: 256, μ: 534898, ~: 534944)
145+
CreateTest:testFuzzComputeCreateAddressRevertTooHighNonce(uint256,address) (runs: 256, μ: 12836, ~: 12766)
146+
CreateTest:testFuzzComputeCreateAddressSelfNonce0x7f(uint64) (runs: 256, μ: 535222, ~: 535286)
147+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint16(uint64) (runs: 256, μ: 534478, ~: 534738)
148+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint24(uint64) (runs: 256, μ: 534662, ~: 534741)
149+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint32(uint64) (runs: 256, μ: 534673, ~: 534771)
150+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint40(uint64) (runs: 256, μ: 534674, ~: 534754)
151+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint48(uint64) (runs: 256, μ: 534762, ~: 534826)
152+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint56(uint64) (runs: 256, μ: 534809, ~: 534870)
153+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint64(uint64) (runs: 256, μ: 534798, ~: 534901)
154+
CreateTest:testFuzzComputeCreateAddressSelfNonceUint8(uint64) (runs: 256, μ: 534530, ~: 534572)
155+
CreateTest:testFuzzComputeCreateAddressSelfRevertTooHighNonce(uint256) (runs: 256, μ: 12663, ~: 12606)
156+
CreateTest:testFuzzDeployCreateRevert(uint64,uint256) (runs: 256, μ: 1040434681, ~: 1040434701)
157+
CreateTest:testFuzzDeployCreateValueSuccess(uint64,uint256) (runs: 256, μ: 787454, ~: 787769)
135158
ECDSATest:testFuzzRecoverWithInvalidSignature(bytes,string) (runs: 256, μ: 15319, ~: 15323)
136159
ECDSATest:testFuzzRecoverWithTooLongSignature(bytes,string) (runs: 256, μ: 13796, ~: 13799)
137160
ECDSATest:testFuzzRecoverWithValidSignature(string,string) (runs: 256, μ: 21640, ~: 21638)
@@ -281,8 +304,8 @@ ERC1155Test:testUriBaseAndTokenUriNotSet() (gas: 2884807)
281304
ERC1155Test:testUriBaseAndTokenUriSet() (gas: 64187)
282305
ERC1155Test:testUriNoBaseURI() (gas: 2934210)
283306
ERC1155Test:testUriNoTokenUri() (gas: 18805)
284-
ERC20Invariants:statefulFuzzOwner() (runs: 256, calls: 3840, reverts: 3443)
285-
ERC20Invariants:statefulFuzzTotalSupply() (runs: 256, calls: 3840, reverts: 3443)
307+
ERC20Invariants:statefulFuzzOwner() (runs: 256, calls: 3840, reverts: 3444)
308+
ERC20Invariants:statefulFuzzTotalSupply() (runs: 256, calls: 3840, reverts: 3444)
286309
ERC20Test:testApproveExceedingBalanceCase1() (gas: 40797)
287310
ERC20Test:testApproveExceedingBalanceCase2() (gas: 47784)
288311
ERC20Test:testApproveFromZeroAddress() (gas: 12957)
@@ -672,7 +695,7 @@ P256Test:testVerifyWithTooHighSValue() (gas: 9288)
672695
P256Test:testVerifyWithValidSignature() (gas: 554087)
673696
P256Test:testVerifyWithZeroInputs() (gas: 8683)
674697
P256Test:testVerifyWycheproofData() (gas: 351004930)
675-
PausableInvariants:statefulFuzzPaused() (runs: 256, calls: 3840, reverts: 1891)
698+
PausableInvariants:statefulFuzzPaused() (runs: 256, calls: 3840, reverts: 1865)
676699
PausableTest:testFuzzPauseSuccess(address) (runs: 256, μ: 34657, ~: 34657)
677700
PausableTest:testFuzzPauseWhilePaused(address) (runs: 256, μ: 37302, ~: 37302)
678701
PausableTest:testFuzzUnpauseSuccess(address) (runs: 256, μ: 27008, ~: 26994)
@@ -700,13 +723,13 @@ SignatureCheckerTest:testFuzzEOAWithInvalidSignature(bytes,string) (runs: 256,
700723
SignatureCheckerTest:testFuzzEOAWithInvalidSigner(string,string) (runs: 256, μ: 20317, ~: 20318)
701724
SignatureCheckerTest:testFuzzEOAWithValidSignature(string,string) (runs: 256, μ: 20249, ~: 20250)
702725
SignatureCheckerTest:testInitialSetup() (gas: 8356)
703-
TimelockControllerInvariants:statefulFuzzExecutedLessThanOrEqualToScheduled() (runs: 256, calls: 3840, reverts: 1226)
704-
TimelockControllerInvariants:statefulFuzzExecutedProposalCancellation() (runs: 256, calls: 3840, reverts: 1306)
705-
TimelockControllerInvariants:statefulFuzzExecutingCancelledProposal() (runs: 256, calls: 3840, reverts: 1219)
706-
TimelockControllerInvariants:statefulFuzzExecutingNotReadyProposal() (runs: 256, calls: 3840, reverts: 1227)
707-
TimelockControllerInvariants:statefulFuzzOnceProposalExecution() (runs: 256, calls: 3840, reverts: 1297)
708-
TimelockControllerInvariants:statefulFuzzProposalsExecutedMatchCount() (runs: 256, calls: 3840, reverts: 1225)
709-
TimelockControllerInvariants:statefulFuzzSumOfProposals() (runs: 256, calls: 3840, reverts: 1226)
726+
TimelockControllerInvariants:statefulFuzzExecutedLessThanOrEqualToScheduled() (runs: 256, calls: 3840, reverts: 1228)
727+
TimelockControllerInvariants:statefulFuzzExecutedProposalCancellation() (runs: 256, calls: 3840, reverts: 1284)
728+
TimelockControllerInvariants:statefulFuzzExecutingCancelledProposal() (runs: 256, calls: 3840, reverts: 1240)
729+
TimelockControllerInvariants:statefulFuzzExecutingNotReadyProposal() (runs: 256, calls: 3840, reverts: 1275)
730+
TimelockControllerInvariants:statefulFuzzOnceProposalExecution() (runs: 256, calls: 3840, reverts: 1255)
731+
TimelockControllerInvariants:statefulFuzzProposalsExecutedMatchCount() (runs: 256, calls: 3840, reverts: 1228)
732+
TimelockControllerInvariants:statefulFuzzSumOfProposals() (runs: 256, calls: 3840, reverts: 1228)
710733
TimelockControllerTest:testAdminCannotBatchExecute() (gas: 750618)
711734
TimelockControllerTest:testAdminCannotBatchSchedule() (gas: 748405)
712735
TimelockControllerTest:testAdminCannotCancel() (gas: 13355)

0 commit comments

Comments
 (0)