Skip to content

Commit 5bc9b04

Browse files
committed
feat: allow config vars in account mnemonic and passphrase fields
1 parent 8bc4fae commit 5bc9b04

File tree

9 files changed

+88
-53
lines changed

9 files changed

+88
-53
lines changed

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/accounts/derive-private-keys.ts

+16-6
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,25 @@
1+
import type { SensitiveString } from "../../../../types/config.js";
2+
13
import { HardhatError } from "@ignored/hardhat-vnext-errors";
24
import { mnemonicToSeedSync } from "ethereum-cryptography/bip39";
35
import { HDKey } from "ethereum-cryptography/hdkey";
46

57
const HD_PATH_REGEX = /^m(:?\/\d+'?)+\/?$/;
68

7-
export const DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS = {
8-
initialIndex: 0,
9-
count: 20,
10-
path: "m/44'/60'/0'/0",
11-
passphrase: "",
12-
};
9+
export interface DefaultHDAccountsConfigParams {
10+
initialIndex: number;
11+
count: number;
12+
path: string;
13+
passphrase: SensitiveString;
14+
}
15+
16+
export const DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS: DefaultHDAccountsConfigParams =
17+
{
18+
initialIndex: 0,
19+
count: 20,
20+
path: "m/44'/60'/0'/0",
21+
passphrase: "",
22+
};
1323

1424
export function derivePrivateKeys(
1525
mnemonic: string,

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/config-resolution.ts

+20-8
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,15 @@ export function resolveHttpNetworkAccounts(
4949
}
5050

5151
if (isHdAccountsUserConfig(accounts)) {
52+
const { passphrase: defaultPassphrase, ...defaultHdAccountRest } =
53+
DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS;
54+
const { mnemonic, passphrase, ...hdAccountRest } = accounts;
55+
5256
return {
53-
...DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS,
54-
...accounts,
57+
...defaultHdAccountRest,
58+
...hdAccountRest,
59+
mnemonic: resolveConfigurationVariable(mnemonic),
60+
passphrase: resolveConfigurationVariable(passphrase ?? defaultPassphrase),
5561
};
5662
}
5763

@@ -77,13 +83,19 @@ export function resolveEdrNetworkAccounts(
7783
});
7884
}
7985

