diff --git a/lib/state/stateManager.ts b/lib/state/stateManager.ts index 97076ef9a9..bc742f5c37 100644 --- a/lib/state/stateManager.ts +++ b/lib/state/stateManager.ts @@ -526,7 +526,11 @@ export default class StateManager { addresses, (address: string, done: any) => { const account = new Account() - account.balance = new BN(initState[address]).toArrayLike(Buffer) + if (initState[address].slice(0, 2) === '0x') { + account.balance = new BN(initState[address].slice(2), 16).toArrayLike(Buffer) + } else { + account.balance = new BN(initState[address]).toArrayLike(Buffer) + } const addressBuffer = utils.toBuffer(address) this._trie.put(addressBuffer, account.serialize(), done) }, diff --git a/tests/api/state/stateManager.js b/tests/api/state/stateManager.js index 7fbf86340c..9bd82c3e8d 100644 --- a/tests/api/state/stateManager.js +++ b/tests/api/state/stateManager.js @@ -138,6 +138,25 @@ tape('StateManager', (t) => { st.end() }) + t.test('should generate correct genesis state root for all chains', async (st) => { + const chains = ['mainnet', 'ropsten', 'rinkeby', 'kovan', 'goerli'] + for (const chain of chains) { + const common = new Common(chain, 'petersburg') + const expectedStateRoot = Buffer.from(common.genesis().stateRoot.slice(2), 'hex') + const stateManager = new StateManager({ common: common }) + + const generateCanonicalGenesis = promisify((...args) => stateManager.generateCanonicalGenesis(...args)) + const getStateRoot = promisify((...args) => stateManager.getStateRoot(...args)) + + await generateCanonicalGenesis() + let stateRoot = await getStateRoot() + + st.true(stateRoot.equals(expectedStateRoot), `generateCanonicalGenesis should produce correct state root for ${chain}`) + } + + st.end() + }) + t.test('should dump storage', async st => { const stateManager = new StateManager() const addressBuffer = Buffer.from('a94f5374fce5edbc8e2a8697c15331677e6ebf0b', 'hex')