Skip to content

Commit 6758ff2

Browse files
committed
build: upgrade to EDR v0.12.0-alpha.0
1 parent e665b96 commit 6758ff2

File tree

4 files changed

+121
-88
lines changed

4 files changed

+121
-88
lines changed

packages/hardhat-core/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@
9999
"dependencies": {
100100
"@ethereumjs/util": "^9.1.0",
101101
"@ethersproject/abi": "^5.1.2",
102-
"@nomicfoundation/edr": "^0.10.0",
102+
"@nomicfoundation/edr": "^0.12.0-alpha.0",
103103
"@nomicfoundation/solidity-analyzer": "^0.1.0",
104104
"@sentry/node": "^5.18.1",
105105
"@types/bn.js": "^5.1.0",

packages/hardhat-core/src/internal/hardhat-network/provider/provider.ts

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -62,14 +62,19 @@ export const DEFAULT_COINBASE = "0xc014ba5ec014ba5ec014ba5ec014ba5ec014ba5e";
6262
let _globalEdrContext: EdrContext | undefined;
6363

6464
// Lazy initialize the global EDR context.
65-
export function getGlobalEdrContext(): EdrContext {
66-
const { EdrContext } = requireNapiRsModule(
67-
"@nomicfoundation/edr"
68-
) as typeof import("@nomicfoundation/edr");
65+
export async function getGlobalEdrContext(): Promise<EdrContext> {
66+
const { EdrContext, GENERIC_CHAIN_TYPE, genericChainProviderFactory } =
67+
requireNapiRsModule(
68+
"@nomicfoundation/edr"
69+
) as typeof import("@nomicfoundation/edr");
6970

7071
if (_globalEdrContext === undefined) {
7172
// Only one is allowed to exist
7273
_globalEdrContext = new EdrContext();
74+
await _globalEdrContext.registerProviderFactory(
75+
GENERIC_CHAIN_TYPE,
76+
genericChainProviderFactory()
77+
);
7378
}
7479

7580
return _globalEdrContext;
@@ -133,9 +138,10 @@ export class EdrProviderWrapper
133138
loggerConfig: LoggerConfig,
134139
tracingConfig?: TracingConfigWithBuffers
135140
): Promise<EdrProviderWrapper> {
136-
const { Provider } = requireNapiRsModule(
137-
"@nomicfoundation/edr"
138-
) as typeof import("@nomicfoundation/edr");
141+
const { GENERIC_CHAIN_TYPE, l1GenesisState, l1HardforkFromString } =
142+
requireNapiRsModule(
143+
"@nomicfoundation/edr"
144+
) as typeof import("@nomicfoundation/edr");
139145

140146
const coinbase = config.coinbase ?? DEFAULT_COINBASE;
141147

@@ -179,8 +185,16 @@ export class EdrProviderWrapper
179185

180186
const hardforkName = getHardforkName(config.hardfork);
181187

182-
const provider = await Provider.withConfig(
183-
getGlobalEdrContext(),
188+
const genesisState =
189+
fork !== undefined
190+
? [] // TODO: Add support for overriding remote fork state when the local fork is different
191+
: l1GenesisState(
192+
l1HardforkFromString(ethereumsjsHardforkToEdrSpecId(hardforkName))
193+
);
194+
195+
const context = await getGlobalEdrContext();
196+
const provider = await context.createProvider(
197+
GENERIC_CHAIN_TYPE,
184198
{
185199
allowBlocksWithSameTimestamp:
186200
config.allowBlocksWithSameTimestamp ?? false,
@@ -209,13 +223,8 @@ export class EdrProviderWrapper
209223
coinbase: Buffer.from(coinbase.slice(2), "hex"),
210224
enableRip7212: config.enableRip7212,
211225
fork,
226+
genesisState,
212227
hardfork: ethereumsjsHardforkToEdrSpecId(hardforkName),
213-
genesisAccounts: config.genesisAccounts.map((account) => {
214-
return {
215-
secretKey: account.privateKey,
216-
balance: BigInt(account.balance),
217-
};
218-
}),
219228
initialDate,
220229
initialBaseFeePerGas:
221230
config.initialBaseFeePerGas !== undefined
@@ -230,6 +239,12 @@ export class EdrProviderWrapper
230239
},
231240
},
232241
networkId: BigInt(config.networkId),
242+
ownedAccounts: config.genesisAccounts.map((account) => {
243+
return {
244+
secretKey: account.privateKey,
245+
balance: BigInt(account.balance),
246+
};
247+
}),
233248
},
234249
{
235250
enable: loggerConfig.enabled,
@@ -242,10 +257,12 @@ export class EdrProviderWrapper
242257
}
243258
},
244259
},
245-
tracingConfig ?? {},
246-
(event: SubscriptionEvent) => {
247-
eventAdapter.emit("ethEvent", event);
248-
}
260+
{
261+
subscriptionCallback: (event: SubscriptionEvent) => {
262+
eventAdapter.emit("ethEvent", event);
263+
},
264+
},
265+
tracingConfig ?? {}
249266
);
250267

251268
const minimalEthereumJsNode = {
@@ -398,18 +415,20 @@ export class EdrProviderWrapper
398415
}
399416

