@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.
- package/CHANGELOG.md +7 -0
- package/LICENSE +4 -16
- package/README.md +35 -247
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +10 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/internal/accounts.d.ts +4 -0
- package/dist/src/internal/accounts.d.ts.map +1 -0
- package/dist/src/internal/accounts.js +15 -0
- package/dist/src/internal/accounts.js.map +1 -0
- package/dist/src/internal/chains.d.ts +11 -0
- package/dist/src/internal/chains.d.ts.map +1 -0
- package/dist/src/internal/chains.js +116 -0
- package/dist/src/internal/chains.js.map +1 -0
- package/dist/src/internal/clients.d.ts +10 -0
- package/dist/src/internal/clients.d.ts.map +1 -0
- package/dist/src/internal/clients.js +91 -0
- package/dist/src/internal/clients.js.map +1 -0
- package/dist/src/internal/contracts.d.ts +11 -0
- package/dist/src/internal/contracts.d.ts.map +1 -0
- package/dist/src/internal/contracts.js +141 -0
- package/dist/src/internal/contracts.js.map +1 -0
- package/dist/src/internal/hook-handlers/network.d.ts +4 -0
- package/dist/src/internal/hook-handlers/network.d.ts.map +1 -0
- package/dist/src/internal/hook-handlers/network.js +12 -0
- package/dist/src/internal/hook-handlers/network.js.map +1 -0
- package/dist/src/internal/initialization.d.ts +6 -0
- package/dist/src/internal/initialization.d.ts.map +1 -0
- package/dist/src/internal/initialization.js +14 -0
- package/dist/src/internal/initialization.js.map +1 -0
- package/dist/src/type-extensions.d.ts +8 -0
- package/dist/src/type-extensions.d.ts.map +1 -0
- package/dist/src/type-extensions.js +2 -0
- package/dist/src/type-extensions.js.map +1 -0
- package/dist/src/types.d.ts +166 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/package.json +46 -51
- package/src/index.ts +10 -39
- package/src/internal/accounts.ts +20 -7
- package/src/internal/chains.ts +122 -62
- package/src/internal/clients.ts +135 -141
- package/src/internal/contracts.ts +126 -150
- package/src/internal/hook-handlers/network.ts +27 -0
- package/src/internal/initialization.ts +67 -0
- package/src/type-extensions.ts +10 -0
- package/src/types.ts +237 -72
- package/.eslintrc.js +0 -24
- package/index.d.ts +0 -3
- package/index.d.ts.map +0 -1
- package/index.js +0 -20
- package/index.js.map +0 -1
- package/internal/accounts.d.ts +0 -5
- package/internal/accounts.d.ts.map +0 -1
- package/internal/accounts.js +0 -9
- package/internal/accounts.js.map +0 -1
- package/internal/bytecode.d.ts +0 -13
- package/internal/bytecode.d.ts.map +0 -1
- package/internal/bytecode.js +0 -94
- package/internal/bytecode.js.map +0 -1
- package/internal/chains.d.ts +0 -7
- package/internal/chains.d.ts.map +0 -1
- package/internal/chains.js +0 -80
- package/internal/chains.js.map +0 -1
- package/internal/clients.d.ts +0 -45
- package/internal/clients.d.ts.map +0 -1
- package/internal/clients.js +0 -136
- package/internal/clients.js.map +0 -1
- package/internal/contracts.d.ts +0 -11
- package/internal/contracts.d.ts.map +0 -1
- package/internal/contracts.js +0 -164
- package/internal/contracts.js.map +0 -1
- package/internal/errors.d.ts +0 -36
- package/internal/errors.d.ts.map +0 -1
- package/internal/errors.js +0 -102
- package/internal/errors.js.map +0 -1
- package/internal/tasks.d.ts +0 -2
- package/internal/tasks.d.ts.map +0 -1
- package/internal/tasks.js +0 -240
- package/internal/tasks.js.map +0 -1
- package/internal/type-extensions.d.ts +0 -19
- package/internal/type-extensions.d.ts.map +0 -1
- package/internal/type-extensions.js +0 -5
- package/internal/type-extensions.js.map +0 -1
- package/src/internal/bytecode.ts +0 -138
- package/src/internal/errors.ts +0 -125
- package/src/internal/tasks.ts +0 -341
- package/src/internal/type-extensions.ts +0 -27
- package/src/tsconfig.json +0 -15
- package/types.d.ts +0 -52
- package/types.d.ts.map +0 -1
- package/types.js +0 -3
- 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
|
package/internal/tasks.js.map
DELETED
@@ -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 +0,0 @@
|
|
1
|
-
{"version":3,"file":"type-extensions.js","sourceRoot":"","sources":["../src/internal/type-extensions.ts"],"names":[],"mappings":";;AACA,iCAA+B;AAC/B,mCAAiC"}
|
package/src/internal/bytecode.ts
DELETED
@@ -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
|
-
}
|
package/src/internal/errors.ts
DELETED
@@ -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
|
-
}
|