@nomicfoundation/hardhat-viem 2.0.6 → 3.0.0-next.1

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 (95) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +4 -16
  3. package/README.md +35 -247
  4. package/dist/src/index.d.ts +5 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/src/index.js +10 -0
  7. package/dist/src/index.js.map +1 -0
  8. package/dist/src/internal/accounts.d.ts +4 -0
  9. package/dist/src/internal/accounts.d.ts.map +1 -0
  10. package/dist/src/internal/accounts.js +15 -0
  11. package/dist/src/internal/accounts.js.map +1 -0
  12. package/dist/src/internal/chains.d.ts +11 -0
  13. package/dist/src/internal/chains.d.ts.map +1 -0
  14. package/dist/src/internal/chains.js +116 -0
  15. package/dist/src/internal/chains.js.map +1 -0
  16. package/dist/src/internal/clients.d.ts +10 -0
  17. package/dist/src/internal/clients.d.ts.map +1 -0
  18. package/dist/src/internal/clients.js +91 -0
  19. package/dist/src/internal/clients.js.map +1 -0
  20. package/dist/src/internal/contracts.d.ts +11 -0
  21. package/dist/src/internal/contracts.d.ts.map +1 -0
  22. package/dist/src/internal/contracts.js +141 -0
  23. package/dist/src/internal/contracts.js.map +1 -0
  24. package/dist/src/internal/hook-handlers/network.d.ts +4 -0
  25. package/dist/src/internal/hook-handlers/network.d.ts.map +1 -0
  26. package/dist/src/internal/hook-handlers/network.js +12 -0
  27. package/dist/src/internal/hook-handlers/network.js.map +1 -0
  28. package/dist/src/internal/initialization.d.ts +6 -0
  29. package/dist/src/internal/initialization.d.ts.map +1 -0
  30. package/dist/src/internal/initialization.js +14 -0
  31. package/dist/src/internal/initialization.js.map +1 -0
  32. package/dist/src/type-extensions.d.ts +8 -0
  33. package/dist/src/type-extensions.d.ts.map +1 -0
  34. package/dist/src/type-extensions.js +2 -0
  35. package/dist/src/type-extensions.js.map +1 -0
  36. package/dist/src/types.d.ts +166 -0
  37. package/dist/src/types.d.ts.map +1 -0
  38. package/dist/src/types.js +2 -0
  39. package/dist/src/types.js.map +1 -0
  40. package/package.json +46 -51
  41. package/src/index.ts +10 -39
  42. package/src/internal/accounts.ts +20 -7
  43. package/src/internal/chains.ts +122 -62
  44. package/src/internal/clients.ts +135 -141
  45. package/src/internal/contracts.ts +126 -150
  46. package/src/internal/hook-handlers/network.ts +27 -0
  47. package/src/internal/initialization.ts +67 -0
  48. package/src/type-extensions.ts +10 -0
  49. package/src/types.ts +237 -72
  50. package/.eslintrc.js +0 -24
  51. package/index.d.ts +0 -3
  52. package/index.d.ts.map +0 -1
  53. package/index.js +0 -20
  54. package/index.js.map +0 -1
  55. package/internal/accounts.d.ts +0 -5
  56. package/internal/accounts.d.ts.map +0 -1
  57. package/internal/accounts.js +0 -9
  58. package/internal/accounts.js.map +0 -1
  59. package/internal/bytecode.d.ts +0 -13
  60. package/internal/bytecode.d.ts.map +0 -1
  61. package/internal/bytecode.js +0 -94
  62. package/internal/bytecode.js.map +0 -1
  63. package/internal/chains.d.ts +0 -7
  64. package/internal/chains.d.ts.map +0 -1
  65. package/internal/chains.js +0 -80
  66. package/internal/chains.js.map +0 -1
  67. package/internal/clients.d.ts +0 -45
  68. package/internal/clients.d.ts.map +0 -1
  69. package/internal/clients.js +0 -136
  70. package/internal/clients.js.map +0 -1
  71. package/internal/contracts.d.ts +0 -11
  72. package/internal/contracts.d.ts.map +0 -1
  73. package/internal/contracts.js +0 -164
  74. package/internal/contracts.js.map +0 -1
  75. package/internal/errors.d.ts +0 -36
  76. package/internal/errors.d.ts.map +0 -1
  77. package/internal/errors.js +0 -102
  78. package/internal/errors.js.map +0 -1
  79. package/internal/tasks.d.ts +0 -2
  80. package/internal/tasks.d.ts.map +0 -1
  81. package/internal/tasks.js +0 -240
  82. package/internal/tasks.js.map +0 -1
  83. package/internal/type-extensions.d.ts +0 -19
  84. package/internal/type-extensions.d.ts.map +0 -1
  85. package/internal/type-extensions.js +0 -5
  86. package/internal/type-extensions.js.map +0 -1
  87. package/src/internal/bytecode.ts +0 -138
  88. package/src/internal/errors.ts +0 -125
  89. package/src/internal/tasks.ts +0 -341
  90. package/src/internal/type-extensions.ts +0 -27
  91. package/src/tsconfig.json +0 -15
  92. package/types.d.ts +0 -52
  93. package/types.d.ts.map +0 -1
  94. package/types.js +0 -3
  95. package/types.js.map +0 -1