400417
// temporarily added to make smock work with HH+EDR
401-
private _setCallOverrideCallback(callback: CallOverrideCallback) {
418+
private async _setCallOverrideCallback(
419+
callback: CallOverrideCallback
420+
): Promise<void> {
402421
this._callOverrideCallback = callback;
403422

404-
this._provider.setCallOverrideCallback(
423+
await this._provider.setCallOverrideCallback(
405424
async (address: Buffer, data: Buffer) => {
406425
return this._callOverrideCallback?.(address, data);
407426
}
408427
);
409428
}
410429

411-
private _setVerboseTracing(enabled: boolean) {
412-
this._provider.setVerboseTracing(enabled);
430+
private async _setVerboseTracing(enabled: boolean): Promise<void> {
431+
await this._provider.setVerboseTracing(enabled);
413432
}
414433

415434
private _ethEventListener(event: SubscriptionEvent) {

packages/hardhat-core/src/internal/hardhat-network/provider/utils/convertToEdr.ts

Lines changed: 45 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
1-
import type {
2-
SpecId,
3-
MineOrdering,
4-
IntervalRange,
5-
DebugTraceResult,
6-
TracingMessage,
7-
TracingMessageResult,
8-
TracingStep,
1+
import {
2+
type SpecId,
3+
type MineOrdering,
4+
type IntervalRange,
5+
type DebugTraceResult,
6+
type TracingMessage,
7+
type TracingMessageResult,
8+
type TracingStep,
9+
FRONTIER,
10+
HOMESTEAD,
11+
DAO_FORK,
12+
TANGERINE,
13+
SPURIOUS_DRAGON,
14+
BYZANTIUM,
15+
CONSTANTINOPLE,
16+
PETERSBURG,
17+
ISTANBUL,
18+
MUIR_GLACIER,
19+
BERLIN,
20+
LONDON,
21+
ARROW_GLACIER,
22+
GRAY_GLACIER,
23+
MERGE,
24+
SHANGHAI,
25+
CANCUN,
26+
PRAGUE,
927
} from "@nomicfoundation/edr";
1028
import { Address } from "@ethereumjs/util";
1129

@@ -21,48 +39,44 @@ import {
2139

2240
/* eslint-disable @nomicfoundation/hardhat-internal-rules/only-hardhat-error */
2341

24-
export function ethereumsjsHardforkToEdrSpecId(hardfork: HardforkName): SpecId {
25-
const { SpecId } = requireNapiRsModule(
26-
"@nomicfoundation/edr"
27-
) as typeof import("@nomicfoundation/edr");
28-
42+
export function ethereumsjsHardforkToEdrSpecId(hardfork: HardforkName): string {
2943
switch (hardfork) {
3044
case HardforkName.FRONTIER:
31-
return SpecId.Frontier;
45+
return FRONTIER;
3246
case HardforkName.HOMESTEAD:
33-
return SpecId.Homestead;
47+
return HOMESTEAD;
3448
case HardforkName.DAO:
35-
return SpecId.DaoFork;
49+
return DAO_FORK;
3650
case HardforkName.TANGERINE_WHISTLE:
37-
return SpecId.Tangerine;
51+
return TANGERINE;
3852
case HardforkName.SPURIOUS_DRAGON:
39-
return SpecId.SpuriousDragon;
53+
return SPURIOUS_DRAGON;
4054
case HardforkName.BYZANTIUM:
41-
return SpecId.Byzantium;
55+
return BYZANTIUM;
4256
case HardforkName.CONSTANTINOPLE:
43-
return SpecId.Constantinople;
57+
return CONSTANTINOPLE;
4458
case HardforkName.PETERSBURG:
45-
return SpecId.Petersburg;
59+
return PETERSBURG;
4660
case HardforkName.ISTANBUL:
47-
return SpecId.Istanbul;
61+
return ISTANBUL;
4862
case HardforkName.MUIR_GLACIER:
49-
return SpecId.MuirGlacier;
63+
return MUIR_GLACIER;
5064
case HardforkName.BERLIN:
51-
return SpecId.Berlin;
65+
return BERLIN;
5266
case HardforkName.LONDON:
53-
return SpecId.London;
67+
return LONDON;
5468
case HardforkName.ARROW_GLACIER:
55-
return SpecId.ArrowGlacier;
69+
return ARROW_GLACIER;
5670
case HardforkName.GRAY_GLACIER:
57-
return SpecId.GrayGlacier;
71+
return GRAY_GLACIER;
5872
case HardforkName.MERGE:
59-
return SpecId.Merge;
73+
return MERGE;
6074
case HardforkName.SHANGHAI:
61-
return SpecId.Shanghai;
75+
return SHANGHAI;
6276
case HardforkName.CANCUN:
63-
return SpecId.Cancun;
77+
return CANCUN;
6478
case HardforkName.PRAGUE:
65-
return SpecId.Prague;
79+
return PRAGUE;
6680
default:
6781
const _exhaustiveCheck: never = hardfork;
6882
throw new Error(

pnpm-lock.yaml

Lines changed: 33 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)