@warptoad/skinny-fat-imt-js 0.0.4 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/CREATE2.md +218 -0
  2. package/README.md +47 -3
  3. package/create2-artifacts/FatIMTPoseidon2Read.create2.json +268 -0
  4. package/create2-artifacts/FatIMTPoseidon2WriteEvent.create2.json +320 -0
  5. package/create2-artifacts/FatIMTPoseidon2WriteStorage.create2.json +320 -0
  6. package/create2-artifacts/SkinnyIMTPoseidon2Read.create2.json +258 -0
  7. package/create2-artifacts/SkinnyIMTPoseidon2WriteEvent.create2.json +301 -0
  8. package/create2-artifacts/SkinnyIMTPoseidon2WriteStorage.create2.json +301 -0
  9. package/create2-artifacts/create2-salts.json +26 -0
  10. package/dist/Trees.d.ts +5 -68
  11. package/dist/Trees.d.ts.map +1 -1
  12. package/dist/Trees.js +78 -41
  13. package/dist/Trees.js.map +1 -1
  14. package/dist/abis.js +1 -1
  15. package/dist/abis.js.map +1 -1
  16. package/dist/create2/create2.d.ts +144 -0
  17. package/dist/create2/create2.d.ts.map +1 -0
  18. package/dist/create2/create2.js +436 -0
  19. package/dist/create2/create2.js.map +1 -0
  20. package/dist/create2/index.d.ts +4 -0
  21. package/dist/create2/index.d.ts.map +1 -0
  22. package/dist/create2/index.js +4 -0
  23. package/dist/create2/index.js.map +1 -0
  24. package/dist/create2/interfaces.d.ts +79 -0
  25. package/dist/create2/interfaces.d.ts.map +1 -0
  26. package/dist/create2/interfaces.js +6 -0
  27. package/dist/create2/interfaces.js.map +1 -0
  28. package/dist/create2/types.d.ts +73 -0
  29. package/dist/create2/types.d.ts.map +1 -0
  30. package/dist/create2/types.js +4 -0
  31. package/dist/create2/types.js.map +1 -0
  32. package/dist/eventScanning.d.ts.map +1 -1
  33. package/dist/eventScanning.js +2 -2
  34. package/dist/eventScanning.js.map +1 -1
  35. package/dist/index.d.ts +1 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/types.d.ts +71 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +12 -0
  42. package/dist/types.js.map +1 -0
  43. package/package.json +9 -2
  44. package/src/Trees.ts +101 -99
  45. package/src/abis.ts +1 -1
  46. package/src/create2/create2.ts +643 -0
  47. package/src/create2/index.ts +3 -0
  48. package/src/create2/interfaces.ts +69 -0
  49. package/src/create2/types.ts +88 -0
  50. package/src/eventScanning.ts +31 -28
  51. package/src/index.ts +1 -0
  52. package/src/types.ts +71 -0