package/internal/tasks.js DELETED
@@ -1,240 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const path_1 = require("path");
4
- const promises_1 = require("fs/promises");
5
- const config_1 = require("hardhat/config");
6
- const task_names_1 = require("hardhat/builtin-tasks/task-names");
7
- const contract_names_1 = require("hardhat/utils/contract-names");
8
- const fs_utils_1 = require("hardhat/internal/util/fs-utils");
9
- const source_names_1 = require("hardhat/utils/source-names");
10
- /**
11
- * Override task that generates an `artifacts.d.ts` file with `never`
12
- * types for duplicate contract names. This file is used in conjunction with
13
- * the `artifacts.d.ts` file inside each contract directory to type
14
- * `hre.artifacts`.
15
- */
16
- (0, config_1.subtask)(task_names_1.TASK_COMPILE_SOLIDITY).setAction(async (_, { config, artifacts }, runSuper) => {
17
- const superRes = await runSuper();
18
- const duplicateContractNames = await findDuplicateContractNames(artifacts);
19
- const duplicateArtifactsDTs = generateDuplicateArtifactsDefinition(duplicateContractNames);
20
- try {
21
- await (0, promises_1.writeFile)((0, path_1.join)(config.paths.artifacts, "artifacts.d.ts"), duplicateArtifactsDTs);
22
- }
23
- catch (error) {
24
- console.error("Error writing artifacts definition:", error);
25
- }
26
- return superRes;
27
- });
28
- /**
29
- * Override task to emit TypeScript and definition files for each contract.
30
- * Generates a `.d.ts` file per contract, and a `artifacts.d.ts` per solidity
31
- * file, which is used in conjunction to the root `artifacts.d.ts`
32
- * to type `hre.artifacts`.
33
- */
34
- (0, config_1.subtask)(task_names_1.TASK_COMPILE_SOLIDITY_EMIT_ARTIFACTS).setAction(async (_, { artifacts, config }, runSuper) => {
35
- const { artifactsEmittedPerFile } = await runSuper();
36
- const duplicateContractNames = await findDuplicateContractNames(artifacts);
37
- await Promise.all(artifactsEmittedPerFile.map(async ({ file, artifactsEmitted }) => {
38
- const srcDir = (0, path_1.join)(config.paths.artifacts, file.sourceName);
39
- await (0, promises_1.mkdir)(srcDir, {
40
- recursive: true,
41
- });
42
- const contractTypeData = await Promise.all(artifactsEmitted.map(async (contractName) => {
43
- const fqn = (0, contract_names_1.getFullyQualifiedName)(file.sourceName, contractName);
44
- const artifact = await artifacts.readArtifact(fqn);
45
- const isDuplicate = duplicateContractNames.has(contractName);
46
- const declaration = generateContractDeclaration(artifact, isDuplicate);
47
- const typeName = `${contractName}$Type`;
48
- return { contractName, fqn, typeName, declaration };
49
- }));
50
- const fp = [];
51
- for (const { contractName, declaration } of contractTypeData) {
52
- fp.push((0, promises_1.writeFile)((0, path_1.join)(srcDir, `${contractName}.d.ts`), declaration));
53
- }
54
- const dTs = generateArtifactsDefinition(contractTypeData);
55
- fp.push((0, promises_1.writeFile)((0, path_1.join)(srcDir, "artifacts.d.ts"), dTs));
56
- try {
57
- await Promise.all(fp);
58
- }
59
- catch (error) {
60
- console.error("Error writing artifacts definition:", error);
61
- }
62
- }));
63
- return { artifactsEmittedPerFile };
64
- });
65
- /**
66
- * Override task for cleaning up outdated artifacts.
67
- * Deletes directories with stale `artifacts.d.ts` files that no longer have
68
- * a matching `.sol` file.
69
- */
70
- (0, config_1.subtask)(task_names_1.TASK_COMPILE_REMOVE_OBSOLETE_ARTIFACTS).setAction(async (_, { config, artifacts }, runSuper) => {
71
- const superRes = await runSuper();
72
- const fqns = await artifacts.getAllFullyQualifiedNames();
73
- const existingSourceNames = new Set(fqns.map((fqn) => (0, contract_names_1.parseFullyQualifiedName)(fqn).sourceName));
74
- const allArtifactsDTs = await (0, fs_utils_1.getAllFilesMatching)(config.paths.artifacts, (f) => f.endsWith("artifacts.d.ts"));
75
- for (const artifactDTs of allArtifactsDTs) {
76
- const dir = (0, path_1.dirname)(artifactDTs);
77
- const sourceName = (0, source_names_1.replaceBackslashes)((0, path_1.relative)(config.paths.artifacts, dir));
78
- // If sourceName is empty, it means that the artifacts.d.ts file is in the
79
- // root of the artifacts directory, and we shouldn't delete it.
80
- if (sourceName === "") {
81
- continue;
82
- }
83
- if (!existingSourceNames.has(sourceName)) {
84
- await (0, promises_1.rm)(dir, { force: true, recursive: true });
85
- }
86
- }
87
- return superRes;
88
- });
89
- const AUTOGENERATED_FILE_PREFACE = `// This file was autogenerated by hardhat-viem, do not edit it.
90
- // prettier-ignore
91
- // tslint:disable
92
- // eslint-disable`;
93
- /**
94
- * Generates TypeScript code that extends the `ArtifactsMap` with `never` types
95
- * for duplicate contract names.
96
- */
97
- function generateDuplicateArtifactsDefinition(duplicateContractNames) {
98
- return `${AUTOGENERATED_FILE_PREFACE}
99
-
100
- import "hardhat/types/artifacts";
101
-
102
- declare module "hardhat/types/artifacts" {
103
- interface ArtifactsMap {
104
- ${Array.from(duplicateContractNames)
105
- .map((name) => `${name}: never;`)
106
- .join("\n ")}
107
- }
108
-
109
- interface ContractTypesMap {
110
- ${Array.from(duplicateContractNames)
111
- .map((name) => `${name}: never;`)
112
- .join("\n ")}
113
- }
114
- }
115
- `;
116
- }
117
- /**
118
- * Generates TypeScript code to declare a contract and its associated
119
- * TypeScript types.
120
- */
121
- function generateContractDeclaration(artifact, isDuplicate) {
122
- const { contractName, sourceName } = artifact;
123
- const fqn = (0, contract_names_1.getFullyQualifiedName)(sourceName, contractName);
124
- const validNames = isDuplicate ? [fqn] : [contractName, fqn];
125
- const json = JSON.stringify(artifact, undefined, 2);
126
- const contractTypeName = `${contractName}$Type`;
127
- const constructorAbi = artifact.abi.find(({ type }) => type === "constructor");
128
- const inputs = constructorAbi !== undefined ? constructorAbi.inputs : [];
129
- const constructorArgs = inputs.length > 0
130
- ? `constructorArgs: [${inputs
131
- .map(({ name, type }) => getArgType(name, type))
132
- .join(", ")}]`
133
- : `constructorArgs?: []`;
134
- return `${AUTOGENERATED_FILE_PREFACE}
135
-
136
- import type { Address } from "viem";
137
- ${inputs.length > 0
138
- ? `import type { AbiParameterToPrimitiveType, GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";`
139
- : `import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";`}
140
- import "@nomicfoundation/hardhat-viem/types";
141
-
142
- export interface ${contractTypeName} ${json}
143
-
144
- declare module "@nomicfoundation/hardhat-viem/types" {
145
- ${validNames
146
- .map((name) => `export function deployContract(
147
- contractName: "${name}",
148
- ${constructorArgs},
149
- config?: DeployContractConfig
150
- ): Promise<GetContractReturnType<${contractTypeName}["abi"]>>;`)
151
- .join("\n ")}
152
-
153
- ${validNames
154
- .map((name) => `export function sendDeploymentTransaction(
155
- contractName: "${name}",
156
- ${constructorArgs},
157
- config?: SendDeploymentTransactionConfig
158
- ): Promise<{
159
- contract: GetContractReturnType<${contractTypeName}["abi"]>;
160
- deploymentTransaction: GetTransactionReturnType;
161
- }>;`)
162
- .join("\n ")}
163
-
164
- ${validNames
165
- .map((name) => `export function getContractAt(
166
- contractName: "${name}",
167
- address: Address,
168
- config?: GetContractAtConfig
169
- ): Promise<GetContractReturnType<${contractTypeName}["abi"]>>;`)
170
- .join("\n ")}
171
- }
172
- `;
173
- }
174
- /**
175
- * Generates TypeScript code to extend the `ArtifactsMap` interface with
176
- * contract types.
177
- */
178
- function generateArtifactsDefinition(contractTypeData) {
179
- return `${AUTOGENERATED_FILE_PREFACE}
180
-
181
- import "hardhat/types/artifacts";
182
- import type { GetContractReturnType } from "@nomicfoundation/hardhat-viem/types";
183
-
184
- ${contractTypeData
185
- .map((ctd) => `import { ${ctd.typeName} } from "./${ctd.contractName}";`)
186
- .join("\n")}
187
-
188
- declare module "hardhat/types/artifacts" {
189
- interface ArtifactsMap {
190
- ${contractTypeData
191
- .map((ctd) => `["${ctd.contractName}"]: ${ctd.typeName};`)
192
- .join("\n ")}
193
- ${contractTypeData
194
- .map((ctd) => `["${ctd.fqn}"]: ${ctd.typeName};`)
195
- .join("\n ")}
196
- }
197
-
198
- interface ContractTypesMap {
199
- ${contractTypeData
200
- .map((ctd) => `["${ctd.contractName}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`)
201
- .join("\n ")}
202
- ${contractTypeData
203
- .map((ctd) => `["${ctd.fqn}"]: GetContractReturnType<${ctd.typeName}["abi"]>;`)
204
- .join("\n ")}
205
- }
206
- }
207
- `;
208
- }
209
- /**
210
- * Returns the type of a function argument in one of the following formats:
211
- * - If the 'name' is provided:
212
- * "name: AbiParameterToPrimitiveType<{ name: string; type: string; }>"
213
- *
214
- * - If the 'name' is empty:
215
- * "AbiParameterToPrimitiveType<{ name: string; type: string; }>"
216
- */
217
- function getArgType(name, type) {
218
- const argType = `AbiParameterToPrimitiveType<${JSON.stringify({
219
- name,
220
- type,
221
- })}>`;
222
- return name !== "" && name !== undefined ? `${name}: ${argType}` : argType;
223
- }
224
- /**
225
- * Returns a set of duplicate contract names.
226
- */
227
- async function findDuplicateContractNames(artifacts) {
228
- const fqns = await artifacts.getAllFullyQualifiedNames();
229
- const contractNames = fqns.map((fqn) => (0, contract_names_1.parseFullyQualifiedName)(fqn).contractName);
230
- const duplicates = new Set();
231
- const existing = new Set();
232
- for (const name of contractNames) {
233
- if (existing.has(name)) {
234
- duplicates.add(name);
235
- }
236
- existing.add(name);
237
- }
238
- return duplicates;
239
- }
240
- //# sourceMappingURL=tasks.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../src/internal/tasks.ts"],"names":[],"mappings":"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"}
@@ -1,19 +0,0 @@
1
- import type { HardhatViemHelpers } from "../types";
2
- import "hardhat/types/runtime";
3
- import "hardhat/types/artifacts";
4
- declare module "hardhat/types/runtime" {
5
- interface HardhatRuntimeEnvironment {
6
- viem: HardhatViemHelpers;
7
- }
8
- }
9
- declare module "hardhat/types/artifacts" {
10
- interface ArtifactsMap {
11
- }
12
- interface ContractTypesMap {
13
- }
14
- interface Artifacts {
15
- readArtifact<ArgT extends keyof ArtifactsMap>(contractNameOrFullyQualifiedName: ArgT): Promise<ArtifactsMap[ArgT]>;
16
- readArtifactSync<ArgT extends keyof ArtifactsMap>(contractNameOrFullyQualifiedName: ArgT): ArtifactsMap[ArgT];
17
- }
18
- }
19
- //# sourceMappingURL=type-extensions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-extensions.d.ts","sourceRoot":"","sources":["../src/internal/type-extensions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,uBAAuB,CAAC;AAC/B,OAAO,yBAAyB,CAAC;AAEjC,OAAO,QAAQ,uBAAuB,CAAC;IACrC,UAAU,yBAAyB;QACjC,IAAI,EAAE,kBAAkB,CAAC;KAC1B;CACF;AAED,OAAO,QAAQ,yBAAyB,CAAC;IAEvC,UAAU,YAAY;KAAG;IAGzB,UAAU,gBAAgB;KAAG;IAE7B,UAAU,SAAS;QACjB,YAAY,CAAC,IAAI,SAAS,MAAM,YAAY,EAC1C,gCAAgC,EAAE,IAAI,GACrC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAE/B,gBAAgB,CAAC,IAAI,SAAS,MAAM,YAAY,EAC9C,gCAAgC,EAAE,IAAI,GACrC,YAAY,CAAC,IAAI,CAAC,CAAC;KACvB;CACF"}
@@ -1,5 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- require("hardhat/types/runtime");
4
- require("hardhat/types/artifacts");
5
- //# sourceMappingURL=type-extensions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"type-extensions.js","sourceRoot":"","sources":["../src/internal/type-extensions.ts"],"names":[],"mappings":";;AACA,iCAA+B;AAC/B,mCAAiC"}
@@ -1,138 +0,0 @@
1
- import type * as viemT from "viem";
2
- import type { Artifact } from "hardhat/types/artifacts";
3
-
4
- import {
5
- AmbigousLibraryNameError,
6
- MissingLibraryAddressError,
7
- OverlappingLibraryNamesError,
8
- UnnecessaryLibraryLinkError,
9
- } from "./errors";
10
-
11
- export interface Libraries<Address = string> {
12
- [libraryName: string]: Address;
13
- }
14
-
15
- export interface Link {
16
- sourceName: string;
17
- libraryName: string;
18
- address: string;
19
- }
20
-
21
- export async function linkBytecode(
22
- artifact: Artifact,
23
- libraries: Link[]
24
- ): Promise<viemT.Hex> {
25
- const { isHex } = await import("viem");
26
- let bytecode = artifact.bytecode;
27
-
28
- // TODO: measure performance impact
29
- for (const { sourceName, libraryName, address } of libraries) {
30
- const linkReferences = artifact.linkReferences[sourceName][libraryName];
31
- for (const { start, length } of linkReferences) {
32
- bytecode =
33
- bytecode.substring(0, 2 + start * 2) +
34
- address.substring(2) +
35
- bytecode.substring(2 + (start + length) * 2);
36
- }
37
- }
38
-
39
- return isHex(bytecode) ? bytecode : `0x${bytecode}`;
40
- }
41
-
42
- async function throwOnAmbigousLibraryNameOrUnnecessaryLink(
43
- contractName: string,
44
- libraries: Libraries<viemT.Address>,
45
- neededLibraries: Link[]
46
- ) {
47
- for (const linkedLibraryName of Object.keys(libraries)) {
48
- const matchingLibraries = neededLibraries.filter(
49
- ({ sourceName, libraryName }) =>
50
- libraryName === linkedLibraryName ||
51
- `${sourceName}:${libraryName}` === linkedLibraryName
52
- );
53
-
54
- if (matchingLibraries.length > 1) {
55
- throw new AmbigousLibraryNameError(
56
- contractName,
57
- linkedLibraryName,
58
- matchingLibraries.map(
59
- ({ sourceName, libraryName }) => `${sourceName}:${libraryName}`
60
- )
61
- );
62
- } else if (matchingLibraries.length === 0) {
63
- throw new UnnecessaryLibraryLinkError(contractName, linkedLibraryName);
64
- }
65
- }
66
- }
67
-
68
- async function throwOnMissingLibrariesAddress(
69
- contractName: string,
70
- libraries: Libraries<viemT.Address>,
71
- neededLibraries: Link[]
72
- ) {
73
- const missingLibraries = [];
74
- for (const { sourceName, libraryName } of neededLibraries) {
75
- const address =
76
- libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName];
77
-
78
- if (address === undefined) {
79
- missingLibraries.push({ sourceName, libraryName });
80
- }
81
- }
82
-
83
- if (missingLibraries.length > 0) {
84
- throw new MissingLibraryAddressError(contractName, missingLibraries);
85
- }
86
- }
87
-
88
- async function throwOnOverlappingLibraryNames(
89
- contractName: string,
90
- libraries: Libraries<viemT.Address>,
91
- neededLibraries: Link[]
92
- ) {
93
- for (const { sourceName, libraryName } of neededLibraries) {
94
- if (
95
- libraries[`${sourceName}:${libraryName}`] !== undefined &&
96
- libraries[libraryName] !== undefined
97
- ) {
98
- throw new OverlappingLibraryNamesError(sourceName, libraryName);
99
- }
100
- }
101
- }
102
-
103
- export async function resolveBytecodeWithLinkedLibraries(
104
- artifact: Artifact,
105
- libraries: Libraries<viemT.Address>
106
- ): Promise<viemT.Hex> {
107
- const { linkReferences } = artifact;
108
-
109
- const neededLibraries: Link[] = [];
110
- for (const [sourceName, sourceLibraries] of Object.entries(linkReferences)) {
111
- for (const libraryName of Object.keys(sourceLibraries)) {
112
- neededLibraries.push({
113
- sourceName,
114
- libraryName,
115
- address:
116
- libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName],
117
- });
118
- }
119
- }
120
-
121
- await throwOnAmbigousLibraryNameOrUnnecessaryLink(
122
- artifact.contractName,
123
- libraries,
124
- neededLibraries
125
- );
126
- await throwOnOverlappingLibraryNames(
127
- artifact.contractName,
128
- libraries,
129
- neededLibraries
130
- );
131
- await throwOnMissingLibrariesAddress(
132
- artifact.contractName,
133
- libraries,
134
- neededLibraries
135
- );
136
-
137
- return linkBytecode(artifact, neededLibraries);
138
- }
@@ -1,125 +0,0 @@
1
- import type { Link } from "./bytecode";
2
-
3
- import { NomicLabsHardhatPluginError } from "hardhat/plugins";
4
-
5
- export class HardhatViemError extends NomicLabsHardhatPluginError {
6
- constructor(message: string, parent?: Error) {
7
- super("@nomicfoundation/hardhat-viem", message, parent);
8
- }
9
- }
10
-
11
- export class UnknownDevelopmentNetworkError extends HardhatViemError {
12
- constructor() {
13
- super(`The chain id corresponds to a development network but we couldn't detect which one.
14
- Please report this issue if you're using Hardhat or Foundry.`);
15
- }
16
- }
17
-
18
- export class NetworkNotFoundError extends HardhatViemError {
19
- constructor(chainId: number) {
20
- super(
21
- `No network with chain id ${chainId} found. You can override the chain by passing it as a parameter to the client getter:
22
-
23
- import { someChain } from "viem/chains";
24
- const client = await hre.viem.getPublicClient({
25
- chain: someChain,
26
- ...
27
- });
28
-
29
- You can find a list of supported networks here: https://github.com/wevm/viem/blob/main/src/chains/index.ts`
30
- );
31
- }
32
- }
33
-
34
- export class MultipleMatchingNetworksError extends HardhatViemError {
35
- constructor(chainId: number) {
36
- super(
37
- `Multiple networks with chain id ${chainId} found. You can override the chain by passing it as a parameter to the client getter:
38
-
39
- import { someChain } from "viem/chains";
40
- const client = await hre.viem.getPublicClient({
41
- chain: someChain,
42
- ...
43
- });
44
-
45
- You can find a list of supported networks here: https://github.com/wevm/viem/blob/main/src/chains/index.ts`
46
- );
47
- }
48
- }
49
-
50
- export class DefaultWalletClientNotFoundError extends HardhatViemError {
51
- constructor(networkName: string) {
52
- super(
53
- `Default wallet client not found. This can happen if no accounts were configured for this network (network: '${networkName}').
54
-
55
- Alternatively, you can set a custom wallet client by passing it as a parameter in the deployContract function:
56
-
57
- const walletClient = await hre.viem.getWalletClient(address);
58
- const contractA = await hre.viem.deployContract("A", [], { walletClient });
59
- const contractB = await hre.viem.getContractAt("B", address, { walletClient });`
60
- );
61
- }
62
- }
63
-
64
- export class InvalidConfirmationsError extends HardhatViemError {
65
- constructor() {
66
- super(
67
- "deployContract does not support 0 confirmations. Use sendDeploymentTransaction if you want to handle the deployment transaction yourself."
68
- );
69
- }
70
- }
71
-
72
- export class DeployContractError extends HardhatViemError {
73
- constructor(txHash: string, blockNumber: bigint) {
74
- super(
75
- `The deployment transaction '${txHash}' was mined in block '${blockNumber}' but its receipt doesn't contain a contract address`
76
- );
77
- }
78
- }
79
-
80
- export class AmbigousLibraryNameError extends HardhatViemError {
81
- constructor(
82
- contractName: string,
83
- libraryName: string,
84
- matchingLibraries: string[]
85
- ) {
86
- super(
87
- `The library name "${libraryName}" is ambiguous for the contract "${contractName}".
88
- It may resolve to one of the following libraries:
89
- ${matchingLibraries.map((fqn) => `\n\t* ${fqn}`).join(",")}
90
-
91
- To fix this, choose one of these fully qualified library names and replace where appropriate.`
92
- );
93
- }
94
- }
95
-
96
- export class OverlappingLibraryNamesError extends HardhatViemError {
97
- constructor(sourceName: string, libraryName: string) {
98
- super(
99
- `The library name "${libraryName}" and "${sourceName}:${libraryName}" are both linking to the same library. Please use one of them, or If they are not the same library, use fully qualified names instead.`
100
- );
101
- }
102
- }
103
-
104
- export class UnnecessaryLibraryLinkError extends HardhatViemError {
105
- constructor(contractName: string, libraryName: string) {
106
- super(
107
- `The library name "${libraryName}" was linked but it's not referenced by the "${contractName}" contract.`
108
- );
109
- }
110
- }
111
-
112
- export class MissingLibraryAddressError extends HardhatViemError {
113
- constructor(
114
- contractName: string,
115
- missingLibraries: Array<Pick<Link, "sourceName" | "libraryName">>
116
- ) {
117
- super(
118
- `The libraries needed are:
119
- ${missingLibraries
120
- .map(({ sourceName, libraryName }) => `\t* "${sourceName}:${libraryName}"`)
121
- .join(",\n")}
122
- Please deploy them first and link them while deploying "${contractName}"`
123
- );
124
- }
125
- }