86+
const {
87+
mnemonic: defaultMnemonic,
88+
accountsBalance: defaultAccountsBalance,
89+
passphrase: defaultPassphrase,
90+
...defaultHdAccountRest
91+
} = DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS;
92+
const { mnemonic, passphrase, accountsBalance, ...hdAccountRest } = accounts;
8093
return {
81-
...DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS,
82-
...accounts,
83-
accountsBalance: BigInt(
84-
accounts.accountsBalance ??
85-
DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS.accountsBalance,
86-
),
94+
...defaultHdAccountRest,
95+
...hdAccountRest,
96+
mnemonic: resolveConfigurationVariable(mnemonic ?? defaultMnemonic),
97+
accountsBalance: BigInt(accountsBalance ?? defaultAccountsBalance),
98+
passphrase: resolveConfigurationVariable(passphrase ?? defaultPassphrase),
8799
};
88100
}
89101

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/edr-provider.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import type { SolidityStackTrace } from "./stack-traces/solidity-stack-trace.js";
22
import type { LoggerConfig } from "./types/logger.js";
33
import type { TracingConfig } from "./types/node-types.js";
4-
import type {
5-
EdrNetworkConfig,
6-
EdrNetworkHDAccountsConfig,
7-
} from "../../../../types/config.js";
4+
import type { EdrNetworkConfig } from "../../../../types/config.js";
85
import type {
96
EthereumProvider,
107
EthSubscription,
@@ -18,6 +15,7 @@ import type {
1815
CompilerInput,
1916
CompilerOutput,
2017
} from "../../../../types/solidity/compiler-io.js";
18+
import type { DefaultHDAccountsConfigParams } from "../accounts/derive-private-keys.js";
2119
import type { JsonRpcRequestWrapperFunction } from "../network-manager.js";
2220
import type {
2321
RawTrace,
@@ -81,10 +79,16 @@ const log = debug("hardhat:core:hardhat-network:provider");
8179
export const EDR_NETWORK_DEFAULT_COINBASE =
8280
"0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e";
8381

82+
interface EdrNetworkDefaultHDAccountsConfigParams
83+
extends DefaultHDAccountsConfigParams {
84+
mnemonic: string;
85+
accountsBalance: bigint;
86+
}
87+
8488
export const EDR_NETWORK_MNEMONIC =
8589
"test test test test test test test test test test test junk";
8690
export const DEFAULT_EDR_NETWORK_BALANCE = 10000000000000000000000n;
87-
export const DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS: EdrNetworkHDAccountsConfig =
91+
export const DEFAULT_EDR_NETWORK_HD_ACCOUNTS_CONFIG_PARAMS: EdrNetworkDefaultHDAccountsConfigParams =
8892
{
8993
...DEFAULT_HD_ACCOUNTS_CONFIG_PARAMS,
9094
mnemonic: EDR_NETWORK_MNEMONIC,

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/edr/utils/convert-to-edr.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ export function edrRpcDebugTraceToHardhat(
224224
export async function hardhatAccountsToEdrGenesisAccounts(
225225
accounts: EdrNetworkAccountsConfig,
226226
): Promise<GenesisAccount[]> {
227-
const normalizedAccounts = normalizeEdrNetworkAccountsConfig(accounts);
227+
const normalizedAccounts = await normalizeEdrNetworkAccountsConfig(accounts);
228228

229229
const accountPromises = normalizedAccounts.map(async (account) => ({
230230
secretKey: await account.privateKey.getHexString(),
@@ -234,19 +234,19 @@ export async function hardhatAccountsToEdrGenesisAccounts(
234234
return Promise.all(accountPromises);
235235
}
236236

237-
function normalizeEdrNetworkAccountsConfig(
237+
async function normalizeEdrNetworkAccountsConfig(
238238
accounts: EdrNetworkAccountsConfig,
239-
): EdrNetworkAccountConfig[] {
239+
): Promise<EdrNetworkAccountConfig[]> {
240240
if (Array.isArray(accounts)) {
241241
return accounts;
242242
}
243243

244244
return derivePrivateKeys(
245-
accounts.mnemonic,
245+
await accounts.mnemonic.get(),
246246
accounts.path,
247247
accounts.initialIndex,
248248
accounts.count,
249-
accounts.passphrase,
249+
await accounts.passphrase.get(),
250250
).map((pk) => ({
251251
privateKey: new FixedValueConfigurationVariable(bytesToHexString(pk)),
252252
balance: accounts.accountsBalance ?? DEFAULT_EDR_NETWORK_BALANCE,

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/request-handlers/hanlders-array.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type {
66

77
import { numberToHexString } from "@ignored/hardhat-vnext-utils/hex";
88

9-
import { isHdAccountsUserConfig } from "../type-validation.js";
9+
import { isHdAccountsConfig } from "../type-validation.js";
1010

1111
import { AutomaticSenderHandler } from "./handlers/accounts/automatic-sender-handler.js";
1212
import { FixedSenderHandler } from "./handlers/accounts/fixed-sender-handler.js";
@@ -96,15 +96,15 @@ export async function createHandlersArray<
9696
requestHandlers.push(
9797
new LocalAccountsHandler(networkConnection.provider, resolvedAccounts),
9898
);
99-
} else if (isHdAccountsUserConfig(accounts)) {
99+
} else if (isHdAccountsConfig(accounts)) {
100100
requestHandlers.push(
101101
new HDWalletHandler(
102102
networkConnection.provider,
103-
accounts.mnemonic,
103+
await accounts.mnemonic.get(),
104104
accounts.path,
105105
accounts.initialIndex,
106106
accounts.count,
107-
accounts.passphrase,
107+
await accounts.passphrase.get(),
108108
),
109109
);
110110
}

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/type-extensions/config.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ declare module "../../../../types/config.js" {
3333
| HttpNetworkHDAccountsUserConfig;
3434

3535
export interface HttpNetworkHDAccountsUserConfig {
36-
mnemonic: string;
36+
mnemonic: SensitiveString;
3737
count?: number;
3838
initialIndex?: number;
39-
passphrase?: string;
39+
passphrase?: SensitiveString;
4040
path?: string;
4141
}
4242

@@ -82,11 +82,11 @@ declare module "../../../../types/config.js" {
8282
}
8383

8484
export interface EdrNetworkHDAccountsUserConfig {
85-
mnemonic?: string;
85+
mnemonic?: SensitiveString;
8686
accountsBalance?: string | bigint;
8787
count?: number;
8888
initialIndex?: number;
89-
passphrase?: string;
89+
passphrase?: SensitiveString;
9090
path?: string;
9191
}
9292

@@ -151,10 +151,10 @@ declare module "../../../../types/config.js" {
151151
| HttpNetworkHDAccountsConfig;
152152

153153
export interface HttpNetworkHDAccountsConfig {
154-
mnemonic: string;
154+
mnemonic: ResolvedConfigurationVariable;
155155
count: number;
156156
initialIndex: number;
157-
passphrase: string;
157+
passphrase: ResolvedConfigurationVariable;
158158
path: string;
159159
}
160160

@@ -200,11 +200,11 @@ declare module "../../../../types/config.js" {
200200
}
201201

202202
export interface EdrNetworkHDAccountsConfig {
203-
mnemonic: string;
203+
mnemonic: ResolvedConfigurationVariable;
204204
accountsBalance: bigint;
205205
count: number;
206206
initialIndex: number;
207-
passphrase: string;
207+
passphrase: ResolvedConfigurationVariable;
208208
path: string;
209209
}
210210

Diff for: v-next/hardhat/src/internal/builtin-plugins/network-manager/type-validation.ts

+17-8
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import type {
22
HardhatUserConfig,
3+
HttpNetworkAccountsConfig,
34
HttpNetworkAccountsUserConfig,
5+
HttpNetworkHDAccountsConfig,
46
HttpNetworkHDAccountsUserConfig,
57
NetworkConfig,
68
} from "../../../types/config.js";
@@ -15,6 +17,7 @@ import {
1517
conditionalUnionType,
1618
configurationVariableSchema,
1719
resolvedConfigurationVariableSchema,
20+
sensitiveStringSchema,
1821
sensitiveUrlSchema,
1922
unionType,
2023
validateUserConfigZodType,
@@ -48,10 +51,10 @@ const accountsPrivateKeyUserConfigSchema = unionType(
4851
);
4952

5053
const httpNetworkHDAccountsUserConfigSchema = z.object({
51-
mnemonic: z.string(),
54+
mnemonic: sensitiveStringSchema,
5255
count: z.optional(nonnegativeIntSchema),
5356
initialIndex: z.optional(nonnegativeIntSchema),
54-
passphrase: z.optional(z.string()),
57+
passphrase: z.optional(sensitiveStringSchema),
5558
path: z.optional(z.string()),
5659
});
5760

@@ -109,11 +112,11 @@ const edrNetworkAccountUserConfigSchema = z.object({
109112
});
110113

111114
const edrNetworkHDAccountsUserConfigSchema = z.object({
112-
mnemonic: z.optional(z.string()),
115+
mnemonic: z.optional(sensitiveStringSchema),
113116
accountsBalance: z.optional(accountBalanceUserConfigSchema),
114117
count: z.optional(nonnegativeIntSchema),
115118
initialIndex: z.optional(nonnegativeIntSchema),
116-
passphrase: z.optional(z.string()),
119+
passphrase: z.optional(sensitiveStringSchema),
117120
path: z.optional(z.string()),
118121
});
119122

@@ -279,10 +282,10 @@ const gasConfigSchema = unionType(
279282
);
280283

281284
const httpNetworkHDAccountsConfigSchema = z.object({
282-
mnemonic: z.string(),
285+
mnemonic: resolvedConfigurationVariableSchema,
283286
count: nonnegativeIntSchema,
284287
initialIndex: nonnegativeIntSchema,
285-
passphrase: z.string(),
288+
passphrase: resolvedConfigurationVariableSchema,
286289
path: z.string(),
287290
});
288291

@@ -322,11 +325,11 @@ const edrNetworkAccountConfigSchema = z.object({
322325
});
323326

324327
const edrNetworkHDAccountsConfigSchema = z.object({
325-
mnemonic: z.string(),
328+
mnemonic: resolvedConfigurationVariableSchema,
326329
accountsBalance: accountBalanceConfigSchema,
327330
count: nonnegativeIntSchema,
328331
initialIndex: nonnegativeIntSchema,
329-
passphrase: z.string(),
332+
passphrase: resolvedConfigurationVariableSchema,
330333
path: z.string(),
331334
});
332335

@@ -442,3 +445,9 @@ export function isHdAccountsUserConfig(
442445
): accounts is HttpNetworkHDAccountsUserConfig {
443446
return isObject(accounts);
444447
}
448+
449+
export function isHdAccountsConfig(
450+
accounts: HttpNetworkAccountsConfig,
451+
): accounts is HttpNetworkHDAccountsConfig {
452+
return isObject(accounts);
453+
}

Diff for: v-next/hardhat/test/internal/builtin-plugins/network-manager/hook-handlers/config.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -729,7 +729,7 @@ describe("network-manager/hook-handlers/config", () => {
729729
[
730730
{
731731
path: ["networks", "localhost", "accounts", "mnemonic"],
732-
message: "Required",
732+
message: "Expected a string or a Configuration Variable",
733733
},
734734
],
735735
);
@@ -742,7 +742,7 @@ describe("network-manager/hook-handlers/config", () => {
742742
[
743743
{
744744
path: ["networks", "localhost", "accounts", "mnemonic"],
745-
message: "Expected string, received number",
745+
message: "Expected a string or a Configuration Variable",
746746
},
747747
],
748748
);
@@ -798,7 +798,7 @@ describe("network-manager/hook-handlers/config", () => {
798798
[
799799
{
800800
path: ["networks", "localhost", "accounts", "mnemonic"],
801-
message: "Required",
801+
message: "Expected a string or a Configuration Variable",
802802
},
803803
],
804804
);
@@ -811,7 +811,7 @@ describe("network-manager/hook-handlers/config", () => {
811811
[
812812
{
813813
path: ["networks", "localhost", "accounts", "mnemonic"],
814-
message: "Required",
814+
message: "Expected a string or a Configuration Variable",
815815
},
816816
],
817817
);
@@ -1124,7 +1124,7 @@ describe("network-manager/hook-handlers/config", () => {
11241124
[
11251125
{
11261126
path: ["networks", "localhost", "accounts", "mnemonic"],
1127-
message: "Expected string, received number",
1127+
message: "Expected a string or a Configuration Variable",
11281128
},
11291129
],
11301130
);
@@ -1411,11 +1411,11 @@ describe("network-manager/hook-handlers/config", () => {
14111411
gasMultiplier: 1.5,
14121412
gasPrice: 100n,
14131413
accounts: {
1414-
mnemonic: "asd asd asd",
1414+
mnemonic: new FixedValueConfigurationVariable("asd asd asd"),
14151415
initialIndex: 0,
14161416
count: 20,
14171417
path: "m/44'/60'/0'/0",
1418-
passphrase: "passphrase",
1418+
passphrase: new FixedValueConfigurationVariable("passphrase"),
14191419
},
14201420
url: new FixedValueConfigurationVariable(
14211421
"http://node.myNetwork.com",

Diff for: v-next/hardhat/test/internal/builtin-plugins/network-manager/request-handlers/e2e.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { HttpNetworkHDAccountsConfig } from "../../../../../src/types/config.js";
1+
import type { HttpNetworkHDAccountsUserConfig } from "../../../../../src/types/config.js";
22

33
import assert from "node:assert/strict";
44
import { describe, it } from "node:test";
@@ -196,7 +196,7 @@ describe("request-handlers - e2e", () => {
196196
const MOCKED_GAS_LIMIT = 21000;
197197
const GAS_MULTIPLIER = 1.337;
198198
const LATEST_BASE_FEE_IN_MOCKED_PROVIDER = 80;
199-
const HD_ACCOUNT: HttpNetworkHDAccountsConfig = {
199+
const HD_ACCOUNT: HttpNetworkHDAccountsUserConfig = {
200200
mnemonic:
201201
"couch hunt wisdom giant regret supreme issue sing enroll ankle type husband",
202202
path: "m/44'/60'/0'/0/",

0 commit comments

Comments
 (0)