@nomicfoundation/hardhat-viem 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -0
- package/internal/bytecode.d.ts +13 -0
- package/internal/bytecode.d.ts.map +1 -0
- package/internal/bytecode.js +94 -0
- package/internal/bytecode.js.map +1 -0
- package/internal/clients.d.ts +1 -1
- package/internal/clients.js +1 -1
- package/internal/contracts.d.ts.map +1 -1
- package/internal/contracts.js +18 -9
- package/internal/contracts.js.map +1 -1
- package/internal/errors.d.ts +13 -0
- package/internal/errors.d.ts.map +1 -1
- package/internal/errors.js +33 -1
- package/internal/errors.js.map +1 -1
- package/package.json +5 -5
- package/src/internal/bytecode.ts +138 -0
- package/src/internal/clients.ts +1 -1
- package/src/internal/contracts.ts +34 -11
- package/src/internal/errors.ts +49 -0
- package/src/types.ts +5 -1
- package/types.d.ts +5 -1
- package/types.d.ts.map +1 -1
package/README.md
CHANGED
@@ -228,6 +228,26 @@ const { contractAddress } = await publicClient.waitForTransactionReceipt({
|
|
228
228
|
});
|
229
229
|
```
|
230
230
|
|
231
|
+
##### Library linking
|
232
|
+
|
233
|
+
Some contracts need to be linked with libraries before they are deployed. You can pass the addresses of their libraries to the `deployContract` and `sendDeploymentTransaction` functions with an object like this:
|
234
|
+
|
235
|
+
```typescript
|
236
|
+
const contractA = await hre.viem.deployContract(
|
237
|
+
"contractName",
|
238
|
+
["arg1", 50, "arg3"],
|
239
|
+
{
|
240
|
+
libraries: {
|
241
|
+
ExampleLib: "0x...",
|
242
|
+
},
|
243
|
+
}
|
244
|
+
);
|
245
|
+
```
|
246
|
+
|
247
|
+
This allows you to deploy a contract linked to the `ExampleLib` library at the address `"0x..."`.
|
248
|
+
|
249
|
+
To deploy a contract, all libraries must be linked. An error will be thrown if any libraries are missing.
|
250
|
+
|
231
251
|
## Usage
|
232
252
|
|
233
253
|
There are no additional steps you need to take for this plugin to work.
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import type * as viemT from "viem";
|
2
|
+
import type { Artifact } from "hardhat/types/artifacts";
|
3
|
+
export interface Libraries<Address = string> {
|
4
|
+
[libraryName: string]: Address;
|
5
|
+
}
|
6
|
+
export interface Link {
|
7
|
+
sourceName: string;
|
8
|
+
libraryName: string;
|
9
|
+
address: string;
|
10
|
+
}
|
11
|
+
export declare function linkBytecode(artifact: Artifact, libraries: Link[]): Promise<viemT.Hex>;
|
12
|
+
export declare function resolveBytecodeWithLinkedLibraries(artifact: Artifact, libraries: Libraries<viemT.Address>): Promise<viemT.Hex>;
|
13
|
+
//# sourceMappingURL=bytecode.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bytecode.d.ts","sourceRoot":"","sources":["../src/internal/bytecode.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AASxD,MAAM,WAAW,SAAS,CAAC,OAAO,GAAG,MAAM;IACzC,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,IAAI;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,IAAI,EAAE,GAChB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAgBpB;AA+DD,wBAAsB,kCAAkC,CACtD,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAClC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAgCpB"}
|
@@ -0,0 +1,94 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
3
|
+
if (k2 === undefined) k2 = k;
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
7
|
+
}
|
8
|
+
Object.defineProperty(o, k2, desc);
|
9
|
+
}) : (function(o, m, k, k2) {
|
10
|
+
if (k2 === undefined) k2 = k;
|
11
|
+
o[k2] = m[k];
|
12
|
+
}));
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
15
|
+
}) : function(o, v) {
|
16
|
+
o["default"] = v;
|
17
|
+
});
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
19
|
+
if (mod && mod.__esModule) return mod;
|
20
|
+
var result = {};
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
22
|
+
__setModuleDefault(result, mod);
|
23
|
+
return result;
|
24
|
+
};
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
26
|
+
exports.resolveBytecodeWithLinkedLibraries = exports.linkBytecode = void 0;
|
27
|
+
const errors_1 = require("./errors");
|
28
|
+
async function linkBytecode(artifact, libraries) {
|
29
|
+
const { isHex } = await Promise.resolve().then(() => __importStar(require("viem")));
|
30
|
+
let bytecode = artifact.bytecode;
|
31
|
+
// TODO: measure performance impact
|
32
|
+
for (const { sourceName, libraryName, address } of libraries) {
|
33
|
+
const linkReferences = artifact.linkReferences[sourceName][libraryName];
|
34
|
+
for (const { start, length } of linkReferences) {
|
35
|
+
bytecode =
|
36
|
+
bytecode.substring(0, 2 + start * 2) +
|
37
|
+
address.substring(2) +
|
38
|
+
bytecode.substring(2 + (start + length) * 2);
|
39
|
+
}
|
40
|
+
}
|
41
|
+
return isHex(bytecode) ? bytecode : `0x${bytecode}`;
|
42
|
+
}
|
43
|
+
exports.linkBytecode = linkBytecode;
|
44
|
+
async function throwOnAmbigousLibraryNameOrUnnecessaryLink(contractName, libraries, neededLibraries) {
|
45
|
+
for (const linkedLibraryName of Object.keys(libraries)) {
|
46
|
+
const matchingLibraries = neededLibraries.filter(({ sourceName, libraryName }) => libraryName === linkedLibraryName ||
|
47
|
+
`${sourceName}:${libraryName}` === linkedLibraryName);
|
48
|
+
if (matchingLibraries.length > 1) {
|
49
|
+
throw new errors_1.AmbigousLibraryNameError(contractName, linkedLibraryName, matchingLibraries.map(({ sourceName, libraryName }) => `${sourceName}:${libraryName}`));
|
50
|
+
}
|
51
|
+
else if (matchingLibraries.length === 0) {
|
52
|
+
throw new errors_1.UnnecessaryLibraryLinkError(contractName, linkedLibraryName);
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
async function throwOnMissingLibrariesAddress(contractName, libraries, neededLibraries) {
|
57
|
+
const missingLibraries = [];
|
58
|
+
for (const { sourceName, libraryName } of neededLibraries) {
|
59
|
+
const address = libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName];
|
60
|
+
if (address === undefined) {
|
61
|
+
missingLibraries.push({ sourceName, libraryName });
|
62
|
+
}
|
63
|
+
}
|
64
|
+
if (missingLibraries.length > 0) {
|
65
|
+
throw new errors_1.MissingLibraryAddressError(contractName, missingLibraries);
|
66
|
+
}
|
67
|
+
}
|
68
|
+
async function throwOnOverlappingLibraryNames(contractName, libraries, neededLibraries) {
|
69
|
+
for (const { sourceName, libraryName } of neededLibraries) {
|
70
|
+
if (libraries[`${sourceName}:${libraryName}`] !== undefined &&
|
71
|
+
libraries[libraryName] !== undefined) {
|
72
|
+
throw new errors_1.OverlappingLibraryNamesError(sourceName, libraryName);
|
73
|
+
}
|
74
|
+
}
|
75
|
+
}
|
76
|
+
async function resolveBytecodeWithLinkedLibraries(artifact, libraries) {
|
77
|
+
const { linkReferences } = artifact;
|
78
|
+
const neededLibraries = [];
|
79
|
+
for (const [sourceName, sourceLibraries] of Object.entries(linkReferences)) {
|
80
|
+
for (const libraryName of Object.keys(sourceLibraries)) {
|
81
|
+
neededLibraries.push({
|
82
|
+
sourceName,
|
83
|
+
libraryName,
|
84
|
+
address: libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName],
|
85
|
+
});
|
86
|
+
}
|
87
|
+
}
|
88
|
+
await throwOnAmbigousLibraryNameOrUnnecessaryLink(artifact.contractName, libraries, neededLibraries);
|
89
|
+
await throwOnOverlappingLibraryNames(artifact.contractName, libraries, neededLibraries);
|
90
|
+
await throwOnMissingLibrariesAddress(artifact.contractName, libraries, neededLibraries);
|
91
|
+
return linkBytecode(artifact, neededLibraries);
|
92
|
+
}
|
93
|
+
exports.resolveBytecodeWithLinkedLibraries = resolveBytecodeWithLinkedLibraries;
|
94
|
+
//# sourceMappingURL=bytecode.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bytecode.js","sourceRoot":"","sources":["../src/internal/bytecode.ts"],"names":[],"mappings":"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"}
|
package/internal/clients.d.ts
CHANGED
@@ -14,7 +14,7 @@ export declare function innerGetPublicClient(provider: EthereumProvider, chain:
|
|
14
14
|
/**
|
15
15
|
* Get a list of WalletClient instances. These are read-write clients that can
|
16
16
|
* be used to send transactions to the blockchain. Each client is associated
|
17
|
-
* with
|
17
|
+
* with an account obtained from the provider using `eth_accounts`.
|
18
18
|
*
|
19
19
|
* @param provider The Ethereum provider used to connect to the blockchain.
|
20
20
|
* @param walletClientConfig Optional configuration for the WalletClient instances. See the viem documentation for more information.
|
package/internal/clients.js
CHANGED
@@ -56,7 +56,7 @@ exports.innerGetPublicClient = innerGetPublicClient;
|
|
56
56
|
/**
|
57
57
|
* Get a list of WalletClient instances. These are read-write clients that can
|
58
58
|
* be used to send transactions to the blockchain. Each client is associated
|
59
|
-
* with
|
59
|
+
* with an account obtained from the provider using `eth_accounts`.
|
60
60
|
*
|
61
61
|
* @param provider The Ethereum provider used to connect to the blockchain.
|
62
62
|
* @param walletClientConfig Optional configuration for the WalletClient instances. See the viem documentation for more information.
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/internal/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,+BAA+B,EAC/B,YAAY,EACb,MAAM,UAAU,CAAC;
|
1
|
+
{"version":3,"file":"contracts.d.ts","sourceRoot":"","sources":["../src/internal/contracts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAC9C,OAAO,KAAK,EACV,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,wBAAwB,EACxB,YAAY,EACZ,+BAA+B,EAC/B,YAAY,EACb,MAAM,UAAU,CAAC;AA4BlB,wBAAsB,cAAc,CAClC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,yBAAyB,EACjD,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,GAAG,EAAO,EAC3B,MAAM,GAAE,oBAAyB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAsBhC;AAED,wBAAsB,mBAAmB,CACvC,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,GAAG,EAChB,gBAAgB,EAAE,GAAG,EACrB,eAAe,EAAE,GAAG,EAAE,EACtB,wBAAwB,GAAE,oBAAyB,EACnD,aAAa,GAAE,MAAU,GACxB,OAAO,CAAC,qBAAqB,CAAC,CAkDhC;AAED,wBAAsB,yBAAyB,CAC7C,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,yBAAyB,EACjD,YAAY,EAAE,MAAM,EACpB,eAAe,GAAE,GAAG,EAAO,EAC3B,MAAM,GAAE,+BAAoC,GAC3C,OAAO,CAAC;IACT,QAAQ,EAAE,qBAAqB,CAAC;IAChC,qBAAqB,EAAE,wBAAwB,CAAC;CACjD,CAAC,CAgBD;AAuDD,wBAAsB,aAAa,CACjC,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,yBAAyB,EACjD,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,mBAAwB,GAC/B,OAAO,CAAC,qBAAqB,CAAC,CAchC"}
|
package/internal/contracts.js
CHANGED
@@ -24,16 +24,25 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
24
24
|
};
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
26
26
|
exports.getContractAt = exports.sendDeploymentTransaction = exports.innerDeployContract = exports.deployContract = void 0;
|
27
|
+
const bytecode_1 = require("./bytecode");
|
27
28
|
const clients_1 = require("./clients");
|
28
29
|
const errors_1 = require("./errors");
|
30
|
+
async function getContractAbiAndBytecode(artifacts, contractName, libraries) {
|
31
|
+
const artifact = await artifacts.readArtifact(contractName);
|
32
|
+
const bytecode = await (0, bytecode_1.resolveBytecodeWithLinkedLibraries)(artifact, libraries);
|
33
|
+
return {
|
34
|
+
abi: artifact.abi,
|
35
|
+
bytecode,
|
36
|
+
};
|
37
|
+
}
|
29
38
|
async function deployContract({ artifacts, network }, contractName, constructorArgs = [], config = {}) {
|
30
|
-
const { client, confirmations, ...deployContractParameters } = config;
|
31
|
-
const [publicClient, walletClient,
|
39
|
+
const { client, confirmations, libraries = {}, ...deployContractParameters } = config;
|
40
|
+
const [publicClient, walletClient, { abi, bytecode }] = await Promise.all([
|
32
41
|
client?.public ?? (0, clients_1.getPublicClient)(network.provider),
|
33
42
|
client?.wallet ?? getDefaultWalletClient(network.provider, network.name),
|
34
|
-
artifacts
|
43
|
+
getContractAbiAndBytecode(artifacts, contractName, libraries),
|
35
44
|
]);
|
36
|
-
return innerDeployContract(publicClient, walletClient,
|
45
|
+
return innerDeployContract(publicClient, walletClient, abi, bytecode, constructorArgs, deployContractParameters, confirmations);
|
37
46
|
}
|
38
47
|
exports.deployContract = deployContract;
|
39
48
|
async function innerDeployContract(publicClient, walletClient, contractAbi, contractBytecode, constructorArgs, deployContractParameters = {}, confirmations = 1) {
|
@@ -69,7 +78,7 @@ async function innerDeployContract(publicClient, walletClient, contractAbi, cont
|
|
69
78
|
hash: deploymentTxHash,
|
70
79
|
confirmations,
|
71
80
|
});
|
72
|
-
if (contractAddress === null) {
|
81
|
+
if (contractAddress === null || contractAddress === undefined) {
|
73
82
|
const transaction = await publicClient.getTransaction({
|
74
83
|
hash: deploymentTxHash,
|
75
84
|
});
|
@@ -80,13 +89,13 @@ async function innerDeployContract(publicClient, walletClient, contractAbi, cont
|
|
80
89
|
}
|
81
90
|
exports.innerDeployContract = innerDeployContract;
|
82
91
|
async function sendDeploymentTransaction({ artifacts, network }, contractName, constructorArgs = [], config = {}) {
|
83
|
-
const { client, ...deployContractParameters } = config;
|
84
|
-
const [publicClient, walletClient,
|
92
|
+
const { client, libraries = {}, ...deployContractParameters } = config;
|
93
|
+
const [publicClient, walletClient, { abi, bytecode }] = await Promise.all([
|
85
94
|
client?.public ?? (0, clients_1.getPublicClient)(network.provider),
|
86
95
|
client?.wallet ?? getDefaultWalletClient(network.provider, network.name),
|
87
|
-
artifacts
|
96
|
+
getContractAbiAndBytecode(artifacts, contractName, libraries),
|
88
97
|
]);
|
89
|
-
return innerSendDeploymentTransaction(publicClient, walletClient,
|
98
|
+
return innerSendDeploymentTransaction(publicClient, walletClient, abi, bytecode, constructorArgs, deployContractParameters);
|
90
99
|
}
|
91
100
|
exports.sendDeploymentTransaction = sendDeploymentTransaction;
|
92
101
|
async function innerSendDeploymentTransaction(publicClient, walletClient, contractAbi, contractBytecode, constructorArgs, deployContractParameters = {}) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/internal/contracts.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,uCAA8D;AAC9D,qCAKkB;
|
1
|
+
{"version":3,"file":"contracts.js","sourceRoot":"","sources":["../src/internal/contracts.ts"],"names":[],"mappings":"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"}
|
package/internal/errors.d.ts
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
import type { Link } from "./bytecode";
|
1
2
|
import { NomicLabsHardhatPluginError } from "hardhat/plugins";
|
2
3
|
export declare class HardhatViemError extends NomicLabsHardhatPluginError {
|
3
4
|
constructor(message: string, parent?: Error);
|
@@ -20,4 +21,16 @@ export declare class InvalidConfirmationsError extends HardhatViemError {
|
|
20
21
|
export declare class DeployContractError extends HardhatViemError {
|
21
22
|
constructor(txHash: string, blockNumber: bigint);
|
22
23
|
}
|
24
|
+
export declare class AmbigousLibraryNameError extends HardhatViemError {
|
25
|
+
constructor(contractName: string, libraryName: string, matchingLibraries: string[]);
|
26
|
+
}
|
27
|
+
export declare class OverlappingLibraryNamesError extends HardhatViemError {
|
28
|
+
constructor(sourceName: string, libraryName: string);
|
29
|
+
}
|
30
|
+
export declare class UnnecessaryLibraryLinkError extends HardhatViemError {
|
31
|
+
constructor(contractName: string, libraryName: string);
|
32
|
+
}
|
33
|
+
export declare class MissingLibraryAddressError extends HardhatViemError {
|
34
|
+
constructor(contractName: string, missingLibraries: Array<Pick<Link, "sourceName" | "libraryName">>);
|
35
|
+
}
|
23
36
|
//# sourceMappingURL=errors.d.ts.map
|
package/internal/errors.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/internal/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D,qBAAa,gBAAiB,SAAQ,2BAA2B;gBACnD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK;CAG5C;AAED,qBAAa,8BAA+B,SAAQ,gBAAgB;;CAKnE;AAED,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,OAAO,EAAE,MAAM;CAa5B;AAED,qBAAa,6BAA8B,SAAQ,gBAAgB;gBACrD,OAAO,EAAE,MAAM;CAa5B;AAED,qBAAa,gCAAiC,SAAQ,gBAAgB;gBACxD,WAAW,EAAE,MAAM;CAWhC;AAED,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAM9D;AAED,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAKhD"}
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/internal/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAE9D,qBAAa,gBAAiB,SAAQ,2BAA2B;gBACnD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK;CAG5C;AAED,qBAAa,8BAA+B,SAAQ,gBAAgB;;CAKnE;AAED,qBAAa,oBAAqB,SAAQ,gBAAgB;gBAC5C,OAAO,EAAE,MAAM;CAa5B;AAED,qBAAa,6BAA8B,SAAQ,gBAAgB;gBACrD,OAAO,EAAE,MAAM;CAa5B;AAED,qBAAa,gCAAiC,SAAQ,gBAAgB;gBACxD,WAAW,EAAE,MAAM;CAWhC;AAED,qBAAa,yBAA0B,SAAQ,gBAAgB;;CAM9D;AAED,qBAAa,mBAAoB,SAAQ,gBAAgB;gBAC3C,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAKhD;AAED,qBAAa,wBAAyB,SAAQ,gBAAgB;gBAE1D,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,iBAAiB,EAAE,MAAM,EAAE;CAU9B;AAED,qBAAa,4BAA6B,SAAQ,gBAAgB;gBACpD,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAKpD;AAED,qBAAa,2BAA4B,SAAQ,gBAAgB;gBACnD,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;CAKtD;AAED,qBAAa,0BAA2B,SAAQ,gBAAgB;gBAE5D,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;CAUpE"}
|
package/internal/errors.js
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
"use strict";
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
exports.DeployContractError = exports.InvalidConfirmationsError = exports.DefaultWalletClientNotFoundError = exports.MultipleMatchingNetworksError = exports.NetworkNotFoundError = exports.UnknownDevelopmentNetworkError = exports.HardhatViemError = void 0;
|
3
|
+
exports.MissingLibraryAddressError = exports.UnnecessaryLibraryLinkError = exports.OverlappingLibraryNamesError = exports.AmbigousLibraryNameError = exports.DeployContractError = exports.InvalidConfirmationsError = exports.DefaultWalletClientNotFoundError = exports.MultipleMatchingNetworksError = exports.NetworkNotFoundError = exports.UnknownDevelopmentNetworkError = exports.HardhatViemError = void 0;
|
4
4
|
const plugins_1 = require("hardhat/plugins");
|
5
5
|
class HardhatViemError extends plugins_1.NomicLabsHardhatPluginError {
|
6
6
|
constructor(message, parent) {
|
@@ -67,4 +67,36 @@ class DeployContractError extends HardhatViemError {
|
|
67
67
|
}
|
68
68
|
}
|
69
69
|
exports.DeployContractError = DeployContractError;
|
70
|
+
class AmbigousLibraryNameError extends HardhatViemError {
|
71
|
+
constructor(contractName, libraryName, matchingLibraries) {
|
72
|
+
super(`The library name "${libraryName}" is ambiguous for the contract "${contractName}".
|
73
|
+
It may resolve to one of the following libraries:
|
74
|
+
${matchingLibraries.map((fqn) => `\n\t* ${fqn}`).join(",")}
|
75
|
+
|
76
|
+
To fix this, choose one of these fully qualified library names and replace where appropriate.`);
|
77
|
+
}
|
78
|
+
}
|
79
|
+
exports.AmbigousLibraryNameError = AmbigousLibraryNameError;
|
80
|
+
class OverlappingLibraryNamesError extends HardhatViemError {
|
81
|
+
constructor(sourceName, libraryName) {
|
82
|
+
super(`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.`);
|
83
|
+
}
|
84
|
+
}
|
85
|
+
exports.OverlappingLibraryNamesError = OverlappingLibraryNamesError;
|
86
|
+
class UnnecessaryLibraryLinkError extends HardhatViemError {
|
87
|
+
constructor(contractName, libraryName) {
|
88
|
+
super(`The library name "${libraryName}" was linked but it's not referenced by the "${contractName}" contract.`);
|
89
|
+
}
|
90
|
+
}
|
91
|
+
exports.UnnecessaryLibraryLinkError = UnnecessaryLibraryLinkError;
|
92
|
+
class MissingLibraryAddressError extends HardhatViemError {
|
93
|
+
constructor(contractName, missingLibraries) {
|
94
|
+
super(`The libraries needed are:
|
95
|
+
${missingLibraries
|
96
|
+
.map(({ sourceName, libraryName }) => `\t* "${sourceName}:${libraryName}"`)
|
97
|
+
.join(",\n")}
|
98
|
+
Please deploy them first and link them while deploying "${contractName}"`);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
exports.MissingLibraryAddressError = MissingLibraryAddressError;
|
70
102
|
//# sourceMappingURL=errors.js.map
|
package/internal/errors.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/internal/errors.ts"],"names":[],"mappings":";;;
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/internal/errors.ts"],"names":[],"mappings":";;;AAEA,6CAA8D;AAE9D,MAAa,gBAAiB,SAAQ,qCAA2B;IAC/D,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,+BAA+B,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;CACF;AAJD,4CAIC;AAED,MAAa,8BAA+B,SAAQ,gBAAgB;IAClE;QACE,KAAK,CAAC;6DACmD,CAAC,CAAC;IAC7D,CAAC;CACF;AALD,wEAKC;AAED,MAAa,oBAAqB,SAAQ,gBAAgB;IACxD,YAAY,OAAe;QACzB,KAAK,CACH,4BAA4B,OAAO;;;;;;;;2GAQkE,CACtG,CAAC;IACJ,CAAC;CACF;AAdD,oDAcC;AAED,MAAa,6BAA8B,SAAQ,gBAAgB;IACjE,YAAY,OAAe;QACzB,KAAK,CACH,mCAAmC,OAAO;;;;;;;;2GAQ2D,CACtG,CAAC;IACJ,CAAC;CACF;AAdD,sEAcC;AAED,MAAa,gCAAiC,SAAQ,gBAAgB;IACpE,YAAY,WAAmB;QAC7B,KAAK,CACH,+GAA+G,WAAW;;;;;;gFAMhD,CAC3E,CAAC;IACJ,CAAC;CACF;AAZD,4EAYC;AAED,MAAa,yBAA0B,SAAQ,gBAAgB;IAC7D;QACE,KAAK,CACH,2IAA2I,CAC5I,CAAC;IACJ,CAAC;CACF;AAND,8DAMC;AAED,MAAa,mBAAoB,SAAQ,gBAAgB;IACvD,YAAY,MAAc,EAAE,WAAmB;QAC7C,KAAK,CACH,+BAA+B,MAAM,yBAAyB,WAAW,sDAAsD,CAChI,CAAC;IACJ,CAAC;CACF;AAND,kDAMC;AAED,MAAa,wBAAyB,SAAQ,gBAAgB;IAC5D,YACE,YAAoB,EACpB,WAAmB,EACnB,iBAA2B;QAE3B,KAAK,CACH,qBAAqB,WAAW,oCAAoC,YAAY;;EAEpF,iBAAiB,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;8FAEoC,CACzF,CAAC;IACJ,CAAC;CACF;AAdD,4DAcC;AAED,MAAa,4BAA6B,SAAQ,gBAAgB;IAChE,YAAY,UAAkB,EAAE,WAAmB;QACjD,KAAK,CACH,qBAAqB,WAAW,UAAU,UAAU,IAAI,WAAW,yIAAyI,CAC7M,CAAC;IACJ,CAAC;CACF;AAND,oEAMC;AAED,MAAa,2BAA4B,SAAQ,gBAAgB;IAC/D,YAAY,YAAoB,EAAE,WAAmB;QACnD,KAAK,CACH,qBAAqB,WAAW,gDAAgD,YAAY,aAAa,CAC1G,CAAC;IACJ,CAAC;CACF;AAND,kEAMC;AAED,MAAa,0BAA2B,SAAQ,gBAAgB;IAC9D,YACE,YAAoB,EACpB,gBAAiE;QAEjE,KAAK,CACH;EACJ,gBAAgB;aACf,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC,QAAQ,UAAU,IAAI,WAAW,GAAG,CAAC;aAC1E,IAAI,CAAC,KAAK,CAAC;0DAC4C,YAAY,GAAG,CACpE,CAAC;IACJ,CAAC;CACF;AAbD,gEAaC"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@nomicfoundation/hardhat-viem",
|
3
|
-
"version": "2.0.
|
3
|
+
"version": "2.0.2",
|
4
4
|
"description": "Hardhat plugin for viem",
|
5
5
|
"homepage": "https://github.com/nomicfoundation/hardhat/tree/main/packages/hardhat-viem",
|
6
6
|
"repository": "github:nomicfoundation/hardhat",
|
@@ -31,7 +31,7 @@
|
|
31
31
|
"@types/lodash": "^4.14.123",
|
32
32
|
"@types/lodash.memoize": "^4.1.7",
|
33
33
|
"@types/mocha": ">=9.1.0",
|
34
|
-
"@types/node": "^
|
34
|
+
"@types/node": "^18.0.0",
|
35
35
|
"@types/sinon": "^9.0.8",
|
36
36
|
"@typescript-eslint/eslint-plugin": "5.61.0",
|
37
37
|
"@typescript-eslint/parser": "5.61.0",
|
@@ -40,7 +40,7 @@
|
|
40
40
|
"eslint": "^8.44.0",
|
41
41
|
"eslint-config-prettier": "8.3.0",
|
42
42
|
"eslint-plugin-import": "2.27.5",
|
43
|
-
"eslint-plugin-
|
43
|
+
"eslint-plugin-mocha": "10.4.1",
|
44
44
|
"eslint-plugin-prettier": "3.4.0",
|
45
45
|
"hardhat": "^2.17.0",
|
46
46
|
"jest-diff": "^29.7.0",
|
@@ -52,8 +52,8 @@
|
|
52
52
|
"ts-node": "^10.8.0",
|
53
53
|
"typescript": "~5.0.0",
|
54
54
|
"viem": "^2.7.6",
|
55
|
-
"@nomicfoundation/eslint-plugin-
|
56
|
-
"@nomicfoundation/eslint-plugin-
|
55
|
+
"@nomicfoundation/eslint-plugin-slow-imports": "^1.0.0",
|
56
|
+
"@nomicfoundation/eslint-plugin-hardhat-internal-rules": "^1.0.2"
|
57
57
|
},
|
58
58
|
"peerDependencies": {
|
59
59
|
"hardhat": "^2.17.0",
|
@@ -0,0 +1,138 @@
|
|
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/clients.ts
CHANGED
@@ -54,7 +54,7 @@ export async function innerGetPublicClient(
|
|
54
54
|
/**
|
55
55
|
* Get a list of WalletClient instances. These are read-write clients that can
|
56
56
|
* be used to send transactions to the blockchain. Each client is associated
|
57
|
-
* with
|
57
|
+
* with an account obtained from the provider using `eth_accounts`.
|
58
58
|
*
|
59
59
|
* @param provider The Ethereum provider used to connect to the blockchain.
|
60
60
|
* @param walletClientConfig Optional configuration for the WalletClient instances. See the viem documentation for more information.
|
@@ -13,6 +13,7 @@ import type {
|
|
13
13
|
WalletClient,
|
14
14
|
} from "../types";
|
15
15
|
|
16
|
+
import { Libraries, resolveBytecodeWithLinkedLibraries } from "./bytecode";
|
16
17
|
import { getPublicClient, getWalletClients } from "./clients";
|
17
18
|
import {
|
18
19
|
DefaultWalletClientNotFoundError,
|
@@ -21,24 +22,46 @@ import {
|
|
21
22
|
InvalidConfirmationsError,
|
22
23
|
} from "./errors";
|
23
24
|
|
25
|
+
async function getContractAbiAndBytecode(
|
26
|
+
artifacts: HardhatRuntimeEnvironment["artifacts"],
|
27
|
+
contractName: string,
|
28
|
+
libraries: Libraries<Address>
|
29
|
+
) {
|
30
|
+
const artifact = await artifacts.readArtifact(contractName);
|
31
|
+
const bytecode = await resolveBytecodeWithLinkedLibraries(
|
32
|
+
artifact,
|
33
|
+
libraries
|
34
|
+
);
|
35
|
+
|
36
|
+
return {
|
37
|
+
abi: artifact.abi,
|
38
|
+
bytecode,
|
39
|
+
};
|
40
|
+
}
|
41
|
+
|
24
42
|
export async function deployContract(
|
25
43
|
{ artifacts, network }: HardhatRuntimeEnvironment,
|
26
44
|
contractName: string,
|
27
45
|
constructorArgs: any[] = [],
|
28
46
|
config: DeployContractConfig = {}
|
29
47
|
): Promise<GetContractReturnType> {
|
30
|
-
const {
|
31
|
-
|
48
|
+
const {
|
49
|
+
client,
|
50
|
+
confirmations,
|
51
|
+
libraries = {},
|
52
|
+
...deployContractParameters
|
53
|
+
} = config;
|
54
|
+
const [publicClient, walletClient, { abi, bytecode }] = await Promise.all([
|
32
55
|
client?.public ?? getPublicClient(network.provider),
|
33
56
|
client?.wallet ?? getDefaultWalletClient(network.provider, network.name),
|
34
|
-
artifacts
|
57
|
+
getContractAbiAndBytecode(artifacts, contractName, libraries),
|
35
58
|
]);
|
36
59
|
|
37
60
|
return innerDeployContract(
|
38
61
|
publicClient,
|
39
62
|
walletClient,
|
40
|
-
|
41
|
-
|
63
|
+
abi,
|
64
|
+
bytecode,
|
42
65
|
constructorArgs,
|
43
66
|
deployContractParameters,
|
44
67
|
confirmations
|
@@ -88,7 +111,7 @@ export async function innerDeployContract(
|
|
88
111
|
confirmations,
|
89
112
|
});
|
90
113
|
|
91
|
-
if (contractAddress === null) {
|
114
|
+
if (contractAddress === null || contractAddress === undefined) {
|
92
115
|
const transaction = await publicClient.getTransaction({
|
93
116
|
hash: deploymentTxHash,
|
94
117
|
});
|
@@ -114,18 +137,18 @@ export async function sendDeploymentTransaction(
|
|
114
137
|
contract: GetContractReturnType;
|
115
138
|
deploymentTransaction: GetTransactionReturnType;
|
116
139
|
}> {
|
117
|
-
const { client, ...deployContractParameters } = config;
|
118
|
-
const [publicClient, walletClient,
|
140
|
+
const { client, libraries = {}, ...deployContractParameters } = config;
|
141
|
+
const [publicClient, walletClient, { abi, bytecode }] = await Promise.all([
|
119
142
|
client?.public ?? getPublicClient(network.provider),
|
120
143
|
client?.wallet ?? getDefaultWalletClient(network.provider, network.name),
|
121
|
-
artifacts
|
144
|
+
getContractAbiAndBytecode(artifacts, contractName, libraries),
|
122
145
|
]);
|
123
146
|
|
124
147
|
return innerSendDeploymentTransaction(
|
125
148
|
publicClient,
|
126
149
|
walletClient,
|
127
|
-
|
128
|
-
|
150
|
+
abi,
|
151
|
+
bytecode,
|
129
152
|
constructorArgs,
|
130
153
|
deployContractParameters
|
131
154
|
);
|
package/src/internal/errors.ts
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
import type { Link } from "./bytecode";
|
2
|
+
|
1
3
|
import { NomicLabsHardhatPluginError } from "hardhat/plugins";
|
2
4
|
|
3
5
|
export class HardhatViemError extends NomicLabsHardhatPluginError {
|
@@ -74,3 +76,50 @@ export class DeployContractError extends HardhatViemError {
|
|
74
76
|
);
|
75
77
|
}
|
76
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
|
+
}
|
package/src/types.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import type * as viemT from "viem";
|
2
2
|
import type { ArtifactsMap } from "hardhat/types/artifacts";
|
3
|
+
import type { Libraries } from "./internal/bytecode";
|
3
4
|
|
4
5
|
export type PublicClient = viemT.PublicClient<viemT.Transport, viemT.Chain>;
|
5
6
|
export type WalletClient = viemT.WalletClient<
|
@@ -38,9 +39,12 @@ export interface SendTransactionConfig {
|
|
38
39
|
|
39
40
|
export interface DeployContractConfig extends SendTransactionConfig {
|
40
41
|
confirmations?: number;
|
42
|
+
libraries?: Libraries<viemT.Address>;
|
41
43
|
}
|
42
44
|
|
43
|
-
export
|
45
|
+
export interface SendDeploymentTransactionConfig extends SendTransactionConfig {
|
46
|
+
libraries?: Libraries<viemT.Address>;
|
47
|
+
}
|
44
48
|
|
45
49
|
export interface GetContractAtConfig {
|
46
50
|
client?: KeyedClient;
|
package/types.d.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import type * as viemT from "viem";
|
2
2
|
import type { ArtifactsMap } from "hardhat/types/artifacts";
|
3
|
+
import type { Libraries } from "./internal/bytecode";
|
3
4
|
export type PublicClient = viemT.PublicClient<viemT.Transport, viemT.Chain>;
|
4
5
|
export type WalletClient = viemT.WalletClient<viemT.Transport, viemT.Chain, viemT.Account>;
|
5
6
|
export type TestClient = viemT.TestClient<TestClientMode, viemT.Transport, viemT.Chain>;
|
@@ -21,8 +22,11 @@ export interface SendTransactionConfig {
|
|
21
22
|
}
|
22
23
|
export interface DeployContractConfig extends SendTransactionConfig {
|
23
24
|
confirmations?: number;
|
25
|
+
libraries?: Libraries<viemT.Address>;
|
26
|
+
}
|
27
|
+
export interface SendDeploymentTransactionConfig extends SendTransactionConfig {
|
28
|
+
libraries?: Libraries<viemT.Address>;
|
24
29
|
}
|
25
|
-
export type SendDeploymentTransactionConfig = SendTransactionConfig;
|
26
30
|
export interface GetContractAtConfig {
|
27
31
|
client?: KeyedClient;
|
28
32
|
}
|
package/types.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;AAC5E,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAC3C,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,EACX,KAAK,CAAC,OAAO,CACd,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CACvC,cAAc,EACd,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,KAAK,CACZ,CAAC;AAEF,MAAM,MAAM,WAAW,GACnB;IACE,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,YAAY,CAAC;CACtB,GACD;IACE,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB,CAAC;AAEN,MAAM,MAAM,cAAc,GAAG,UAAU,CACrC,OAAO,KAAK,CAAC,gBAAgB,CAC9B,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAEb,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,+BAAgC,SAAQ,qBAAqB;IAC5E,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,MAAM,qBAAqB,CAC/B,IAAI,SAAS,KAAK,CAAC,GAAG,GAAG,SAAS,OAAO,EAAE,GAAG,KAAK,CAAC,GAAG,IACrD,KAAK,CAAC,qBAAqB,CAAC,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;AAE5E,MAAM,MAAM,wBAAwB,GAAG,KAAK,CAAC,wBAAwB,CACnE,KAAK,CAAC,KAAK,EACX,QAAQ,CACT,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,OAAO,SAAS,MAAM,IAC7C,OAAO,SAAS,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,CAAC;AAEvD,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,SAAS,MAAM,EACtD,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,EAC9B,eAAe,CAAC,EAAE,GAAG,EAAE,EACvB,MAAM,CAAC,EAAE,oBAAoB,GAC5B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAElC,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,SAAS,MAAM,EACjE,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,EAC9B,eAAe,CAAC,EAAE,GAAG,EAAE,EACvB,MAAM,CAAC,EAAE,+BAA+B,GACvC,OAAO,CAAC;IACT,QAAQ,EAAE,qBAAqB,CAAC;IAChC,qBAAqB,EAAE,wBAAwB,CAAC;CACjD,CAAC,CAAC;AAEH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,SAAS,MAAM,EACrD,YAAY,EAAE,YAAY,CAAC,EAAE,CAAC,EAC9B,OAAO,EAAE,KAAK,CAAC,OAAO,EACtB,MAAM,CAAC,EAAE,mBAAmB,GAC3B,OAAO,CAAC,qBAAqB,CAAC,CAAC;AAElC,YAAY,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC"}
|