@rocketh/deploy 0.10.8 → 0.10.10

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.
@@ -0,0 +1,38 @@
1
+ import { Abi } from 'abitype';
2
+ import { EIP1193DATA } from 'eip-1193';
3
+ import type { DeploymentConstruction, Deployment } from 'rocketh';
4
+ import { Address, Chain, ContractFunctionArgs, ContractFunctionName, DecodeFunctionResultReturnType, ReadContractParameters, WriteContractParameters } from 'viem';
5
+ declare module 'rocketh' {
6
+ interface Environment {
7
+ deploy: DeployFunction;
8
+ execute: ExecuteFunction;
9
+ read: ReadFunction;
10
+ executeByName: ExecuteFunctionByName;
11
+ readByName: ReadFunctionByName;
12
+ }
13
+ }
14
+ export type DeployFunction = <TAbi extends Abi, TChain extends Chain = Chain>(name: string, args: DeploymentConstruction<TAbi>, options?: DeployOptions) => Promise<Deployment<TAbi> & {
15
+ updated: boolean;
16
+ }>;
17
+ export type ExecuteFunction = <TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>, TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName>>(deployment: Deployment<TAbi>, args: ExecutionArgs<TAbi, TFunctionName, TArgs>) => Promise<EIP1193DATA>;
18
+ export type ExecuteFunctionByName = <TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>, TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName>>(name: string, args: ExecutionArgs<TAbi, TFunctionName, TArgs>) => Promise<EIP1193DATA>;
19
+ export type ReadFunction = <TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>, TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName>>(deployment: Deployment<TAbi>, args: ReadingArgs<TAbi, TFunctionName, TArgs>) => Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>>;
20
+ export type ReadFunctionByName = <TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>, TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName>>(name: string, args: ReadingArgs<TAbi, TFunctionName, TArgs>) => Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>>;
21
+ export type ExecutionArgs<TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>, TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName>> = Omit<WriteContractParameters<TAbi, TFunctionName, TArgs>, 'address' | 'abi' | 'account' | 'nonce' | 'chain'> & {
22
+ account: string;
23
+ };
24
+ export type ReadingArgs<TAbi extends Abi, TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>, TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName>> = Omit<ReadContractParameters<TAbi, TFunctionName, TArgs>, 'address' | 'abi' | 'account' | 'nonce'> & {
25
+ account?: string;
26
+ };
27
+ export type DeployOptions = {
28
+ linkedData?: any;
29
+ deterministic?: boolean | `0x${string}`;
30
+ libraries?: {
31
+ [name: string]: Address;
32
+ };
33
+ } & ({
34
+ skipIfAlreadyDeployed?: boolean;
35
+ } | {
36
+ alwaysOverride?: boolean;
37
+ });
38
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,374 @@
1
+ import { extendEnvironment } from 'rocketh';
2
+ import { decodeFunctionResult, encodeFunctionData, encodePacked, keccak256, } from 'viem';
3
+ import { encodeDeployData } from 'viem';
4
+ import { logs } from 'named-logs';
5
+ const logger = logs('rocketh-deploy');
6
+ async function broadcastTransaction(env, signer, params) {
7
+ if (signer.type === 'wallet' || signer.type === 'remote') {
8
+ return signer.signer.request({
9
+ method: 'eth_sendTransaction',
10
+ params,
11
+ });
12
+ }
13
+ else {
14
+ const rawTx = await signer.signer.request({
15
+ method: 'eth_signTransaction',
16
+ params,
17
+ });
18
+ return env.network.provider.request({
19
+ method: 'eth_sendRawTransaction',
20
+ params: [rawTx],
21
+ });
22
+ }
23
+ }
24
+ function linkRawLibrary(bytecode, libraryName, libraryAddress) {
25
+ const address = libraryAddress.replace('0x', '');
26
+ let encodedLibraryName;
27
+ if (libraryName.startsWith('$') && libraryName.endsWith('$')) {
28
+ encodedLibraryName = libraryName.slice(1, libraryName.length - 1);
29
+ }
30
+ else {
31
+ encodedLibraryName = keccak256(encodePacked(['string'], [libraryName])).slice(2, 36);
32
+ }
33
+ const pattern = new RegExp(`_+\\$${encodedLibraryName}\\$_+`, 'g');
34
+ if (!pattern.exec(bytecode)) {
35
+ throw new Error(`Can't link '${libraryName}' (${encodedLibraryName}) in \n----\n ${bytecode}\n----\n`);
36
+ }
37
+ return bytecode.replace(pattern, address);
38
+ }
39
+ function linkRawLibraries(bytecode, libraries) {
40
+ for (const libName of Object.keys(libraries)) {
41
+ const libAddress = libraries[libName];
42
+ bytecode = linkRawLibrary(bytecode, libName, libAddress);
43
+ }
44
+ return bytecode;
45
+ }
46
+ function linkLibraries(artifact, libraries) {
47
+ let bytecode = artifact.bytecode;
48
+ if (libraries) {
49
+ if (artifact.linkReferences) {
50
+ for (const [fileName, fileReferences] of Object.entries(artifact.linkReferences)) {
51
+ for (const [libName, fixups] of Object.entries(fileReferences)) {
52
+ const addr = libraries[libName];
53
+ if (addr === undefined) {
54
+ continue;
55
+ }
56
+ for (const fixup of fixups) {
57
+ bytecode =
58
+ bytecode.substring(0, 2 + fixup.start * 2) +
59
+ addr.substring(2) +
60
+ bytecode.substring(2 + (fixup.start + fixup.length) * 2);
61
+ }
62
+ }
63
+ }
64
+ }
65
+ else {
66
+ bytecode = linkRawLibraries(bytecode, libraries);
67
+ }
68
+ }
69
+ // TODO return libraries object with path name <filepath.sol>:<name> for names
70
+ return bytecode;
71
+ }
72
+ extendEnvironment((env) => {
73
+ async function execute(deployment, args) {
74
+ const { account, ...viemArgs } = args;
75
+ let address;
76
+ if (account.startsWith('0x')) {
77
+ address = account;
78
+ }
79
+ else {
80
+ if (env.namedAccounts) {
81
+ address = env.namedAccounts[account];
82
+ if (!address) {
83
+ throw new Error(`no address for ${account}`);
84
+ }
85
+ }
86
+ else {
87
+ throw new Error(`no accounts setup, cannot get address for ${account}`);
88
+ }
89
+ }
90
+ const artifactToUse = deployment;
91
+ const abi = artifactToUse.abi;
92
+ const calldata = encodeFunctionData({
93
+ abi,
94
+ functionName: viemArgs.functionName,
95
+ args: viemArgs.args,
96
+ });
97
+ const signer = env.addressSigners[address];
98
+ const txParam = {
99
+ to: deployment.address,
100
+ type: '0x2',
101
+ from: address,
102
+ chainId: `0x${env.network.chain.id.toString(16)}`,
103
+ data: calldata,
104
+ gas: viemArgs.gas && `0x${viemArgs.gas.toString(16)}`,
105
+ // gasPrice: viemArgs.gasPrice && `0x${viemArgs.gasPrice.toString(16)}` as `0x${string}`,
106
+ maxFeePerGas: viemArgs.maxFeePerGas && `0x${viemArgs.maxFeePerGas.toString(16)}`,
107
+ maxPriorityFeePerGas: viemArgs.maxPriorityFeePerGas && `0x${viemArgs.maxPriorityFeePerGas.toString(16)}`,
108
+ // nonce: viemArgs.nonce && (`0x${viemArgs.nonce.toString(16)}` as `0x${string}`),
109
+ };
110
+ if (viemArgs.value) {
111
+ txParam.value = `0x${viemArgs.value?.toString(16)}`;
112
+ }
113
+ let txHash;
114
+ if (signer.type === 'wallet' || signer.type === 'remote') {
115
+ txHash = await signer.signer.request({
116
+ method: 'eth_sendTransaction',
117
+ params: [txParam],
118
+ });
119
+ }
120
+ else {
121
+ const rawTx = await signer.signer.request({
122
+ method: 'eth_signTransaction',
123
+ params: [txParam],
124
+ });
125
+ txHash = await env.network.provider.request({
126
+ method: 'eth_sendRawTransaction',
127
+ params: [rawTx],
128
+ });
129
+ }
130
+ const pendingExecution = {
131
+ type: 'execution',
132
+ transaction: { hash: txHash, origin: address },
133
+ // description, // TODO
134
+ // TODO we should have the nonce, except for wallet like metamask where it is not usre you get the nonce you start with
135
+ };
136
+ await env.savePendingExecution(pendingExecution);
137
+ return txHash;
138
+ }
139
+ async function executeByName(name, args) {
140
+ const deployment = env.getOrNull(name);
141
+ if (!deployment) {
142
+ throw new Error(`no deployment named ${name}`);
143
+ }
144
+ return execute(deployment, args);
145
+ }
146
+ async function read(deployment, args) {
147
+ const { account, ...viemArgs } = args;
148
+ let address;
149
+ if (account) {
150
+ if (account.startsWith('0x')) {
151
+ address = account;
152
+ }
153
+ else {
154
+ if (env.namedAccounts) {
155
+ address = env.namedAccounts[account];
156
+ if (!address) {
157
+ throw new Error(`no address for ${account}`);
158
+ }
159
+ }
160
+ else {
161
+ throw new Error(`no accounts setup, cannot get address for ${account}`);
162
+ }
163
+ }
164
+ }
165
+ const artifactToUse = deployment;
166
+ const abi = artifactToUse.abi;
167
+ const calldata = encodeFunctionData({
168
+ abi,
169
+ functionName: viemArgs.functionName,
170
+ args: viemArgs.args,
171
+ });
172
+ const result = (await env.network.provider.request({
173
+ method: 'eth_call',
174
+ params: [
175
+ {
176
+ to: deployment.address,
177
+ type: '0x2',
178
+ from: address,
179
+ chainId: `0x${env.network.chain.id.toString(16)}`,
180
+ data: calldata,
181
+ // value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`,
182
+ },
183
+ ],
184
+ }));
185
+ const parsed = decodeFunctionResult({
186
+ abi,
187
+ functionName: viemArgs.functionName,
188
+ data: result,
189
+ args: viemArgs.args,
190
+ });
191
+ return parsed;
192
+ }
193
+ async function readByName(name, args) {
194
+ const deployment = env.getOrNull(name);
195
+ if (!deployment) {
196
+ throw new Error(`no deployment named ${name}`);
197
+ }
198
+ return read(deployment, args);
199
+ }
200
+ async function deploy(name, args, options) {
201
+ const skipIfAlreadyDeployed = options && 'skipIfAlreadyDeployed' in options && options.skipIfAlreadyDeployed;
202
+ const allwaysOverride = options && 'allwaysOverride' in options && options.allwaysOverride;
203
+ if (allwaysOverride && skipIfAlreadyDeployed) {
204
+ throw new Error(`conflicting options: "allwaysOverride" and "skipIfAlreadyDeployed"`);
205
+ }
206
+ const existingDeployment = env.getOrNull(name);
207
+ if (existingDeployment && skipIfAlreadyDeployed) {
208
+ logger.info(`deployment for ${name} at ${existingDeployment.address}, skipIfAlreadyDeployed: true => we skip`);
209
+ return { ...existingDeployment, updated: false };
210
+ }
211
+ const { account, artifact, ...viemArgs } = args;
212
+ let address;
213
+ if (account.startsWith('0x')) {
214
+ address = account;
215
+ }
216
+ else {
217
+ if (env.namedAccounts) {
218
+ address = env.namedAccounts[account];
219
+ if (!address) {
220
+ throw new Error(`no address for ${account}`);
221
+ }
222
+ }
223
+ else {
224
+ throw new Error(`no accounts setup, cannot get address for ${account}`);
225
+ }
226
+ }
227
+ // TODO throw specific error if artifact not found
228
+ const artifactToUse = (typeof artifact === 'string' ? env.artifacts[artifact] : artifact);
229
+ const bytecode = linkLibraries(artifactToUse, options?.libraries);
230
+ const abi = artifactToUse.abi;
231
+ const argsToUse = {
232
+ ...viemArgs,
233
+ account,
234
+ abi,
235
+ bytecode,
236
+ };
237
+ const calldata = encodeDeployData(argsToUse); // TODO any
238
+ const argsData = `0x${calldata.replace(bytecode, '')}`;
239
+ if (existingDeployment) {
240
+ logger.info(`existing deployment for ${name} at ${existingDeployment.address}`);
241
+ }
242
+ if (existingDeployment && !allwaysOverride) {
243
+ const previousBytecode = existingDeployment.bytecode;
244
+ const previousArgsData = existingDeployment.argsData;
245
+ // we assume cbor encoding of hash at the end
246
+ // TODO option to remove it, can parse metadata but would rather avoid this here
247
+ const last2Bytes = previousBytecode.slice(-4);
248
+ const cborLength = parseInt(last2Bytes, 16);
249
+ const previousBytecodeWithoutCBOR = previousBytecode.slice(0, -cborLength * 2);
250
+ const newBytecodeWithoutCBOR = bytecode.slice(0, -cborLength * 2);
251
+ if (previousBytecodeWithoutCBOR === newBytecodeWithoutCBOR && previousArgsData === argsData) {
252
+ return { ...existingDeployment, updated: false };
253
+ }
254
+ else {
255
+ // logger.info(`-------------- WITHOUT CBOR---------------------`);
256
+ // logger.info(previousBytecodeWithoutCBOR);
257
+ // logger.info(newBytecodeWithoutCBOR);
258
+ // logger.info(`-----------------------------------`);
259
+ // logger.info(`-------------- ARGS DATA ---------------------`);
260
+ // logger.info(previousArgsData);
261
+ // logger.info(argsData);
262
+ // logger.info(`-----------------------------------`);
263
+ }
264
+ }
265
+ const partialDeployment = {
266
+ ...artifactToUse,
267
+ argsData,
268
+ linkedData: options?.linkedData,
269
+ };
270
+ const signer = env.addressSigners[address];
271
+ const chainId = `0x${env.network.chain.id.toString(16)}`;
272
+ const maxFeePerGas = viemArgs.maxFeePerGas && `0x${viemArgs.maxFeePerGas.toString(16)}`;
273
+ const maxPriorityFeePerGas = viemArgs.maxPriorityFeePerGas && `0x${viemArgs.maxPriorityFeePerGas.toString(16)}`;
274
+ const params = [
275
+ {
276
+ type: '0x2',
277
+ from: address,
278
+ chainId,
279
+ data: calldata,
280
+ gas: viemArgs.gas && `0x${viemArgs.gas.toString(16)}`,
281
+ maxFeePerGas,
282
+ maxPriorityFeePerGas,
283
+ // gasPrice: viemArgs.gasPrice && `0x${viemArgs.gasPrice.toString(16)}` as `0x${string}`,
284
+ // value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`,
285
+ // nonce: viemArgs.nonce && (`0x${viemArgs.nonce.toString(16)}` as `0x${string}`),
286
+ },
287
+ ];
288
+ let expectedAddress = undefined;
289
+ if (options?.deterministic) {
290
+ // TODO make these configurable
291
+ const deterministicFactoryAddress = `0x4e59b44847b379578588920ca78fbf26c0b4956c`;
292
+ const deterministicFactoryDeployerAddress = `0x3fab184622dc19b6109349b94811493bf2a45362`;
293
+ const factoryDeploymentData = `0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222`;
294
+ const code = await env.network.provider.request({
295
+ method: 'eth_getCode',
296
+ params: [deterministicFactoryAddress, 'latest'],
297
+ });
298
+ if (code === '0x') {
299
+ const balanceHexString = await env.network.provider.request({
300
+ method: 'eth_getBalance',
301
+ params: [deterministicFactoryDeployerAddress, 'latest'],
302
+ });
303
+ const balance = BigInt(balanceHexString);
304
+ if (balance < 10000000000000000n) {
305
+ const need = 10000000000000000n - balance;
306
+ const balanceToSend = `0x${need.toString(16)}`;
307
+ const txHash = await broadcastTransaction(env, signer, [
308
+ {
309
+ type: '0x2',
310
+ chainId,
311
+ from: address,
312
+ to: deterministicFactoryDeployerAddress,
313
+ value: balanceToSend,
314
+ gas: `0x${BigInt(21000).toString(16)}`,
315
+ maxFeePerGas,
316
+ maxPriorityFeePerGas,
317
+ },
318
+ ]);
319
+ await env.savePendingExecution({
320
+ type: 'execution', // TODO different type ?
321
+ transaction: { hash: txHash, origin: address },
322
+ });
323
+ }
324
+ const txHash = await env.network.provider.request({
325
+ method: 'eth_sendRawTransaction',
326
+ params: [factoryDeploymentData],
327
+ });
328
+ await env.savePendingExecution({
329
+ type: 'execution', // TODO different type ?
330
+ transaction: { hash: txHash, origin: address },
331
+ });
332
+ }
333
+ // prepending the salt
334
+ const salt = (typeof options.deterministic === 'string'
335
+ ? `0x${options.deterministic.slice(2).padStart(64, '0')}`
336
+ : '0x0000000000000000000000000000000000000000000000000000000000000000');
337
+ const bytecode = params[0].data || '0x';
338
+ expectedAddress = ('0x' +
339
+ keccak256(`0xff${deterministicFactoryAddress.slice(2)}${salt.slice(2)}${keccak256(bytecode).slice(2)}`).slice(-40));
340
+ const codeAlreadyDeployed = await env.network.provider.request({
341
+ method: 'eth_getCode',
342
+ params: [expectedAddress, 'latest'],
343
+ });
344
+ if (codeAlreadyDeployed !== '0x') {
345
+ env.showMessage(`contract was already deterministically deployed at ${expectedAddress}`);
346
+ const deployment = await env.save(name, {
347
+ address: expectedAddress,
348
+ ...partialDeployment,
349
+ });
350
+ return { ...deployment, updated: true };
351
+ }
352
+ params[0].data = (salt + (bytecode.slice(2) || ''));
353
+ params[0].to = deterministicFactoryAddress;
354
+ }
355
+ const txHash = await broadcastTransaction(env, signer, params);
356
+ const pendingDeployment = {
357
+ type: 'deployment',
358
+ expectedAddress,
359
+ partialDeployment,
360
+ transaction: { hash: txHash, origin: address },
361
+ name,
362
+ // TODO we should have the nonce, except for wallet like metamask where it is not usre you get the nonce you start with
363
+ };
364
+ const deployment = await env.savePendingDeployment(pendingDeployment);
365
+ return { ...deployment, updated: true };
366
+ }
367
+ env.deploy = deploy;
368
+ env.execute = execute;
369
+ env.executeByName = executeByName;
370
+ env.read = read;
371
+ env.readByName = readByName;
372
+ return env;
373
+ });
374
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.cjs CHANGED
@@ -349,4 +349,3 @@ rocketh.extendEnvironment((env) => {
349
349
  env.readByName = readByName;
350
350
  return env;
351
351
  });
