@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.
- package/dist/esm/index.d.ts +38 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +374 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/index.cjs +0 -1
- package/dist/index.mjs +0 -1
- package/package.json +12 -14
- package/.prettierignore +0 -3
- package/.prettierrc +0 -7
- package/CHANGELOG.md +0 -59
- package/src/index.ts +0 -606
- package/tsconfig.json +0 -15
|
@@ -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
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,41 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rocketh/deploy",
|
|
3
|
-
"version": "0.10.
|
|
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
|
-
"
|
|
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.
|
|
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.
|
|
26
|
+
"rocketh": "0.10.16"
|
|
29
27
|
},
|
|
30
28
|
"peerDependencies": {
|
|
31
|
-
"rocketh": "0.10.
|
|
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": "
|
|
39
|
-
"dev": "
|
|
36
|
+
"build": "tsc --project tsconfig.json",
|
|
37
|
+
"dev": "as-soon -w src pnpm build"
|
|
40
38
|
}
|
|
41
39
|
}
|
package/.prettierignore
DELETED
package/.prettierrc
DELETED
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
|
-
}
|