@latticexyz/common 2.2.24-7fc3f6370bc1c1107de1471098f0ba3225fb62d8 → 2.2.24-a851c91de9ca31fe4d522ac33c07cfdd0e403853
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.
- package/dist/internal.d.ts +8 -3
- package/dist/internal.js +19 -11
- package/dist/internal.js.map +1 -1
- package/package.json +2 -2
package/dist/internal.d.ts
CHANGED
|
@@ -12,16 +12,21 @@ type Contract = {
|
|
|
12
12
|
debugLabel?: string;
|
|
13
13
|
salt?: Hex;
|
|
14
14
|
};
|
|
15
|
+
type EnsureContractResult = {
|
|
16
|
+
contract: Contract;
|
|
17
|
+
deployedAddress: Hex;
|
|
18
|
+
txHash: readonly Hex[];
|
|
19
|
+
};
|
|
15
20
|
declare function ensureContract({ client, deployerAddress, bytecode, deployedBytecodeSize, debugLabel, salt, }: {
|
|
16
21
|
readonly client: Client<Transport, Chain | undefined, Account>;
|
|
17
22
|
readonly deployerAddress: Hex;
|
|
18
|
-
} & Contract): Promise<
|
|
23
|
+
} & Contract): Promise<EnsureContractResult>;
|
|
19
24
|
|
|
20
25
|
declare function ensureContractsDeployed({ client, deployerAddress, contracts, }: {
|
|
21
26
|
readonly client: Client<Transport, Chain | undefined, Account>;
|
|
22
27
|
readonly deployerAddress: Hex;
|
|
23
28
|
readonly contracts: readonly Contract[];
|
|
24
|
-
}): Promise<
|
|
29
|
+
}): Promise<EnsureContractResult[]>;
|
|
25
30
|
|
|
26
31
|
declare function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address>;
|
|
27
32
|
|
|
@@ -45,4 +50,4 @@ declare function wiresaw<const wiresawTransport extends Transport>(transports?:
|
|
|
45
50
|
|
|
46
51
|
declare function getUserOperationReceipt(userOpHash: Hex, receipt: RpcTransactionReceipt): RpcUserOperationReceipt;
|
|
47
52
|
|
|
48
|
-
export { type Contract, ensureContract, ensureContractsDeployed, ensureDeployer, getContractAddress, getDeployer, getUserOperationReceipt, waitForTransactions, wiresaw };
|
|
53
|
+
export { type Contract, type EnsureContractResult, ensureContract, ensureContractsDeployed, ensureDeployer, getContractAddress, getDeployer, getUserOperationReceipt, waitForTransactions, wiresaw };
|
package/dist/internal.js
CHANGED
|
@@ -57,7 +57,11 @@ async function ensureContract({
|
|
|
57
57
|
const contractCode = await getCode(client, { address, blockTag: "pending" });
|
|
58
58
|
if (contractCode) {
|
|
59
59
|
debug2("found", debugLabel, "at", address);
|
|
60
|
-
return
|
|
60
|
+
return {
|
|
61
|
+
contract: { bytecode, deployedBytecodeSize, debugLabel, salt },
|
|
62
|
+
deployedAddress: address,
|
|
63
|
+
txHash: []
|
|
64
|
+
};
|
|
61
65
|
}
|
|
62
66
|
if (deployedBytecodeSize != null) {
|
|
63
67
|
if (deployedBytecodeSize === 0) {
|
|
@@ -79,13 +83,17 @@ Bytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the co
|
|
|
79
83
|
}
|
|
80
84
|
}
|
|
81
85
|
debug2("deploying", debugLabel, "at", address);
|
|
82
|
-
return
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
return {
|
|
87
|
+
contract: { bytecode, deployedBytecodeSize, debugLabel, salt },
|
|
88
|
+
deployedAddress: address,
|
|
89
|
+
txHash: [
|
|
90
|
+
await sendTransaction(client, {
|
|
91
|
+
chain: client.chain ?? null,
|
|
92
|
+
to: deployerAddress,
|
|
93
|
+
data: concatHex([salt, bytecode])
|
|
94
|
+
})
|
|
95
|
+
]
|
|
96
|
+
};
|
|
89
97
|
}
|
|
90
98
|
|
|
91
99
|
// src/deploy/ensureContractsDeployed.ts
|
|
@@ -95,13 +103,13 @@ async function ensureContractsDeployed({
|
|
|
95
103
|
contracts
|
|
96
104
|
}) {
|
|
97
105
|
const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);
|
|
98
|
-
const
|
|
106
|
+
const deployedContracts = (await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))).flat();
|
|
99
107
|
await waitForTransactions({
|
|
100
108
|
client,
|
|
101
|
-
hashes:
|
|
109
|
+
hashes: deployedContracts.map(({ txHash }) => txHash).flat(),
|
|
102
110
|
debugLabel: "contract deploys"
|
|
103
111
|
});
|
|
104
|
-
return
|
|
112
|
+
return deployedContracts;
|
|
105
113
|
}
|
|
106
114
|
|
|
107
115
|
// src/deploy/ensureDeployer.ts
|
package/dist/internal.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts","../src/transports/wiresaw.ts","../src/transports/methods/estimateUserOperationGas.ts","../src/transports/entryPointGasSimulations.ts","../src/transports/methods/getUserOperationReceipt.ts","../src/transports/chainTransport.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<readonly Hex[]> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return [];\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize === 0) {\n throw new Error(`Empty bytecode for ${debugLabel}`);\n }\n\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ];\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<readonly Hex[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const txs = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: txs,\n debugLabel: \"contract deploys\",\n });\n\n return txs;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n","import { Chain, EIP1193RequestFn, Hex, http, RpcTransactionReceipt, Transport } from \"viem\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { getUserOperationReceipt } from \"./methods/getUserOperationReceipt\";\nimport { chainTransport } from \"./chainTransport\";\n\ntype WiresawSendUserOperationResult = {\n txHash: Hex;\n userOpHash: Hex;\n};\n\ntype WiresawOptions<transport extends Transport> = {\n /** wiresaw-compatible transport */\n wiresawTransport: transport;\n /** fallback transport for bundler RPC methods */\n fallbackBundlerTransport?: Transport;\n /** fallback transport for all other RPC methods */\n fallbackDefaultTransport?: Transport;\n};\n\nexport function wiresaw<const wiresawTransport extends Transport>(\n transports?: WiresawOptions<wiresawTransport>,\n): wiresawTransport {\n return ((opts) => {\n const { wiresawTransport, fallbackBundlerTransport, fallbackDefaultTransport } =\n transports ?? getDefaultTransports(opts.chain);\n\n const { request: wiresawRequest, ...rest } = wiresawTransport(opts);\n\n let chainId: Hex | null = null;\n const transactionHashes: { [userOpHash: Hex]: Hex } = {};\n const transactionReceipts: { [transactionHashes: Hex]: RpcTransactionReceipt } = {};\n\n return {\n ...rest,\n // TODO: type `request` so we don't have to cast\n async request(req): ReturnType<EIP1193RequestFn> {\n try {\n if (req.method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return (chainId = await fallbackRequest(req));\n }\n return (chainId = await wiresawRequest(req));\n }\n\n if (req.method === \"eth_estimateGas\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_estimateGas\" });\n }\n\n if (req.method === \"eth_call\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_call\" });\n }\n\n if (req.method === \"eth_getTransactionCount\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_getTransactionCount\" });\n }\n\n if (req.method === \"eth_getTransactionReceipt\") {\n return await getTransactionReceipt((req.params as [Hex])[0]);\n }\n\n if (req.method === \"eth_sendUserOperation\") {\n const { userOpHash, txHash } = (await wiresawRequest({\n ...req,\n method: \"wiresaw_sendUserOperation\",\n })) as WiresawSendUserOperationResult;\n transactionHashes[userOpHash] = txHash;\n return userOpHash;\n }\n\n if (req.method === \"eth_getUserOperationReceipt\") {\n const userOpHash = (req.params as [Hex])[0];\n const knownTransactionHash = transactionHashes[userOpHash];\n if (!knownTransactionHash) {\n throw new Error(`eth_getUserOperationReceipt only supported for own user operations`);\n }\n const transactionReceipt = await getTransactionReceipt(knownTransactionHash);\n return transactionReceipt && getUserOperationReceipt(userOpHash, transactionReceipt);\n }\n\n if (req.method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas({\n request: wiresawRequest,\n params: req.params as never,\n });\n }\n\n // Fallback to regular RPC for methods that don't require wiresaw\n if (\n req.method === \"eth_blockNumber\" ||\n req.method === \"eth_getBlockByNumber\" ||\n req.method === \"eth_maxPriorityFeePerGas\"\n ) {\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return await fallbackRequest(req);\n }\n return await wiresawRequest(req);\n }\n\n return await wiresawRequest(req);\n } catch (e) {\n console.warn(\"[wiresaw] request failed\", e);\n const bundlerMethods = [\n \"eth_estimateUserOperationGas\",\n \"eth_sendUserOperation\",\n \"eth_getUserOperationReceipt\",\n ];\n if (bundlerMethods.includes(req.method)) {\n if (fallbackBundlerTransport) {\n const { request: fallbackRequest } = fallbackBundlerTransport(opts);\n console.warn(\"[wiresaw] falling back to bundler rpc\", req);\n return fallbackRequest(req);\n }\n }\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n console.warn(\"[wiresaw] falling back to eth rpc\", req);\n return fallbackRequest(req);\n }\n throw e;\n }\n\n async function getTransactionReceipt(hash: Hex): Promise<RpcTransactionReceipt | undefined> {\n // Return cached receipt if available\n if (transactionReceipts[hash]) return transactionReceipts[hash];\n\n // Fetch pending receipt\n const pendingReceipt = (await wiresawRequest({\n ...req,\n method: \"wiresaw_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (pendingReceipt) {\n transactionReceipts[hash] = pendingReceipt;\n return pendingReceipt;\n }\n\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n const receipt = (await fallbackRequest({\n ...req,\n method: \"eth_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (receipt) {\n transactionReceipts[hash] = receipt;\n return receipt;\n }\n }\n }\n },\n };\n }) as wiresawTransport;\n}\n\nfunction getDefaultTransports(chain?: Chain): WiresawOptions<Transport> {\n if (!chain) {\n throw new Error(\"No chain or transports provided\");\n }\n\n const wiresawTransport = chainTransport(chain.rpcUrls.wiresaw);\n if (!wiresawTransport) {\n throw new Error(\"Provided chain does not support wiresaw\");\n }\n\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n return {\n wiresawTransport,\n fallbackBundlerTransport: bundlerHttpUrl ? http(bundlerHttpUrl) : undefined,\n fallbackDefaultTransport: http(),\n };\n}\n","import {\n BundlerRpcSchema,\n decodeFunctionResult,\n DecodeFunctionResultReturnType,\n EIP1193RequestFn,\n encodeFunctionData,\n Hex,\n zeroAddress,\n} from \"viem\";\nimport { getRpcMethod } from \"../common\";\nimport {\n entryPoint07Address,\n formatUserOperation,\n formatUserOperationRequest,\n toPackedUserOperation,\n UserOperation,\n} from \"viem/account-abstraction\";\nimport { bigIntMax } from \"../../utils\";\nimport { entryPointGasSimulationsAbi } from \"../entryPointGasSimulations\";\n\ntype rpcMethod = getRpcMethod<BundlerRpcSchema, \"eth_estimateUserOperationGas\">;\n\ntype EstimateUserOperationGasOptions = {\n request: EIP1193RequestFn;\n params: rpcMethod[\"Parameters\"];\n};\n\nexport async function estimateUserOperationGas({\n request,\n params,\n}: EstimateUserOperationGasOptions): Promise<rpcMethod[\"ReturnType\"]> {\n const userOp = formatUserOperation(params[0]);\n const gasSimulation = await simulateGas({ userOp, request });\n const gasLimits = {\n verificationGasLimit: gasSimulation.verificationGas * 2n,\n callGasLimit: bigIntMax(gasSimulation.callGas * 2n, 9000n),\n paymasterVerificationGasLimit: gasSimulation.paymasterVerificationGas * 2n,\n paymasterPostOpGasLimit: gasSimulation.paymasterPostOpGas * 2n,\n preVerificationGas: 20_000n,\n };\n\n return formatUserOperationRequest({\n ...gasLimits,\n });\n}\n\ntype SimulateGasOptions = {\n request: EIP1193RequestFn;\n userOp: UserOperation<\"0.7\">;\n};\n\ntype SimulateGasResult = DecodeFunctionResultReturnType<typeof entryPointGasSimulationsAbi>;\n\nasync function simulateGas({ request, userOp }: SimulateGasOptions): Promise<SimulateGasResult> {\n // Prepare user operation for simulation\n const simulationUserOp = {\n ...userOp,\n preVerificationGas: 0n,\n callGasLimit: 10_000_000n,\n verificationGasLimit: 10_000_000n,\n // https://github.com/pimlicolabs/alto/blob/471998695e5ec75ef88dda3f8a534f47c24bcd1a/src/rpc/methods/eth_estimateUserOperationGas.ts#L117\n maxPriorityFeePerGas: userOp.maxFeePerGas,\n paymasterPostOpGasLimit: 2_000_000n,\n paymasterVerificationGasLimit: 5_000_000n,\n } satisfies UserOperation<\"0.7\">;\n\n const packedUserOp = toPackedUserOperation(simulationUserOp);\n const simulationData = encodeFunctionData({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n args: [packedUserOp],\n });\n\n const hasPaymaster = userOp.paymaster != null && userOp.paymaster !== zeroAddress;\n const senderBalanceOverride = hasPaymaster ? {} : { [userOp.sender]: { balance: \"0xFFFFFFFFFFFFFFFFFFFF\" } };\n const simulationParams = [\n {\n to: entryPoint07Address,\n data: simulationData,\n },\n \"pending\",\n {\n ...senderBalanceOverride,\n },\n ];\n const encodedSimulationResult: Hex = await request({\n method: \"wiresaw_callEntryPointSimulations\",\n params: simulationParams,\n });\n\n return decodeFunctionResult({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n data: encodedSimulationResult,\n });\n}\n","export const entryPointGasSimulationsAbi = [\n {\n inputs: [\n {\n components: [\n {\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes\",\n name: \"initCode\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"callData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes32\",\n name: \"accountGasLimits\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"gasFees\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes\",\n name: \"paymasterAndData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n internalType: \"struct PackedUserOperation\",\n name: \"op\",\n type: \"tuple\",\n },\n ],\n name: \"estimateGas\",\n outputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"verificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"callGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterPostOpGas\",\n type: \"uint256\",\n },\n ],\n internalType: \"struct EntryPoint.GasInfo\",\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import {\n Address,\n ExtractAbiItem,\n Hex,\n RpcTransactionReceipt,\n RpcUserOperationReceipt,\n decodeEventLog,\n encodeEventTopics,\n numberToHex,\n parseEventLogs,\n zeroAddress,\n} from \"viem\";\nimport { entryPoint07Abi } from \"viem/account-abstraction\";\n\nconst userOperationRevertReasonAbi = [\n entryPoint07Abi.find(\n (item): item is ExtractAbiItem<typeof entryPoint07Abi, \"UserOperationRevertReason\"> =>\n item.type === \"event\" && item.name === \"UserOperationRevertReason\",\n )!,\n] as const;\n\nconst userOperationEventTopic = encodeEventTopics({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n});\n\nexport function getUserOperationReceipt(userOpHash: Hex, receipt: RpcTransactionReceipt): RpcUserOperationReceipt {\n const userOperationRevertReasonTopicEvent = encodeEventTopics({\n abi: userOperationRevertReasonAbi,\n })[0];\n\n let entryPoint: Address = zeroAddress;\n let revertReason = undefined;\n\n let startIndex = -1;\n let endIndex = -1;\n receipt.logs.forEach((log, index) => {\n if (log?.topics[0] === userOperationEventTopic[0]) {\n // process UserOperationEvent\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. save as end of logs array\n endIndex = index;\n entryPoint = log.address;\n } else if (endIndex === -1) {\n // it's a different hash. remember it as beginning index, but only if we didn't find our end index yet.\n startIndex = index;\n }\n }\n\n if (log?.topics[0] === userOperationRevertReasonTopicEvent) {\n // process UserOperationRevertReason\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. capture revert reason.\n const decodedLog = decodeEventLog({\n abi: userOperationRevertReasonAbi,\n data: log.data,\n topics: log.topics,\n });\n\n revertReason = decodedLog.args.revertReason;\n }\n }\n });\n\n if (endIndex === -1) {\n throw new Error(\"fatal: no UserOperationEvent in logs\");\n }\n\n const logs = receipt.logs.slice(startIndex + 1, endIndex);\n\n const userOperationEvent = parseEventLogs({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n args: {\n userOpHash,\n },\n logs: receipt.logs,\n })[0]!;\n\n let paymaster: Address | undefined = userOperationEvent.args.paymaster;\n paymaster = paymaster === zeroAddress ? undefined : paymaster;\n\n return {\n userOpHash,\n entryPoint,\n sender: userOperationEvent.args.sender,\n nonce: numberToHex(userOperationEvent.args.nonce),\n paymaster,\n actualGasUsed: numberToHex(userOperationEvent.args.actualGasUsed),\n actualGasCost: numberToHex(userOperationEvent.args.actualGasCost),\n success: userOperationEvent.args.success,\n reason: revertReason,\n logs,\n receipt,\n };\n}\n","import { Chain, fallback, http, Transport, webSocket } from \"viem\";\n\nexport function chainTransport(rpcUrls: Chain[\"rpcUrls\"][string]): Transport | undefined {\n const webSocketUrl = rpcUrls?.webSocket?.[0];\n const httpUrl = rpcUrls?.http[0];\n\n if (webSocketUrl) {\n return httpUrl ? fallback([webSocket(webSocketUrl), http(httpUrl)]) : webSocket(webSocketUrl);\n }\n\n if (httpUrl) {\n return http(httpUrl);\n }\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address","http","zeroAddress","http"]}
|
|
1
|
+
{"version":3,"sources":["../src/waitForTransactions.ts","../src/deploy/ensureContract.ts","../src/deploy/common.ts","../src/deploy/debug.ts","../src/deploy/ensureContractsDeployed.ts","../src/deploy/ensureDeployer.ts","../src/deploy/create2/deployment.json","../src/deploy/getDeployer.ts","../src/deploy/getContractAddress.ts","../src/transports/wiresaw.ts","../src/transports/methods/estimateUserOperationGas.ts","../src/transports/entryPointGasSimulations.ts","../src/transports/methods/getUserOperationReceipt.ts","../src/transports/chainTransport.ts"],"sourcesContent":["import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { debug } from \"./debug\";\nimport { waitForTransactionReceipt } from \"viem/actions\";\n\nexport async function waitForTransactions({\n client,\n hashes,\n debugLabel = \"transactions\",\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly hashes: readonly Hex[];\n readonly debugLabel?: string;\n}): Promise<void> {\n if (!hashes.length) return;\n\n debug(`waiting for ${debugLabel} to confirm`);\n // wait for each tx separately/serially, because parallelizing results in RPC errors\n for (const hash of hashes) {\n const receipt = await waitForTransactionReceipt(client, { hash });\n // TODO: handle user op failures?\n if (receipt.status === \"reverted\") {\n throw new Error(`Transaction reverted: ${hash}`);\n }\n }\n}\n","import { Client, Transport, Chain, Account, concatHex, getCreate2Address, Hex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport { contractSizeLimit, singletonSalt } from \"./common\";\nimport { debug } from \"./debug\";\nimport { sendTransaction } from \"../sendTransaction\";\n\nexport type Contract = {\n bytecode: Hex;\n deployedBytecodeSize?: number;\n debugLabel?: string;\n salt?: Hex;\n};\n\nexport type EnsureContractResult = {\n contract: Contract;\n deployedAddress: Hex;\n txHash: readonly Hex[];\n};\n\nexport async function ensureContract({\n client,\n deployerAddress,\n bytecode,\n deployedBytecodeSize,\n debugLabel = \"contract\",\n salt = singletonSalt,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n} & Contract): Promise<EnsureContractResult> {\n if (bytecode.includes(\"__$\")) {\n throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);\n }\n\n const address = getCreate2Address({ from: deployerAddress, salt, bytecode });\n\n const contractCode = await getCode(client, { address, blockTag: \"pending\" });\n if (contractCode) {\n debug(\"found\", debugLabel, \"at\", address);\n return {\n contract: { bytecode, deployedBytecodeSize, debugLabel, salt },\n deployedAddress: address,\n txHash: [],\n };\n }\n\n if (deployedBytecodeSize != null) {\n if (deployedBytecodeSize === 0) {\n throw new Error(`Empty bytecode for ${debugLabel}`);\n }\n\n if (deployedBytecodeSize > contractSizeLimit) {\n console.warn(\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\nBytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \\`forge build --sizes\\` for more info.\\n`,\n );\n }\n }\n\n debug(\"deploying\", debugLabel, \"at\", address);\n return {\n contract: { bytecode, deployedBytecodeSize, debugLabel, salt },\n deployedAddress: address,\n txHash: [\n await sendTransaction(client, {\n chain: client.chain ?? null,\n to: deployerAddress,\n data: concatHex([salt, bytecode]),\n }),\n ],\n };\n}\n","import { stringToHex } from \"viem\";\n\n// salt for deterministic deploys of singleton contracts\nexport const singletonSalt = stringToHex(\"\", { size: 32 });\n\n// https://eips.ethereum.org/EIPS/eip-170\nexport const contractSizeLimit = parseInt(\"6000\", 16);\n","import { debug as parentDebug } from \"../debug\";\n\nexport const debug = parentDebug.extend(\"deploy\");\nexport const error = parentDebug.extend(\"deploy\");\n\n// Pipe debug output to stdout instead of stderr\ndebug.log = console.debug.bind(console);\n\n// Pipe error output to stderr\nerror.log = console.error.bind(console);\n","import { Client, Transport, Chain, Account, Hex } from \"viem\";\nimport { Contract, ensureContract, EnsureContractResult } from \"./ensureContract\";\nimport { waitForTransactions } from \"../waitForTransactions\";\nimport { uniqueBy } from \"../utils/uniqueBy\";\n\nexport async function ensureContractsDeployed({\n client,\n deployerAddress,\n contracts,\n}: {\n readonly client: Client<Transport, Chain | undefined, Account>;\n readonly deployerAddress: Hex;\n readonly contracts: readonly Contract[];\n}): Promise<EnsureContractResult[]> {\n // Deployments assume a deterministic deployer, so we only need to deploy the unique bytecode\n const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);\n\n const deployedContracts = (\n await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))\n ).flat();\n\n await waitForTransactions({\n client,\n hashes: deployedContracts.map(({ txHash }) => txHash).flat(),\n debugLabel: \"contract deploys\",\n });\n\n return deployedContracts;\n}\n","import { Account, Address, Chain, Client, Transport } from \"viem\";\nimport { getBalance, sendRawTransaction, sendTransaction, waitForTransactionReceipt } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\nimport { getDeployer } from \"./getDeployer\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function ensureDeployer(client: Client<Transport, Chain | undefined, Account>): Promise<Address> {\n const existingDeployer = await getDeployer(client);\n if (existingDeployer !== undefined) {\n return existingDeployer;\n }\n\n // There's not really a way to simulate a pre-EIP-155 (no chain ID) transaction,\n // so we have to attempt to create the deployer first and, if it fails, fall back\n // to a regular deploy.\n\n // Send gas to deployment signer\n const gasRequired = BigInt(deployment.gasLimit) * BigInt(deployment.gasPrice);\n const currentBalance = await getBalance(client, { address: `0x${deployment.signerAddress}` });\n const gasNeeded = gasRequired - currentBalance;\n if (gasNeeded > 0) {\n debug(\"sending gas for CREATE2 deployer to signer at\", deployment.signerAddress);\n const gasTx = await sendTransaction(client, {\n chain: client.chain ?? null,\n to: `0x${deployment.signerAddress}`,\n value: gasNeeded,\n });\n const gasReceipt = await waitForTransactionReceipt(client, { hash: gasTx });\n if (gasReceipt.status !== \"success\") {\n console.error(\"failed to send gas to deployer signer\", gasReceipt);\n throw new Error(\"failed to send gas to deployer signer\");\n }\n }\n\n // Deploy the deployer\n debug(\"deploying CREATE2 deployer at\", deployer);\n const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment.transaction}` }).catch(\n (error) => {\n // Do a regular contract create if the presigned transaction doesn't work due to replay protection\n if (String(error).includes(\"only replay-protected (EIP-155) transactions allowed over RPC\")) {\n console.warn(\n // eslint-disable-next-line max-len\n `\\n ⚠️ Your chain or RPC does not allow for non EIP-155 signed transactions, so your deploys will not be determinstic and contract addresses may change between deploys.\\n\\n We recommend running your chain's node with \\`--rpc.allow-unprotected-txs\\` to enable determinstic deployments.\\n`,\n );\n debug(\"deploying CREATE2 deployer\");\n return sendTransaction(client, {\n chain: client.chain ?? null,\n data: `0x${deployment.creationCode}`,\n });\n }\n throw error;\n },\n );\n\n const deployReceipt = await waitForTransactionReceipt(client, { hash: deployTx });\n if (!deployReceipt.contractAddress) {\n throw new Error(\"Deploy receipt did not have contract address, was the deployer not deployed?\");\n }\n\n if (deployReceipt.contractAddress !== deployer) {\n console.warn(\n `\\n ⚠️ CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer})`,\n );\n }\n\n return deployReceipt.contractAddress;\n}\n","{\n \"gasPrice\": 100000000000,\n \"gasLimit\": 100000,\n \"signerAddress\": \"3fab184622dc19b6109349b94811493bf2a45362\",\n \"transaction\": \"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222\",\n \"address\": \"4e59b44847b379578588920ca78fbf26c0b4956c\",\n \"creationCode\": \"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3\"\n}\n","import { Address, Chain, Client, Transport, sliceHex } from \"viem\";\nimport { getCode } from \"viem/actions\";\nimport deployment from \"./create2/deployment.json\";\nimport { debug } from \"./debug\";\n\nconst deployer = `0x${deployment.address}` as const;\n\nexport async function getDeployer(client: Client<Transport, Chain | undefined>): Promise<Address | undefined> {\n const bytecode = await getCode(client, { address: deployer });\n if (bytecode) {\n debug(\"found deployer bytecode at\", deployer);\n // check if deployed bytecode is the same as the expected bytecode (minus 14-bytes creation code prefix)\n if (bytecode !== sliceHex(`0x${deployment.creationCode}`, 14)) {\n console.warn(\n `\\n ⚠️ Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.\\n`,\n );\n }\n return deployer;\n }\n}\n","import { Hex, getCreate2Address } from \"viem\";\nimport { singletonSalt } from \"./common\";\n\nexport function getContractAddress({\n deployerAddress,\n bytecode,\n salt = singletonSalt,\n}: {\n readonly deployerAddress: Hex;\n readonly bytecode: Hex;\n readonly salt?: Hex;\n}): Hex {\n return getCreate2Address({ from: deployerAddress, bytecode, salt });\n}\n","import { Chain, EIP1193RequestFn, Hex, http, RpcTransactionReceipt, Transport } from \"viem\";\nimport { estimateUserOperationGas } from \"./methods/estimateUserOperationGas\";\nimport { getUserOperationReceipt } from \"./methods/getUserOperationReceipt\";\nimport { chainTransport } from \"./chainTransport\";\n\ntype WiresawSendUserOperationResult = {\n txHash: Hex;\n userOpHash: Hex;\n};\n\ntype WiresawOptions<transport extends Transport> = {\n /** wiresaw-compatible transport */\n wiresawTransport: transport;\n /** fallback transport for bundler RPC methods */\n fallbackBundlerTransport?: Transport;\n /** fallback transport for all other RPC methods */\n fallbackDefaultTransport?: Transport;\n};\n\nexport function wiresaw<const wiresawTransport extends Transport>(\n transports?: WiresawOptions<wiresawTransport>,\n): wiresawTransport {\n return ((opts) => {\n const { wiresawTransport, fallbackBundlerTransport, fallbackDefaultTransport } =\n transports ?? getDefaultTransports(opts.chain);\n\n const { request: wiresawRequest, ...rest } = wiresawTransport(opts);\n\n let chainId: Hex | null = null;\n const transactionHashes: { [userOpHash: Hex]: Hex } = {};\n const transactionReceipts: { [transactionHashes: Hex]: RpcTransactionReceipt } = {};\n\n return {\n ...rest,\n // TODO: type `request` so we don't have to cast\n async request(req): ReturnType<EIP1193RequestFn> {\n try {\n if (req.method === \"eth_chainId\") {\n if (chainId != null) return chainId;\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return (chainId = await fallbackRequest(req));\n }\n return (chainId = await wiresawRequest(req));\n }\n\n if (req.method === \"eth_estimateGas\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_estimateGas\" });\n }\n\n if (req.method === \"eth_call\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_call\" });\n }\n\n if (req.method === \"eth_getTransactionCount\") {\n return await wiresawRequest({ ...req, method: \"wiresaw_getTransactionCount\" });\n }\n\n if (req.method === \"eth_getTransactionReceipt\") {\n return await getTransactionReceipt((req.params as [Hex])[0]);\n }\n\n if (req.method === \"eth_sendUserOperation\") {\n const { userOpHash, txHash } = (await wiresawRequest({\n ...req,\n method: \"wiresaw_sendUserOperation\",\n })) as WiresawSendUserOperationResult;\n transactionHashes[userOpHash] = txHash;\n return userOpHash;\n }\n\n if (req.method === \"eth_getUserOperationReceipt\") {\n const userOpHash = (req.params as [Hex])[0];\n const knownTransactionHash = transactionHashes[userOpHash];\n if (!knownTransactionHash) {\n throw new Error(`eth_getUserOperationReceipt only supported for own user operations`);\n }\n const transactionReceipt = await getTransactionReceipt(knownTransactionHash);\n return transactionReceipt && getUserOperationReceipt(userOpHash, transactionReceipt);\n }\n\n if (req.method === \"eth_estimateUserOperationGas\") {\n return await estimateUserOperationGas({\n request: wiresawRequest,\n params: req.params as never,\n });\n }\n\n // Fallback to regular RPC for methods that don't require wiresaw\n if (\n req.method === \"eth_blockNumber\" ||\n req.method === \"eth_getBlockByNumber\" ||\n req.method === \"eth_maxPriorityFeePerGas\"\n ) {\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n return await fallbackRequest(req);\n }\n return await wiresawRequest(req);\n }\n\n return await wiresawRequest(req);\n } catch (e) {\n console.warn(\"[wiresaw] request failed\", e);\n const bundlerMethods = [\n \"eth_estimateUserOperationGas\",\n \"eth_sendUserOperation\",\n \"eth_getUserOperationReceipt\",\n ];\n if (bundlerMethods.includes(req.method)) {\n if (fallbackBundlerTransport) {\n const { request: fallbackRequest } = fallbackBundlerTransport(opts);\n console.warn(\"[wiresaw] falling back to bundler rpc\", req);\n return fallbackRequest(req);\n }\n }\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n console.warn(\"[wiresaw] falling back to eth rpc\", req);\n return fallbackRequest(req);\n }\n throw e;\n }\n\n async function getTransactionReceipt(hash: Hex): Promise<RpcTransactionReceipt | undefined> {\n // Return cached receipt if available\n if (transactionReceipts[hash]) return transactionReceipts[hash];\n\n // Fetch pending receipt\n const pendingReceipt = (await wiresawRequest({\n ...req,\n method: \"wiresaw_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (pendingReceipt) {\n transactionReceipts[hash] = pendingReceipt;\n return pendingReceipt;\n }\n\n if (fallbackDefaultTransport) {\n const { request: fallbackRequest } = fallbackDefaultTransport(opts);\n const receipt = (await fallbackRequest({\n ...req,\n method: \"eth_getTransactionReceipt\",\n params: [hash],\n })) as RpcTransactionReceipt | undefined;\n if (receipt) {\n transactionReceipts[hash] = receipt;\n return receipt;\n }\n }\n }\n },\n };\n }) as wiresawTransport;\n}\n\nfunction getDefaultTransports(chain?: Chain): WiresawOptions<Transport> {\n if (!chain) {\n throw new Error(\"No chain or transports provided\");\n }\n\n const wiresawTransport = chainTransport(chain.rpcUrls.wiresaw);\n if (!wiresawTransport) {\n throw new Error(\"Provided chain does not support wiresaw\");\n }\n\n const bundlerHttpUrl = chain.rpcUrls.bundler?.http[0];\n return {\n wiresawTransport,\n fallbackBundlerTransport: bundlerHttpUrl ? http(bundlerHttpUrl) : undefined,\n fallbackDefaultTransport: http(),\n };\n}\n","import {\n BundlerRpcSchema,\n decodeFunctionResult,\n DecodeFunctionResultReturnType,\n EIP1193RequestFn,\n encodeFunctionData,\n Hex,\n zeroAddress,\n} from \"viem\";\nimport { getRpcMethod } from \"../common\";\nimport {\n entryPoint07Address,\n formatUserOperation,\n formatUserOperationRequest,\n toPackedUserOperation,\n UserOperation,\n} from \"viem/account-abstraction\";\nimport { bigIntMax } from \"../../utils\";\nimport { entryPointGasSimulationsAbi } from \"../entryPointGasSimulations\";\n\ntype rpcMethod = getRpcMethod<BundlerRpcSchema, \"eth_estimateUserOperationGas\">;\n\ntype EstimateUserOperationGasOptions = {\n request: EIP1193RequestFn;\n params: rpcMethod[\"Parameters\"];\n};\n\nexport async function estimateUserOperationGas({\n request,\n params,\n}: EstimateUserOperationGasOptions): Promise<rpcMethod[\"ReturnType\"]> {\n const userOp = formatUserOperation(params[0]);\n const gasSimulation = await simulateGas({ userOp, request });\n const gasLimits = {\n verificationGasLimit: gasSimulation.verificationGas * 2n,\n callGasLimit: bigIntMax(gasSimulation.callGas * 2n, 9000n),\n paymasterVerificationGasLimit: gasSimulation.paymasterVerificationGas * 2n,\n paymasterPostOpGasLimit: gasSimulation.paymasterPostOpGas * 2n,\n preVerificationGas: 20_000n,\n };\n\n return formatUserOperationRequest({\n ...gasLimits,\n });\n}\n\ntype SimulateGasOptions = {\n request: EIP1193RequestFn;\n userOp: UserOperation<\"0.7\">;\n};\n\ntype SimulateGasResult = DecodeFunctionResultReturnType<typeof entryPointGasSimulationsAbi>;\n\nasync function simulateGas({ request, userOp }: SimulateGasOptions): Promise<SimulateGasResult> {\n // Prepare user operation for simulation\n const simulationUserOp = {\n ...userOp,\n preVerificationGas: 0n,\n callGasLimit: 10_000_000n,\n verificationGasLimit: 10_000_000n,\n // https://github.com/pimlicolabs/alto/blob/471998695e5ec75ef88dda3f8a534f47c24bcd1a/src/rpc/methods/eth_estimateUserOperationGas.ts#L117\n maxPriorityFeePerGas: userOp.maxFeePerGas,\n paymasterPostOpGasLimit: 2_000_000n,\n paymasterVerificationGasLimit: 5_000_000n,\n } satisfies UserOperation<\"0.7\">;\n\n const packedUserOp = toPackedUserOperation(simulationUserOp);\n const simulationData = encodeFunctionData({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n args: [packedUserOp],\n });\n\n const hasPaymaster = userOp.paymaster != null && userOp.paymaster !== zeroAddress;\n const senderBalanceOverride = hasPaymaster ? {} : { [userOp.sender]: { balance: \"0xFFFFFFFFFFFFFFFFFFFF\" } };\n const simulationParams = [\n {\n to: entryPoint07Address,\n data: simulationData,\n },\n \"pending\",\n {\n ...senderBalanceOverride,\n },\n ];\n const encodedSimulationResult: Hex = await request({\n method: \"wiresaw_callEntryPointSimulations\",\n params: simulationParams,\n });\n\n return decodeFunctionResult({\n abi: entryPointGasSimulationsAbi,\n functionName: \"estimateGas\",\n data: encodedSimulationResult,\n });\n}\n","export const entryPointGasSimulationsAbi = [\n {\n inputs: [\n {\n components: [\n {\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"nonce\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes\",\n name: \"initCode\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"callData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes32\",\n name: \"accountGasLimits\",\n type: \"bytes32\",\n },\n {\n internalType: \"uint256\",\n name: \"preVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"bytes32\",\n name: \"gasFees\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes\",\n name: \"paymasterAndData\",\n type: \"bytes\",\n },\n {\n internalType: \"bytes\",\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n internalType: \"struct PackedUserOperation\",\n name: \"op\",\n type: \"tuple\",\n },\n ],\n name: \"estimateGas\",\n outputs: [\n {\n components: [\n {\n internalType: \"uint256\",\n name: \"verificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"callGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterVerificationGas\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"paymasterPostOpGas\",\n type: \"uint256\",\n },\n ],\n internalType: \"struct EntryPoint.GasInfo\",\n name: \"\",\n type: \"tuple\",\n },\n ],\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const;\n","import {\n Address,\n ExtractAbiItem,\n Hex,\n RpcTransactionReceipt,\n RpcUserOperationReceipt,\n decodeEventLog,\n encodeEventTopics,\n numberToHex,\n parseEventLogs,\n zeroAddress,\n} from \"viem\";\nimport { entryPoint07Abi } from \"viem/account-abstraction\";\n\nconst userOperationRevertReasonAbi = [\n entryPoint07Abi.find(\n (item): item is ExtractAbiItem<typeof entryPoint07Abi, \"UserOperationRevertReason\"> =>\n item.type === \"event\" && item.name === \"UserOperationRevertReason\",\n )!,\n] as const;\n\nconst userOperationEventTopic = encodeEventTopics({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n});\n\nexport function getUserOperationReceipt(userOpHash: Hex, receipt: RpcTransactionReceipt): RpcUserOperationReceipt {\n const userOperationRevertReasonTopicEvent = encodeEventTopics({\n abi: userOperationRevertReasonAbi,\n })[0];\n\n let entryPoint: Address = zeroAddress;\n let revertReason = undefined;\n\n let startIndex = -1;\n let endIndex = -1;\n receipt.logs.forEach((log, index) => {\n if (log?.topics[0] === userOperationEventTopic[0]) {\n // process UserOperationEvent\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. save as end of logs array\n endIndex = index;\n entryPoint = log.address;\n } else if (endIndex === -1) {\n // it's a different hash. remember it as beginning index, but only if we didn't find our end index yet.\n startIndex = index;\n }\n }\n\n if (log?.topics[0] === userOperationRevertReasonTopicEvent) {\n // process UserOperationRevertReason\n if (log.topics[1] === userOpHash) {\n // it's our userOpHash. capture revert reason.\n const decodedLog = decodeEventLog({\n abi: userOperationRevertReasonAbi,\n data: log.data,\n topics: log.topics,\n });\n\n revertReason = decodedLog.args.revertReason;\n }\n }\n });\n\n if (endIndex === -1) {\n throw new Error(\"fatal: no UserOperationEvent in logs\");\n }\n\n const logs = receipt.logs.slice(startIndex + 1, endIndex);\n\n const userOperationEvent = parseEventLogs({\n abi: entryPoint07Abi,\n eventName: \"UserOperationEvent\",\n args: {\n userOpHash,\n },\n logs: receipt.logs,\n })[0]!;\n\n let paymaster: Address | undefined = userOperationEvent.args.paymaster;\n paymaster = paymaster === zeroAddress ? undefined : paymaster;\n\n return {\n userOpHash,\n entryPoint,\n sender: userOperationEvent.args.sender,\n nonce: numberToHex(userOperationEvent.args.nonce),\n paymaster,\n actualGasUsed: numberToHex(userOperationEvent.args.actualGasUsed),\n actualGasCost: numberToHex(userOperationEvent.args.actualGasCost),\n success: userOperationEvent.args.success,\n reason: revertReason,\n logs,\n receipt,\n };\n}\n","import { Chain, fallback, http, Transport, webSocket } from \"viem\";\n\nexport function chainTransport(rpcUrls: Chain[\"rpcUrls\"][string]): Transport | undefined {\n const webSocketUrl = rpcUrls?.webSocket?.[0];\n const httpUrl = rpcUrls?.http[0];\n\n if (webSocketUrl) {\n return httpUrl ? fallback([webSocket(webSocketUrl), http(httpUrl)]) : webSocket(webSocketUrl);\n }\n\n if (httpUrl) {\n return http(httpUrl);\n }\n}\n"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address","http","zeroAddress","http"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@latticexyz/common",
|
|
3
|
-
"version": "2.2.24-
|
|
3
|
+
"version": "2.2.24-a851c91de9ca31fe4d522ac33c07cfdd0e403853",
|
|
4
4
|
"description": "Common low level logic shared between packages",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"p-retry": "^5.1.2",
|
|
70
70
|
"prettier": "3.2.5",
|
|
71
71
|
"prettier-plugin-solidity": "1.3.1",
|
|
72
|
-
"@latticexyz/schema-type": "2.2.24-
|
|
72
|
+
"@latticexyz/schema-type": "2.2.24-a851c91de9ca31fe4d522ac33c07cfdd0e403853"
|
|
73
73
|
},
|
|
74
74
|
"devDependencies": {
|
|
75
75
|
"@types/debug": "^4.1.7",
|