352
- //# sourceMappingURL=index.cjs.map
package/dist/index.mjs CHANGED
@@ -347,4 +347,3 @@ extendEnvironment((env) => {
347
347
  env.readByName = readByName;
348
348
  return env;
349
349
  });
350
- //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,41 +1,39 @@
1
1
  {
2
2
  "name": "@rocketh/deploy",
3
- "version": "0.10.8",
3
+ "version": "0.10.10",
4
4
  "description": "provide deploy function for rocketh",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },
8
8
  "type": "module",
9
- "main": "dist/index.cjs",
10
- "module": "dist/index.mjs",
9
+ "module": "dist/esm/index.js",
11
10
  "types": "dist/index.d.ts",
12
11
  ".": {
13
- "require": {
14
- "types": "./dist/index.d.ts",
15
- "default": "./dist/index.cjs"
16
- },
17
12
  "import": {
18
- "types": "./dist/index.d.ts",
19
- "default": "./dist/index.mjs"
13
+ "types": "./dist/esm/index.d.ts",
14
+ "default": "./dist/esm/index.js"
20
15
  }
21
16
  },
17
+ "files": [
18
+ "dist"
19
+ ],
22
20
  "devDependencies": {
23
21
  "abitype": "^1.0.4",
22
+ "as-soon": "^0.0.11",
24
23
  "eip-1193": "^0.5.0",
25
- "pkgroll": "^2.1.1",
26
24
  "rimraf": "^5.0.7",
27
25
  "typescript": "^5.5.2",
28
- "rocketh": "0.10.15"
26
+ "rocketh": "0.10.16"
29
27
  },
