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
Some additional security measures for EthereumJS...
2
173
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.
1
4
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.
1
5
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.
1
6
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.
1
10
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.
1
12
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).
1
16
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.
1
10
Builder flow in @ethereumjs/vm: runBlock(vm, { block, generate: true, }) No extra flag beyond Amsterdam. The VM accumulates accesses automatically while executing.
1
12
You should print: regular: 21000 state: 183600 recommended gasLimit: 204600 That's the whole EIP in one transfer.
1
7