hardhat-deploy 2.0.0-next.4 → 2.0.0-next.41

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.
Files changed (58) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +630 -1
  3. package/dist/esm/config/default.d.ts.map +1 -1
  4. package/dist/esm/config/default.js +8 -5
  5. package/dist/esm/config/default.js.map +1 -1
  6. package/dist/esm/config/get-config.d.ts.map +1 -1
  7. package/dist/esm/config/get-config.js +5 -2
  8. package/dist/esm/config/get-config.js.map +1 -1
  9. package/dist/esm/config/validation.d.ts.map +1 -1
  10. package/dist/esm/config/validation.js +12 -7
  11. package/dist/esm/config/validation.js.map +1 -1
  12. package/dist/esm/generate-types.d.ts +2 -3
  13. package/dist/esm/generate-types.d.ts.map +1 -1
  14. package/dist/esm/generate-types.js +153 -83
  15. package/dist/esm/generate-types.js.map +1 -1
  16. package/dist/esm/helpers.d.ts +12 -6
  17. package/dist/esm/helpers.d.ts.map +1 -1
  18. package/dist/esm/helpers.js +52 -24
  19. package/dist/esm/helpers.js.map +1 -1
  20. package/dist/esm/hook-handlers/config.d.ts.map +1 -1
  21. package/dist/esm/hook-handlers/config.js +53 -1
  22. package/dist/esm/hook-handlers/config.js.map +1 -1
  23. package/dist/esm/hook-handlers/solidity.d.ts.map +1 -1
  24. package/dist/esm/hook-handlers/solidity.js +13 -7
  25. package/dist/esm/hook-handlers/solidity.js.map +1 -1
  26. package/dist/esm/index.d.ts +3 -0
  27. package/dist/esm/index.d.ts.map +1 -1
  28. package/dist/esm/index.js +17 -5
  29. package/dist/esm/index.js.map +1 -1
  30. package/dist/esm/tasks/deploy.d.ts +1 -0
  31. package/dist/esm/tasks/deploy.d.ts.map +1 -1
  32. package/dist/esm/tasks/deploy.js +13 -5
  33. package/dist/esm/tasks/deploy.js.map +1 -1
  34. package/dist/esm/type-extensions.d.ts +2 -2
  35. package/dist/esm/type-extensions.d.ts.map +1 -1
  36. package/dist/esm/types.d.ts +14 -10
  37. package/dist/esm/types.d.ts.map +1 -1
  38. package/dist/esm/utils/files.d.ts +9 -0
  39. package/dist/esm/utils/files.d.ts.map +1 -0
  40. package/dist/esm/utils/files.js +25 -0
  41. package/dist/esm/utils/files.js.map +1 -0
  42. package/package.json +16 -13
  43. package/src/config/default.ts +12 -0
  44. package/src/config/get-config.ts +13 -0
  45. package/src/config/validation.ts +27 -0
  46. package/src/generate-types.ts +292 -0
  47. package/src/helpers.ts +285 -0
  48. package/src/hook-handlers/config.ts +80 -0
  49. package/src/hook-handlers/solidity.ts +33 -0
  50. package/src/index.ts +47 -0
  51. package/src/tasks/deploy.ts +35 -0
  52. package/src/type-extensions.ts +12 -0
  53. package/src/types.ts +21 -0
  54. package/src/utils/files.ts +37 -0
  55. package/dist/esm/tasks/compile.d.ts +0 -6
  56. package/dist/esm/tasks/compile.d.ts.map +0 -1
  57. package/dist/esm/tasks/compile.js +0 -254
  58. package/dist/esm/tasks/compile.js.map +0 -1
