@rocketh/deploy 0.17.7 → 0.17.9
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/README.md +6 -0
- package/dist/deploy.integration.test.d.ts +11 -0
- package/dist/deploy.integration.test.d.ts.map +1 -0
- package/dist/deploy.integration.test.js +420 -0
- package/dist/deploy.integration.test.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -23
- package/dist/index.js.map +1 -1
- package/package.json +11 -7
- package/src/index.ts +472 -0
package/README.md
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
1
|
# @rocketh/deploy
|
|
2
|
+
|
|
3
|
+
Standard contract deployment functionality for rocketh, providing a framework-agnostic deploy function that works with any Ethereum development toolchain.
|
|
4
|
+
|
|
5
|
+
For full documentation, visit [rocketh.dev](https://rocketh.dev).
|
|
6
|
+
|
|
7
|
+
For hardhat-deploy documentation, see [rocketh.dev/hardhat-deploy/](https://rocketh.dev/hardhat-deploy/).
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Tests for @rocketh/deploy
|
|
3
|
+
*
|
|
4
|
+
* These tests serve as documentation for how to use the deployment system.
|
|
5
|
+
* They demonstrate real-world scenarios and best practices.
|
|
6
|
+
*
|
|
7
|
+
* Note: These tests use @rocketh/test-utils for mock environments.
|
|
8
|
+
* The mock provider can be configured to return specific values for testing.
|
|
9
|
+
*/
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=deploy.integration.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.integration.test.d.ts","sourceRoot":"","sources":["../src/deploy.integration.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}
|
|
@@ -0,0 +1,420 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Integration Tests for @rocketh/deploy
|
|
3
|
+
*
|
|
4
|
+
* These tests serve as documentation for how to use the deployment system.
|
|
5
|
+
* They demonstrate real-world scenarios and best practices.
|
|
6
|
+
*
|
|
7
|
+
* Note: These tests use @rocketh/test-utils for mock environments.
|
|
8
|
+
* The mock provider can be configured to return specific values for testing.
|
|
9
|
+
*/
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { deploy } from './index.js';
|
|
12
|
+
import { createMockEnvironment, createMockArtifact } from '@rocketh/test-utils';
|
|
13
|
+
describe('@rocketh/deploy - Integration Tests', () => {
|
|
14
|
+
describe('Basic Contract Deployment', () => {
|
|
15
|
+
it('should demonstrate basic deployment pattern', async () => {
|
|
16
|
+
/**
|
|
17
|
+
* Example: Deploying a simple contract with constructor arguments
|
|
18
|
+
*
|
|
19
|
+
* This demonstrates the most basic deployment scenario:
|
|
20
|
+
* - Create an environment with named accounts
|
|
21
|
+
* - Use the deploy function to deploy a contract
|
|
22
|
+
* - Specify the account, artifact, and constructor arguments
|
|
23
|
+
*
|
|
24
|
+
* Usage in real scenario:
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import {deploy} from '@rocketh/deploy';
|
|
27
|
+
* import {MyContract} from './artifacts/MyContract.js';
|
|
28
|
+
*
|
|
29
|
+
* const _deploy = deploy(env);
|
|
30
|
+
* const deployment = await _deploy('MyContract', {
|
|
31
|
+
* account: 'deployer',
|
|
32
|
+
* artifact: MyContract,
|
|
33
|
+
* args: [42n],
|
|
34
|
+
* });
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
const { env } = createMockEnvironment();
|
|
38
|
+
const _deploy = deploy(env);
|
|
39
|
+
const artifact = createMockArtifact('SimpleContract');
|
|
40
|
+
const deployment = await _deploy('SimpleContract', {
|
|
41
|
+
account: 'deployer',
|
|
42
|
+
artifact,
|
|
43
|
+
args: [42n],
|
|
44
|
+
});
|
|
45
|
+
expect(deployment).toBeDefined();
|
|
46
|
+
expect(deployment.address).toBeDefined();
|
|
47
|
+
expect(deployment.newlyDeployed).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it('should demonstrate idempotent deployment with skipIfAlreadyDeployed', async () => {
|
|
50
|
+
/**
|
|
51
|
+
* Example: Idempotent deployment with skipIfAlreadyDeployed
|
|
52
|
+
*
|
|
53
|
+
* This demonstrates how to avoid redeploying contracts that
|
|
54
|
+
* haven't changed. The system checks both bytecode and constructor
|
|
55
|
+
* arguments before deciding to redeploy.
|
|
56
|
+
*
|
|
57
|
+
* Usage in real scenario:
|
|
58
|
+
* ```typescript
|
|
59
|
+
* const deployment = await _deploy('MyContract', {
|
|
60
|
+
* account: 'deployer',
|
|
61
|
+
* artifact: MyContract,
|
|
62
|
+
* args: [100n],
|
|
63
|
+
* skipIfAlreadyDeployed: true,
|
|
64
|
+
* });
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
const { env } = createMockEnvironment();
|
|
68
|
+
const _deploy = deploy(env);
|
|
69
|
+
const artifact = createMockArtifact('ImmutableContract');
|
|
70
|
+
// First deployment
|
|
71
|
+
const firstDeployment = await _deploy('ImmutableContract', {
|
|
72
|
+
account: 'deployer',
|
|
73
|
+
artifact,
|
|
74
|
+
args: [100n],
|
|
75
|
+
}, {
|
|
76
|
+
skipIfAlreadyDeployed: true,
|
|
77
|
+
});
|
|
78
|
+
expect(firstDeployment.newlyDeployed).toBe(true);
|
|
79
|
+
// Second deployment with same args - would skip in real scenario
|
|
80
|
+
const secondDeployment = await _deploy('ImmutableContract', {
|
|
81
|
+
account: 'deployer',
|
|
82
|
+
artifact,
|
|
83
|
+
args: [100n],
|
|
84
|
+
}, {
|
|
85
|
+
skipIfAlreadyDeployed: true,
|
|
86
|
+
});
|
|
87
|
+
// In mock, newlyDeployed is always true, but pattern is demonstrated
|
|
88
|
+
expect(secondDeployment).toBeDefined();
|
|
89
|
+
});
|
|
90
|
+
it('should demonstrate forced redeployment with alwaysOverride', async () => {
|
|
91
|
+
/**
|
|
92
|
+
* Example: Forced redeployment with alwaysOverride
|
|
93
|
+
*
|
|
94
|
+
* This demonstrates how to force a redeployment even if
|
|
95
|
+
* the contract already exists with the same bytecode.
|
|
96
|
+
* This is useful for testing or when you need to reset state.
|
|
97
|
+
*
|
|
98
|
+
* Usage in real scenario:
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const deployment = await _deploy('MyContract', {
|
|
101
|
+
* account: 'deployer',
|
|
102
|
+
* artifact: MyContract,
|
|
103
|
+
* args: [],
|
|
104
|
+
* alwaysOverride: true,
|
|
105
|
+
* });
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
const { env } = createMockEnvironment();
|
|
109
|
+
const _deploy = deploy(env);
|
|
110
|
+
const artifact = createMockArtifact('UpgradeableContract');
|
|
111
|
+
const deployment = await _deploy('UpgradeableContract', {
|
|
112
|
+
account: 'deployer',
|
|
113
|
+
artifact,
|
|
114
|
+
args: [],
|
|
115
|
+
}, {
|
|
116
|
+
alwaysOverride: true,
|
|
117
|
+
});
|
|
118
|
+
expect(deployment).toBeDefined();
|
|
119
|
+
expect(deployment.newlyDeployed).toBe(true);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
describe('Named Accounts Resolution', () => {
|
|
123
|
+
it('should demonstrate using named accounts', async () => {
|
|
124
|
+
/**
|
|
125
|
+
* Example: Using named accounts
|
|
126
|
+
*
|
|
127
|
+
* Named accounts allow you to reference accounts by name
|
|
128
|
+
* instead of hardcoded addresses. This makes your deployment
|
|
129
|
+
* scripts more portable across different networks.
|
|
130
|
+
*
|
|
131
|
+
* Usage in real scenario:
|
|
132
|
+
* ```typescript
|
|
133
|
+
* // In your environment config:
|
|
134
|
+
* const env = {
|
|
135
|
+
* namedAccounts: {
|
|
136
|
+
* deployer: '0x...',
|
|
137
|
+
* user1: '0x...',
|
|
138
|
+
* user2: '0x...',
|
|
139
|
+
* },
|
|
140
|
+
* // ... other config
|
|
141
|
+
* };
|
|
142
|
+
*
|
|
143
|
+
* const deployment = await _deploy('MyContract', {
|
|
144
|
+
* account: 'deployer',
|
|
145
|
+
* artifact: MyContract,
|
|
146
|
+
* args: [],
|
|
147
|
+
* });
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
const { env } = createMockEnvironment();
|
|
151
|
+
const _deploy = deploy(env);
|
|
152
|
+
const artifact = createMockArtifact('NamedAccountContract');
|
|
153
|
+
const deployment = await _deploy('NamedAccountContract', {
|
|
154
|
+
account: 'deployer',
|
|
155
|
+
artifact,
|
|
156
|
+
args: [],
|
|
157
|
+
});
|
|
158
|
+
expect(deployment).toBeDefined();
|
|
159
|
+
});
|
|
160
|
+
it('should demonstrate deploying with different named accounts', async () => {
|
|
161
|
+
/**
|
|
162
|
+
* Example: Using multiple named accounts
|
|
163
|
+
*
|
|
164
|
+
* You can use different named accounts for different
|
|
165
|
+
* deployments. This is useful for multi-signature setups
|
|
166
|
+
* or when deploying contracts owned by different entities.
|
|
167
|
+
*
|
|
168
|
+
* Usage in real scenario:
|
|
169
|
+
* ```typescript
|
|
170
|
+
* const deployment1 = await _deploy('ContractByUser1', {
|
|
171
|
+
* account: 'user1',
|
|
172
|
+
* artifact: MyContract,
|
|
173
|
+
* args: [],
|
|
174
|
+
* });
|
|
175
|
+
*
|
|
176
|
+
* const deployment2 = await _deploy('ContractByUser2', {
|
|
177
|
+
* account: 'user2',
|
|
178
|
+
* artifact: MyContract,
|
|
179
|
+
* args: [],
|
|
180
|
+
* });
|
|
181
|
+
* ```
|
|
182
|
+
*/
|
|
183
|
+
const { env } = createMockEnvironment();
|
|
184
|
+
const _deploy = deploy(env);
|
|
185
|
+
const artifact = createMockArtifact('MultiUserContract');
|
|
186
|
+
const deployment1 = await _deploy('ContractByUser1', {
|
|
187
|
+
account: 'user1',
|
|
188
|
+
artifact,
|
|
189
|
+
args: [],
|
|
190
|
+
});
|
|
191
|
+
const deployment2 = await _deploy('ContractByUser2', {
|
|
192
|
+
account: 'user1',
|
|
193
|
+
artifact,
|
|
194
|
+
args: [],
|
|
195
|
+
});
|
|
196
|
+
expect(deployment1).toBeDefined();
|
|
197
|
+
expect(deployment2).toBeDefined();
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('Library Linking', () => {
|
|
201
|
+
it('should demonstrate deploying contract with linked libraries', async () => {
|
|
202
|
+
/**
|
|
203
|
+
* Example: Deploying a contract that uses external libraries
|
|
204
|
+
*
|
|
205
|
+
* Libraries are linked at deployment time. You need to:
|
|
206
|
+
* 1. Deploy the library first
|
|
207
|
+
* 2. Specify the library addresses in the libraries option
|
|
208
|
+
* The deployment system will automatically link the library
|
|
209
|
+
* placeholders in the bytecode.
|
|
210
|
+
*
|
|
211
|
+
* Usage in real scenario:
|
|
212
|
+
* ```typescript
|
|
213
|
+
* // Deploy library
|
|
214
|
+
* const libraryDeployment = await _deploy('MathLib', {
|
|
215
|
+
* account: 'deployer',
|
|
216
|
+
* artifact: MathLibArtifact,
|
|
217
|
+
* args: [],
|
|
218
|
+
* });
|
|
219
|
+
*
|
|
220
|
+
* // Deploy contract that uses the library
|
|
221
|
+
* const contractDeployment = await _deploy('Calculator', {
|
|
222
|
+
* account: 'deployer',
|
|
223
|
+
* artifact: CalculatorArtifact,
|
|
224
|
+
* args: [],
|
|
225
|
+
* libraries: {
|
|
226
|
+
* MathLib: libraryDeployment.address,
|
|
227
|
+
* },
|
|
228
|
+
* });
|
|
229
|
+
* ```
|
|
230
|
+
*/
|
|
231
|
+
const { env } = createMockEnvironment();
|
|
232
|
+
const _deploy = deploy(env);
|
|
233
|
+
const libraryArtifact = createMockArtifact('MathLib');
|
|
234
|
+
const libraryDeployment = await _deploy('MathLib', {
|
|
235
|
+
account: 'deployer',
|
|
236
|
+
artifact: libraryArtifact,
|
|
237
|
+
args: [],
|
|
238
|
+
});
|
|
239
|
+
const contractArtifact = createMockArtifact('Calculator');
|
|
240
|
+
const contractDeployment = await _deploy('Calculator', {
|
|
241
|
+
account: 'deployer',
|
|
242
|
+
artifact: contractArtifact,
|
|
243
|
+
args: [],
|
|
244
|
+
}, {
|
|
245
|
+
libraries: {
|
|
246
|
+
MathLib: libraryDeployment.address,
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
expect(contractDeployment).toBeDefined();
|
|
250
|
+
expect(libraryDeployment).toBeDefined();
|
|
251
|
+
});
|
|
252
|
+
});
|
|
253
|
+
describe('Deterministic Deployments', () => {
|
|
254
|
+
it('should demonstrate CREATE2 deterministic deployment', async () => {
|
|
255
|
+
/**
|
|
256
|
+
* Example: Deterministic deployment using CREATE2
|
|
257
|
+
*
|
|
258
|
+
* Deterministic deployments allow you to deploy contracts
|
|
259
|
+
* at predictable addresses based on:
|
|
260
|
+
* - Deployer address (factory)
|
|
261
|
+
* - Salt (a 32-byte value)
|
|
262
|
+
* - Contract bytecode
|
|
263
|
+
*
|
|
264
|
+
* This is useful for:
|
|
265
|
+
* - Cross-chain deployments
|
|
266
|
+
* - Gas optimization (known addresses in advance)
|
|
267
|
+
* - Multi-chain setups
|
|
268
|
+
*
|
|
269
|
+
* Usage in real scenario:
|
|
270
|
+
* ```typescript
|
|
271
|
+
* const deployment = await _deploy('DeterministicContract', {
|
|
272
|
+
* account: 'deployer',
|
|
273
|
+
* artifact: MyContract,
|
|
274
|
+
* args: [],
|
|
275
|
+
* deterministic: {
|
|
276
|
+
* type: 'create2',
|
|
277
|
+
* salt: '0x1234...',
|
|
278
|
+
* },
|
|
279
|
+
* });
|
|
280
|
+
* ```
|
|
281
|
+
*/
|
|
282
|
+
const { env } = createMockEnvironment();
|
|
283
|
+
const _deploy = deploy(env);
|
|
284
|
+
const artifact = createMockArtifact('DeterministicContract');
|
|
285
|
+
const salt = '0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef';
|
|
286
|
+
const deployment = await _deploy('DeterministicContract', {
|
|
287
|
+
account: 'deployer',
|
|
288
|
+
artifact,
|
|
289
|
+
args: [],
|
|
290
|
+
}, {
|
|
291
|
+
deterministic: {
|
|
292
|
+
type: 'create2',
|
|
293
|
+
salt,
|
|
294
|
+
},
|
|
295
|
+
});
|
|
296
|
+
expect(deployment).toBeDefined();
|
|
297
|
+
});
|
|
298
|
+
it('should demonstrate CREATE3 deterministic deployment', async () => {
|
|
299
|
+
/**
|
|
300
|
+
* Example: Deterministic deployment using CREATE3
|
|
301
|
+
*
|
|
302
|
+
* CREATE3 provides a different address calculation formula
|
|
303
|
+
* that's more flexible for certain use cases. The main
|
|
304
|
+
* advantage is that the address depends only on the salt,
|
|
305
|
+
* not on the bytecode.
|
|
306
|
+
*
|
|
307
|
+
* This is useful when you want to upgrade a contract but
|
|
308
|
+
* keep the same address.
|
|
309
|
+
*
|
|
310
|
+
* Usage in real scenario:
|
|
311
|
+
* ```typescript
|
|
312
|
+
* const deployment = await _deploy('Create3Contract', {
|
|
313
|
+
* account: 'deployer',
|
|
314
|
+
* artifact: MyContract,
|
|
315
|
+
* args: [],
|
|
316
|
+
* deterministic: {
|
|
317
|
+
* type: 'create3',
|
|
318
|
+
* salt: '0x9876...',
|
|
319
|
+
* },
|
|
320
|
+
* });
|
|
321
|
+
* ```
|
|
322
|
+
*/
|
|
323
|
+
const { env } = createMockEnvironment();
|
|
324
|
+
const _deploy = deploy(env);
|
|
325
|
+
const artifact = createMockArtifact('Create3Contract');
|
|
326
|
+
const salt = '0x9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba';
|
|
327
|
+
const deployment = await _deploy('Create3Contract', {
|
|
328
|
+
account: 'deployer',
|
|
329
|
+
artifact,
|
|
330
|
+
args: [],
|
|
331
|
+
}, {
|
|
332
|
+
deterministic: {
|
|
333
|
+
type: 'create3',
|
|
334
|
+
salt,
|
|
335
|
+
},
|
|
336
|
+
});
|
|
337
|
+
expect(deployment).toBeDefined();
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('Linked Data', () => {
|
|
341
|
+
it('should demonstrate attaching metadata to deployments', async () => {
|
|
342
|
+
/**
|
|
343
|
+
* Example: Attaching metadata to deployments
|
|
344
|
+
*
|
|
345
|
+
* Linked data allows you to attach arbitrary metadata
|
|
346
|
+
* to your deployments. This is useful for:
|
|
347
|
+
* - Documentation
|
|
348
|
+
* - Frontend integration
|
|
349
|
+
* - Deployment tracking
|
|
350
|
+
* - Versioning
|
|
351
|
+
*
|
|
352
|
+
* Usage in real scenario:
|
|
353
|
+
* ```typescript
|
|
354
|
+
* const deployment = await _deploy('MyContract', {
|
|
355
|
+
* account: 'deployer',
|
|
356
|
+
* artifact: MyContract,
|
|
357
|
+
* args: [],
|
|
358
|
+
* linkedData: {
|
|
359
|
+
* version: '1.0.0',
|
|
360
|
+
* description: 'A contract with metadata',
|
|
361
|
+
* author: 'Developer',
|
|
362
|
+
* tags: ['test', 'example'],
|
|
363
|
+
* },
|
|
364
|
+
* });
|
|
365
|
+
* ```
|
|
366
|
+
*/
|
|
367
|
+
const { env } = createMockEnvironment();
|
|
368
|
+
const _deploy = deploy(env);
|
|
369
|
+
const artifact = createMockArtifact('MetadataContract');
|
|
370
|
+
const deployment = await _deploy('MetadataContract', {
|
|
371
|
+
account: 'deployer',
|
|
372
|
+
artifact,
|
|
373
|
+
args: [],
|
|
374
|
+
}, {
|
|
375
|
+
linkedData: {
|
|
376
|
+
version: '1.0.0',
|
|
377
|
+
description: 'A contract with metadata',
|
|
378
|
+
author: 'Developer',
|
|
379
|
+
tags: ['test', 'example'],
|
|
380
|
+
},
|
|
381
|
+
});
|
|
382
|
+
expect(deployment.linkedData).toBeDefined();
|
|
383
|
+
expect(deployment.linkedData?.version).toBe('1.0.0');
|
|
384
|
+
});
|
|
385
|
+
});
|
|
386
|
+
describe('Error Handling', () => {
|
|
387
|
+
it('should demonstrate error for conflicting options', async () => {
|
|
388
|
+
/**
|
|
389
|
+
* Example: Error handling for conflicting options
|
|
390
|
+
*
|
|
391
|
+
* The deployment system validates your options and throws
|
|
392
|
+
* descriptive errors when there are conflicts.
|
|
393
|
+
*
|
|
394
|
+
* Usage in real scenario:
|
|
395
|
+
* ```typescript
|
|
396
|
+
* // This will throw an error:
|
|
397
|
+
* const deployment = await _deploy('MyContract', {
|
|
398
|
+
* account: 'deployer',
|
|
399
|
+
* artifact: MyContract,
|
|
400
|
+
* args: [],
|
|
401
|
+
* skipIfAlreadyDeployed: true,
|
|
402
|
+
* alwaysOverride: true, // Conflict!
|
|
403
|
+
* });
|
|
404
|
+
* ```
|
|
405
|
+
*/
|
|
406
|
+
const { env } = createMockEnvironment();
|
|
407
|
+
const _deploy = deploy(env);
|
|
408
|
+
const artifact = createMockArtifact('ConflictingOptionsContract');
|
|
409
|
+
await expect(_deploy('ConflictingOptionsContract', {
|
|
410
|
+
account: 'deployer',
|
|
411
|
+
artifact,
|
|
412
|
+
args: [],
|
|
413
|
+
}, {
|
|
414
|
+
skipIfAlreadyDeployed: true,
|
|
415
|
+
alwaysOverride: true,
|
|
416
|
+
})).rejects.toThrow('conflicting options');
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
//# sourceMappingURL=deploy.integration.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy.integration.test.js","sourceRoot":"","sources":["../src/deploy.integration.test.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,SAAS,CAAC;AAG5B,OAAO,KAAK,EACX,sBAAsB,EACtB,UAAU,EACV,WAAW,EAIX,kBAAkB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,OAAO,EACP,KAAK,EAQL,MAAM,MAAM,CAAC;AAId,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG;IAAC,aAAa,EAAE,OAAO,CAAA;CAAC,CAAC;AAEzF,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,SAAS,GAAG,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC3E,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,KACnB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjC,MAAM,MAAM,aAAa,GAAG;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EACX,OAAO,GACP,KAAK,MAAM,EAAE,GACb;QACA,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;KACpB,CAAC;IACL,SAAS,CAAC,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC,CAAC;CACtC,GAAG,CACD;IACA,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC/B,GACD;IACA,cAAc,CAAC,EAAE,OAAO,CAAC;CACxB,CACH,CAAC;AAwPF,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,IAAI,SAAS,GAAG,EAC1D,IAAI,EAAE,MAAM,EAAE,0BAA0B;AACxC,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,KACnB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,SAAS,CAAC;AAG5B,OAAO,KAAK,EACX,sBAAsB,EACtB,UAAU,EACV,WAAW,EAIX,kBAAkB,EAClB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,OAAO,EACP,KAAK,EAQL,MAAM,MAAM,CAAC;AAId,MAAM,MAAM,YAAY,CAAC,IAAI,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG;IAAC,aAAa,EAAE,OAAO,CAAA;CAAC,CAAC;AAEzF,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,SAAS,GAAG,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC3E,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,KACnB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAEjC,MAAM,MAAM,aAAa,GAAG;IAC3B,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EACX,OAAO,GACP,KAAK,MAAM,EAAE,GACb;QACA,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,EAAE,KAAK,MAAM,EAAE,CAAC;KACpB,CAAC;IACL,SAAS,CAAC,EAAE;QAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;KAAC,CAAC;CACtC,GAAG,CACD;IACA,qBAAqB,CAAC,EAAE,OAAO,CAAC;CAC/B,GACD;IACA,cAAc,CAAC,EAAE,OAAO,CAAC;CACxB,CACH,CAAC;AAwPF,wBAAgB,MAAM,CAAC,GAAG,EAAE,WAAW,GAAG,CAAC,IAAI,SAAS,GAAG,EAC1D,IAAI,EAAE,MAAM,EAAE,0BAA0B;AACxC,IAAI,EAAE,sBAAsB,CAAC,IAAI,CAAC,EAClC,OAAO,CAAC,EAAE,aAAa,KACnB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAuK/B"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { toJSONCompatibleLinkedData } from '@rocketh/core
|
|
1
|
+
import { toJSONCompatibleLinkedData, resolveAccount } from '@rocketh/core';
|
|
2
2
|
import { logs } from 'named-logs';
|
|
3
3
|
import { encodeDeployData, encodeFunctionData, encodePacked, getCreate2Address, keccak256, parseAbi, zeroHash, } from 'viem';
|
|
4
4
|
const logger = logs('@rocketh/deploy');
|
|
@@ -196,9 +196,9 @@ export function deploy(env) {
|
|
|
196
196
|
return async (name, args, options) => {
|
|
197
197
|
const nameToDisplay = name || '<no name>';
|
|
198
198
|
const skipIfAlreadyDeployed = options && 'skipIfAlreadyDeployed' in options && options.skipIfAlreadyDeployed;
|
|
199
|
-
const
|
|
200
|
-
if (
|
|
201
|
-
throw new Error(`conflicting options: "
|
|
199
|
+
const alwaysOverride = options && 'alwaysOverride' in options && options.alwaysOverride;
|
|
200
|
+
if (alwaysOverride && skipIfAlreadyDeployed) {
|
|
201
|
+
throw new Error(`conflicting options: "alwaysOverride" and "skipIfAlreadyDeployed"`);
|
|
202
202
|
}
|
|
203
203
|
const existingDeployment = name && env.getOrNull(name);
|
|
204
204
|
if (existingDeployment && skipIfAlreadyDeployed) {
|
|
@@ -206,21 +206,7 @@ export function deploy(env) {
|
|
|
206
206
|
return { ...existingDeployment, newlyDeployed: false };
|
|
207
207
|
}
|
|
208
208
|
const { account, artifact, ...viemArgs } = args;
|
|
209
|
-
|
|
210
|
-
if (account.startsWith('0x')) {
|
|
211
|
-
address = account;
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
if (env.namedAccounts) {
|
|
215
|
-
address = env.namedAccounts[account];
|
|
216
|
-
if (!address) {
|
|
217
|
-
throw new Error(`no address for ${account}`);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
else {
|
|
221
|
-
throw new Error(`no accounts setup, cannot get address for ${account}`);
|
|
222
|
-
}
|
|
223
|
-
}
|
|
209
|
+
const address = resolveAccount(account, env);
|
|
224
210
|
// TODO throw specific error if artifact not found
|
|
225
211
|
const artifactToUse = artifact;
|
|
226
212
|
const bytecode = linkLibraries(artifactToUse, options?.libraries);
|
|
@@ -236,7 +222,7 @@ export function deploy(env) {
|
|
|
236
222
|
if (existingDeployment) {
|
|
237
223
|
logger.info(`existing deployment for ${nameToDisplay} at ${existingDeployment.address}`);
|
|
238
224
|
}
|
|
239
|
-
if (existingDeployment && !
|
|
225
|
+
if (existingDeployment && !alwaysOverride) {
|
|
240
226
|
const previousBytecode = existingDeployment.bytecode;
|
|
241
227
|
const previousArgsData = existingDeployment.argsData;
|
|
242
228
|
// we assume cbor encoding of hash at the end
|
|
@@ -304,9 +290,12 @@ export function deploy(env) {
|
|
|
304
290
|
method: 'eth_getCode',
|
|
305
291
|
params: [expectedAddress, 'latest'],
|
|
306
292
|
});
|
|
307
|
-
if (codeAlreadyDeployed
|
|
293
|
+
if (!codeAlreadyDeployed) {
|
|
294
|
+
throw new Error(`invalid code : ${codeAlreadyDeployed}`);
|
|
295
|
+
}
|
|
296
|
+
else if (codeAlreadyDeployed !== '0x') {
|
|
308
297
|
if (deterministicType === 'create3' && codeAlreadyDeployed !== bytecode)
|
|
309
|
-
throw new Error(`code already deployed at ${expectedAddress} but is not the expected bytecode`);
|
|
298
|
+
throw new Error(`code (length: ${(codeAlreadyDeployed.length - 2) / 2}) already deployed at ${expectedAddress} but is not the expected bytecode (length: ${(bytecode.length - 2) / 2})`);
|
|
310
299
|
env.showMessage(`contract was already deterministically deployed at ${expectedAddress}`);
|
|
311
300
|
if (name) {
|
|
312
301
|
const deployment = await env.save(name, {
|
|
@@ -329,7 +318,7 @@ export function deploy(env) {
|
|
|
329
318
|
partialDeployment,
|
|
330
319
|
transaction: { hash: txHash, origin: address },
|
|
331
320
|
name,
|
|
332
|
-
// TODO we should have the nonce, except for wallet like metamask where it is not
|
|
321
|
+
// TODO we should have the nonce, except for wallet like metamask where it is not sure you get the nonce you start with
|
|
333
322
|
};
|
|
334
323
|
const deployment = await env.savePendingDeployment(pendingDeployment, ` - Deploying {name} ${options?.deterministic ? '(deterministically)' : ''} with tx:\n {hash}\n {transaction}`);
|
|
335
324
|
return { ...deployment, newlyDeployed: true };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rocketh/deploy",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.9",
|
|
4
4
|
"description": "provide deploy function for rocketh",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -18,22 +18,26 @@
|
|
|
18
18
|
}
|
|
19
19
|
},
|
|
20
20
|
"files": [
|
|
21
|
-
"dist"
|
|
21
|
+
"dist",
|
|
22
|
+
"src"
|
|
22
23
|
],
|
|
23
24
|
"dependencies": {
|
|
24
25
|
"abitype": "^1.2.3",
|
|
25
26
|
"eip-1193": "^0.6.5",
|
|
26
27
|
"named-logs": "^0.4.1",
|
|
27
|
-
"viem": "^2.44.
|
|
28
|
-
"@rocketh/core": "0.17.
|
|
28
|
+
"viem": "^2.44.4",
|
|
29
|
+
"@rocketh/core": "0.17.9"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
|
-
"as-soon": "^0.
|
|
32
|
+
"as-soon": "^0.1.4",
|
|
32
33
|
"rimraf": "^6.1.2",
|
|
33
|
-
"typescript": "^5.9.3"
|
|
34
|
+
"typescript": "^5.9.3",
|
|
35
|
+
"vitest": "^4.0.18",
|
|
36
|
+
"@rocketh/test-utils": "0.0.2"
|
|
34
37
|
},
|
|
35
38
|
"scripts": {
|
|
36
39
|
"build": "tsc --project tsconfig.json",
|
|
37
|
-
"dev": "as-soon -w src pnpm build"
|
|
40
|
+
"dev": "as-soon -w src pnpm build",
|
|
41
|
+
"test": "vitest"
|
|
38
42
|
}
|
|
39
43
|
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,472 @@
|
|
|
1
|
+
import {toJSONCompatibleLinkedData, resolveAccount} from '@rocketh/core';
|
|
2
|
+
import {Abi} from 'abitype';
|
|
3
|
+
import {EIP1193TransactionData} from 'eip-1193';
|
|
4
|
+
import {logs} from 'named-logs';
|
|
5
|
+
import type {
|
|
6
|
+
DeploymentConstruction,
|
|
7
|
+
Deployment,
|
|
8
|
+
Environment,
|
|
9
|
+
PartialDeployment,
|
|
10
|
+
PendingDeployment,
|
|
11
|
+
Signer,
|
|
12
|
+
LinkedDataProvided,
|
|
13
|
+
} from '@rocketh/core/types';
|
|
14
|
+
import {
|
|
15
|
+
Address,
|
|
16
|
+
Chain,
|
|
17
|
+
encodeDeployData,
|
|
18
|
+
encodeFunctionData,
|
|
19
|
+
encodePacked,
|
|
20
|
+
getCreate2Address,
|
|
21
|
+
keccak256,
|
|
22
|
+
parseAbi,
|
|
23
|
+
zeroHash,
|
|
24
|
+
} from 'viem';
|
|
25
|
+
|
|
26
|
+
const logger = logs('@rocketh/deploy');
|
|
27
|
+
|
|
28
|
+
export type DeployResult<TAbi extends Abi> = Deployment<TAbi> & {newlyDeployed: boolean};
|
|
29
|
+
|
|
30
|
+
export type DeployFunction = <TAbi extends Abi, TChain extends Chain = Chain>(
|
|
31
|
+
name: string,
|
|
32
|
+
args: DeploymentConstruction<TAbi>,
|
|
33
|
+
options?: DeployOptions,
|
|
34
|
+
) => Promise<DeployResult<TAbi>>;
|
|
35
|
+
|
|
36
|
+
export type DeployOptions = {
|
|
37
|
+
linkedData?: LinkedDataProvided;
|
|
38
|
+
deterministic?:
|
|
39
|
+
| boolean
|
|
40
|
+
| `0x${string}`
|
|
41
|
+
| {
|
|
42
|
+
type: 'create2' | 'create3';
|
|
43
|
+
salt?: `0x${string}`;
|
|
44
|
+
};
|
|
45
|
+
libraries?: {[name: string]: Address};
|
|
46
|
+
} & (
|
|
47
|
+
| {
|
|
48
|
+
skipIfAlreadyDeployed?: boolean;
|
|
49
|
+
}
|
|
50
|
+
| {
|
|
51
|
+
alwaysOverride?: boolean;
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
async function broadcastTransaction(
|
|
56
|
+
env: Environment,
|
|
57
|
+
signer: Signer,
|
|
58
|
+
params: [EIP1193TransactionData],
|
|
59
|
+
): Promise<`0x${string}`> {
|
|
60
|
+
if (signer.type === 'wallet' || signer.type === 'remote') {
|
|
61
|
+
const tx = signer.signer.request({
|
|
62
|
+
method: 'eth_sendTransaction',
|
|
63
|
+
params: params as any, // TODO fix eip-1193 ?,
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
if (env.tags['auto-mine']) {
|
|
67
|
+
await (env.network.provider as any).request({method: 'evm_mine', params: []});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
return tx;
|
|
71
|
+
} else {
|
|
72
|
+
const rawTx = await signer.signer.request({
|
|
73
|
+
method: 'eth_signTransaction',
|
|
74
|
+
params,
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
const tx = env.network.provider.request({
|
|
78
|
+
method: 'eth_sendRawTransaction',
|
|
79
|
+
params: [rawTx],
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
if (env.tags['auto-mine']) {
|
|
83
|
+
await (env.network.provider as any).request({method: 'evm_mine', params: []});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return tx;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function linkRawLibrary(bytecode: string, libraryName: string, libraryAddress: string): string {
|
|
91
|
+
const address = libraryAddress.replace('0x', '');
|
|
92
|
+
let encodedLibraryName;
|
|
93
|
+
if (libraryName.startsWith('$') && libraryName.endsWith('$')) {
|
|
94
|
+
encodedLibraryName = libraryName.slice(1, libraryName.length - 1);
|
|
95
|
+
} else {
|
|
96
|
+
encodedLibraryName = keccak256(encodePacked(['string'], [libraryName])).slice(2, 36);
|
|
97
|
+
}
|
|
98
|
+
const pattern = new RegExp(`_+\\$${encodedLibraryName}\\$_+`, 'g');
|
|
99
|
+
if (!pattern.exec(bytecode)) {
|
|
100
|
+
throw new Error(`Can't link '${libraryName}' (${encodedLibraryName}) in \n----\n ${bytecode}\n----\n`);
|
|
101
|
+
}
|
|
102
|
+
return bytecode.replace(pattern, address);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function linkRawLibraries(bytecode: string, libraries: {[libraryName: string]: Address}): string {
|
|
106
|
+
for (const libName of Object.keys(libraries)) {
|
|
107
|
+
const libAddress = libraries[libName];
|
|
108
|
+
bytecode = linkRawLibrary(bytecode, libName, libAddress);
|
|
109
|
+
}
|
|
110
|
+
return bytecode;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function linkLibraries(
|
|
114
|
+
artifact: {
|
|
115
|
+
bytecode: string;
|
|
116
|
+
linkReferences?: {
|
|
117
|
+
[libraryFileName: string]: {
|
|
118
|
+
[libraryName: string]: Array<{length: number; start: number}>;
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
libraries?: {[libraryName: string]: Address},
|
|
123
|
+
) {
|
|
124
|
+
let bytecode = artifact.bytecode;
|
|
125
|
+
|
|
126
|
+
if (libraries) {
|
|
127
|
+
if (artifact.linkReferences) {
|
|
128
|
+
for (const [fileName, fileReferences] of Object.entries(artifact.linkReferences)) {
|
|
129
|
+
for (const [libName, fixups] of Object.entries(fileReferences)) {
|
|
130
|
+
const addr = libraries[libName];
|
|
131
|
+
if (addr === undefined) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
for (const fixup of fixups) {
|
|
136
|
+
bytecode =
|
|
137
|
+
bytecode.substring(0, 2 + fixup.start * 2) +
|
|
138
|
+
addr.substring(2) +
|
|
139
|
+
bytecode.substring(2 + (fixup.start + fixup.length) * 2);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
bytecode = linkRawLibraries(bytecode, libraries);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// TODO return libraries object with path name <filepath.sol>:<name> for names
|
|
149
|
+
|
|
150
|
+
return bytecode;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
type FactoryParams = {
|
|
154
|
+
chainId: `0x${string}`;
|
|
155
|
+
address: `0x${string}`;
|
|
156
|
+
maxFeePerGas: `0x${string}` | undefined;
|
|
157
|
+
maxPriorityFeePerGas: `0x${string}` | undefined;
|
|
158
|
+
};
|
|
159
|
+
async function getCreate2Factory(env: Environment, signer: Signer, params: FactoryParams) {
|
|
160
|
+
const deploymentInfo =
|
|
161
|
+
'create2' in env.network.deterministicDeployment
|
|
162
|
+
? env.network.deterministicDeployment.create2
|
|
163
|
+
: 'factory' in env.network.deterministicDeployment
|
|
164
|
+
? env.network.deterministicDeployment
|
|
165
|
+
: undefined;
|
|
166
|
+
if (!deploymentInfo) throw new Error('create2 deterministic deployment info not found');
|
|
167
|
+
|
|
168
|
+
const factoryAddress = deploymentInfo.factory;
|
|
169
|
+
const factoryDeployerAddress = deploymentInfo.deployer;
|
|
170
|
+
const factoryDeploymentData = deploymentInfo.signedTx;
|
|
171
|
+
const funding = BigInt(deploymentInfo.funding);
|
|
172
|
+
const code = await env.network.provider.request({
|
|
173
|
+
method: 'eth_getCode',
|
|
174
|
+
params: [factoryAddress, 'latest'],
|
|
175
|
+
});
|
|
176
|
+
if (code === '0x') {
|
|
177
|
+
const balanceHexString = await env.network.provider.request({
|
|
178
|
+
method: 'eth_getBalance',
|
|
179
|
+
params: [factoryDeployerAddress, 'latest'],
|
|
180
|
+
});
|
|
181
|
+
const balance = BigInt(balanceHexString);
|
|
182
|
+
if (balance < funding) {
|
|
183
|
+
const need = funding - balance;
|
|
184
|
+
const balanceToSend = `0x${need.toString(16)}` as `0x${string}`;
|
|
185
|
+
const txHash = await broadcastTransaction(env, signer, [
|
|
186
|
+
{
|
|
187
|
+
type: '0x2',
|
|
188
|
+
chainId: params.chainId,
|
|
189
|
+
from: params.address,
|
|
190
|
+
to: factoryDeployerAddress,
|
|
191
|
+
value: balanceToSend,
|
|
192
|
+
gas: `0x${BigInt(21000).toString(16)}`,
|
|
193
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
194
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
195
|
+
},
|
|
196
|
+
]);
|
|
197
|
+
await env.savePendingExecution(
|
|
198
|
+
{
|
|
199
|
+
type: 'execution', // TODO different type ?
|
|
200
|
+
transaction: {hash: txHash, origin: params.address},
|
|
201
|
+
},
|
|
202
|
+
` - Broadcasting Create 2 Factory Funding tx:\n {hash}\n {transaction}`,
|
|
203
|
+
);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
const txHash = await env.network.provider.request({
|
|
207
|
+
method: 'eth_sendRawTransaction',
|
|
208
|
+
params: [factoryDeploymentData],
|
|
209
|
+
});
|
|
210
|
+
await env.savePendingExecution(
|
|
211
|
+
{
|
|
212
|
+
type: 'execution', // TODO different type ?
|
|
213
|
+
transaction: {hash: txHash, origin: params.address},
|
|
214
|
+
},
|
|
215
|
+
` - Deploying Create 2 Factory:\n {hash}\n {transaction}`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return {
|
|
220
|
+
getExpectedAddress: ({salt, bytecode}: {salt: `0x${string}`; bytecode: `0x${string}`}): `0x${string}` =>
|
|
221
|
+
getCreate2Address({
|
|
222
|
+
bytecode,
|
|
223
|
+
from: factoryAddress,
|
|
224
|
+
salt,
|
|
225
|
+
}),
|
|
226
|
+
encodeData: ({salt, bytecode}: {salt: `0x${string}`; bytecode: `0x${string}`}): `0x${string}` =>
|
|
227
|
+
(salt + (bytecode.slice(2) || '')) as `0x${string}`,
|
|
228
|
+
factoryAddress,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function getCreate3Factory(env: Environment, signer: Signer, params: FactoryParams) {
|
|
233
|
+
const deploymentInfo =
|
|
234
|
+
'create3' in env.network.deterministicDeployment ? env.network.deterministicDeployment.create3 : undefined;
|
|
235
|
+
if (!deploymentInfo) throw new Error('create3 deterministic deployment info not found');
|
|
236
|
+
|
|
237
|
+
const factoryAddress = deploymentInfo.factory;
|
|
238
|
+
const factoryBytecode = deploymentInfo.bytecode;
|
|
239
|
+
const proxyBytecode = deploymentInfo.proxyBytecode;
|
|
240
|
+
const code = await env.network.provider.request({
|
|
241
|
+
method: 'eth_getCode',
|
|
242
|
+
params: [factoryAddress, 'latest'],
|
|
243
|
+
});
|
|
244
|
+
if (code === '0x') {
|
|
245
|
+
const create2 = await getCreate2Factory(env, signer, params);
|
|
246
|
+
const salt = deploymentInfo.salt || zeroHash;
|
|
247
|
+
const expectedAddress = create2.getExpectedAddress({salt, bytecode: factoryBytecode});
|
|
248
|
+
if (expectedAddress.toLowerCase() !== factoryAddress.toLowerCase())
|
|
249
|
+
throw new Error(`create3 factory at ${factoryAddress} is not the expected address ${expectedAddress}`);
|
|
250
|
+
|
|
251
|
+
const txHash = await broadcastTransaction(env, signer, [
|
|
252
|
+
{
|
|
253
|
+
type: '0x2',
|
|
254
|
+
chainId: params.chainId,
|
|
255
|
+
from: params.address,
|
|
256
|
+
to: create2.factoryAddress,
|
|
257
|
+
data: create2.encodeData({salt, bytecode: factoryBytecode}),
|
|
258
|
+
maxFeePerGas: params.maxFeePerGas,
|
|
259
|
+
maxPriorityFeePerGas: params.maxPriorityFeePerGas,
|
|
260
|
+
},
|
|
261
|
+
]);
|
|
262
|
+
await env.savePendingExecution(
|
|
263
|
+
{
|
|
264
|
+
type: 'execution', // TODO different type ?
|
|
265
|
+
transaction: {hash: txHash, origin: params.address},
|
|
266
|
+
},
|
|
267
|
+
` - Deploying Create 3 Factory:\n {hash}\n {transaction}`,
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
return {
|
|
272
|
+
getExpectedAddress: ({salt}: {salt: `0x${string}`}): `0x${string}` => {
|
|
273
|
+
const namespacedSalt = keccak256(encodePacked(['address', 'bytes32'], [params.address, salt]));
|
|
274
|
+
|
|
275
|
+
const proxyAddress = getCreate2Address({
|
|
276
|
+
from: factoryAddress,
|
|
277
|
+
salt: namespacedSalt,
|
|
278
|
+
bytecode: proxyBytecode,
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// This follows the RLP encoding rules for contract addresses created by CREATE
|
|
282
|
+
// prefix ++ address ++ nonce, where:
|
|
283
|
+
// prefix = 0xd6 (0xc0 + 0x16), where 0x16 is length of: 0x94 ++ address ++ 0x01
|
|
284
|
+
// 0x94 = 0x80 + 0x14 (0x14 is the length of an address)
|
|
285
|
+
const rlpEncodedData = encodePacked(
|
|
286
|
+
['bytes1', 'bytes1', 'address', 'bytes1'],
|
|
287
|
+
['0xd6', '0x94', proxyAddress, '0x01'],
|
|
288
|
+
);
|
|
289
|
+
|
|
290
|
+
return `0x${keccak256(rlpEncodedData).slice(26)}`;
|
|
291
|
+
},
|
|
292
|
+
encodeData: ({salt, bytecode}: {salt: `0x${string}`; bytecode: `0x${string}`}): `0x${string}` =>
|
|
293
|
+
encodeFunctionData({
|
|
294
|
+
abi: parseAbi(['function deployDeterministic(bytes memory,bytes32) external returns (address)']),
|
|
295
|
+
args: [bytecode, salt],
|
|
296
|
+
}),
|
|
297
|
+
factoryAddress,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export function deploy(env: Environment): <TAbi extends Abi>(
|
|
302
|
+
name: string, // '' allow to not save it
|
|
303
|
+
args: DeploymentConstruction<TAbi>,
|
|
304
|
+
options?: DeployOptions,
|
|
305
|
+
) => Promise<DeployResult<TAbi>> {
|
|
306
|
+
return async <TAbi extends Abi>(name: string, args: DeploymentConstruction<TAbi>, options?: DeployOptions) => {
|
|
307
|
+
const nameToDisplay = name || '<no name>';
|
|
308
|
+
const skipIfAlreadyDeployed = options && 'skipIfAlreadyDeployed' in options && options.skipIfAlreadyDeployed;
|
|
309
|
+
const alwaysOverride = options && 'alwaysOverride' in options && options.alwaysOverride;
|
|
310
|
+
|
|
311
|
+
if (alwaysOverride && skipIfAlreadyDeployed) {
|
|
312
|
+
throw new Error(`conflicting options: "alwaysOverride" and "skipIfAlreadyDeployed"`);
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
const existingDeployment = name && env.getOrNull(name);
|
|
316
|
+
if (existingDeployment && skipIfAlreadyDeployed) {
|
|
317
|
+
logger.info(
|
|
318
|
+
`deployment for ${nameToDisplay} at ${existingDeployment.address}, skipIfAlreadyDeployed: true => we skip`,
|
|
319
|
+
);
|
|
320
|
+
return {...(existingDeployment as Deployment<TAbi>), newlyDeployed: false};
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
const {account, artifact, ...viemArgs} = args;
|
|
324
|
+
const address = resolveAccount(account, env);
|
|
325
|
+
|
|
326
|
+
// TODO throw specific error if artifact not found
|
|
327
|
+
const artifactToUse = artifact;
|
|
328
|
+
|
|
329
|
+
const bytecode = linkLibraries(artifactToUse, options?.libraries);
|
|
330
|
+
|
|
331
|
+
const abi = artifactToUse.abi;
|
|
332
|
+
|
|
333
|
+
const argsToUse = {
|
|
334
|
+
...viemArgs,
|
|
335
|
+
account,
|
|
336
|
+
abi,
|
|
337
|
+
bytecode,
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
const calldata = encodeDeployData(argsToUse as any); // TODO any
|
|
341
|
+
const argsData = `0x${calldata.replace(bytecode, '')}` as `0x${string}`;
|
|
342
|
+
|
|
343
|
+
if (existingDeployment) {
|
|
344
|
+
logger.info(`existing deployment for ${nameToDisplay} at ${existingDeployment.address}`);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (existingDeployment && !alwaysOverride) {
|
|
348
|
+
const previousBytecode = existingDeployment.bytecode;
|
|
349
|
+
const previousArgsData = existingDeployment.argsData;
|
|
350
|
+
// we assume cbor encoding of hash at the end
|
|
351
|
+
// TODO option to remove it, can parse metadata but would rather avoid this here
|
|
352
|
+
const last2Bytes = previousBytecode.slice(-4);
|
|
353
|
+
const cborLength = parseInt(last2Bytes, 16);
|
|
354
|
+
const previousBytecodeWithoutCBOR = previousBytecode.slice(0, -cborLength * 2);
|
|
355
|
+
const newBytecodeWithoutCBOR = bytecode.slice(0, -cborLength * 2);
|
|
356
|
+
if (previousBytecodeWithoutCBOR === newBytecodeWithoutCBOR && previousArgsData === argsData) {
|
|
357
|
+
return {...(existingDeployment as Deployment<TAbi>), newlyDeployed: false};
|
|
358
|
+
} else {
|
|
359
|
+
// logger.info(`-------------- WITHOUT CBOR---------------------`);
|
|
360
|
+
// logger.info(previousBytecodeWithoutCBOR);
|
|
361
|
+
// logger.info(newBytecodeWithoutCBOR);
|
|
362
|
+
// logger.info(`-----------------------------------`);
|
|
363
|
+
// logger.info(`-------------- ARGS DATA ---------------------`);
|
|
364
|
+
// logger.info(previousArgsData);
|
|
365
|
+
// logger.info(argsData);
|
|
366
|
+
// logger.info(`-----------------------------------`);
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
const partialDeployment: PartialDeployment<TAbi> = {
|
|
371
|
+
...artifactToUse,
|
|
372
|
+
argsData,
|
|
373
|
+
linkedData: toJSONCompatibleLinkedData(options?.linkedData),
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
const signer = env.addressSigners[address];
|
|
377
|
+
|
|
378
|
+
const chainId = `0x${env.network.chain.id.toString(16)}` as `0x${string}`;
|
|
379
|
+
const maxFeePerGas = viemArgs.maxFeePerGas && (`0x${viemArgs.maxFeePerGas.toString(16)}` as `0x${string}`);
|
|
380
|
+
const maxPriorityFeePerGas =
|
|
381
|
+
viemArgs.maxPriorityFeePerGas && (`0x${viemArgs.maxPriorityFeePerGas.toString(16)}` as `0x${string}`);
|
|
382
|
+
|
|
383
|
+
const params: [EIP1193TransactionData] = [
|
|
384
|
+
{
|
|
385
|
+
type: '0x2',
|
|
386
|
+
from: address,
|
|
387
|
+
chainId,
|
|
388
|
+
data: calldata,
|
|
389
|
+
gas: viemArgs.gas && (`0x${viemArgs.gas.toString(16)}` as `0x${string}`),
|
|
390
|
+
maxFeePerGas,
|
|
391
|
+
maxPriorityFeePerGas,
|
|
392
|
+
// gasPrice: viemArgs.gasPrice && `0x${viemArgs.gasPrice.toString(16)}` as `0x${string}`,
|
|
393
|
+
// value: `0x${viemArgs.value?.toString(16)}` as `0x${string}`,
|
|
394
|
+
// nonce: viemArgs.nonce && (`0x${viemArgs.nonce.toString(16)}` as `0x${string}`),
|
|
395
|
+
},
|
|
396
|
+
];
|
|
397
|
+
|
|
398
|
+
let expectedAddress: `0x${string}` | undefined = undefined;
|
|
399
|
+
if (options?.deterministic) {
|
|
400
|
+
const [deterministicType, salt] = (() => {
|
|
401
|
+
const normalizeSalt = (salt: `0x${string}` | boolean | undefined): `0x${string}` =>
|
|
402
|
+
typeof salt === 'string' ? `0x${salt.slice(2).padStart(64, '0')}` : zeroHash;
|
|
403
|
+
if (typeof options.deterministic !== 'object')
|
|
404
|
+
return ['create2', normalizeSalt(options.deterministic)] as const;
|
|
405
|
+
if (options.deterministic.type === 'create2')
|
|
406
|
+
return ['create2', normalizeSalt(options.deterministic.salt)] as const;
|
|
407
|
+
if (options.deterministic.type === 'create3')
|
|
408
|
+
return ['create3', normalizeSalt(options.deterministic.salt)] as const;
|
|
409
|
+
throw new Error(`unknown deterministic type: ${options.deterministic.type}`);
|
|
410
|
+
})();
|
|
411
|
+
|
|
412
|
+
const bytecode = params[0].data || '0x';
|
|
413
|
+
|
|
414
|
+
const factoryParams = {chainId, address, maxFeePerGas, maxPriorityFeePerGas};
|
|
415
|
+
const create =
|
|
416
|
+
deterministicType === 'create2'
|
|
417
|
+
? await getCreate2Factory(env, signer, factoryParams)
|
|
418
|
+
: await getCreate3Factory(env, signer, factoryParams);
|
|
419
|
+
|
|
420
|
+
expectedAddress = create.getExpectedAddress({salt, bytecode});
|
|
421
|
+
|
|
422
|
+
const codeAlreadyDeployed = await env.network.provider.request({
|
|
423
|
+
method: 'eth_getCode',
|
|
424
|
+
params: [expectedAddress, 'latest'],
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
if (!codeAlreadyDeployed) {
|
|
428
|
+
throw new Error(`invalid code : ${codeAlreadyDeployed}`);
|
|
429
|
+
} else if (codeAlreadyDeployed !== '0x') {
|
|
430
|
+
if (deterministicType === 'create3' && codeAlreadyDeployed !== bytecode)
|
|
431
|
+
throw new Error(
|
|
432
|
+
`code (length: ${(codeAlreadyDeployed.length - 2) / 2}) already deployed at ${expectedAddress} but is not the expected bytecode (length: ${(bytecode.length - 2) / 2})`,
|
|
433
|
+
);
|
|
434
|
+
env.showMessage(`contract was already deterministically deployed at ${expectedAddress}`);
|
|
435
|
+
if (name) {
|
|
436
|
+
const deployment = await env.save(
|
|
437
|
+
name,
|
|
438
|
+
{
|
|
439
|
+
address: expectedAddress,
|
|
440
|
+
...partialDeployment,
|
|
441
|
+
},
|
|
442
|
+
{doNotCountAsNewDeployment: true},
|
|
443
|
+
);
|
|
444
|
+
return {...(deployment as Deployment<TAbi>), newlyDeployed: false};
|
|
445
|
+
} else {
|
|
446
|
+
return {address: expectedAddress, ...partialDeployment, newlyDeployed: false};
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
params[0].data = create.encodeData({salt, bytecode});
|
|
451
|
+
params[0].to = create.factoryAddress;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
const txHash = await broadcastTransaction(env, signer, params);
|
|
455
|
+
|
|
456
|
+
const pendingDeployment: PendingDeployment<TAbi> = {
|
|
457
|
+
type: 'deployment',
|
|
458
|
+
expectedAddress,
|
|
459
|
+
partialDeployment,
|
|
460
|
+
transaction: {hash: txHash, origin: address},
|
|
461
|
+
name,
|
|
462
|
+
// TODO we should have the nonce, except for wallet like metamask where it is not sure you get the nonce you start with
|
|
463
|
+
};
|
|
464
|
+
const deployment = await env.savePendingDeployment(
|
|
465
|
+
pendingDeployment,
|
|
466
|
+
` - Deploying {name} ${
|
|
467
|
+
options?.deterministic ? '(deterministically)' : ''
|
|
468
|
+
} with tx:\n {hash}\n {transaction}`,
|
|
469
|
+
);
|
|
470
|
+
return {...(deployment as Deployment<TAbi>), newlyDeployed: true};
|
|
471
|
+
};
|
|
472
|
+
}
|