@latticexyz/common 2.2.18-f0433092876e2ac9b5b12cd0ecae9c120a2d0368 → 2.2.18

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/index.js CHANGED
@@ -1,2 +1,234 @@
1
- import{a as p}from"./chunk-DPUUE7NM.js";import{a as K,b as $,c as q,d as B,f as j}from"./chunk-6FIKI2CG.js";import{a as D,b as L,c as x,d as _,e as m}from"./chunk-ZIUX7JCQ.js";import{a as l}from"./chunk-TCWGPC6G.js";import h from"debug";var T=h("mud:benchmark");T.log=console.info.bind(console);function J(e){let r=T.extend(e),t=performance.now();return o=>{let n=(performance.now()-t)/1e3;r("%s: +%ds",o,n),t=performance.now()}}import{privateKeyToAccount as P}from"viem/accounts";function V(e){return{...P(e)}}import{generatePrivateKey as w,privateKeyToAccount as d}from"viem/accounts";import{isHex as H}from"viem";function v(e,r){if(!H(e))throw console.error("Private key found in cache is not valid hex",{privateKey:e,cacheKey:r}),new Error(`Private key found in cache (${r}) is not valid hex`);d(e)}function re(e="mud:burnerWallet"){let r=localStorage.getItem(e);if(r!=null)return v(r,e),r;let t=w();return console.log("New burner wallet created:",d(t)),localStorage.setItem(e,t),t}import{getContract as W}from"viem";function O(e){let r=e.length&&Array.isArray(e[0]),t=r?e[0]:[],o=(r?e[1]:e[0])??{};return{args:t,options:o}}function f({abi:e,address:r,client:{public:t,wallet:o},onWrite:n}){let i=W({abi:e,address:r,client:{public:t,wallet:o}});if(i.write){let s=0;i.write=new Proxy({},{get(F,C){return(...g)=>{let{args:A,options:k}=O(g),c={abi:e,address:r,functionName:C,args:A,...k,onWrite:n},u=p(o,c,{publicClient:t}),y=`${o.chain.id}:${o.account.address}:${s++}`;return n?.({id:y,request:c,result:u}),u}}})}return i}function be(e,r){return e.blockNumber===r.blockNumber?e.logIndex===r.logIndex?0:e.logIndex==null?1:r.logIndex==null?-1:e.logIndex-r.logIndex:e.blockNumber==null?1:r.blockNumber==null?-1:e.blockNumber>r.blockNumber?1:e.blockNumber<r.blockNumber?-1:0}var b=class extends Map{constructor(r){super(),this.maxSize=r}set(r,t){return super.set(r,t),this.maxSize&&this.size>this.maxSize&&this.delete(this.keys().next().value),this}};function a(e,r,t){return`0x${e.replace(/^0x/,"").slice(r*2,t!=null?t*2:void 0).padEnd(((t??r)-r)*2,"0")}`}function ke(e){return"ok"in e}function I(e){return"error"in e}function ye(e){if(I(e))throw e.error;return e.ok}import{concatHex as N}from"viem";function ve(e,r,t=0,o="0x"){return N([a(e,0,r),o,a(e,r+t)])}import{keccak256 as E}from"viem";var R=l.extend("transportObserver");function Re(e){return r=>{let t=e(r);return{...t,request:async n=>{if(n.method==="eth_sendRawTransaction"&&n.params instanceof Array){let i=n.params.map(s=>E(s));R("saw txs",i)}return t.request(n)}}}}var S=f;var G=x;var z=m;export{b as LruMap,J as createBenchmark,V as createBurnerAccount,S as createContract,q as createNonceManager,$ as findCause,re as getBurnerPrivateKey,f as getContract,B as getNonceManager,K as getNonceManagerId,m as hexToResource,z as hexToResourceId,I as isError,ke as isOk,be as logSort,a as readHex,G as resourceIdToHex,x as resourceToHex,_ as resourceToLabel,L as resourceTypeIds,D as resourceTypes,j as sendTransaction,ve as spliceHex,Re as transportObserver,ye as unwrap,p as writeContract};
1
+ import {
2
+ writeContract
3
+ } from "./chunk-324BIDBP.js";
4
+ import {
5
+ createNonceManager,
6
+ findCause,
7
+ getNonceManager,
8
+ getNonceManagerId,
9
+ sendTransaction
10
+ } from "./chunk-5Q2OTK63.js";
11
+ import {
12
+ hexToResource,
13
+ resourceToHex,
14
+ resourceToLabel,
15
+ resourceTypeIds,
16
+ resourceTypes
17
+ } from "./chunk-6Y3PYSE7.js";
18
+ import {
19
+ debug
20
+ } from "./chunk-73UWXFXB.js";
21
+
22
+ // src/createBenchmark.ts
23
+ import createDebug from "debug";
24
+ var parentDebug = createDebug("mud:benchmark");
25
+ parentDebug.log = console.info.bind(console);
26
+ function createBenchmark(namespace) {
27
+ const debug3 = parentDebug.extend(namespace);
28
+ let lastStep = performance.now();
29
+ return (stepName) => {
30
+ const secondsSinceLastStep = (performance.now() - lastStep) / 1e3;
31
+ debug3("%s: +%ds", stepName, secondsSinceLastStep);
32
+ lastStep = performance.now();
33
+ };
34
+ }
35
+
36
+ // src/createBurnerAccount.ts
37
+ import { privateKeyToAccount } from "viem/accounts";
38
+ function createBurnerAccount(privateKey) {
39
+ const account = privateKeyToAccount(privateKey);
40
+ return {
41
+ ...account
42
+ };
43
+ }
44
+
45
+ // src/getBurnerPrivateKey.ts
46
+ import { generatePrivateKey, privateKeyToAccount as privateKeyToAccount2 } from "viem/accounts";
47
+ import { isHex } from "viem";
48
+ function assertPrivateKey(privateKey, cacheKey) {
49
+ if (!isHex(privateKey)) {
50
+ console.error("Private key found in cache is not valid hex", { privateKey, cacheKey });
51
+ throw new Error(`Private key found in cache (${cacheKey}) is not valid hex`);
52
+ }
53
+ privateKeyToAccount2(privateKey);
54
+ }
55
+ function getBurnerPrivateKey(cacheKey = "mud:burnerWallet") {
56
+ const cachedPrivateKey = localStorage.getItem(cacheKey);
57
+ if (cachedPrivateKey != null) {
58
+ assertPrivateKey(cachedPrivateKey, cacheKey);
59
+ return cachedPrivateKey;
60
+ }
61
+ const privateKey = generatePrivateKey();
62
+ console.log("New burner wallet created:", privateKeyToAccount2(privateKey));
63
+ localStorage.setItem(cacheKey, privateKey);
64
+ return privateKey;
65
+ }
66
+
67
+ // src/getContract.ts
68
+ import {
69
+ getContract as viem_getContract
70
+ } from "viem";
71
+ function getFunctionParameters(values) {
72
+ const hasArgs = values.length && Array.isArray(values[0]);
73
+ const args = hasArgs ? values[0] : [];
74
+ const options = (hasArgs ? values[1] : values[0]) ?? {};
75
+ return { args, options };
76
+ }
77
+ function getContract({
78
+ abi,
79
+ address,
80
+ client: { public: publicClient, wallet: walletClient },
81
+ onWrite
82
+ }) {
83
+ const contract = viem_getContract({
84
+ abi,
85
+ address,
86
+ client: {
87
+ public: publicClient,
88
+ wallet: walletClient
89
+ }
90
+ });
91
+ if (contract.write) {
92
+ let nextWriteId = 0;
93
+ contract.write = new Proxy(
94
+ {},
95
+ {
96
+ get(_, functionName) {
97
+ return (...parameters) => {
98
+ const { args, options } = getFunctionParameters(parameters);
99
+ const request = {
100
+ abi,
101
+ address,
102
+ functionName,
103
+ args,
104
+ ...options,
105
+ onWrite
106
+ };
107
+ const result = writeContract(walletClient, request, { publicClient });
108
+ const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;
109
+ onWrite?.({
110
+ id,
111
+ request,
112
+ result
113
+ });
114
+ return result;
115
+ };
116
+ }
117
+ }
118
+ );
119
+ }
120
+ return contract;
121
+ }
122
+
123
+ // src/logSort.ts
124
+ function logSort(a, b) {
125
+ if (a.blockNumber === b.blockNumber) {
126
+ if (a.logIndex === b.logIndex) return 0;
127
+ if (a.logIndex == null) return 1;
128
+ if (b.logIndex == null) return -1;
129
+ return a.logIndex - b.logIndex;
130
+ }
131
+ if (a.blockNumber == null) return 1;
132
+ if (b.blockNumber == null) return -1;
133
+ if (a.blockNumber > b.blockNumber) return 1;
134
+ if (a.blockNumber < b.blockNumber) return -1;
135
+ return 0;
136
+ }
137
+
138
+ // src/LruMap.ts
139
+ var LruMap = class extends Map {
140
+ constructor(size) {
141
+ super();
142
+ this.maxSize = size;
143
+ }
144
+ set(key, value) {
145
+ super.set(key, value);
146
+ if (this.maxSize && this.size > this.maxSize) {
147
+ this.delete(this.keys().next().value);
148
+ }
149
+ return this;
150
+ }
151
+ };
152
+
153
+ // src/readHex.ts
154
+ function readHex(data, start, end) {
155
+ return `0x${data.replace(/^0x/, "").slice(start * 2, end != null ? end * 2 : void 0).padEnd(((end ?? start) - start) * 2, "0")}`;
156
+ }
157
+
158
+ // src/result.ts
159
+ function isOk(result) {
160
+ return "ok" in result;
161
+ }
162
+ function isError(result) {
163
+ return "error" in result;
164
+ }
165
+ function unwrap(result) {
166
+ if (isError(result)) {
167
+ throw result.error;
168
+ }
169
+ return result.ok;
170
+ }
171
+
172
+ // src/spliceHex.ts
173
+ import { concatHex } from "viem";
174
+ function spliceHex(data, start, deleteCount = 0, newData = "0x") {
175
+ return concatHex([readHex(data, 0, start), newData, readHex(data, start + deleteCount)]);
176
+ }
177
+
178
+ // src/transportObserver.ts
179
+ import { keccak256 } from "viem";
180
+ var debug2 = debug.extend("transportObserver");
181
+ function transportObserver(transport) {
182
+ return (opts) => {
183
+ const result = transport(opts);
184
+ const request = async (req) => {
185
+ if (req.method === "eth_sendRawTransaction" && req.params instanceof Array) {
186
+ const txs = req.params.map((data) => keccak256(data));
187
+ debug2("saw txs", txs);
188
+ }
189
+ return result.request(req);
190
+ };
191
+ return {
192
+ ...result,
193
+ request
194
+ };
195
+ };
196
+ }
197
+
198
+ // src/deprecated/createContract.ts
199
+ var createContract = getContract;
200
+
201
+ // src/deprecated/resourceIdToHex.ts
202
+ var resourceIdToHex = resourceToHex;
203
+
204
+ // src/deprecated/hexToResourceId.ts
205
+ var hexToResourceId = hexToResource;
206
+ export {
207
+ LruMap,
208
+ createBenchmark,
209
+ createBurnerAccount,
210
+ createContract,
211
+ createNonceManager,
212
+ findCause,
213
+ getBurnerPrivateKey,
214
+ getContract,
215
+ getNonceManager,
216
+ getNonceManagerId,
217
+ hexToResource,
218
+ hexToResourceId,
219
+ isError,
220
+ isOk,
221
+ logSort,
222
+ readHex,
223
+ resourceIdToHex,
224
+ resourceToHex,
225
+ resourceToLabel,
226
+ resourceTypeIds,
227
+ resourceTypes,
228
+ sendTransaction,
229
+ spliceHex,
230
+ transportObserver,
231
+ unwrap,
232
+ writeContract
233
+ };
2
234
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/createBenchmark.ts","../src/createBurnerAccount.ts","../src/getBurnerPrivateKey.ts","../src/getContract.ts","../src/logSort.ts","../src/LruMap.ts","../src/readHex.ts","../src/result.ts","../src/spliceHex.ts","../src/transportObserver.ts","../src/deprecated/createContract.ts","../src/deprecated/resourceIdToHex.ts","../src/deprecated/hexToResourceId.ts"],"sourcesContent":["import createDebug from \"debug\";\n\nconst parentDebug = createDebug(\"mud:benchmark\");\n\n// Pipe debug output to stdout instead of stderr\nparentDebug.log = console.info.bind(console);\n\nexport function createBenchmark(namespace: string): (stepName: string) => void {\n const debug = parentDebug.extend(namespace);\n let lastStep = performance.now();\n\n return (stepName: string) => {\n const secondsSinceLastStep = (performance.now() - lastStep) / 1000;\n debug(\"%s: +%ds\", stepName, secondsSinceLastStep);\n lastStep = performance.now();\n };\n}\n","import { Hex, PrivateKeyAccount } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport function createBurnerAccount(privateKey: Hex): PrivateKeyAccount {\n const account = privateKeyToAccount(privateKey);\n // We may override account features here\n return {\n ...account,\n };\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { isHex, Hex } from \"viem\";\n\nfunction assertPrivateKey(privateKey: string, cacheKey: string): asserts privateKey is Hex {\n if (!isHex(privateKey)) {\n console.error(\"Private key found in cache is not valid hex\", { privateKey, cacheKey });\n throw new Error(`Private key found in cache (${cacheKey}) is not valid hex`);\n }\n // ensure we can extract address from private key\n // this should throw on bad private keys\n privateKeyToAccount(privateKey);\n}\n\nexport function getBurnerPrivateKey(cacheKey = \"mud:burnerWallet\"): Hex {\n const cachedPrivateKey = localStorage.getItem(cacheKey);\n\n if (cachedPrivateKey != null) {\n assertPrivateKey(cachedPrivateKey, cacheKey);\n return cachedPrivateKey;\n }\n\n const privateKey = generatePrivateKey();\n console.log(\"New burner wallet created:\", privateKeyToAccount(privateKey));\n localStorage.setItem(cacheKey, privateKey);\n return privateKey;\n}\n","import {\n Abi,\n Account,\n Address,\n Chain,\n GetContractParameters,\n GetContractReturnType,\n Hex,\n PublicClient,\n Transport,\n WalletClient,\n WriteContractParameters,\n type ContractFunctionName,\n type ContractFunctionArgs,\n getContract as viem_getContract,\n} from \"viem\";\nimport { UnionOmit } from \"./type-utils/common\";\nimport { writeContract } from \"./writeContract\";\n\n// copied from viem because this isn't exported\n// TODO: import from viem?\nfunction getFunctionParameters(values: [args?: readonly unknown[], options?: object]): {\n args: readonly unknown[];\n options: object;\n} {\n const hasArgs = values.length && Array.isArray(values[0]);\n const args = hasArgs ? values[0]! : [];\n const options = (hasArgs ? values[1] : values[0]) ?? {};\n return { args, options };\n}\n\nexport type ContractWrite = {\n id: string;\n request: WriteContractParameters;\n result: Promise<Hex>;\n};\n\nexport type GetContractOptions<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n> = GetContractParameters<\n TTransport,\n TChain,\n TAccount,\n TAbi,\n { public: TPublicClient; wallet: TWalletClient },\n TAddress\n> & {\n onWrite?: (write: ContractWrite) => void;\n};\n\n// TODO: migrate away from this approach once we can hook into viem: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue()).extend(writeObserver({ onWrite }))` and viem's `getContract` instead. */\nexport function getContract<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n>({\n abi,\n address,\n client: { public: publicClient, wallet: walletClient },\n onWrite,\n}: GetContractOptions<\n TTransport,\n TAddress,\n TAbi,\n TChain,\n TAccount,\n TPublicClient,\n TWalletClient\n>): GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> {\n const contract: GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n } = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as never;\n\n if (contract.write) {\n // Replace write calls with our own. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries).\n let nextWriteId = 0;\n contract.write = new Proxy(\n {},\n {\n get(_, functionName: string) {\n return (\n ...parameters: [\n args?: readonly unknown[],\n options?: UnionOmit<WriteContractParameters, \"abi\" | \"address\" | \"functionName\" | \"args\">,\n ]\n ) => {\n const { args, options } = getFunctionParameters(parameters);\n const request: WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n > = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as never;\n const result = writeContract(walletClient, request, { publicClient }) as never;\n\n const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;\n onWrite?.({\n id,\n request: request as WriteContractParameters,\n result,\n });\n\n return result;\n };\n },\n },\n );\n }\n\n return contract;\n}\n","type PartialLog = { readonly blockNumber: bigint | null; readonly logIndex: number | null };\n\nexport function logSort(a: PartialLog, b: PartialLog): number {\n if (a.blockNumber === b.blockNumber) {\n if (a.logIndex === b.logIndex) return 0;\n if (a.logIndex == null) return 1;\n if (b.logIndex == null) return -1;\n return a.logIndex - b.logIndex;\n }\n\n if (a.blockNumber == null) return 1;\n if (b.blockNumber == null) return -1;\n if (a.blockNumber > b.blockNumber) return 1;\n if (a.blockNumber < b.blockNumber) return -1;\n return 0;\n}\n","/**\n * Map with a LRU (least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n * @link https://github.com/wevm/viem/blob/0fa08e113a890e6672fdc64fa7a2206a840611ab/src/utils/lru.ts\n */\nexport class LruMap<key, value> extends Map<key, value> {\n maxSize: number;\n\n constructor(size: number) {\n super();\n this.maxSize = size;\n }\n\n override set(key: key, value: value): this {\n super.set(key, value);\n if (this.maxSize && this.size > this.maxSize) {\n this.delete(this.keys().next().value);\n }\n return this;\n }\n}\n","import { Hex } from \"viem\";\n\n/**\n * Get the hex value at start/end positions. This will always return a valid hex string.\n *\n * If `start` is out of range, this returns `\"0x\"`.\n *\n * If `end` is specified and out of range, the result is right zero-padded to the desired length (`end - start`).\n */\nexport function readHex(data: Hex, start: number, end?: number): Hex {\n return `0x${data\n .replace(/^0x/, \"\")\n .slice(start * 2, end != null ? end * 2 : undefined)\n .padEnd(((end ?? start) - start) * 2, \"0\")}`;\n}\n","// Inspired by https://doc.rust-lang.org/std/result/\nexport type Result<Ok, Err = unknown> = { ok: Ok } | { error: Err };\n\nexport function isOk<Ok, Err>(result: Result<Ok, Err>): result is { ok: Ok } {\n return \"ok\" in result;\n}\n\nexport function isError<Ok, Err>(result: Result<Ok, Err>): result is { error: Err } {\n return \"error\" in result;\n}\n\nexport function unwrap<Ok, Err>(result: Result<Ok, Err>): Ok {\n if (isError(result)) {\n throw result.error;\n }\n return result.ok;\n}\n","import { Hex, concatHex } from \"viem\";\nimport { readHex } from \"./readHex\";\n\nexport function spliceHex(data: Hex, start: number, deleteCount = 0, newData: Hex = \"0x\"): Hex {\n return concatHex([readHex(data, 0, start), newData, readHex(data, start + deleteCount)]);\n}\n","import { Hex, Transport, keccak256 } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\n\nconst debug = parentDebug.extend(\"transportObserver\");\n\nexport function transportObserver<TTransport extends Transport>(transport: TTransport): TTransport {\n return ((opts) => {\n const result = transport(opts);\n const request: typeof result.request = async (req) => {\n if (req.method === \"eth_sendRawTransaction\" && req.params instanceof Array) {\n const txs = req.params.map((data: Hex) => keccak256(data));\n debug(\"saw txs\", txs);\n // TODO: pass these tx hashes into dev tools\n }\n // TODO: add support for `eth_sendTransaction`\n return result.request(req);\n };\n return {\n ...result,\n request,\n };\n }) as TTransport;\n}\n","import { getContract } from \"../getContract\";\n\n/** @deprecated use `getContract` instead */\nexport const createContract = getContract;\n","import { resourceToHex } from \"../resourceToHex\";\n\n/** @deprecated use `resourceToHex` instead */\nexport const resourceIdToHex = resourceToHex;\n","import { hexToResource } from \"../hexToResource\";\n\n/** @deprecated use `hexToResource` instead */\nexport const hexToResourceId = hexToResource;\n"],"mappings":"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","names":["createDebug","parentDebug","createBenchmark","namespace","debug","lastStep","stepName","secondsSinceLastStep","privateKeyToAccount","createBurnerAccount","privateKey","generatePrivateKey","privateKeyToAccount","isHex","assertPrivateKey","privateKey","cacheKey","getBurnerPrivateKey","cachedPrivateKey","viem_getContract","getFunctionParameters","values","hasArgs","args","options","getContract","abi","address","publicClient","walletClient","onWrite","contract","viem_getContract","nextWriteId","_","functionName","parameters","request","result","writeContract","id","logSort","a","b","LruMap","size","key","value","readHex","data","start","end","isOk","result","isError","unwrap","concatHex","spliceHex","data","start","deleteCount","newData","concatHex","readHex","keccak256","debug","transportObserver","transport","opts","result","req","txs","data","keccak256","createContract","getContract","resourceIdToHex","resourceToHex","hexToResourceId","hexToResource"]}
1
+ {"version":3,"sources":["../src/createBenchmark.ts","../src/createBurnerAccount.ts","../src/getBurnerPrivateKey.ts","../src/getContract.ts","../src/logSort.ts","../src/LruMap.ts","../src/readHex.ts","../src/result.ts","../src/spliceHex.ts","../src/transportObserver.ts","../src/deprecated/createContract.ts","../src/deprecated/resourceIdToHex.ts","../src/deprecated/hexToResourceId.ts"],"sourcesContent":["import createDebug from \"debug\";\n\nconst parentDebug = createDebug(\"mud:benchmark\");\n\n// Pipe debug output to stdout instead of stderr\nparentDebug.log = console.info.bind(console);\n\nexport function createBenchmark(namespace: string): (stepName: string) => void {\n const debug = parentDebug.extend(namespace);\n let lastStep = performance.now();\n\n return (stepName: string) => {\n const secondsSinceLastStep = (performance.now() - lastStep) / 1000;\n debug(\"%s: +%ds\", stepName, secondsSinceLastStep);\n lastStep = performance.now();\n };\n}\n","import { Hex, PrivateKeyAccount } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\n\nexport function createBurnerAccount(privateKey: Hex): PrivateKeyAccount {\n const account = privateKeyToAccount(privateKey);\n // We may override account features here\n return {\n ...account,\n };\n}\n","import { generatePrivateKey, privateKeyToAccount } from \"viem/accounts\";\nimport { isHex, Hex } from \"viem\";\n\nfunction assertPrivateKey(privateKey: string, cacheKey: string): asserts privateKey is Hex {\n if (!isHex(privateKey)) {\n console.error(\"Private key found in cache is not valid hex\", { privateKey, cacheKey });\n throw new Error(`Private key found in cache (${cacheKey}) is not valid hex`);\n }\n // ensure we can extract address from private key\n // this should throw on bad private keys\n privateKeyToAccount(privateKey);\n}\n\nexport function getBurnerPrivateKey(cacheKey = \"mud:burnerWallet\"): Hex {\n const cachedPrivateKey = localStorage.getItem(cacheKey);\n\n if (cachedPrivateKey != null) {\n assertPrivateKey(cachedPrivateKey, cacheKey);\n return cachedPrivateKey;\n }\n\n const privateKey = generatePrivateKey();\n console.log(\"New burner wallet created:\", privateKeyToAccount(privateKey));\n localStorage.setItem(cacheKey, privateKey);\n return privateKey;\n}\n","import {\n Abi,\n Account,\n Address,\n Chain,\n GetContractParameters,\n GetContractReturnType,\n Hex,\n PublicClient,\n Transport,\n WalletClient,\n WriteContractParameters,\n type ContractFunctionName,\n type ContractFunctionArgs,\n getContract as viem_getContract,\n} from \"viem\";\nimport { UnionOmit } from \"./type-utils/common\";\nimport { writeContract } from \"./writeContract\";\n\n// copied from viem because this isn't exported\n// TODO: import from viem?\nfunction getFunctionParameters(values: [args?: readonly unknown[], options?: object]): {\n args: readonly unknown[];\n options: object;\n} {\n const hasArgs = values.length && Array.isArray(values[0]);\n const args = hasArgs ? values[0]! : [];\n const options = (hasArgs ? values[1] : values[0]) ?? {};\n return { args, options };\n}\n\nexport type ContractWrite = {\n id: string;\n request: WriteContractParameters;\n result: Promise<Hex>;\n};\n\nexport type GetContractOptions<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n> = GetContractParameters<\n TTransport,\n TChain,\n TAccount,\n TAbi,\n { public: TPublicClient; wallet: TWalletClient },\n TAddress\n> & {\n onWrite?: (write: ContractWrite) => void;\n};\n\n// TODO: migrate away from this approach once we can hook into viem: https://github.com/wagmi-dev/viem/discussions/1230\n\n/** @deprecated Use `walletClient.extend(transactionQueue()).extend(writeObserver({ onWrite }))` and viem's `getContract` instead. */\nexport function getContract<\n TTransport extends Transport,\n TAddress extends Address,\n TAbi extends Abi,\n TChain extends Chain,\n TAccount extends Account,\n TPublicClient extends PublicClient<TTransport, TChain>,\n TWalletClient extends WalletClient<TTransport, TChain, TAccount>,\n>({\n abi,\n address,\n client: { public: publicClient, wallet: walletClient },\n onWrite,\n}: GetContractOptions<\n TTransport,\n TAddress,\n TAbi,\n TChain,\n TAccount,\n TPublicClient,\n TWalletClient\n>): GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> {\n const contract: GetContractReturnType<TAbi, { public: TPublicClient; wallet: TWalletClient }, TAddress> & {\n write: unknown;\n } = viem_getContract({\n abi,\n address,\n client: {\n public: publicClient,\n wallet: walletClient,\n },\n }) as never;\n\n if (contract.write) {\n // Replace write calls with our own. Implemented ~the same as viem, but adds better handling of nonces (via queue + retries).\n let nextWriteId = 0;\n contract.write = new Proxy(\n {},\n {\n get(_, functionName: string) {\n return (\n ...parameters: [\n args?: readonly unknown[],\n options?: UnionOmit<WriteContractParameters, \"abi\" | \"address\" | \"functionName\" | \"args\">,\n ]\n ) => {\n const { args, options } = getFunctionParameters(parameters);\n const request: WriteContractParameters<\n TAbi,\n ContractFunctionName<TAbi, \"nonpayable\" | \"payable\">,\n ContractFunctionArgs<TAbi, \"nonpayable\" | \"payable\">,\n TChain,\n TAccount\n > = {\n abi,\n address,\n functionName,\n args,\n ...options,\n onWrite,\n } as never;\n const result = writeContract(walletClient, request, { publicClient }) as never;\n\n const id = `${walletClient.chain.id}:${walletClient.account.address}:${nextWriteId++}`;\n onWrite?.({\n id,\n request: request as WriteContractParameters,\n result,\n });\n\n return result;\n };\n },\n },\n );\n }\n\n return contract;\n}\n","type PartialLog = { readonly blockNumber: bigint | null; readonly logIndex: number | null };\n\nexport function logSort(a: PartialLog, b: PartialLog): number {\n if (a.blockNumber === b.blockNumber) {\n if (a.logIndex === b.logIndex) return 0;\n if (a.logIndex == null) return 1;\n if (b.logIndex == null) return -1;\n return a.logIndex - b.logIndex;\n }\n\n if (a.blockNumber == null) return 1;\n if (b.blockNumber == null) return -1;\n if (a.blockNumber > b.blockNumber) return 1;\n if (a.blockNumber < b.blockNumber) return -1;\n return 0;\n}\n","/**\n * Map with a LRU (least recently used) policy.\n *\n * @link https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU\n * @link https://github.com/wevm/viem/blob/0fa08e113a890e6672fdc64fa7a2206a840611ab/src/utils/lru.ts\n */\nexport class LruMap<key, value> extends Map<key, value> {\n maxSize: number;\n\n constructor(size: number) {\n super();\n this.maxSize = size;\n }\n\n override set(key: key, value: value): this {\n super.set(key, value);\n if (this.maxSize && this.size > this.maxSize) {\n this.delete(this.keys().next().value);\n }\n return this;\n }\n}\n","import { Hex } from \"viem\";\n\n/**\n * Get the hex value at start/end positions. This will always return a valid hex string.\n *\n * If `start` is out of range, this returns `\"0x\"`.\n *\n * If `end` is specified and out of range, the result is right zero-padded to the desired length (`end - start`).\n */\nexport function readHex(data: Hex, start: number, end?: number): Hex {\n return `0x${data\n .replace(/^0x/, \"\")\n .slice(start * 2, end != null ? end * 2 : undefined)\n .padEnd(((end ?? start) - start) * 2, \"0\")}`;\n}\n","// Inspired by https://doc.rust-lang.org/std/result/\nexport type Result<Ok, Err = unknown> = { ok: Ok } | { error: Err };\n\nexport function isOk<Ok, Err>(result: Result<Ok, Err>): result is { ok: Ok } {\n return \"ok\" in result;\n}\n\nexport function isError<Ok, Err>(result: Result<Ok, Err>): result is { error: Err } {\n return \"error\" in result;\n}\n\nexport function unwrap<Ok, Err>(result: Result<Ok, Err>): Ok {\n if (isError(result)) {\n throw result.error;\n }\n return result.ok;\n}\n","import { Hex, concatHex } from \"viem\";\nimport { readHex } from \"./readHex\";\n\nexport function spliceHex(data: Hex, start: number, deleteCount = 0, newData: Hex = \"0x\"): Hex {\n return concatHex([readHex(data, 0, start), newData, readHex(data, start + deleteCount)]);\n}\n","import { Hex, Transport, keccak256 } from \"viem\";\nimport { debug as parentDebug } from \"./debug\";\n\nconst debug = parentDebug.extend(\"transportObserver\");\n\nexport function transportObserver<TTransport extends Transport>(transport: TTransport): TTransport {\n return ((opts) => {\n const result = transport(opts);\n const request: typeof result.request = async (req) => {\n if (req.method === \"eth_sendRawTransaction\" && req.params instanceof Array) {\n const txs = req.params.map((data: Hex) => keccak256(data));\n debug(\"saw txs\", txs);\n // TODO: pass these tx hashes into dev tools\n }\n // TODO: add support for `eth_sendTransaction`\n return result.request(req);\n };\n return {\n ...result,\n request,\n };\n }) as TTransport;\n}\n","import { getContract } from \"../getContract\";\n\n/** @deprecated use `getContract` instead */\nexport const createContract = getContract;\n","import { resourceToHex } from \"../resourceToHex\";\n\n/** @deprecated use `resourceToHex` instead */\nexport const resourceIdToHex = resourceToHex;\n","import { hexToResource } from \"../hexToResource\";\n\n/** @deprecated use `hexToResource` instead */\nexport const hexToResourceId = hexToResource;\n"],"mappings":"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","names":["debug","privateKeyToAccount","debug"]}
package/dist/internal.js CHANGED
@@ -1,13 +1,209 @@
1
- import{f as g}from"./chunk-6FIKI2CG.js";import{a as c}from"./chunk-TCWGPC6G.js";import{a as x}from"./chunk-ZV2KGJCD.js";import{waitForTransactionReceipt as T}from"viem/actions";async function C({client:e,hashes:o,debugLabel:a="transactions"}){if(o.length){c(`waiting for ${a} to confirm`);for(let r of o)if((await T(e,{hash:r})).status==="reverted")throw new Error(`Transaction reverted: ${r}`)}}import{concatHex as H,getCreate2Address as R}from"viem";import{getCode as P}from"viem/actions";import{stringToHex as $}from"viem";var p=$("",{size:32}),l=parseInt("6000",16);var f=c.extend("deploy"),E=c.extend("deploy");f.log=console.debug.bind(console);E.log=console.error.bind(console);async function h({client:e,deployerAddress:o,bytecode:a,deployedBytecodeSize:r,debugLabel:t="contract",salt:s=p}){if(a.includes("__$"))throw new Error(`Found unlinked public library in ${t} bytecode`);let i=R({from:o,salt:s,bytecode:a});return await P(e,{address:i,blockTag:"pending"})?(f("found",t,"at",i),[]):(r!=null&&(r>l?console.warn(`
2
- Bytecode for ${t} (${r} bytes) is over the contract size limit (${l} bytes). Run \`forge build --sizes\` for more info.
3
- `):r>l*.95&&console.warn(`
4
- Bytecode for ${t} (${r} bytes) is almost over the contract size limit (${l} bytes). Run \`forge build --sizes\` for more info.
5
- `)),f("deploying",t,"at",i),[await g(e,{chain:e.chain??null,to:o,data:H([s,a])})])}async function te({client:e,deployerAddress:o,contracts:a}){let r=x(a,s=>s.bytecode),t=(await Promise.all(r.map(s=>h({client:e,deployerAddress:o,...s})))).flat();return await C({client:e,hashes:t,debugLabel:"contract deploys"}),t}import{getBalance as B,sendRawTransaction as F,sendTransaction as b,waitForTransactionReceipt as A}from"viem/actions";var n={gasPrice:1e11,gasLimit:1e5,signerAddress:"3fab184622dc19b6109349b94811493bf2a45362",transaction:"f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222",address:"4e59b44847b379578588920ca78fbf26c0b4956c",creationCode:"604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"};import{sliceHex as D}from"viem";import{getCode as z}from"viem/actions";var m=`0x${n.address}`;async function w(e){let o=await z(e,{address:m});if(o)return f("found deployer bytecode at",m),o!==D(`0x${n.creationCode}`,14)&&console.warn(`
6
- \u26A0\uFE0F Bytecode for deployer at ${m} did not match the expected CREATE2 bytecode. You may have unexpected results.
7
- `),m}var u=`0x${n.address}`;async function he(e){let o=await w(e);if(o!==void 0)return o;let a=BigInt(n.gasLimit)*BigInt(n.gasPrice),r=await B(e,{address:`0x${n.signerAddress}`}),t=a-r;if(t>0){f("sending gas for CREATE2 deployer to signer at",n.signerAddress);let d=await b(e,{chain:e.chain??null,to:`0x${n.signerAddress}`,value:t}),y=await A(e,{hash:d});if(y.status!=="success")throw console.error("failed to send gas to deployer signer",y),new Error("failed to send gas to deployer signer")}f("deploying CREATE2 deployer at",u);let s=await F(e,{serializedTransaction:`0x${n.transaction}`}).catch(d=>{if(String(d).includes("only replay-protected (EIP-155) transactions allowed over RPC"))return console.warn(`
1
+ import {
2
+ sendTransaction
3
+ } from "./chunk-5Q2OTK63.js";
4
+ import {
5
+ debug
6
+ } from "./chunk-73UWXFXB.js";
7
+ import {
8
+ uniqueBy
9
+ } from "./chunk-CHXZROA7.js";
10
+
11
+ // src/waitForTransactions.ts
12
+ import { waitForTransactionReceipt } from "viem/actions";
13
+ async function waitForTransactions({
14
+ client,
15
+ hashes,
16
+ debugLabel = "transactions"
17
+ }) {
18
+ if (!hashes.length) return;
19
+ debug(`waiting for ${debugLabel} to confirm`);
20
+ for (const hash of hashes) {
21
+ const receipt = await waitForTransactionReceipt(client, { hash });
22
+ if (receipt.status === "reverted") {
23
+ throw new Error(`Transaction reverted: ${hash}`);
24
+ }
25
+ }
26
+ }
27
+
28
+ // src/deploy/ensureContract.ts
29
+ import { concatHex, getCreate2Address } from "viem";
30
+ import { getCode } from "viem/actions";
31
+
32
+ // src/deploy/common.ts
33
+ import { stringToHex } from "viem";
34
+ var singletonSalt = stringToHex("", { size: 32 });
35
+ var contractSizeLimit = parseInt("6000", 16);
36
+
37
+ // src/deploy/debug.ts
38
+ var debug2 = debug.extend("deploy");
39
+ var error = debug.extend("deploy");
40
+ debug2.log = console.debug.bind(console);
41
+ error.log = console.error.bind(console);
42
+
43
+ // src/deploy/ensureContract.ts
44
+ async function ensureContract({
45
+ client,
46
+ deployerAddress,
47
+ bytecode,
48
+ deployedBytecodeSize,
49
+ debugLabel = "contract",
50
+ salt = singletonSalt
51
+ }) {
52
+ if (bytecode.includes("__$")) {
53
+ throw new Error(`Found unlinked public library in ${debugLabel} bytecode`);
54
+ }
55
+ const address = getCreate2Address({ from: deployerAddress, salt, bytecode });
56
+ const contractCode = await getCode(client, { address, blockTag: "pending" });
57
+ if (contractCode) {
58
+ debug2("found", debugLabel, "at", address);
59
+ return [];
60
+ }
61
+ if (deployedBytecodeSize != null) {
62
+ if (deployedBytecodeSize > contractSizeLimit) {
63
+ console.warn(
64
+ `
65
+ Bytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is over the contract size limit (${contractSizeLimit} bytes). Run \`forge build --sizes\` for more info.
66
+ `
67
+ );
68
+ } else if (deployedBytecodeSize > contractSizeLimit * 0.95) {
69
+ console.warn(
70
+ // eslint-disable-next-line max-len
71
+ `
72
+ Bytecode for ${debugLabel} (${deployedBytecodeSize} bytes) is almost over the contract size limit (${contractSizeLimit} bytes). Run \`forge build --sizes\` for more info.
73
+ `
74
+ );
75
+ }
76
+ }
77
+ debug2("deploying", debugLabel, "at", address);
78
+ return [
79
+ await sendTransaction(client, {
80
+ chain: client.chain ?? null,
81
+ to: deployerAddress,
82
+ data: concatHex([salt, bytecode])
83
+ })
84
+ ];
85
+ }
86
+
87
+ // src/deploy/ensureContractsDeployed.ts
88
+ async function ensureContractsDeployed({
89
+ client,
90
+ deployerAddress,
91
+ contracts
92
+ }) {
93
+ const uniqueContracts = uniqueBy(contracts, (contract) => contract.bytecode);
94
+ const txs = (await Promise.all(uniqueContracts.map((contract) => ensureContract({ client, deployerAddress, ...contract })))).flat();
95
+ await waitForTransactions({
96
+ client,
97
+ hashes: txs,
98
+ debugLabel: "contract deploys"
99
+ });
100
+ return txs;
101
+ }
102
+
103
+ // src/deploy/ensureDeployer.ts
104
+ import { getBalance, sendRawTransaction, sendTransaction as sendTransaction2, waitForTransactionReceipt as waitForTransactionReceipt2 } from "viem/actions";
105
+
106
+ // src/deploy/create2/deployment.json
107
+ var deployment_default = {
108
+ gasPrice: 1e11,
109
+ gasLimit: 1e5,
110
+ signerAddress: "3fab184622dc19b6109349b94811493bf2a45362",
111
+ transaction: "f8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222",
112
+ address: "4e59b44847b379578588920ca78fbf26c0b4956c",
113
+ creationCode: "604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf3"
114
+ };
115
+
116
+ // src/deploy/getDeployer.ts
117
+ import { sliceHex } from "viem";
118
+ import { getCode as getCode2 } from "viem/actions";
119
+ var deployer = `0x${deployment_default.address}`;
120
+ async function getDeployer(client) {
121
+ const bytecode = await getCode2(client, { address: deployer });
122
+ if (bytecode) {
123
+ debug2("found deployer bytecode at", deployer);
124
+ if (bytecode !== sliceHex(`0x${deployment_default.creationCode}`, 14)) {
125
+ console.warn(
126
+ `
127
+ \u26A0\uFE0F Bytecode for deployer at ${deployer} did not match the expected CREATE2 bytecode. You may have unexpected results.
128
+ `
129
+ );
130
+ }
131
+ return deployer;
132
+ }
133
+ }
134
+
135
+ // src/deploy/ensureDeployer.ts
136
+ var deployer2 = `0x${deployment_default.address}`;
137
+ async function ensureDeployer(client) {
138
+ const existingDeployer = await getDeployer(client);
139
+ if (existingDeployer !== void 0) {
140
+ return existingDeployer;
141
+ }
142
+ const gasRequired = BigInt(deployment_default.gasLimit) * BigInt(deployment_default.gasPrice);
143
+ const currentBalance = await getBalance(client, { address: `0x${deployment_default.signerAddress}` });
144
+ const gasNeeded = gasRequired - currentBalance;
145
+ if (gasNeeded > 0) {
146
+ debug2("sending gas for CREATE2 deployer to signer at", deployment_default.signerAddress);
147
+ const gasTx = await sendTransaction2(client, {
148
+ chain: client.chain ?? null,
149
+ to: `0x${deployment_default.signerAddress}`,
150
+ value: gasNeeded
151
+ });
152
+ const gasReceipt = await waitForTransactionReceipt2(client, { hash: gasTx });
153
+ if (gasReceipt.status !== "success") {
154
+ console.error("failed to send gas to deployer signer", gasReceipt);
155
+ throw new Error("failed to send gas to deployer signer");
156
+ }
157
+ }
158
+ debug2("deploying CREATE2 deployer at", deployer2);
159
+ const deployTx = await sendRawTransaction(client, { serializedTransaction: `0x${deployment_default.transaction}` }).catch(
160
+ (error2) => {
161
+ if (String(error2).includes("only replay-protected (EIP-155) transactions allowed over RPC")) {
162
+ console.warn(
163
+ // eslint-disable-next-line max-len
164
+ `
8
165
  \u26A0\uFE0F 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.
9
166
 
10
167
  We recommend running your chain's node with \`--rpc.allow-unprotected-txs\` to enable determinstic deployments.
11
- `),f("deploying CREATE2 deployer"),b(e,{chain:e.chain??null,data:`0x${n.creationCode}`});throw d}),i=await A(e,{hash:s});if(!i.contractAddress)throw new Error("Deploy receipt did not have contract address, was the deployer not deployed?");return i.contractAddress!==u&&console.warn(`
12
- \u26A0\uFE0F CREATE2 deployer created at ${i.contractAddress} does not match the CREATE2 determinstic deployer we expected (${u})`),i.contractAddress}import{getCreate2Address as I}from"viem";function $e({deployerAddress:e,bytecode:o,salt:a=p}){return I({from:e,bytecode:o,salt:a})}export{h as ensureContract,te as ensureContractsDeployed,he as ensureDeployer,$e as getContractAddress,w as getDeployer,C as waitForTransactions};
168
+ `
169
+ );
170
+ debug2("deploying CREATE2 deployer");
171
+ return sendTransaction2(client, {
172
+ chain: client.chain ?? null,
173
+ data: `0x${deployment_default.creationCode}`
174
+ });
175
+ }
176
+ throw error2;
177
+ }
178
+ );
179
+ const deployReceipt = await waitForTransactionReceipt2(client, { hash: deployTx });
180
+ if (!deployReceipt.contractAddress) {
181
+ throw new Error("Deploy receipt did not have contract address, was the deployer not deployed?");
182
+ }
183
+ if (deployReceipt.contractAddress !== deployer2) {
184
+ console.warn(
185
+ `
186
+ \u26A0\uFE0F CREATE2 deployer created at ${deployReceipt.contractAddress} does not match the CREATE2 determinstic deployer we expected (${deployer2})`
187
+ );
188
+ }
189
+ return deployReceipt.contractAddress;
190
+ }
191
+
192
+ // src/deploy/getContractAddress.ts
193
+ import { getCreate2Address as getCreate2Address2 } from "viem";
194
+ function getContractAddress({
195
+ deployerAddress,
196
+ bytecode,
197
+ salt = singletonSalt
198
+ }) {
199
+ return getCreate2Address2({ from: deployerAddress, bytecode, salt });
200
+ }
201
+ export {
202
+ ensureContract,
203
+ ensureContractsDeployed,
204
+ ensureDeployer,
205
+ getContractAddress,
206
+ getDeployer,
207
+ waitForTransactions
208
+ };
13
209
  //# sourceMappingURL=internal.js.map
@@ -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"],"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 > 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"],"mappings":"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","names":["waitForTransactionReceipt","waitForTransactions","client","hashes","debugLabel","debug","hash","concatHex","getCreate2Address","getCode","stringToHex","singletonSalt","contractSizeLimit","debug","error","ensureContract","client","deployerAddress","bytecode","deployedBytecodeSize","debugLabel","salt","singletonSalt","address","getCreate2Address","getCode","debug","contractSizeLimit","sendTransaction","concatHex","ensureContractsDeployed","client","deployerAddress","contracts","uniqueContracts","uniqueBy","contract","txs","ensureContract","waitForTransactions","getBalance","sendRawTransaction","sendTransaction","waitForTransactionReceipt","deployment_default","sliceHex","getCode","deployer","deployment_default","getDeployer","client","bytecode","getCode","debug","sliceHex","deployer","deployment_default","ensureDeployer","client","existingDeployer","getDeployer","gasRequired","currentBalance","getBalance","gasNeeded","debug","gasTx","sendTransaction","gasReceipt","waitForTransactionReceipt","deployTx","sendRawTransaction","error","deployReceipt","getCreate2Address","getContractAddress","deployerAddress","bytecode","salt","singletonSalt","getCreate2Address"]}
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"],"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 > 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"],"mappings":"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","names":["debug","debug","sendTransaction","waitForTransactionReceipt","getCode","getCode","debug","deployer","debug","sendTransaction","waitForTransactionReceipt","error","getCreate2Address","getCreate2Address"]}