@@ -12,6 +12,7 @@ import {
1212 opHardforkFromString ,
1313 type AccountOverride ,
1414} from "@nomicfoundation/edr" ;
15+ import { bytesToHexString } from "@nomicfoundation/hardhat-utils/hex" ;
1516import { AsyncMutex } from "@nomicfoundation/hardhat-utils/synchronization" ;
1617import { hexToBytes } from "ethereum-cryptography/utils" ;
1718
@@ -50,7 +51,7 @@ const genesisStateAndAccountsCache: WeakMap<
5051 Map <
5152 string ,
5253 {
53- genesisState : Map < Uint8Array , AccountOverride > ;
54+ genesisState : Map < string , AccountOverride > ;
5455 ownedAccounts : Array < { secretKey : string ; balance : bigint } > ;
5556 }
5657 >
@@ -66,7 +67,7 @@ export async function getGenesisStateAndOwnedAccounts(
6667 chainType : ChainType ,
6768 specId : string ,
6869) : Promise < {
69- genesisState : Map < Uint8Array , AccountOverride > ;
70+ genesisState : Map < string , AccountOverride > ;
7071 ownedAccounts : Array < { secretKey : string ; balance : bigint } > ;
7172} > {
7273 const cached = genesisStateAndAccountsCache
@@ -131,7 +132,7 @@ async function createGenesisStateAndOwnedAccounts(
131132 chainType : ChainType ,
132133 specId : string ,
133134) : Promise < {
134- genesisState : Map < Uint8Array , AccountOverride > ;
135+ genesisState : Map < string , AccountOverride > ;
135136 ownedAccounts : Array < { secretKey : string ; balance : bigint } > ;
136137} > {
137138 if ( microEthSignerAddress === undefined ) {
@@ -142,7 +143,7 @@ async function createGenesisStateAndOwnedAccounts(
142143
143144 const ownedAccounts = await hardhatAccountsToEdrOwnedAccounts ( accountsConfig ) ;
144145
145- const genesisState : Map < Uint8Array , AccountOverride > = new Map (
146+ const genesisState : Map < string , AccountOverride > = new Map (
146147 ownedAccounts . map ( ( { secretKey, balance } ) => {
147148 const address = hexToBytes ( addr . fromPrivateKey ( secretKey ) ) ;
148149 const accountOverride : AccountOverride = {
@@ -151,7 +152,7 @@ async function createGenesisStateAndOwnedAccounts(
151152 code : new Uint8Array ( ) , // Empty account code, removing potential delegation code when forking
152153 } ;
153154
154- return [ address , accountOverride ] ;
155+ return [ bytesToHexString ( address ) , accountOverride ] ;
155156 } ) ,
156157 ) ;
157158
@@ -162,18 +163,25 @@ async function createGenesisStateAndOwnedAccounts(
162163 ? opGenesisState ( opHardforkFromString ( specId ) )
163164 : l1GenesisState ( l1HardforkFromString ( specId ) ) ;
164165
166+ mergeGenesisState ( genesisState , chainGenesisState ) ;
167+
168+ return { genesisState, ownedAccounts } ;
169+ }
170+
171+ export function mergeGenesisState (
172+ genesisState : Map < string , AccountOverride > ,
173+ chainGenesisState : readonly AccountOverride [ ] ,
174+ ) : void {
165175 for ( const account of chainGenesisState ) {
166- const existingOverride = genesisState . get ( account . address ) ;
176+ const addressKey = bytesToHexString ( account . address ) ;
177+ const existingOverride = genesisState . get ( addressKey ) ;
167178 if ( existingOverride !== undefined ) {
168179 // Favor the genesis state specified by the user
169- account . balance = account . balance ?? existingOverride . balance ;
170- account . nonce = account . nonce ?? existingOverride . nonce ;
171- account . code = account . code ?? existingOverride . code ;
172- account . storage = account . storage ?? existingOverride . storage ;
173- } else {
174- genesisState . set ( account . address , account ) ;
180+ account . balance = existingOverride . balance ?? account . balance ;
181+ account . nonce = existingOverride . nonce ?? account . nonce ;
182+ account . code = existingOverride . code ?? account . code ;
183+ account . storage = existingOverride . storage ?? account . storage ;
175184 }
185+ genesisState . set ( addressKey , account ) ;
176186 }
177-
178- return { genesisState, ownedAccounts } ;
179187}
0 commit comments