Found while building a TypeScript frame-transaction library against the hegota-testnet chain. All three verified against branch hegota-testnet and the live https://rpc1.privacy.ethrex.xyz (web3_clientVersion = ethrex/v23.0.0-hegota-testnet-31b5322665.../rustc-v1.93.1). Not blocking — but each would mislead someone implementing from the docs.
1. docs/eip-8141.md — the "Wire encoding" section is the pre-composition layout
It shows:
0x06 || rlp([chain_id, nonce, sender, frames, signatures,
max_priority_fee_per_gas, max_fee_per_gas,
max_fee_per_blob_gas, blob_versioned_hashes])
and a frame as [mode, flags, target, gas_limit, value, data], and the sig_hash section repeats the same flat form.
The deployed chain (ethrex's own scripts/hegota-testnet/frametx.py) accepts:
0x06 || rlp([chain_id, nonce_keys, nonce_seq, sender, frames, signatures,
fees, blob_hashes, recent_root_references])
fees = rlp([max_priority_fee, max_fee, max_blob_fee])
frame = [mode, flags, target_or_empty, limits, value, data] # limits = [execution, state]
i.e. EIP-8250 splits nonce → nonce_keys, nonce_seq, EIP-8037 turns gas_limit → limits, the three fee fields nest into a fees list, and EIP-8272 appends recent_root_references. A builder following §"Wire encoding" produces bytes the node rejects at RLP decode. hegota-testnet-spec.md describes the EIP-8272 change, but the eip-8141.md Wire encoding section neither reflects the composition nor points to where it is documented.
2. docs/eip-8141.md — FRAME_TX_INTRINSIC_COST documented as 15000
§"Gas Accounting" → "Total gas limit":
mandatory_gas = FRAME_TX_INTRINSIC_COST # 15000
crates/common/types/transaction.rs:2195 is pub const FRAME_TX_INTRINSIC_COST: u64 = 12000; — with the compile-time assert!(FRAME_TX_INTRINSIC_COST == 12_000) at :2221 and the comment at :2190 ("down from the earlier 15000"). The same block's standard_gas_limit = mandatory_gas + data_cost + Σ(frame.gas_limit) also omits the Σ frame.limits.state and recent_root_reference_intrinsic_gas terms that FrameTransaction::standard_gas_limit() adds.
3. docs/hegota-testnet-spec.md:74 lists debug as served, but the endpoint refuses it
$ curl -s https://rpc1.privacy.ethrex.xyz -H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"debug_getRawTransaction","params":["0x0000000000000000000000000000000000000000000000000000000000000000"]}'
{"jsonrpc": "2.0", "id": 1, "error": {"code": -32601, "message": "debug_getRawTransaction is not available on this endpoint"}}
The JSON-RPC row lists eth, net, web3, txpool, debug and ethrex. debug_* is refused with -32601, and eth_getRawTransactionByHash is -32601 Method not found too — so there is no way to get a transaction's canonical bytes from this endpoint; they have to be reconstructed from the decoded JSON. Either the proxy config or the doc row is off. (Exposing eth_getRawTransactionByHash, which most clients serve, would also be a clean fix.)
Happy to send a docs PR for 1 and 2 if that's useful.
Found while building a TypeScript frame-transaction library against the
hegota-testnetchain. All three verified against branchhegota-testnetand the livehttps://rpc1.privacy.ethrex.xyz(web3_clientVersion=ethrex/v23.0.0-hegota-testnet-31b5322665.../rustc-v1.93.1). Not blocking — but each would mislead someone implementing from the docs.1.
docs/eip-8141.md— the "Wire encoding" section is the pre-composition layoutIt shows:
and a frame as
[mode, flags, target, gas_limit, value, data], and the sig_hash section repeats the same flat form.The deployed chain (ethrex's own
scripts/hegota-testnet/frametx.py) accepts:i.e. EIP-8250 splits
nonce→nonce_keys, nonce_seq, EIP-8037 turnsgas_limit→limits, the three fee fields nest into afeeslist, and EIP-8272 appendsrecent_root_references. A builder following §"Wire encoding" produces bytes the node rejects at RLP decode.hegota-testnet-spec.mddescribes the EIP-8272 change, but the eip-8141.md Wire encoding section neither reflects the composition nor points to where it is documented.2.
docs/eip-8141.md—FRAME_TX_INTRINSIC_COSTdocumented as 15000§"Gas Accounting" → "Total gas limit":
crates/common/types/transaction.rs:2195ispub const FRAME_TX_INTRINSIC_COST: u64 = 12000;— with the compile-timeassert!(FRAME_TX_INTRINSIC_COST == 12_000)at :2221 and the comment at :2190 ("down from the earlier 15000"). The same block'sstandard_gas_limit = mandatory_gas + data_cost + Σ(frame.gas_limit)also omits theΣ frame.limits.stateandrecent_root_reference_intrinsic_gasterms thatFrameTransaction::standard_gas_limit()adds.3.
docs/hegota-testnet-spec.md:74listsdebugas served, but the endpoint refuses itThe JSON-RPC row lists
eth, net, web3, txpool, debug and ethrex.debug_*is refused with-32601, andeth_getRawTransactionByHashis-32601 Method not foundtoo — so there is no way to get a transaction's canonical bytes from this endpoint; they have to be reconstructed from the decoded JSON. Either the proxy config or the doc row is off. (Exposingeth_getRawTransactionByHash, which most clients serve, would also be a clean fix.)Happy to send a docs PR for 1 and 2 if that's useful.