@@ -0,0 +1,144 @@
1
+ import { type Address, type Hex } from "viem";
2
+ import type { MinimalPublicClient, MinimalWalletClient } from "./interfaces.js";
3
+ import type { Create2Artifact, Create2Source, DeployCreate2Result, MakeCreate2Options, VerifyResult } from "./types.js";
4
+ /** The canonical deterministic-deployment-proxy, present on most chains. */
5
+ export declare const DEFAULT_CREATE2_FACTORY: Address;
6
+ /**
7
+ * solc guards public library functions against being CALLed directly by opening the runtime code
8
+ * with `PUSH20 <own address>; ADDRESS; EQ`, and the constructor patches the real address in at
9
+ * deploy time. The compiler's own output carries 20 zero bytes there.
10
+ *
11
+ * Two consequences worth recording: the init code is address-independent, which is exactly why one
12
+ * frozen blob CREATE2s to the same address on every chain; and code read back with `eth_getCode`
13
+ * differs from `deployedBytecode` at those 20 bytes, so a string comparison always fails.
14
+ */
15
+ export declare function findCallProtectionOffset(deployedBytecode: Hex): number | null;
16
+ /**
17
+ * Freezes a contract into everything needed to deploy it deterministically and verify it later.
18
+ *
19
+ * Pass a contract name (or `path/To.sol:Name`) to resolve it through the surrounding Hardhat
20
+ * project, or pass `{ artifact, buildInfo }` yourself to skip Hardhat entirely.
21
+ *
22
+ * Whichever build profile was last compiled is the one that gets frozen — Hardhat keeps a single
23
+ * `artifacts/` tree, not one per profile — so build with the profile you intend to publish before
24
+ * calling this, and pin every setting in it. Anything left to a solc default will move the address
25
+ * on the next toolchain bump.
26
+ *
27
+ * The result is plain JSON: `writeFile(path, JSON.stringify(artifact))` is a complete, publishable
28
+ * deployment package.
29
+ */
30
+ export declare function makeCreate2(target: string | Create2Source, options?: MakeCreate2Options): Promise<Create2Artifact>;
31
+ /** Where `initCodeHash` lands for a given factory and salt. Pure — no chain access. */
32
+ export declare function predictCreate2Address({ initCodeHash, salt, factory, }: {
33
+ initCodeHash: Hex;
34
+ salt: Hex;
35
+ factory?: Address;
36
+ }): Address;
37
+ /**
38
+ * The two inputs a vanity miner (create2crunch, createXcrunch, …) needs.
39
+ *
40
+ * The default factory does not bind the salt to a sender, so mine with any caller — and note that
41
+ * anyone can front-run the deployment. That is harmless here: identical init code at the same
42
+ * address is the outcome you wanted anyway.
43
+ */
44
+ export declare function create2MiningTarget(artifact: Create2Artifact, factory?: Address): {
45
+ factory: Address;
46
+ initCodeHash: Hex;
47
+ };
48
+ /**
49
+ * Deploys the frozen init code through a CREATE2 factory, idempotently.
50
+ *
51
+ * Safe to call unconditionally: if the predicted address already holds code this returns without
52
+ * sending a transaction, which is the normal case on a chain where someone deployed before you.
53
+ *
54
+ * Gas needs care, because a failed CREATE2 **does not revert the caller**. The factory's inner
55
+ * create simply returns the zero address, the factory returns that, and the outer transaction
56
+ * succeeds — burning the gas and deploying nothing. EIP-150 forwards only 63/64 of the remaining
57
+ * gas to the inner call, so a limit that looks sufficient can leave the create just short, and the
58
+ * only symptom is an empty address afterwards. So this estimates and adds headroom rather than
59
+ * trusting a wallet's automatic gas, and re-reads the code afterwards to turn a silent failure
60
+ * into a thrown error. Pass `gas` to override.
61
+ */
62
+ export declare function sendCreate2({ artifact, salt, walletClient, publicClient, factory, gas, nonce, }: {
63
+ artifact: Create2Artifact;
64
+ salt: Hex;
65
+ walletClient: MinimalWalletClient;
66
+ publicClient: MinimalPublicClient;
67
+ factory?: Address;
68
+ gas?: bigint;
69
+ /**
70
+ * Explicit nonce, for firing several deployments at once. Without it every concurrent call
71
+ * fetches the same pending nonce and they collide; assign consecutive values instead. Skip it
72
+ * for a single deployment and let the wallet choose.
73
+ */
74
+ nonce?: number;
75
+ }): Promise<DeployCreate2Result>;
76
+ /** {@link sendCreate2} followed by {@link confirmCreate2}: deploy one contract and wait for it. */
77
+ export declare function deployCreate2(args: Parameters<typeof sendCreate2>[0]): Promise<DeployCreate2Result>;
78
+ /**
79
+ * Waits for a deployment transaction and checks that code actually landed.
80
+ *
81
+ * Split out so a batch can send everything first and only then wait: sending is a single fast RPC
82
+ * round trip, waiting is a whole block. Sequential sends followed by concurrent waits is both the
83
+ * fastest safe ordering and the only one that keeps nonces in order — nodes without mempool
84
+ * queueing (Hardhat's auto-mining network among them) reject a nonce that arrives ahead of its
85
+ * predecessor.
86
+ */
87
+ export declare function confirmCreate2({ address, transactionHash, publicClient, confirmations, timeout, }: {
88
+ address: Address;
89
+ transactionHash: Hex;
90
+ publicClient: MinimalPublicClient;
91
+ /** Blocks to wait on top of the one containing the transaction. Defaults to viem's 1. */
92
+ confirmations?: number;
93
+ /**
94
+ * Give up after this long. Worth setting when asking for more than one confirmation: a chain
95
+ * that only mines on demand (a local node) never produces the next block, so the wait would
96
+ * otherwise never return.
97
+ */
98
+ timeout?: number;
99
+ }): Promise<void>;
100
+ /**
101
+ * Whether the code at `address` is this contract.
102
+ *
103
+ * A plain comparison against `deployedBytecode` fails for reasons that are not defects: solc's
104
+ * library call protection writes the contract's own address into its runtime code at construction,
105
+ * and immutables are written the same way. Both are zeroed in the compiler's output. This splices
106
+ * the address in and masks the immutables before comparing.
107
+ */
108
+ export declare function matchesOnchainBytecode(artifact: Create2Artifact, onchainCode: Hex, address: Address): boolean;
109
+ /**
110
+ * Submits to Etherscan's v2 multichain API and polls until it settles.
111
+ *
112
+ * One API key covers every supported chain; the chain is selected by `chainId` in the query string.
113
+ * The contract is verified from the frozen `solcInput`, so this works from a machine that has
114
+ * neither the sources nor a compiler.
115
+ *
116
+ * Safe to call immediately after deploying: a submission for an address Etherscan has not indexed
117
+ * yet is retried rather than reported as a failure, until `timeoutMs`.
118
+ */
119
+ export declare function verifyOnEtherscan({ artifact, address, chainId, apiKey, apiUrl, pollIntervalMs, timeoutMs, }: {
120
+ artifact: Create2Artifact;
121
+ address: Address;
122
+ chainId: number;
123
+ apiKey: string;
124
+ apiUrl?: string;
125
+ pollIntervalMs?: number;
126
+ timeoutMs?: number;
127
+ }): Promise<VerifyResult>;
128
+ /**
129
+ * Submits to Sourcify's v2 API and polls until the job completes.
130
+ *
131
+ * Sourcify recompiles from `stdJsonInput`, so a `match` of `exact_match` means the metadata hash
132
+ * matched too — which only happens if the build kept it (`bytecodeHash` other than `"none"`).
133
+ * Builds that strip it can still reach a plain `match`.
134
+ */
135
+ export declare function verifyOnSourcify({ artifact, address, chainId, apiUrl, creationTxHash, pollIntervalMs, timeoutMs, }: {
136
+ artifact: Create2Artifact;
137
+ address: Address;
138
+ chainId: number;
139
+ apiUrl?: string;
140
+ creationTxHash?: Hex;
141
+ pollIntervalMs?: number;
142
+ timeoutMs?: number;
143
+ }): Promise<VerifyResult>;
144
+ //# sourceMappingURL=create2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create2.d.ts","sourceRoot":"","sources":["../../src/create2/create2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,436 @@
1
+ // Generic CREATE2 toolkit: turn any Hardhat 3 contract into a self-contained artifact you can
2
+ // deploy, mine a vanity salt against, and verify — on any chain, without recompiling.
3
+ //
4
+ // The problem it solves is that a CREATE2 address is a function of the exact init code, and init
5
+ // code is not reproducible by asking someone to compile the same source. It depends on the solc
6
+ // version, every optimizer setting, the evm target, and — because solc's metadata hash covers the
7
+ // source paths — on the exact paths the build assigned. Hardhat puts npm package versions in those
8
+ // paths, so even a dependency bump with byte-identical Solidity moves the address.
9
+ //
10
+ // So `makeCreate2()` freezes the bytes once, together with the solc input that produced them.
11
+ // Everything downstream works off that frozen object and never compiles anything:
12
+ //
13
+ // makeCreate2() build time, needs Hardhat → Create2Artifact (JSON-serializable)
14
+ // predictCreate2Address() pure
15
+ // deployCreate2() runtime, viem only
16
+ // verifyOnEtherscan() runtime, fetch only
17
+ // verifyOnSourcify() runtime, fetch only
18
+ //
19
+ // Only `makeCreate2` touches Hardhat, and it does so through a dynamic import, so consumers who
20
+ // just deploy a published artifact never need Hardhat installed.
21
+ //
22
+ // This file is the implementation. `./interfaces.ts` holds the foreign shapes it reads (solc's
23
+ // standard JSON, Hardhat's artifact/build-info, the minimal viem clients), `./types.ts` its own
24
+ // inputs and outputs, and `./index.ts` is the `@warptoad/skinny-fat-imt-js/create2` entry point.
25
+ //
26
+ // The verification clients here are ours. Their request and response handling was written against
27
+ // `@nomicfoundation/hardhat-verify`'s `src/internal/{etherscan,sourcify}.ts`, which is the
28
+ // maintained implementation — but it only exposes `verifyContract(args, hre)`, requires a
29
+ // `HardhatRuntimeEnvironment`, and peer-depends on Hardhat, so it cannot be reused from a package
30
+ // meant to work without Hardhat.
31
+ // TODO
32
+ // ----
33
+ // zksync era will work with this shit. But it will run as EVM which is 3x to 5x more expensive then their EraVM
34
+ // but that requires using that whole compiler stack to work. Afaik hardhat 3 supports it now? Not sure
35
+ // Also a EraVM contract cant delegatecall a EVM contract. Normal calls do work, but not libraries
36
+ import { concat, encodeDeployData, getContractAddress, keccak256, } from "viem";
37
+ /** The canonical deterministic-deployment-proxy, present on most chains. */
38
+ export const DEFAULT_CREATE2_FACTORY = "0x4e59b44847b379578588920cA78FbF26c0B4956C";
39
+ // ---------------------------------------------------------------------------
40
+ // makeCreate2
41
+ // ---------------------------------------------------------------------------
42
+ /**
43
+ * solc guards public library functions against being CALLed directly by opening the runtime code
44
+ * with `PUSH20 <own address>; ADDRESS; EQ`, and the constructor patches the real address in at
45
+ * deploy time. The compiler's own output carries 20 zero bytes there.
46
+ *
47
+ * Two consequences worth recording: the init code is address-independent, which is exactly why one
48
+ * frozen blob CREATE2s to the same address on every chain; and code read back with `eth_getCode`
49
+ * differs from `deployedBytecode` at those 20 bytes, so a string comparison always fails.
50
+ */
51
+ export function findCallProtectionOffset(deployedBytecode) {
52
+ return /^0x73(0{40})3014/.test(deployedBytecode) ? 1 : null;
53
+ }
54
+ /**
55
+ * Substitutes library addresses into the `__$…$__` placeholders solc leaves in creation bytecode.
56
+ *
57
+ * Works off the artifact's `linkReferences` offsets rather than string-replacing the placeholder
58
+ * text: the offsets are exact, and a placeholder hash could in principle collide with unrelated
59
+ * bytes in a large contract.
60
+ */
61
+ function linkBytecode(bytecode, linkReferences, libraries) {
62
+ const used = {};
63
+ let hex = bytecode.slice(2);
64
+ const missing = [];
65
+ for (const [sourceName, contracts] of Object.entries(linkReferences)) {
66
+ for (const [libraryName, ranges] of Object.entries(contracts)) {
67
+ const address = libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName];
68
+ if (address === undefined) {
69
+ missing.push(`${sourceName}:${libraryName}`);
70
+ continue;
71
+ }
72
+ const value = address.toLowerCase().replace(/^0x/, "");
73
+ for (const { start, length } of ranges) {
74
+ if (length !== 20) {
75
+ throw new Error(`unexpected link reference length ${length} for ${libraryName}`);
76
+ }
77
+ hex = hex.slice(0, start * 2) + value + hex.slice(start * 2 + 40);
78
+ }
79
+ used[libraryName] = address;
80
+ }
81
+ }
82
+ if (missing.length > 0) {
83
+ throw new Error(`missing library addresses for: ${missing.join(", ")}\n` +
84
+ "Pass them as `libraries` — unlinked bytecode still contains `__$…$__` placeholders and " +
85
+ "is not deployable. Deploy and mine the libraries first; their addresses become part of " +
86
+ "this contract's init code, and therefore of its address.");
87
+ }
88
+ return { linked: `0x${hex}`, used };
89
+ }
90
+ async function resolveFromHardhat(nameOrFullyQualifiedName) {
91
+ // Dynamic so that merely importing this module does not require Hardhat. Only callers who ask
92
+ // for a contract *by name* need a Hardhat project; everyone else passes the JSON directly.
93
+ let hardhat;
94
+ try {
95
+ hardhat = await import("hardhat");
96
+ }
97
+ catch (cause) {
98
+ throw new Error(`makeCreate2("${nameOrFullyQualifiedName}") resolves contracts through Hardhat, which is not ` +
99
+ "installed here. Either run this inside the Hardhat project that compiled the contract, or " +
100
+ "pass { artifact, buildInfo } directly.", { cause });
101
+ }
102
+ const { artifacts } = hardhat;
103
+ const artifact = (await artifacts.readArtifact(nameOrFullyQualifiedName));
104
+ const buildInfoId = await artifacts.getBuildInfoId(nameOrFullyQualifiedName);
105
+ if (buildInfoId === undefined) {
106
+ throw new Error(`no build-info for ${nameOrFullyQualifiedName} — compile with Hardhat 3 first, using the ` +
107
+ "build profile whose settings you want frozen into the address");
108
+ }
109
+ const buildInfoPath = await artifacts.getBuildInfoPath(buildInfoId);
110
+ const buildInfoOutputPath = await artifacts.getBuildInfoOutputPath(buildInfoId);
111
+ if (buildInfoPath === undefined) {
112
+ throw new Error(`build-info ${buildInfoId} is missing from disk — try a clean rebuild`);
113
+ }
114
+ const { readFile } = await import("node:fs/promises");
115
+ const buildInfo = JSON.parse(await readFile(buildInfoPath, "utf8"));
116
+ const buildInfoOutput = buildInfoOutputPath === undefined
117
+ ? undefined
118
+ : JSON.parse(await readFile(buildInfoOutputPath, "utf8"));
119
+ return { artifact, buildInfo, buildInfoOutput };
120
+ }
121
+ /**
122
+ * Freezes a contract into everything needed to deploy it deterministically and verify it later.
123
+ *
124
+ * Pass a contract name (or `path/To.sol:Name`) to resolve it through the surrounding Hardhat
125
+ * project, or pass `{ artifact, buildInfo }` yourself to skip Hardhat entirely.
126
+ *
127
+ * Whichever build profile was last compiled is the one that gets frozen — Hardhat keeps a single
128
+ * `artifacts/` tree, not one per profile — so build with the profile you intend to publish before
129
+ * calling this, and pin every setting in it. Anything left to a solc default will move the address
130
+ * on the next toolchain bump.
131
+ *
132
+ * The result is plain JSON: `writeFile(path, JSON.stringify(artifact))` is a complete, publishable
133
+ * deployment package.
134
+ */
135
+ export async function makeCreate2(target, options = {}) {
136
+ const { artifact, buildInfo, buildInfoOutput } = typeof target === "string" ? await resolveFromHardhat(target) : target;
137
+ const inputSourceName = artifact.inputSourceName ?? artifact.sourceName;
138
+ const libraries = options.libraries ?? {};
139
+ const { linked, used } = linkBytecode(artifact.bytecode, artifact.linkReferences ?? {}, libraries);
140
+ // The runtime code carries its own placeholders at their own offsets. Linking them here is what
141
+ // makes `matchesOnchainBytecode` work for a contract that delegatecalls libraries.
142
+ const { linked: linkedRuntime } = linkBytecode(artifact.deployedBytecode, artifact.deployedLinkReferences ?? {}, libraries);
143
+ // `encodeDeployData` appends the encoded arguments to the bytecode and handles the
144
+ // no-constructor case, so the init code and the standalone argument blob stay consistent —
145
+ // Etherscan wants the arguments separately, and any mismatch fails verification.
146
+ const initCode = options.constructorArgs === undefined || options.constructorArgs.length === 0
147
+ ? linked
148
+ : encodeDeployData({
149
+ abi: artifact.abi,
150
+ bytecode: linked,
151
+ args: options.constructorArgs,
152
+ });
153
+ const constructorArgs = `0x${initCode.slice(linked.length)}`;
154
+ const metadata = buildInfoOutput?.output.contracts[inputSourceName]?.[artifact.contractName]?.metadata;
155
+ return {
156
+ contractName: artifact.contractName,
157
+ sourceName: artifact.sourceName,
158
+ contractIdentifier: `${inputSourceName}:${artifact.contractName}`,
159
+ compilerVersion: buildInfo.solcLongVersion,
160
+ evmVersion: buildInfo.input.settings.evmVersion,
161
+ constructorArgs,
162
+ initCode,
163
+ initCodeHash: keccak256(initCode),
164
+ deployedBytecode: linkedRuntime,
165
+ callProtectionOffset: findCallProtectionOffset(linkedRuntime),
166
+ immutableReferences: artifact.immutableReferences ?? {},
167
+ linkedLibraries: used,
168
+ abi: artifact.abi,
169
+ metadata,
170
+ solcInput: buildInfo.input,
171
+ };
172
+ }
173
+ // ---------------------------------------------------------------------------
174
+ // Address prediction, mining, deployment
175
+ // ---------------------------------------------------------------------------
176
+ /** Where `initCodeHash` lands for a given factory and salt. Pure — no chain access. */
177
+ export function predictCreate2Address({ initCodeHash, salt, factory = DEFAULT_CREATE2_FACTORY, }) {
178
+ return getContractAddress({ opcode: "CREATE2", from: factory, salt, bytecodeHash: initCodeHash });
179
+ }
180
+ /**
181
+ * The two inputs a vanity miner (create2crunch, createXcrunch, …) needs.
182
+ *
183
+ * The default factory does not bind the salt to a sender, so mine with any caller — and note that
184
+ * anyone can front-run the deployment. That is harmless here: identical init code at the same
185
+ * address is the outcome you wanted anyway.
186
+ */
187
+ export function create2MiningTarget(artifact, factory = DEFAULT_CREATE2_FACTORY) {
188
+ return { factory, initCodeHash: artifact.initCodeHash };
189
+ }
190
+ /**
191
+ * Deploys the frozen init code through a CREATE2 factory, idempotently.
192
+ *
193
+ * Safe to call unconditionally: if the predicted address already holds code this returns without
194
+ * sending a transaction, which is the normal case on a chain where someone deployed before you.
195
+ *
196
+ * Gas needs care, because a failed CREATE2 **does not revert the caller**. The factory's inner
197
+ * create simply returns the zero address, the factory returns that, and the outer transaction
198
+ * succeeds — burning the gas and deploying nothing. EIP-150 forwards only 63/64 of the remaining
199
+ * gas to the inner call, so a limit that looks sufficient can leave the create just short, and the
200
+ * only symptom is an empty address afterwards. So this estimates and adds headroom rather than
201
+ * trusting a wallet's automatic gas, and re-reads the code afterwards to turn a silent failure
202
+ * into a thrown error. Pass `gas` to override.
203
+ */
204
+ export async function sendCreate2({ artifact, salt, walletClient, publicClient, factory = DEFAULT_CREATE2_FACTORY, gas, nonce, }) {
205
+ const address = predictCreate2Address({ initCodeHash: artifact.initCodeHash, salt, factory });
206
+ const existing = await publicClient.getCode({ address });
207
+ if (existing !== undefined && existing !== "0x") {
208
+ return { address, alreadyDeployed: true };
209
+ }
210
+ const factoryCode = await publicClient.getCode({ address: factory });
211
+ if (factoryCode === undefined || factoryCode === "0x") {
212
+ throw new Error(`no CREATE2 factory at ${factory} on this chain. Deploy one there first, or pass a ` +
213
+ "`factory` that exists — note that a different factory yields a different address.");
214
+ }
215
+ // The canonical proxy takes `salt ‖ initCode` as raw calldata and CREATE2s the remainder.
216
+ const data = concat([salt, artifact.initCode]);
217
+ let gasLimit = gas;
218
+ if (gasLimit === undefined) {
219
+ if (publicClient.estimateGas === undefined) {
220
+ // Falling back to the wallet's automatic gas is exactly how the silent failure above
221
+ // happens, so refuse rather than quietly risk it.
222
+ throw new Error("deployCreate2 needs either a `gas` limit or a public client with `estimateGas`; " +
223
+ "wallet-chosen gas is what produces a successful transaction that deploys nothing.");
224
+ }
225
+ const estimate = await publicClient.estimateGas({
226
+ account: walletClient.account?.address,
227
+ to: factory,
228
+ data,
229
+ });
230
+ // 64/63 covers what EIP-150 withholds from the inner create, and a further 10% absorbs the
231
+ // estimator landing slightly under on a large deployment.
232
+ gasLimit = (estimate * 64n * 110n) / (63n * 100n);
233
+ }
234
+ const transactionHash = await walletClient.sendTransaction({ to: factory, data, gas: gasLimit, nonce });
235
+ return { address, alreadyDeployed: false, transactionHash };
236
+ }
237
+ /** {@link sendCreate2} followed by {@link confirmCreate2}: deploy one contract and wait for it. */
238
+ export async function deployCreate2(args) {
239
+ const sent = await sendCreate2(args);
240
+ if (!sent.alreadyDeployed) {
241
+ await confirmCreate2({
242
+ address: sent.address,
243
+ transactionHash: sent.transactionHash,
244
+ publicClient: args.publicClient,
245
+ });
246
+ }
247
+ return sent;
248
+ }
249
+ /**
250
+ * Waits for a deployment transaction and checks that code actually landed.
251
+ *
252
+ * Split out so a batch can send everything first and only then wait: sending is a single fast RPC
253
+ * round trip, waiting is a whole block. Sequential sends followed by concurrent waits is both the
254
+ * fastest safe ordering and the only one that keeps nonces in order — nodes without mempool
255
+ * queueing (Hardhat's auto-mining network among them) reject a nonce that arrives ahead of its
256
+ * predecessor.
257
+ */
258
+ export async function confirmCreate2({ address, transactionHash, publicClient, confirmations, timeout, }) {
259
+ await publicClient.waitForTransactionReceipt({ hash: transactionHash, confirmations, timeout });
260
+ const deployed = await publicClient.getCode({ address });
261
+ if (deployed === undefined || deployed === "0x") {
262
+ throw new Error(`transaction ${transactionHash} succeeded but ${address} holds no code.\n` +
263
+ "A failed CREATE2 does not revert the caller, so this is what an out-of-gas inner create " +
264
+ "looks like — the factory returned the zero address and the transaction still reported " +
265
+ "success. Retry with a higher `gas`, or check whether the constructor reverted.");
266
+ }
267
+ }
268
+ /**
269
+ * Whether the code at `address` is this contract.
270
+ *
271
+ * A plain comparison against `deployedBytecode` fails for reasons that are not defects: solc's
272
+ * library call protection writes the contract's own address into its runtime code at construction,
273
+ * and immutables are written the same way. Both are zeroed in the compiler's output. This splices
274
+ * the address in and masks the immutables before comparing.
275
+ */
276
+ export function matchesOnchainBytecode(artifact, onchainCode, address) {
277
+ let expected = artifact.deployedBytecode.toLowerCase();
278
+ let actual = onchainCode.toLowerCase();
279
+ if (artifact.callProtectionOffset !== null) {
280
+ const start = 2 + artifact.callProtectionOffset * 2;
281
+ expected = expected.slice(0, start) + address.toLowerCase().slice(2) + expected.slice(start + 40);
282
+ }
283
+ for (const ranges of Object.values(artifact.immutableReferences)) {
284
+ for (const { start, length } of ranges) {
285
+ const from = 2 + start * 2;
286
+ const mask = "0".repeat(length * 2);
287
+ expected = expected.slice(0, from) + mask + expected.slice(from + length * 2);
288
+ actual = actual.slice(0, from) + mask + actual.slice(from + length * 2);
289
+ }
290
+ }
291
+ return expected === actual;
292
+ }
293
+ // ---------------------------------------------------------------------------
294
+ // Verification
295
+ // ---------------------------------------------------------------------------
296
+ const ETHERSCAN_API_URL = "https://api.etherscan.io/v2/api";
297
+ const SOURCIFY_API_URL = "https://sourcify.dev/server";
298
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
299
+ function isAlreadyVerifiedMessage(message) {
300
+ return (message.startsWith("Contract source code already verified") ||
301
+ message.startsWith("Already Verified"));
302
+ }
303
+ /**
304
+ * Etherscan rejects a submission for an address whose code it has not indexed yet.
305
+ *
306
+ * This is the normal response in the first minute or so after a deployment, not a real failure —
307
+ * so it is worth retrying rather than reporting. Same string `hardhat-verify` keys its
308
+ * `isBytecodeMissingInNetworkError` on.
309
+ */
310
+ function isNotIndexedYetMessage(message) {
311
+ return message.startsWith("Unable to locate ContractCode at");
312
+ }
313
+ /**
314
+ * Submits to Etherscan's v2 multichain API and polls until it settles.
315
+ *
316
+ * One API key covers every supported chain; the chain is selected by `chainId` in the query string.
317
+ * The contract is verified from the frozen `solcInput`, so this works from a machine that has
318
+ * neither the sources nor a compiler.
319
+ *
320
+ * Safe to call immediately after deploying: a submission for an address Etherscan has not indexed
321
+ * yet is retried rather than reported as a failure, until `timeoutMs`.
322
+ */
323
+ export async function verifyOnEtherscan({ artifact, address, chainId, apiKey, apiUrl = ETHERSCAN_API_URL, pollIntervalMs = 3_000,
324
+ // Covers indexing latency *and* verification, since a fresh deployment has to wait for the
325
+ // explorer to see it before verification can even start.
326
+ timeoutMs = 300_000, }) {
327
+ // `module`, `chainid` and `apikey` ride in the query string on every call; only the action and
328
+ // its own parameters differ between submitting and polling.
329
+ const endpoint = (params) => {
330
+ const url = new URL(apiUrl);
331
+ url.searchParams.set("module", "contract");
332
+ url.searchParams.set("chainid", String(chainId));
333
+ url.searchParams.set("apikey", apiKey);
334
+ for (const [key, value] of Object.entries(params))
335
+ url.searchParams.set(key, value);
336
+ return url;
337
+ };
338
+ const deadline = Date.now() + timeoutMs;
339
+ const submit = async () => {
340
+ const response = await fetch(endpoint({ action: "verifysourcecode" }), {
341
+ method: "POST",
342
+ headers: { "content-type": "application/x-www-form-urlencoded" },
343
+ body: new URLSearchParams({
344
+ contractaddress: address,
345
+ sourceCode: JSON.stringify(artifact.solcInput),
346
+ codeformat: "solidity-standard-json-input",
347
+ contractname: artifact.contractIdentifier,
348
+ compilerversion: `v${artifact.compilerVersion}`,
349
+ // Etherscan wants this unprefixed, and empty when there is no constructor.
350
+ constructorArguments: artifact.constructorArgs.replace(/^0x/, ""),
351
+ }),
352
+ });
353
+ if (!response.ok) {
354
+ throw new Error(`Etherscan returned HTTP ${response.status} for ${artifact.contractName}`);
355
+ }
356
+ return (await response.json());
357
+ };
358
+ // Submitting straight after a deployment usually loses a race with Etherscan's indexer, so keep
359
+ // resubmitting until it has the code — that response is a "not yet", not a rejection.
360
+ let guid;
361
+ for (;;) {
362
+ const submitted = await submit();
363
+ if (isAlreadyVerifiedMessage(submitted.result)) {
364
+ return { outcome: "already-verified", message: submitted.result };
365
+ }
366
+ if (submitted.status === "1") {
367
+ guid = submitted.result;
368
+ break;
369
+ }
370
+ if (!isNotIndexedYetMessage(submitted.result) || Date.now() >= deadline) {
371
+ return { outcome: "failed", message: submitted.result };
372
+ }
373
+ await sleep(pollIntervalMs);
374
+ }
375
+ const statusUrl = endpoint({ action: "checkverifystatus", guid });
376
+ while (Date.now() < deadline) {
377
+ await sleep(pollIntervalMs);
378
+ const status = (await (await fetch(statusUrl)).json());
379
+ if (status.result === "Pending in queue")
380
+ continue;
381
+ if (isAlreadyVerifiedMessage(status.result)) {
382
+ return { outcome: "already-verified", message: status.result, jobId: guid };
383
+ }
384
+ if (status.result === "Pass - Verified") {
385
+ return { outcome: "verified", message: status.result, jobId: guid };
386
+ }
387
+ return { outcome: "failed", message: status.result, jobId: guid };
388
+ }
389
+ throw new Error(`Etherscan verification of ${address} still pending after ${timeoutMs}ms (guid ${guid})`);
390
+ }
391
+ /**
392
+ * Submits to Sourcify's v2 API and polls until the job completes.
393
+ *
394
+ * Sourcify recompiles from `stdJsonInput`, so a `match` of `exact_match` means the metadata hash
395
+ * matched too — which only happens if the build kept it (`bytecodeHash` other than `"none"`).
396
+ * Builds that strip it can still reach a plain `match`.
397
+ */
398
+ export async function verifyOnSourcify({ artifact, address, chainId, apiUrl = SOURCIFY_API_URL, creationTxHash, pollIntervalMs = 3_000, timeoutMs = 120_000, }) {
399
+ const submission = await fetch(`${apiUrl}/v2/verify/${chainId}/${address}`, {
400
+ method: "POST",
401
+ headers: { "content-type": "application/json" },
402
+ body: JSON.stringify({
403
+ stdJsonInput: artifact.solcInput,
404
+ contractIdentifier: artifact.contractIdentifier,
405
+ compilerVersion: artifact.compilerVersion,
406
+ ...(creationTxHash === undefined ? {} : { creationTransactionHash: creationTxHash }),
407
+ }),
408
+ });
409
+ const submitted = (await submission.json());
410
+ if (submitted.customCode === "already_verified") {
411
+ return { outcome: "already-verified", message: submitted.message ?? "already verified" };
412
+ }
413
+ if (!submission.ok || submitted.verificationId === undefined) {
414
+ return { outcome: "failed", message: submitted.message ?? `HTTP ${submission.status}` };
415
+ }
416
+ const verificationId = submitted.verificationId;
417
+ const deadline = Date.now() + timeoutMs;
418
+ while (Date.now() < deadline) {
419
+ await sleep(pollIntervalMs);
420
+ const status = (await (await fetch(`${apiUrl}/v2/verify/${verificationId}`)).json());
421
+ if (!status.isJobCompleted)
422
+ continue;
423
+ if (status.error !== undefined) {
424
+ return { outcome: "failed", message: status.error.message, jobId: verificationId };
425
+ }
426
+ const match = status.contract?.match ?? null;
427
+ return {
428
+ outcome: match === null ? "failed" : "verified",
429
+ message: match === null ? "no match" : match,
430
+ match,
431
+ jobId: verificationId,
432
+ };
433
+ }
434
+ throw new Error(`Sourcify verification of ${address} still pending after ${timeoutMs}ms (job ${verificationId})`);
435
+ }
436
+ //# sourceMappingURL=create2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create2.js","sourceRoot":"","sources":["../../src/create2/create2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from "./interfaces.js";
2
+ export * from "./types.js";
3
+ export * from "./create2.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/create2/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./interfaces.js";
2
+ export * from "./types.js";
3
+ export * from "./create2.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/create2/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC"}