
The core Ethereum protocol suite in TypeScript. EVM, Trie, Block & Tx execution for Node.js and browser. Longtime @ethereumfndn project, community-led.
Joined November 2020
- Tweets589
- Following287
- Followers1.9K
- Likes495
Gotcha #1 — validate vs build:
Validating: missing contracts → invalid block.
Building (generate: true): missing/failing call → empty request.
Local demos can seed STOP bytecode; devnets ship full contract code.
In @ethereumjs/vm:
runBlock() on Hardfork.Amsterdam already calls accumulateRequests().
Builder requests append after deposit / withdrawal / consolidation.
Read result.requests + result.requestsHash — same Prague+ pipeline, two new types.
Gotcha for 7997:
Clients must NOT inject the factory at the fork boundary.
In @ethereumjs/vm you seed it yourself — nonce 1 + runtime bytecode from the EIP — then call it like any contract.
On Hardfork.Amsterdam:
maxCodeSize = 65536
maxInitCodeSize = 131072
Prague rejects 24,577 bytes.
Amsterdam accepts it.
Same initcode path — the EVM just stops reverting at the old limit.
Decode with @ethereumjs/evm:
decodeEIP7708TransferLog(log)
→ { from, to, value }
One value transfer → 1 log in our example.
Burn logs use Burn(address,uint256) on balance-removal paths.
In @ethereumjs/vm:
const result = await runTx(vm, { tx, block })
const logs = result.receipt.logs
No new API beyond Hardfork.Amsterdam.
If the tx reverts → empty logs (as today).
Then read:
result.blockLevelAccessList
One plain ETH transfer → 4 accounts in the BAL on our example.
Header hash must match bal.hash().
Mismatch = invalid block.
Builder flow in @ethereumjs/vm:
runBlock(vm, {
block,
generate: true,
})
No extra flag beyond Amsterdam.
The VM accumulates accesses automatically while executing.