30
28
  "peerDependencies": {
31
- "rocketh": "0.10.15"
29
+ "rocketh": "0.10.16"
32
30
  },
33
31
  "dependencies": {
34
32
  "named-logs": "^0.2.4",
35
33
  "viem": "^2.16.2"
36
34
  },
37
35
  "scripts": {
38
- "build": "rimraf dist && pkgroll --sourcemap",
39
- "dev": "pkgroll --watch"
36
+ "build": "tsc --project tsconfig.json",
37
+ "dev": "as-soon -w src pnpm build"
40
38
  }
41
39
  }
package/.prettierignore DELETED
@@ -1,3 +0,0 @@
1
- dist/
2
- node_modules/
3
- package.json
package/.prettierrc DELETED
@@ -1,7 +0,0 @@
1
- {
2
- "useTabs": true,
3
- "singleQuote": true,
4
-
5
- "printWidth": 120,
6
- "bracketSpacing": false
7
- }
package/CHANGELOG.md DELETED
@@ -1,59 +0,0 @@
1
- # @rocketh/deploy
2
-
3
- ## 0.10.8
4
-
5
- ### Patch Changes
6
-
7
- - Updated dependencies
8
- - rocketh@0.10.15
9
-
10
- ## 0.10.7
11
-
12
- ### Patch Changes
13
-
14
- - latest dependencies
15
- - Updated dependencies
16
- - rocketh@0.10.14
17
-
18
- ## 0.10.6
19
-
20
- ### Patch Changes
21
-
22
- - rocketh-deploy: add libraries support
23
-
24
- ## 0.10.5
25
-
26
- ### Patch Changes
27
-
28
- - Updated dependencies
29
- - rocketh@0.10.13
30
-
31
- ## 0.10.4
32
-
33
- ### Patch Changes
34
-
35
- - Updated dependencies
36
- - rocketh@0.10.12
37
-
38
- ## 0.10.3
39
-
40
- ### Patch Changes
41
-
42
- - Updated dependencies
43
- - rocketh@0.10.11
44
-
45
- ## 0.10.2
46
-
47
- ### Patch Changes
48
-
49
- - unnamedAccounts
50
- - Updated dependencies
51
- - rocketh@0.10.10
52
-
53
- ## 0.10.1
54
-
55
- ### Patch Changes
56
-
57
- - use pkgroll and @rocketh namespace
58
- - Updated dependencies
59
- - rocketh@0.10.9
package/src/index.ts DELETED
@@ -1,606 +0,0 @@
1
- import {Abi} from 'abitype';
2
- import {EIP1193DATA, EIP1193TransactionData} from 'eip-1193';
3
- import type {
4
- Artifact,
5
- DeploymentConstruction,
6
- Deployment,
7
- Environment,
8
- PendingDeployment,
9
- PartialDeployment,
10
- PendingExecution,
11
- Signer,
12
- } from 'rocketh';
13
- import {extendEnvironment} from 'rocketh';
14
- import {
15
- Address,
16
- Chain,
17
- ContractFunctionArgs,
18
- ContractFunctionName,
19
- DecodeFunctionResultReturnType,
20
- EncodeDeployDataParameters,
21
- ReadContractParameters,
22
- WriteContractParameters,
23
- decodeFunctionResult,
24
- encodeFunctionData,
25
- encodePacked,
26
- keccak256,
27
- } from 'viem';
28
- import {DeployContractParameters, encodeDeployData} from 'viem';
29
- import {logs} from 'named-logs';
30
-
31
- const logger = logs('rocketh-deploy');
32
-
33
- declare module 'rocketh' {
34
- interface Environment {
35
- deploy: DeployFunction;
36
- execute: ExecuteFunction;
37
- read: ReadFunction;
38
- executeByName: ExecuteFunctionByName;
39
- readByName: ReadFunctionByName;
40
- }
41
- }
42
-
43
- export type DeployFunction = <TAbi extends Abi, TChain extends Chain = Chain>(
44
- name: string,
45
- args: DeploymentConstruction<TAbi>,
46
- options?: DeployOptions
47
- ) => Promise<Deployment<TAbi> & {updated: boolean}>;
48
-
49
- export type ExecuteFunction = <
50
- TAbi extends Abi,
51
- TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,
52
- TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<
53
- TAbi,
54
- 'nonpayable' | 'payable',
55
- TFunctionName
56
- >
57
- >(
58
- deployment: Deployment<TAbi>,
59
- args: ExecutionArgs<TAbi, TFunctionName, TArgs>
60
- ) => Promise<EIP1193DATA>;
61
-
62
- export type ExecuteFunctionByName = <
63
- TAbi extends Abi,
64
- TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,
65
- TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<
66
- TAbi,
67
- 'nonpayable' | 'payable',
68
- TFunctionName
69
- >
70
- >(
71
- name: string,
72
- args: ExecutionArgs<TAbi, TFunctionName, TArgs>
73
- ) => Promise<EIP1193DATA>;
74
-
75
- export type ReadFunction = <
76
- TAbi extends Abi,
77
- TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,
78
- TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<
79
- TAbi,
80
- 'pure' | 'view',
81
- TFunctionName
82
- >
83
- >(
84
- deployment: Deployment<TAbi>,
85
- args: ReadingArgs<TAbi, TFunctionName, TArgs>
86
- ) => Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>>;
87
-
88
- export type ReadFunctionByName = <
89
- TAbi extends Abi,
90
- TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,
91
- TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<
92
- TAbi,
93
- 'pure' | 'view',
94
- TFunctionName
95
- >
96
- >(
97
- name: string,
98
- args: ReadingArgs<TAbi, TFunctionName, TArgs>
99
- ) => Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>>;
100
-
101
- export type ExecutionArgs<
102
- TAbi extends Abi,
103
- TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,
104
- TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<
105
- TAbi,
106
- 'nonpayable' | 'payable',
107
- TFunctionName
108
- >
109
- > = Omit<WriteContractParameters<TAbi, TFunctionName, TArgs>, 'address' | 'abi' | 'account' | 'nonce' | 'chain'> & {
110
- account: string;
111
- };
112
-
113
- export type ReadingArgs<
114
- TAbi extends Abi,
115
- TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,
116
- TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<
117
- TAbi,
118
- 'pure' | 'view',
119
- TFunctionName
120
- >
121
- > = Omit<ReadContractParameters<TAbi, TFunctionName, TArgs>, 'address' | 'abi' | 'account' | 'nonce'> & {
122
- account?: string;
123
- };
124
-
125
- export type DeployOptions = {
126
- linkedData?: any;
127
- deterministic?: boolean | `0x${string}`;
128
- libraries?: {[name: string]: Address};
129
- } & (
130
- | {
131
- skipIfAlreadyDeployed?: boolean;
132
- }
133
- | {
134
- alwaysOverride?: boolean;
135
- }
136
- );
137
-
138
- async function broadcastTransaction(
139
- env: Environment,
140
- signer: Signer,
141
- params: [EIP1193TransactionData]
142
- ): Promise<`0x${string}`> {
143
- if (signer.type === 'wallet' || signer.type === 'remote') {
144
- return signer.signer.request({
145
- method: 'eth_sendTransaction',
146
- params,
147
- });
148
- } else {
149
- const rawTx = await signer.signer.request({
150
- method: 'eth_signTransaction',
151
- params,
152
- });
153
-
154
- return env.network.provider.request({
155
- method: 'eth_sendRawTransaction',
156
- params: [rawTx],
157
- });
158
- }
159
- }
160
-
161
- function linkRawLibrary(bytecode: string, libraryName: string, libraryAddress: string): string {
162
- const address = libraryAddress.replace('0x', '');
163
- let encodedLibraryName;
164
- if (libraryName.startsWith('$') && libraryName.endsWith('$')) {
165
- encodedLibraryName = libraryName.slice(1, libraryName.length - 1);
166
- } else {
167
- encodedLibraryName = keccak256(encodePacked(['string'], [libraryName])).slice(2, 36);
168
- }
169
- const pattern = new RegExp(`_+\\$${encodedLibraryName}\\$_+`, 'g');
170
- if (!pattern.exec(bytecode)) {
171
- throw new Error(`Can't link '${libraryName}' (${encodedLibraryName}) in \n----\n ${bytecode}\n----\n`);
172
- }
173
- return bytecode.replace(pattern, address);
174
- }
175
-
176
- function linkRawLibraries(bytecode: string, libraries: {[libraryName: string]: Address}): string {
177
- for (const libName of Object.keys(libraries)) {
178
- const libAddress = libraries[libName];
179
- bytecode = linkRawLibrary(bytecode, libName, libAddress);
180
- }
181
- return bytecode;
182
- }
183
-
184
- function linkLibraries(
185
- artifact: {
186
- bytecode: string;
187
- linkReferences?: {
188
- [libraryFileName: string]: {
189
- [libraryName: string]: Array<{length: number; start: number}>;
190
- };
191
- };
192
- },
193
- libraries?: {[libraryName: string]: Address}
194
- ) {
195
- let bytecode = artifact.bytecode;
196
-
197
- if (libraries) {
198
- if (artifact.linkReferences) {
199
- for (const [fileName, fileReferences] of Object.entries(artifact.linkReferences)) {
200
- for (const [libName, fixups] of Object.entries(fileReferences)) {
201
- const addr = libraries[libName];
202
- if (addr === undefined) {
203
- continue;
204
- }
205
-
206
- for (const fixup of fixups) {
207
- bytecode =
208
- bytecode.substring(0, 2 + fixup.start * 2) +
209
- addr.substring(2) +
210
- bytecode.substring(2 + (fixup.start + fixup.length) * 2);
211
- }
212
- }
213
- }
214
- } else {
215
- bytecode = linkRawLibraries(bytecode, libraries);
216
- }
217
- }
218
-
219
- // TODO return libraries object with path name <filepath.sol>:<name> for names
220
-
221
- return bytecode;
222
- }
223
-
224
- extendEnvironment((env: Environment) => {
225
- async function execute<
226
- TAbi extends Abi,
227
- TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,
228
- TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<
229
- TAbi,
230
- 'nonpayable' | 'payable',
231
- TFunctionName
232
- >
233
- >(deployment: Deployment<TAbi>, args: ExecutionArgs<TAbi, TFunctionName, TArgs>) {
234
- const {account, ...viemArgs} = args;
235
- let address: `0x${string}`;
236
- if (account.startsWith('0x')) {
237
- address = account as `0x${string}`;
238
- } else {
239
- if (env.namedAccounts) {
240
- address = env.namedAccounts[account];
241
- if (!address) {
242
- throw new Error(`no address for ${account}`);
243
- }
244
- } else {
245
- throw new Error(`no accounts setup, cannot get address for ${account}`);
246
- }
247
- }
248
-
249
- const artifactToUse = deployment as unknown as Artifact<TAbi>;
250
- const abi = artifactToUse.abi;
251
- const calldata = encodeFunctionData<TAbi, TFunctionName>({
252
- abi,
253
- functionName: viemArgs.functionName,
254
- args: viemArgs.args,
255
- } as any);
256
-
257
- const signer = env.addressSigners[address];
258
-
259
- const txParam: EIP1193TransactionData = {
260
- to: deployment.address,
261
- type: '0x2',
262
- from: address,
263
- chainId: `0x${env.network.chain.id.toString(16)}` as `0x${string}`,
264
- data: calldata,
265
- gas: viemArgs.gas && (`0x${viemArgs.gas.toString(16)}` as `0x${string}`),
266
- // gasPrice: viemArgs.gasPrice && `0x${viemArgs.gasPrice.toString(16)}` as `0x${string}`,
267
- maxFeePerGas: viemArgs.maxFeePerGas && (`0x${viemArgs.maxFeePerGas.toString(16)}` as `0x${string}`),
268
- maxPriorityFeePerGas:
269
- viemArgs.maxPriorityFeePerGas && (`0x${viemArgs.maxPriorityFeePerGas.toString(16)}` as `0x${string}`),
270
- // nonce: viemArgs.nonce && (`0x${viemArgs.nonce.toString(16)}` as `0x${string}`),
271
- };
272
- if (viemArgs.value) {
273
- txParam.value = `0x${viemArgs.value?.toString(16)}` as `0x${string}`;
274
- }
275
-
276
- let txHash: `0x${string}`;
277
- if (signer.type === 'wallet' || signer.type === 'remote') {
278
- txHash = await signer.signer.request({
279
- method: 'eth_sendTransaction',
280
- params: [txParam],
281
- });
282
- } else {
283
- const rawTx = await signer.signer.request({
284
- method: 'eth_signTransaction',
285
- params: [txParam],
286
- });
287
-
288
- txHash = await env.network.provider.request({
289
- method: 'eth_sendRawTransaction',
290
- params: [rawTx],
291
- });
292
- }
293
-
294
- const pendingExecution: PendingExecution = {
295
- type: 'execution',
296
- transaction: {hash: txHash, origin: address},
297
- // description, // TODO
298
- // TODO we should have the nonce, except for wallet like metamask where it is not usre you get the nonce you start with
299
- };
300
- await env.savePendingExecution(pendingExecution);
301
- return txHash;
302
- }
303
-
304
- async function executeByName<
305
- TAbi extends Abi,
306
- TFunctionName extends ContractFunctionName<TAbi, 'nonpayable' | 'payable'>,
307
- TArgs extends ContractFunctionArgs<TAbi, 'nonpayable' | 'payable', TFunctionName> = ContractFunctionArgs<
308
- TAbi,
309
- 'nonpayable' | 'payable',
310
- TFunctionName
311
- >
312
- >(name: string, args: ExecutionArgs<TAbi, TFunctionName, TArgs>) {
313
- const deployment = env.getOrNull<TAbi>(name);
314
- if (!deployment) {
315
- throw new Error(`no deployment named ${name}`);
316
- }
317
-
318
- return execute(deployment, args);
319
- }
320
-
321
- async function read<
322
- TAbi extends Abi,
323
- TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,
324
- TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<
325
- TAbi,
326
- 'pure' | 'view',
327
- TFunctionName
328
- >
329
- >(
330
- deployment: Deployment<TAbi>,
331
- args: ReadingArgs<TAbi, TFunctionName, TArgs>
332
- ): Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>> {
333
- const {account, ...viemArgs} = args;
334
- let address: `0x${string}` | undefined;
335
- if (account) {
336
- if (account.startsWith('0x')) {
337
- address = account as `0x${string}`;
338
- } else {
339
- if (env.namedAccounts) {
340
- address = env.namedAccounts[account];
341
- if (!address) {
342
- throw new Error(`no address for ${account}`);
343
- }
344
- } else {
345
- throw new Error(`no accounts setup, cannot get address for ${account}`);
346
- }
347
- }
348
- }
349
-
350
- const artifactToUse = deployment as unknown as Artifact<TAbi>;
351
- const abi = artifactToUse.abi;
352
- const calldata = encodeFunctionData<TAbi, TFunctionName>({
353
- abi,
354
- functionName: viemArgs.functionName,
355
- args: viemArgs.args,
356
- } as any);
357
-
358
- const result: `0x${string}` = (await env.network.provider.request({
359
- method: 'eth_call',
360
- params: [
361
- {
362
- to: deployment.address,
363
- type: '0x2',
364
- from: address,
365
- chainId: `0x${env.network.chain.id.toString(16)}` as `0x${string}`,
366
- data: calldata,
367
- // value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`,
368
- },
369
- ],
370
- })) as `0x${string}`;
371
-
372
- const parsed = decodeFunctionResult<TAbi, TFunctionName>({
373
- abi,
374
- functionName: viemArgs.functionName,
375
- data: result,
376
- args: viemArgs.args,
377
- } as any);
378
-
379
- return parsed as DecodeFunctionResultReturnType<TAbi, TFunctionName>;
380
- }
381
-
382
- async function readByName<
383
- TAbi extends Abi,
384
- TFunctionName extends ContractFunctionName<TAbi, 'pure' | 'view'>,
385
- TArgs extends ContractFunctionArgs<TAbi, 'pure' | 'view', TFunctionName> = ContractFunctionArgs<
386
- TAbi,
387
- 'pure' | 'view',
388
- TFunctionName
389
- >
390
- >(
391
- name: string,
392
- args: ReadingArgs<TAbi, TFunctionName, TArgs>
393
- ): Promise<DecodeFunctionResultReturnType<TAbi, TFunctionName>> {
394
- const deployment = env.getOrNull<TAbi>(name);
395
- if (!deployment) {
396
- throw new Error(`no deployment named ${name}`);
397
- }
398
-
399
- return read(deployment, args);
400
- }
401
- async function deploy<TAbi extends Abi>(
402
- name: string,
403
- args: DeploymentConstruction<TAbi>,
404
- options?: DeployOptions
405
- ): Promise<Deployment<TAbi> & {updated: boolean}> {
406
- const skipIfAlreadyDeployed = options && 'skipIfAlreadyDeployed' in options && options.skipIfAlreadyDeployed;
407
- const allwaysOverride = options && 'allwaysOverride' in options && options.allwaysOverride;
408
-
409
- if (allwaysOverride && skipIfAlreadyDeployed) {
410
- throw new Error(`conflicting options: "allwaysOverride" and "skipIfAlreadyDeployed"`);
411
- }
412
-
413
- const existingDeployment = env.getOrNull(name);
414
- if (existingDeployment && skipIfAlreadyDeployed) {
415
- logger.info(`deployment for ${name} at ${existingDeployment.address}, skipIfAlreadyDeployed: true => we skip`);
416
- return {...(existingDeployment as Deployment<TAbi>), updated: false};
417
- }
418
-
419
- const {account, artifact, ...viemArgs} = args;
420
- let address: `0x${string}`;
421
- if (account.startsWith('0x')) {
422
- address = account as `0x${string}`;
423
- } else {
424
- if (env.namedAccounts) {
425
- address = env.namedAccounts[account];
426
- if (!address) {
427
- throw new Error(`no address for ${account}`);
428
- }
429
- } else {
430
- throw new Error(`no accounts setup, cannot get address for ${account}`);
431
- }
432
- }
433
-
434
- // TODO throw specific error if artifact not found
435
- const artifactToUse = (typeof artifact === 'string' ? env.artifacts[artifact] : artifact) as Artifact<TAbi>;
436
-
437
- const bytecode = linkLibraries(artifactToUse, options?.libraries);
438
-
439
- const abi = artifactToUse.abi;
440
-
441
- const argsToUse = {
442
- ...viemArgs,
443
- account,
444
- abi,
445
- bytecode,
446
- };
447
-
448
- const calldata = encodeDeployData(argsToUse as any); // TODO any
449
- const argsData = `0x${calldata.replace(bytecode, '')}` as `0x${string}`;
450
-
451
- if (existingDeployment) {
452
- logger.info(`existing deployment for ${name} at ${existingDeployment.address}`);
453
- }
454
-
455
- if (existingDeployment && !allwaysOverride) {
456
- const previousBytecode = existingDeployment.bytecode;
457
- const previousArgsData = existingDeployment.argsData;
458
- // we assume cbor encoding of hash at the end
459
- // TODO option to remove it, can parse metadata but would rather avoid this here
460
- const last2Bytes = previousBytecode.slice(-4);
461
- const cborLength = parseInt(last2Bytes, 16);
462
- const previousBytecodeWithoutCBOR = previousBytecode.slice(0, -cborLength * 2);
463
- const newBytecodeWithoutCBOR = bytecode.slice(0, -cborLength * 2);
464
- if (previousBytecodeWithoutCBOR === newBytecodeWithoutCBOR && previousArgsData === argsData) {
465
- return {...(existingDeployment as Deployment<TAbi>), updated: false};
466
- } else {
467
- // logger.info(`-------------- WITHOUT CBOR---------------------`);
468
- // logger.info(previousBytecodeWithoutCBOR);
469
- // logger.info(newBytecodeWithoutCBOR);
470
- // logger.info(`-----------------------------------`);
471
- // logger.info(`-------------- ARGS DATA ---------------------`);
472
- // logger.info(previousArgsData);
473
- // logger.info(argsData);
474
- // logger.info(`-----------------------------------`);
475
- }
476
- }
477
-
478
- const partialDeployment: PartialDeployment<TAbi> = {
479
- ...artifactToUse,
480
- argsData,
481
- linkedData: options?.linkedData,
482
- };
483
-
484
- const signer = env.addressSigners[address];
485
-
486
- const chainId = `0x${env.network.chain.id.toString(16)}` as `0x${string}`;
487
- const maxFeePerGas = viemArgs.maxFeePerGas && (`0x${viemArgs.maxFeePerGas.toString(16)}` as `0x${string}`);
488
- const maxPriorityFeePerGas =
489
- viemArgs.maxPriorityFeePerGas && (`0x${viemArgs.maxPriorityFeePerGas.toString(16)}` as `0x${string}`);
490
-
491
- const params: [EIP1193TransactionData] = [
492
- {
493
- type: '0x2',
494
- from: address,
495
- chainId,
496
- data: calldata,
497
- gas: viemArgs.gas && (`0x${viemArgs.gas.toString(16)}` as `0x${string}`),
498
- maxFeePerGas,
499
- maxPriorityFeePerGas,
500
- // gasPrice: viemArgs.gasPrice && `0x${viemArgs.gasPrice.toString(16)}` as `0x${string}`,
501
- // value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`,
502
- // nonce: viemArgs.nonce && (`0x${viemArgs.nonce.toString(16)}` as `0x${string}`),
503
- },
504
- ];
505
-
506
- let expectedAddress: `0x${string}` | undefined = undefined;
507
- if (options?.deterministic) {
508
- // TODO make these configurable
509
- const deterministicFactoryAddress = `0x4e59b44847b379578588920ca78fbf26c0b4956c`;
510
- const deterministicFactoryDeployerAddress = `0x3fab184622dc19b6109349b94811493bf2a45362`;
511
- const factoryDeploymentData = `0xf8a58085174876e800830186a08080b853604580600e600039806000f350fe7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe03601600081602082378035828234f58015156039578182fd5b8082525050506014600cf31ba02222222222222222222222222222222222222222222222222222222222222222a02222222222222222222222222222222222222222222222222222222222222222`;
512
-
513
- const code = await env.network.provider.request({
514
- method: 'eth_getCode',
515
- params: [deterministicFactoryAddress, 'latest'],
516
- });
517
- if (code === '0x') {
518
- const balanceHexString = await env.network.provider.request({
519
- method: 'eth_getBalance',
520
- params: [deterministicFactoryDeployerAddress, 'latest'],
521
- });
522
- const balance = BigInt(balanceHexString);
523
- if (balance < 10000000000000000n) {
524
- const need = 10000000000000000n - balance;
525
- const balanceToSend = `0x${need.toString(16)}` as `0x${string}`;
526
- const txHash = await broadcastTransaction(env, signer, [
527
- {
528
- type: '0x2',
529
- chainId,
530
- from: address,
531
- to: deterministicFactoryDeployerAddress,
532
- value: balanceToSend,
533
- gas: `0x${BigInt(21000).toString(16)}`,
534
- maxFeePerGas,
535
- maxPriorityFeePerGas,
536
- },
537
- ]);
538
- await env.savePendingExecution({
539
- type: 'execution', // TODO different type ?
540
- transaction: {hash: txHash, origin: address},
541
- });
542
- }
543
-
544
- const txHash = await env.network.provider.request({
545
- method: 'eth_sendRawTransaction',
546
- params: [factoryDeploymentData],
547
- });
548
- await env.savePendingExecution({
549
- type: 'execution', // TODO different type ?
550
- transaction: {hash: txHash, origin: address},
551
- });
552
- }
553
-
554
- // prepending the salt
555
- const salt = (
556
- typeof options.deterministic === 'string'
557
- ? `0x${options.deterministic.slice(2).padStart(64, '0')}`
558
- : '0x0000000000000000000000000000000000000000000000000000000000000000'
559
- ) as `0x${string}`;
560
-
561
- const bytecode = params[0].data || '0x';
562
-
563
- expectedAddress = ('0x' +
564
- keccak256(`0xff${deterministicFactoryAddress.slice(2)}${salt.slice(2)}${keccak256(bytecode).slice(2)}`).slice(
565
- -40
566
- )) as `0x${string}`;
567
-
568
- const codeAlreadyDeployed = await env.network.provider.request({
569
- method: 'eth_getCode',
570
- params: [expectedAddress, 'latest'],
571
- });
572
-
573
- if (codeAlreadyDeployed !== '0x') {
574
- env.showMessage(`contract was already deterministically deployed at ${expectedAddress}`);
575
- const deployment = await env.save(name, {
576
- address: expectedAddress,
577
- ...partialDeployment,
578
- });
579
- return {...(deployment as Deployment<TAbi>), updated: true};
580
- }
581
-
582
- params[0].data = (salt + (bytecode.slice(2) || '')) as `0x${string}`;
583
- params[0].to = deterministicFactoryAddress;
584
- }
585
-
586
- const txHash = await broadcastTransaction(env, signer, params);
587
-
588
- const pendingDeployment: PendingDeployment<TAbi> = {
589
- type: 'deployment',
590
- expectedAddress,
591
- partialDeployment,
592
- transaction: {hash: txHash, origin: address},
593
- name,
594
- // TODO we should have the nonce, except for wallet like metamask where it is not usre you get the nonce you start with
595
- };
596
- const deployment = await env.savePendingDeployment(pendingDeployment);
597
- return {...(deployment as Deployment<TAbi>), updated: true};
598
- }
599
-
600
- env.deploy = deploy;
601
- env.execute = execute;
602
- env.executeByName = executeByName;
603
- env.read = read;
604
- env.readByName = readByName;
605
- return env;
606
- });
package/tsconfig.json DELETED
@@ -1,15 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "moduleResolution": "Node",
4
- "lib": ["ES2020", "dom"],
5
- "target": "ES2020",
6
- "declaration": true,
7
- "declarationMap": true,
8
- "sourceMap": true,
9
- "strict": true,
10
- "esModuleInterop": true,
11
- "skipLibCheck": true,
12
- "resolveJsonModule": true,
13
- "module": "ES6"
14
- }
15
- }