package/src/index.ts ADDED
@@ -0,0 +1,47 @@
1
+ import type {HardhatPlugin} from 'hardhat/types/plugins';
2
+ import {task} from 'hardhat/config';
3
+
4
+ import './type-extensions.js';
5
+ import {ArgumentType} from 'hardhat/types/arguments';
6
+ import {Environment} from 'rocketh';
7
+ import type {NetworkConnection} from 'hardhat/types/network';
8
+
9
+ // const deployTask = import.meta.resolve('./tasks/deploy.js').replace('.ts', '.js');
10
+ // console.log({deployTask});
11
+
12
+ const hardhatPlugin: HardhatPlugin = {
13
+ id: 'hardhat-deploy',
14
+ hookHandlers: {
15
+ config: () => import('./hook-handlers/config.js'),
16
+ solidity: () => import('./hook-handlers/solidity.js'),
17
+ },
18
+ tasks: [
19
+ task('deploy', 'Deploy contracts')
20
+ // .addFlag('skipGasReport', 'if set, skip gas report')
21
+ .addFlag({name: 'skipPrompts', description: 'if set, skip any prompts'})
22
+ .addOption({
23
+ name: 'saveDeployments',
24
+ description: 'if set, save deployments',
25
+ defaultValue: '',
26
+ type: ArgumentType.STRING,
27
+ })
28
+ .addOption({
29
+ name: 'tags',
30
+ description: 'specify which tags to deploy',
31
+ defaultValue: '',
32
+ type: ArgumentType.STRING,
33
+ })
34
+ .setAction(() => import('./tasks/deploy.js'))
35
+ .build(),
36
+ ],
37
+ npmPackage: 'hardhat-deploy',
38
+ };
39
+
40
+ export default hardhatPlugin;
41
+
42
+ export function getHardhatConnection(env: Environment): NetworkConnection<'generic'> {
43
+ if (!env.extra?.connection) {
44
+ throw new Error('Hardhat deploy connection not found in the environment');
45
+ }
46
+ return env.extra.connection as NetworkConnection<'generic'>;
47
+ }
@@ -0,0 +1,35 @@
1
+ import {NewTaskActionFunction} from 'hardhat/types/tasks';
2
+ import {loadAndExecuteDeployments} from 'rocketh';
3
+
4
+ interface RunActionArguments {
5
+ saveDeployments: string;
6
+ skipPrompts: boolean;
7
+ tags?: string;
8
+ }
9
+
10
+ const runScriptWithHardhat: NewTaskActionFunction<RunActionArguments> = async (args, hre) => {
11
+ let saveDeployments = true;
12
+ let skipPrompts = args.skipPrompts ? true : false;
13
+ const connection = await hre.network.connect();
14
+ const isMemoryNetwork = connection.networkConfig.type == 'edr-simulated';
15
+ if (isMemoryNetwork) {
16
+ skipPrompts = true;
17
+ saveDeployments = false;
18
+ }
19
+ if (args.saveDeployments != '') {
20
+ saveDeployments = args.saveDeployments == 'true' ? true : false;
21
+ }
22
+ const tags = args.tags && args.tags != '' ? args.tags : undefined;
23
+
24
+ await loadAndExecuteDeployments({
25
+ logLevel: 1,
26
+ provider: connection.provider as unknown as any, // TODO type
27
+ network: process.env.HARDHAT_FORK ? {fork: process.env.HARDHAT_FORK} : connection.networkName,
28
+ saveDeployments,
29
+ askBeforeProceeding: skipPrompts ? false : true,
30
+ tags,
31
+ // reportGasUse: args.skipGasReport ? false : true,
32
+ extra: {connection},
33
+ });
34
+ };
35
+ export default runScriptWithHardhat;
@@ -0,0 +1,12 @@
1
+ import 'hardhat/types/config';
2
+ import {ArtifactGenerationConfig, ArtifactGenerationUserConfig} from './types.js';
3
+
4
+ declare module 'hardhat/types/config' {
5
+ export interface HardhatUserConfig {
6
+ generateTypedArtifacts?: ArtifactGenerationUserConfig;
7
+ }
8
+
9
+ export interface HardhatConfig {
10
+ readonly generateTypedArtifacts: ArtifactGenerationConfig;
11
+ }
12
+ }
package/src/types.ts ADDED
@@ -0,0 +1,21 @@
1
+ export type ArtifactGenerationUserConfig = {
2
+ // externalArtifacts?: string[];
3
+ destinations?: {
4
+ js?: string[];
5
+ ts?: string[];
6
+ json?: string[];
7
+ jsm?: string[];
8
+ tsm?: string[];
9
+ };
10
+ };
11
+
12
+ export type ArtifactGenerationConfig = {
13
+ // externalArtifacts: string[];
14
+ destinations: {
15
+ js: string[];
16
+ ts: string[];
17
+ json: string[];
18
+ jsm: string[];
19
+ tsm: string[];
20
+ };
21
+ };
@@ -0,0 +1,37 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+
4
+ export type FileTraversed = {
5
+ name: string;
6
+ path: string;
7
+ relativePath: string;
8
+ mtimeMs: number;
9
+ directory: boolean;
10
+ };
11
+
12
+ export function traverse(
13
+ dir: string,
14
+ result: any[] = [],
15
+ topDir?: string,
16
+ filter?: (name: string, stats: any) => boolean // TODO any is Stats
17
+ ): Array<FileTraversed> {
18
+ fs.readdirSync(dir).forEach((name) => {
19
+ const fPath = path.resolve(dir, name);
20
+ const stats = fs.statSync(fPath);
21
+ if ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {
22
+ const fileStats = {
23
+ name,
24
+ path: fPath,
25
+ relativePath: path.relative(topDir || dir, fPath),
26
+ mtimeMs: stats.mtimeMs,
27
+ directory: stats.isDirectory(),
28
+ };
29
+ if (fileStats.directory) {
30
+ result.push(fileStats);
31
+ return traverse(fPath, result, topDir || dir, filter);
32
+ }
33
+ result.push(fileStats);
34
+ }
35
+ });
36
+ return result;
37
+ }
@@ -1,6 +0,0 @@
1
- import { NewTaskActionFunction } from 'hardhat/types/tasks';
2
- interface RunActionArguments {
3
- }
4
- declare const runScriptWithHardhat: NewTaskActionFunction<RunActionArguments>;
5
- export default runScriptWithHardhat;
6
- //# sourceMappingURL=compile.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compile.d.ts","sourceRoot":"","sources":["../../../src/tasks/compile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,qBAAqB,EAAC,MAAM,qBAAqB,CAAC;AAM1D,UAAU,kBAAkB;CAAG;AAmJ/B,QAAA,MAAM,oBAAoB,EAAE,qBAAqB,CAAC,kBAAkB,CA4InE,CAAC;AACF,eAAe,oBAAoB,CAAC"}
@@ -1,254 +0,0 @@
1
- import fs from 'node:fs';
2
- import path from 'node:path';
3
- function traverse(dir, result = [], topDir, filter // TODO any is Stats
4
- ) {
5
- fs.readdirSync(dir).forEach((name) => {
6
- const fPath = path.resolve(dir, name);
7
- const stats = fs.statSync(fPath);
8
- if ((!filter && !name.startsWith('.')) || (filter && filter(name, stats))) {
9
- const fileStats = {
10
- name,
11
- path: fPath,
12
- relativePath: path.relative(topDir || dir, fPath),
13
- mtimeMs: stats.mtimeMs,
14
- directory: stats.isDirectory(),
15
- };
16
- if (fileStats.directory) {
17
- result.push(fileStats);
18
- return traverse(fPath, result, topDir || dir, filter);
19
- }
20
- result.push(fileStats);
21
- }
22
- });
23
- return result;
24
- }
25
- function writeFiles(name, data, config) {
26
- const js = typeof config?.js === 'string' ? [config?.js] : config?.js || [];
27
- const ts = typeof config?.ts === 'string' ? [config?.ts] : config?.ts || [];
28
- const json = typeof config?.json === 'string' ? [config?.json] : config?.json || [];
29
- const jsm = typeof config?.jsm === 'string' ? [config?.jsm] : config?.jsm || [];
30
- const tsm = typeof config?.tsm === 'string' ? [config?.tsm] : config?.tsm || [];
31
- if (ts.length > 0) {
32
- const newContent = `export default ${JSON.stringify(data, null, 2)} as const;`;
33
- for (const tsFile of ts) {
34
- if (tsFile.endsWith('.ts')) {
35
- if (!name) {
36
- const filepath = tsFile;
37
- const folderPath = path.dirname(filepath);
38
- fs.mkdirSync(folderPath, { recursive: true });
39
- fs.writeFileSync(filepath, newContent);
40
- }
41
- }
42
- else {
43
- if (name) {
44
- const filepath = `${tsFile}/${name}.ts`;
45
- const folderPath = path.dirname(filepath);
46
- fs.mkdirSync(folderPath, { recursive: true });
47
- fs.writeFileSync(filepath, newContent);
48
- }
49
- }
50
- }
51
- }
52
- if (js.length > 0) {
53
- const newContent = `export default /** @type {const} **/ (${JSON.stringify(data, null, 2)});`;
54
- // const dtsContent = `export = ${JSON.stringify(data, null, 2)} as const;`;
55
- const dtsContent = `declare const _default: ${JSON.stringify(data, null, 2)};export default _default;`;
56
- // const dtsContent = `declare const _default: ${JSON.stringify(data, null, 2)};export = _default;`;
57
- const cjsContent = `module.exports = /** @type {const} **/ (${JSON.stringify(data, null, 2)});`;
58
- for (const jsFile of js) {
59
- if (jsFile.endsWith('.js')) {
60
- if (!name) {
61
- const filepath = jsFile;
62
- const folderPath = path.dirname(filepath);
63
- fs.mkdirSync(folderPath, { recursive: true });
64
- fs.writeFileSync(filepath, newContent);
65
- fs.writeFileSync(filepath.replace(/\.js$/, '.d.ts'), dtsContent);
66
- fs.writeFileSync(filepath.replace(/\.js$/, '.cjs'), cjsContent);
67
- }
68
- }
69
- else {
70
- if (name) {
71
- const filepath = `${jsFile}/${name}.js`;
72
- const folderPath = path.dirname(filepath);
73
- fs.mkdirSync(folderPath, { recursive: true });
74
- fs.writeFileSync(filepath, newContent);
75
- fs.writeFileSync(filepath.replace(/\.js$/, '.d.ts'), dtsContent);
76
- fs.writeFileSync(filepath.replace(/\.js$/, '.cjs'), cjsContent);
77
- }
78
- }
79
- }
80
- }
81
- if (json.length > 0) {
82
- const newContent = JSON.stringify(data, null, 2);
83
- for (const jsonFile of json) {
84
- if (jsonFile.endsWith('.json')) {
85
- if (!name) {
86
- const filepath = jsonFile;
87
- const folderPath = path.dirname(filepath);
88
- fs.mkdirSync(folderPath, { recursive: true });
89
- fs.writeFileSync(filepath, newContent);
90
- }
91
- }
92
- else {
93
- if (name) {
94
- const filepath = `${jsonFile}/${name}.json`;
95
- const folderPath = path.dirname(filepath);
96
- fs.mkdirSync(folderPath, { recursive: true });
97
- fs.writeFileSync(filepath, newContent);
98
- }
99
- }
100
- }
101
- }
102
- if (!name) {
103
- if (tsm.length > 0) {
104
- let newContent = '';
105
- for (const key of Object.keys(data)) {
106
- newContent += `export const ${key} = ${JSON.stringify(data[key], null, 2)} as const;`;
107
- }
108
- for (const tsFile of tsm) {
109
- const filepath = tsFile;
110
- const folderPath = path.dirname(filepath);
111
- fs.mkdirSync(folderPath, { recursive: true });
112
- fs.writeFileSync(filepath, newContent);
113
- }
114
- }
115
- if (jsm.length > 0) {
116
- let newContent = '';
117
- for (const key of Object.keys(data)) {
118
- newContent += `export const ${key} = /** @type {const} **/ (${JSON.stringify(data[key], null, 2)});`;
119
- }
120
- for (const jsFile of jsm) {
121
- const filepath = jsFile;
122
- const folderPath = path.dirname(filepath);
123
- fs.mkdirSync(folderPath, { recursive: true });
124
- fs.writeFileSync(filepath, newContent);
125
- }
126
- }
127
- }
128
- }
129
- // TODO add docgen command ?
130
- // task("docgen").setAction(async (args, hre, runSuper): Promise<any> => {
131
- const runScriptWithHardhat = async (args, hre) => {
132
- // let previousArtifacts: {[name: string]: any} = {};
133
- // try {
134
- // previousArtifacts = JSON.parse(fs.readFileSync('./generated/_artifacts.json', 'utf-8'));
135
- // } catch {}
136
- // const allArtifacts: {[name: string]: any} = previousArtifacts;
137
- const allArtifacts = {};
138
- const shortNameDict = {};
139
- // for (const key of Object.keys(allArtifacts)) {
140
- // if (!key.indexOf('/')) {
141
- // shortNameDict[key] = true;
142
- // }
143
- // }
144
- const compilationResult = await hre.tasks.getTask('compile').run();
145
- console.log(compilationResult);
146
- // for (const artifact of artifactResult.artifactsEmittedPerFile) {
147
- // const filepath = `./artifacts/${artifact.file.sourceName}/${artifact.artifactsEmitted[0]}.json`;
148
- // if (fs.existsSync(filepath)) {
149
- // for (let i = 0; i < artifact.artifactsEmitted.length; i++) {
150
- // const shortName = artifact.artifactsEmitted[i];
151
- // const content = fs.readFileSync(filepath, 'utf-8');
152
- // const parsed = JSON.parse(content);
153
- // const debugFilepath = filepath.replace('.json', '.dbg.json');
154
- // const debugContent = fs.readFileSync(debugFilepath, 'utf-8');
155
- // const parsedDebug: {_format: string; buildInfo: string} = JSON.parse(debugContent);
156
- // const buildInfoFilepath = path.join(path.dirname(path.resolve(debugFilepath)), parsedDebug.buildInfo);
157
- // const buildInfoContent = fs.readFileSync(buildInfoFilepath, 'utf-8');
158
- // const parsedBuildInfo = JSON.parse(buildInfoContent);
159
- // const solidityOutput = parsedBuildInfo.output.contracts[artifact.file.sourceName][shortName];
160
- // const artifactObject = {...parsed, ...solidityOutput};
161
- // const fullName = `${artifact.file.sourceName}/${shortName}`;
162
- // allArtifacts[fullName] = artifactObject;
163
- // if (shortNameDict[shortName]) {
164
- // delete allArtifacts[shortName];
165
- // } else {
166
- // allArtifacts[shortName] = artifactObject;
167
- // shortNameDict[shortName] = true;
168
- // }
169
- // }
170
- // } else {
171
- // // this can happen for solidity file without contract exported, just error or types for example
172
- // // throw new Error(`no artifact at ${filepath}`);
173
- // }
174
- // }
175
- console.log(...hre.config.paths.sources.solidity);
176
- // const generationConfig = hre.config.generateArtifacts;
177
- const generationConfig = {
178
- ts: ['./generated/artifacts.ts'],
179
- js: [],
180
- json: [],
181
- tsm: [],
182
- jsm: [],
183
- directories: [...hre.config.paths.sources.solidity],
184
- };
185
- const files = [];
186
- const directories = generationConfig.directories.map((dir) => path.relative('.', dir));
187
- console.log({ directories });
188
- for (const directory of directories) {
189
- const filesToAdd = traverse(`./artifacts/${directory}`, [], './artifacts', (name) => name != 'build-info');
190
- files.push(...filesToAdd);
191
- }
192
- for (const file of files) {
193
- if (file.directory || !file.path.endsWith('.json')) {
194
- continue;
195
- }
196
- const filename = path.basename(file.path);
197
- const dirname = path.dirname(file.relativePath);
198
- // const namePath = dirname.replace('.sol', '');
199
- const contractName = filename.replace('.json', '');
200
- // const shortName = artifact.artifactsEmitted[i];
201
- console.log({ path: file.path });
202
- const content = fs.readFileSync(file.path, 'utf-8');
203
- const parsed = JSON.parse(content);
204
- // TODO read config for artifacts folder
205
- const buildInfoFilepath = path.join('artifacts', 'build-info', `${parsed.buildInfoId}.output.json`);
206
- console.log({ buildInfoFilepath });
207
- const backupBuildInfoFilepath = path.join('./generated', buildInfoFilepath.slice(buildInfoFilepath.indexOf('/', 1)));
208
- let buildInfoFilepathToUse = buildInfoFilepath;
209
- if (!fs.existsSync(buildInfoFilepathToUse)) {
210
- buildInfoFilepathToUse = backupBuildInfoFilepath;
211
- }
212
- if (fs.existsSync(buildInfoFilepathToUse)) {
213
- const buildInfoContent = fs.readFileSync(buildInfoFilepathToUse, 'utf-8');
214
- if (buildInfoFilepathToUse !== backupBuildInfoFilepath) {
215
- fs.mkdirSync(path.dirname(backupBuildInfoFilepath), { recursive: true });
216
- fs.writeFileSync(backupBuildInfoFilepath, buildInfoContent);
217
- }
218
- const parsedBuildInfo = JSON.parse(buildInfoContent);
219
- const solidityOutput = parsedBuildInfo.output.contracts[dirname][contractName];
220
- const artifactObject = { ...parsed, ...solidityOutput };
221
- const fullName = `${dirname}/${contractName}`;
222
- allArtifacts[fullName] = artifactObject;
223
- if (shortNameDict[contractName]) {
224
- delete allArtifacts[contractName];
225
- }
226
- else {
227
- allArtifacts[contractName] = artifactObject;
228
- shortNameDict[contractName] = true;
229
- }
230
- }
231
- }
232
- for (const key of Object.keys(allArtifacts)) {
233
- if (key.indexOf('/') >= 0) {
234
- const split = key.split('/');
235
- if (split.length > 1) {
236
- const shortName = split[split.length - 1];
237
- if (allArtifacts[shortName]) {
238
- delete allArtifacts[key];
239
- }
240
- }
241
- }
242
- }
243
- for (const key of Object.keys(allArtifacts)) {
244
- const artifact = allArtifacts[key];
245
- writeFiles(key, artifact, generationConfig);
246
- }
247
- // const json = hre.config.generateArtifacts.json || [];
248
- // json.push('./generated/_artifacts.json');
249
- // writeFiles(undefined, allArtifacts, {...hre.config.generateArtifacts, json: json});
250
- writeFiles(undefined, allArtifacts, generationConfig);
251
- return compilationResult;
252
- };
253
- export default runScriptWithHardhat;
254
- //# sourceMappingURL=compile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../../src/tasks/compile.ts"],"names":[],"mappings":"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"}