Repository navigation
feat(tests): extend EIP-8198 coverage - #3812
Merged
fselmo merged 5 commits intoOct 13, 2026
Merged
Conversation
A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected.
The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged.
The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged.
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## eips/bogota/eip-8198 #3812 +/- ##
=======================================================
Coverage ? 95.01%
=======================================================
Files ? 673
Lines ? 40834
Branches ? 3747
=======================================================
Hits ? 38797
Misses ? 1424
Partials ? 613
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
spencer-tb
approved these changes
Oct 13, 2026
spencer-tb
left a comment
Contributor
There was a problem hiding this comment.
Thanks for the PR! The new pre-fork case fails when Amsterdam prices blobs with the new fraction, so LGTM with two optional nits :D
The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged.
The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork.
fselmo
added a commit
that referenced
this pull request
Oct 14, 2026
* feat(tests): reject the new blob fee fraction one block early A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected. * docs(tests): correct the EIP-8198 blob suites coverage entry The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged. * refactor(tests): derive the EIP-8198 base fee rounding edges The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged. * refactor(tests): parametrize the blob fee rejection by block index The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged. * docs(tests): name the base fee case instead of its value The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork.
6 tasks done
fselmo
added a commit
that referenced
this pull request
Oct 19, 2026
* feat(tests): reject the new blob fee fraction one block early A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected. * docs(tests): correct the EIP-8198 blob suites coverage entry The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged. * refactor(tests): derive the EIP-8198 base fee rounding edges The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged. * refactor(tests): parametrize the blob fee rejection by block index The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged. * docs(tests): name the base fee case instead of its value The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork.
3 of 17 tasks
github-actions Bot
pushed a commit
that referenced
this pull request
Oct 21, 2026
* feat(tests): reject the new blob fee fraction one block early A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected. * docs(tests): correct the EIP-8198 blob suites coverage entry The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged. * refactor(tests): derive the EIP-8198 base fee rounding edges The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged. * refactor(tests): parametrize the blob fee rejection by block index The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged. * docs(tests): name the base fee case instead of its value The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork.
8 tasks done
fselmo
added a commit
that referenced
this pull request
Oct 27, 2026
* Add EIP-7805 on top of Amsterdam (#1928) * src(focil): add FOCIL src features + first set of FOCIL tests (#2643) * feat: continue focil implementation * feat: tests added * fix(tests): derive 7702 set-code gas in FOCIL test from fork calculator * feat: parametrize existing tests * chore: move focil tests to bogota folder * feat: update feature.yaml with focil release support * feat: Bogota fork + EIP-7805 engine_newPayloadV6 bump (#3028) * feat: Bogota fork + EIP-7805 engine_newPayloadV6 bump The first tests-focil release fixtures were filling FOCIL tests with `newPayloadVersion: 5` because no EIP class declared the version bump and there was no fork class to host EIP-7805. As a result `consume engine` appended `inclusionListTransactions` as a 5th positional arg to V5, which isn't a wire format defined by any Engine API spec — all clients reject it. This adds: - EIP7805 mixin under eips/bogota/ with engine_new_payload_version_bump and engine_forkchoice_updated_version_bump - Bogota fork class (Amsterdam + EIP7805), reusing Amsterdam's t8n - Switches FOCIL tests' valid_from marker to Bogota After refilling, fixtures now use engine_newPayloadV6 / forkchoiceUpdatedV5, matching the canonical Engine API PR (ethereum/execution-apis#626). * Address review: BogotaEIPs auto-discovery + feature.yaml --from=Bogota - Add BogotaEIPs sentinel that auto-discovers eip_*.py modules under eips/bogota/, mirroring AmsterdamEIPs. Bogota fork class now inherits BogotaEIPs instead of referencing eips.EIP7805 explicitly. - Switch focil entry in .github/configs/feature.yaml from --until=Amsterdam to --from=Bogota so the FOCIL job fills against the Bogota fork rather than ending at Amsterdam. --------- Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> * fix: focil release range * feat: support bogota in build matrix script * feat: print draft release url for easier discovery * Rename inclusion_list_satisfied field (#3092) * refactor(spec-specs): rename `inclusion_list_satisfied` part 2 (#3095) * fix(specs): Rebase issue * fix(specs): More rebase issues * fix(tests,tools): make the EIP-7805 FOCIL tests fill on the current Amsterdam (#3370) * fix(tests,tools): make the EIP-7805 FOCIL tests fill on the current Amsterdam 21 of the 24 FOCIL tests do not fill on this branch. Three independent causes, none of them in the tests' assertions. t8n passed decoded transactions where raw ones are expected. check_inclusion_list_transactions takes Tuple[LegacyTransaction | Bytes, ...] and calls get_transaction_hash, which asserts isinstance(tx, (LegacyTransaction, Bytes)); the caller passed convert_transaction(...), which returns a decoded fork transaction, so every typed-transaction case died on AssertionError. Both tuples now go through encode_transaction. The scenarios left no gas budget for the block's own access list. They size block_gas_limit to their transactions alone, but the EIP-7928 budget is block_gas_limit // GAS_BLOCK_ACCESS_LIST_ITEM, and the system-contract predeploys touched every block plus senders, recipients and coinbase come to about 30 items against a limit of about 22. Raising the limit alone would change what the scenarios assert, because the gas a pending inclusion-list transaction is allowed comes from block_gas_limit minus the gas the included transactions use. So build_block raises the limit and spends exactly the same amount on ballast transactions, leaving remaining_gas -- and therefore every "fits" and "does not fit" boundary -- unchanged. The ballast is a whole number of empty transfers so the amount is always representable on the fork's calldata-cost lattice. One funding transfer predated value-carrying transactions costing extra intrinsic gas. test_unsatisfied_when_block_tx_funds_pending_il_sender sizes and funds alice's transfer with calc(), but it carries value, so it needs calc(sends_value=True) and was failing INTRINSIC_GAS_BELOW_FLOOR_GAS_COST. Assertions are untouched: of the changed lines in test_focil.py, none touch expected_status, pytest.param, assertions, sender balances, nonces or inclusion-list composition. Scenario ids are unchanged and the reference implementation validates all 24 expected outcomes during fill. * Apply suggestions from code review Co-authored-by: Mario Vega <marioevz@gmail.com> * fix: lint --------- Co-authored-by: Mario Vega <marioevz@gmail.com> * fix(specs): fix check_inclusion_list_transactions * fix(tests): fix import * refactor(test-specs,tests): Refactor inclusion-list spec definitions, existing tests (#3373) * feat(test-specs): Add inclusion list satisfied verification to block * fix(test-specs): fix framework on missing inclusion list * refactor(tests): refactor existing focil tests * nit(test-specs): Unnecessary comment * Apply suggestions from code review Co-authored-by: spencer <spencer.tb@ethereum.org> Co-authored-by: Mario Vega <marioevz@gmail.com> --------- Co-authored-by: spencer <spencer.tb@ethereum.org> * feat(specs,test-specs,tests): Update Engine API to latest Bogota spec, implement IL inclusion_test (#3401) * fix(specs,test-forks): Fix Bogota filling with EIP-7805 * fix(test-fixtures,test-specs): Update Engine API to latest version * fix(test-fixtures): Label suffix fix (backport safe) * fix(test-fixtures): Unit tests (backport safe) * feat(test-specs): Implement inclusion list variant of inclusion_test marked tests * bug(specs): Fix type-3, invalid RLP, and invalid chain id txs in inclusion lists * bug(test-specs): Fix inclusion_test filling * fix(tests): Blob test * fix(tests): clear rlp_modifier when building inclusion-list variants (#3406) The inclusion-list variant moves the last transaction of the last block out of the block body and into the inclusion list, then clears the expectations derived from it: header_verify, expected_gas_used and expected_block_access_list. rlp_modifier was left in place. rlp_modifier force-writes header fields onto the built block after the transition tool has run, and tests compute it from the pre-move transaction list. The moved transaction therefore keeps contributing to the header even though it no longer executes in the block, producing fixtures whose header contradicts their own body. Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> * fix(tests): count top-frame state gas once in FOCIL OOG scenarios * chore(ci,test-consume,test-specs,tests): backport devnets/focil/0 fixes to eip-7805 (#3595) * fix(github): EIP-7805 Devnet config Backported without the whitespace-only runs-on reformatting. (cherry picked from commit 5f46130) * fix(consume): require null inclusionListSatisfied on non-VALID payloads (#3470) Port the engine simulator's inclusionListSatisfied guard from #3410 to the devnets/focil/0 simulator. The check previously asserted a non-null response field whenever the fixture stamped one, regardless of the payload's expected status; execution-apis bogota.md requires the field to be null for any payload not deemed VALID, so the check demanded a spec violation. tests-focil-devnet v0.2.0 stamps the field on 5,489 expected-INVALID engine fixtures, which fail for every client on the Hive focil board with "expected inclusion_list_satisfied in response". The ported guard is verbatim from #3410: a payload not deemed VALID must report null, and only VALID payloads have the fixture's expected verdict enforced. Fixes #3436 for the consume path independently of a fixture refill. (cherry picked from commit 67a9345) * fix(tests,test-specs): fix invalid inclusion-list engine fixture generation (#3471) * fix(tests): clear rlp_modifier when building inclusion-list variants (#3406) The inclusion-list variant moves the last transaction of the last block out of the block body and into the inclusion list, then clears the expectations derived from it: header_verify, expected_gas_used and expected_block_access_list. rlp_modifier was left in place. rlp_modifier force-writes header fields onto the built block after the transition tool has run, and tests compute it from the pre-move transaction list. The moved transaction therefore keeps contributing to the header even though it no longer executes in the block, producing fixtures whose header contradicts their own body. Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> * fix(focil): omit inclusion list result for invalid payloads * fix(tests): give test_tx_gas_limit a block gas limit a valid block fits in The test pinned the block gas limit to 21000 with a 21001-gas transaction to trigger GAS_ALLOWANCE_EXCEEDED. On forks with the EIP-7928 block-access-list item budget (gas_limit // 2000) a 21000-gas-limit block allows 10 items, which is below the protocol-level writes of even an empty block, so no block in this environment can be valid. The test itself never noticed - its block is expected invalid - but its auto-generated inclusion-list variant moves the failing transaction into the inclusion list and expects the emptied block to be VALID, producing a fixture that the spec's own state transition rejects (tests-focil-devnet@v0.2.0, blockchain_test_engine_inclusion_list, the one non-blob entry in the 127 broken engine fixtures). Scale the numbers to 100_000/100_001: the allowance check still fires the same way, and the item budget (50) now accommodates an empty block, so the inclusion-list variant fills to a genuinely valid block. * fix(test-specs): splat the metadata regression block from untyped kwargs The regression test from #3445 constructs a BuiltBlock through model_construct with object() sentinels for fields that get_fixture_engine_new_payload only forwards, which the typechecker rejects for missing and mistyped named arguments. model_construct skips validation and the sentinels are never read, so splat them from a dict[str, Any] instead of passing them as checked named arguments. * fix(tests): align test_tx_gas_limit with its #3566 counterpart Byte-identical to the forks/amsterdam hunk so the next focil rebase resolves cleanly; fixture output is unchanged. --------- Co-authored-by: Marc <Marchhill@users.noreply.github.com> Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> Co-authored-by: chugarchugarr <josephlerma19@gmail.com> Co-authored-by: Felipe Selmo <fselmo2@gmail.com> (cherry picked from commit 65f4222) --------- Co-authored-by: marioevz <marioevz@gmail.com> Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com> Co-authored-by: Marc <Marchhill@users.noreply.github.com> Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> Co-authored-by: chugarchugarr <josephlerma19@gmail.com> * fix(ci,test): fix issues with PR CI runs in focil branch (#3594) * fix(tests): use a nonce collision in the FOCIL creation-collision scenario * refactor(spec-specs,test-forks,tests): move EIP-7805 onto the Bogota fork module * fix(test-forks): pin Bogota's FOCIL engine method versions The EIP-7805 mixin bumps Bogota to engine_newPayloadV6 and engine_forkchoiceUpdatedV5; the fork test still pinned the pre-FOCIL newPayload version. * docs(spec-specs): drop blob exclusion claim from the IL check The inclusion list check never skipped blob transactions, and EIP-7805 does not ask it to; test_block_with_pending_blob_il_tx_is_valid expects an appendable blob transaction to leave the list unsatisfied. * refactor(spec-specs): drop repeated sender checks in the IL check check_transaction already recovers the sender and runs validate_transaction, so the IL check now mirrors process_transaction: the chain id check, then check_transaction. * docs(spec-specs): keep the forks/bogota fork docstring EIP branches that each rewrite the Bogota fork docstring conflict when the devnet workflow merges them, so this branch leaves it as forks/bogota has it; the EIP is listed there when it lands. * fix(tests): skip inclusion-list variants whose entry cannot fit a list (#3502) * fix(tests): skip inclusion-list variants whose entry cannot fit a list * fix(test-specs,test-forks): fail oversized IL entries a test wrote Only the inclusion-list variant moves a test's own transaction into the list, so only it skips an entry over the limit; a list the test wrote fails with a test correctness error. The limit is now a fork accessor named after MAX_TRANSACTIONS_BYTES_PER_INCLUSION_LIST, and the unit test pins both sides of it for both cases. --------- Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> Co-authored-by: fselmo <fselmo2@gmail.com> * feat(consume): check inclusionListSatisfied semantics and probe engine_getInclusionListV1 (#3410) * feat(consume): check inclusionListSatisfied on forkchoice responses to a valid head * feat(consume): probe engine_getInclusionListV1 after chain import on inclusion-list fixtures * feat(test-forks): version engine_getInclusionList by fork EIP-7805 introduces engine_getInclusionListV1, so its mixin now bumps the method version like the other Engine API methods, and the method version test pins it at Amsterdam and Bogota. * fix(consume): check only what getInclusionList must return The spec leaves transaction selection to the client and caps the sum of the transactions' bytes, so the probe no longer requires the seeded transactions back and no longer counts the list's RLP header. Its method version and size limit come from the head block's fork. * fix(test-specs): omit inclusionListSatisfied on engine API errors A payload rejected with an engine API error code is not deemed VALID, so its fixture carries no inclusionListSatisfied, as for payloads with an expected exception. * fix(test-specs): limit inclusion-list variants to engine formats Only the engine and engine X simulators check inclusionListSatisfied, so sync and stateful fixtures no longer get an inclusion-list variant. No inclusion test generates one today, so no fixture changes. * fix(test-specs): reject inclusion tests the variant cannot use An inclusion test whose last block has no transaction, or is invalid only through block exceptions, now fails as a test correctness error instead of crashing or filling a wrong satisfied expectation. * fix(spec-specs): raise catchable errors for bad transaction bytes decode_transaction indexed empty bytes and asserted on a 0xff first byte, so the inclusion list check crashed on such entries instead of skipping them. Both now raise an InvalidTransaction. --------- Co-authored-by: fselmo <fselmo2@gmail.com> * feat(tests): Increase coverage for EIP-7805 tests (#3804) * feat(test-specs): send inclusion list entries as raw bytes Entries reach the transition tool and the fixture as the same bytes, so the verdict is computed on what clients receive, including rlp_override. Block.inclusion_list_txs also accepts Bytes entries for malformed cases. * feat(test-forks): add the inclusion list blob-entry predicate The inclusion list variant now reads fork.inclusion_list_counts_blob_entries() for a moved blob transaction, so a spec change on blob entries is a one-line flip in the EIP-7805 mixin. * feat(tests): skip undecodable inclusion list entries Each malformed entry (empty, a 0x00 byte before a legacy transaction, type bytes 0x7f, 0xff and the first undefined type, a known type with another type's payload, a trailing byte, truncated legacy) leaves the payload satisfied alone and lets the check reach an appendable transaction after it; two well-formed controls show the reused payloads are appendable. * feat(tests): extend FOCIL appendability coverage Covers every non-blob type through with_all_typed_transactions, the fee cap and value in the balance check, withdrawals funding a sender only from the next block, priority fees funding the fee recipient, a delegated sender drained without a nonce change, an entry past one member's byte limit, and entries that count as included only by their exact bytes (access list or authorization list changed); the blob test reads the fork's blob-entry predicate. * feat(tests): mark invalid-authorization set-code txs as inclusion tests A set-code transaction whose authorizations all fail is still valid, so its inclusion list variant expects an omitted copy to leave the payload unsatisfied. * feat(tests): cover more FOCIL appendability checks Add L2 type bytes 0x7d and 0x7e to the undecodable-entry cases, gas limits above the transaction cap at each block room's edge, and one-field pairs for chain id, base fee and sender code. * feat(spec-specs,test-forks): skip blob entries in the IL check EIP-7805's author confirmed that a blob transaction in the inclusion list is ignored for satisfaction, so the check skips it and the fork's blob-entry predicate flips to false. * feat(test-forks): add the merged inclusion list size limit The consensus layer merges up to 16 committee members' lists into the one sent with a payload, so it carries at most 128 KiB; a test that writes a larger list fails to fill. * feat(tests): pin FOCIL ordering, encoding and merged list size Adds a system call funding a pending sender before and after the block's transactions, non-canonical RLP entries, and a full 128 KiB merged list whose last entry still counts. * fix(tests): stop the FOCIL transfer size search from looping Re-signing can shorten r or s by a byte, which left the length search stuck one byte either side of the target for about 1 in 80 sender keys. A miss now also changes the calldata byte, which draws a new signature; all 400 probed keys converge within four tries. * refactor(test-specs): send malformed IL entries through rlp_override Block.inclusion_list_txs takes Transactions again; a malformed entry is a transaction with rlp_override, the idiom malformed block transactions already use. The framework still passes each entry's rlp() bytes to the transition tool and the fixture, so the verdict is judged on exactly what clients receive. * refactor(test-forks): drop the inclusion list blob-entry predicate EIP-7805's check now skips blob transactions outright (ethereum/EIPs#12470), so the fork method that hedged it was False on every fork. The inclusion list variant expects a satisfied payload when the moved transaction is a blob transaction, and its unit test no longer monkeypatches the predicate. * refactor(test-forks): derive the merged IL size from the list limit The merged inclusion list limit is now the committee size times the per-list limit, so 8 KiB has one source. * feat(tests): pin FOCIL blob and chain id skips Blob and wrong-chain entries now also run before an appendable transaction, so a client that stops at a skipped entry fails. The blob test adds a control that includes the blob transaction in the block, and the chain id test adds type-2 and unprotected legacy entries. * feat(tests): spend state gas before the FOCIL gas-cap state edge The block now also creates an account, so the pending transaction's state room is the block gas limit minus state gas already used. A client that ignores block state gas used fails the one-over case. * refactor(tests): name FOCIL type-2 fields and trim docstrings type_2_entry keys its raw field overrides by RLP field name and reads chain id and to from the transaction instead of decoding its own encoding. Also trims the undecodable-entry docstring and sets the match-by-bytes expectation in each branch. * refactor(tests): set FOCIL expectations in each branch The new FOCIL tests now name the expected verdict in each branch and use match like the rest of the module. The base fee pair is named for its boundary, and the same_bytes case says it is the control. Fixtures are unchanged. * docs(spec-specs): name every skip in the IL check docstring The inclusion list check docstring named only the blob skip; it now also names undecodable entries and entries signed for another chain. * refactor(test-specs): fund the IL unit test's signing sender The IL verdict unit test funds the sender the default key signs for, instead of a hard-coded address that would leave the entry unfunded if that default changed. * feat(tests): tighten FOCIL entry matching and drain cases The bytes-matching test gains an entry that changes only the signature's s, and the drained-sender test takes one wei instead of the whole balance, so the pending tx misses being affordable by one wei. The sized transfer reads its nonce from the sender. * feat(tests): skip FOCIL legacy entries with over-64-bit chain ids A pending legacy IL tx whose v encodes this chain's id plus 2**64 has an invalid v and is skipped, so a client that truncates the chain id to 64 bits, and counts the entry, fails it. * chore(ci): fill devnet releases for every fork through Bogota Devnet releases from this branch now fill --until=Bogota, split across the fork ranges, as the frames and bogota devnet releases do (#3418), instead of Bogota alone. * fix(test-specs): seed genesis accounts in FOCIL fixture tests Since #3830, a pre built outside the pre fixture must opt into the fork's genesis accounts, so the inclusion-list fixture tests call with_genesis_accounts(). * ✨ feat(tests): Extend focil test coverage (#3868) * ✨ feat(tests): Extend focil test coverage * fix(tests): drop duplicated parametrize line * fix(tests): keep the parity bit in the y_parity_2 IL case With v=2, a client that reads only the low bit recovers an unfunded sender for types 2 and 4, so the list was satisfied for the wrong reason; v + 2 recovers the funded sender instead. * test(tests): drop the IL authorization-list test The inclusion_test variant of EIP-7702's test_empty_authorization_list already covers the empty list, and the type-4 base-fee case covers an appendable one. * refactor(tests): derive the IL signature test's gas limit The gas limit comes from the fork's intrinsic cost calculator, and each test builds the one authorization a type-4 tx needs. * refactor(tests): run IL signature and base-fee cases on all typed txs with_all_typed_transactions picks up every non-blob type a fork adds, where the hand-written type list would not. * fix(tests): fund the key a lenient s_zero recovery yields With s = 0, a client without the s > 0 check recovers the key -z / r and found that sender unfunded, so the case passed for the wrong reason. --------- Co-authored-by: raxhvl <raxhvl@users.noreply.github.com> Co-authored-by: fselmo <fselmo2@gmail.com> * feat(spec-specs,test-forks,tests): implement EIP-8198 quick slots (#3703) Co-authored-by: spencer-tb <spencer.tb@ethereum.org> * fix(tests): price the value transfer in blob transition txs The pre-fork blob transactions send value to an existing EOA, which EIP-2780 charges in the intrinsic gas, so every one was rejected once a transition from Amsterdam changed the blob schedule. * docs(spec-specs): keep the forks/bogota fork docstring EIP branches that each rewrite the Bogota fork docstring conflict when the devnet workflow merges them, so this branch leaves it as forks/bogota has it; the EIP is listed there when it lands. * feat(tests): extend EIP-8198 coverage (#3812) * feat(tests): reject the new blob fee fraction one block early A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected. * docs(tests): correct the EIP-8198 blob suites coverage entry The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged. * refactor(tests): derive the EIP-8198 base fee rounding edges The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged. * refactor(tests): parametrize the blob fee rejection by block index The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged. * docs(tests): name the base fee case instead of its value The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork. * fix(spec-specs,tests): keep the blob schedule unchanged at Bogota (#3871) * fix(spec-specs,tests): keep the blob schedule unchanged at Bogota EIP-8198 pairs a slot duration change with an EIP-7892 blob schedule entry at the upgrade, so Bogota inherits the blob target, maximum and update fraction like any named fork after Prague. Drop the provisional 12/18 values from the fork and the tests that asserted them. * feat(tests): pin the blob schedule unchanged at the Bogota fork Rewrite the removed blob transition tests to check that the fork block keeps the parent fork's blob target, maximum, and update fraction, and mark the block-level constraint section not applicable. * refactor(test-forks,tests): drop the blob schedule entry mentions Remove the sentences describing the EIP-7892 entry, which this EIP no longer carries, and take the fork block's blob counts from the new fork as the other transition tests do. --------- Co-authored-by: fselmo <fselmo2@gmail.com> * feat(spec-specs,tests): derive Bogota base fee from slot spacing (EIPs#12552) (#3873) * feat(spec-specs,tests): derive the bogota base fee change from slot spacing * fix(spec-specs,test-forks): cap the Bogota base fee change at 1/8 Count a spacing longer than twelve seconds per slot as twelve, as EIPs#12552 now specifies, so the change never exceeds the Amsterdam rule's. The framework reads the denominator from the parent fork instead of the 8 * 12 literal. * feat(test-exceptions): add INVALID_SLOT_NUMBER EIP-8198 rejects a block whose slot number does not exceed its parent's, so tests need an exception to expect for it. * feat(tests): pin the EIP-8198 fork block, cap and slot rule Check that the fork block keeps the 1/8 rule, including after a missed first slot, that spacing above twelve seconds per slot is capped, that a slot gap whose product exceeds 64 bits is handled, and that the slot number must increase from the fork block on. * fix(tests): restore the osaka BPO transition parent timestamp With the blob schedule unchanged at Bogota, this test no longer reaches a Bogota transition, so the earlier timestamp change is not needed. * feat(test-forks,test-specs): add header_slot_number_must_increase Name the EIP-8198 slot ordering rule as its own fork accessor, and give a state test's block one slot number shared by its state and blockchain fixtures, defaulting to one slot after the genesis block. * refactor(tests): gate the SLOTNUM slot cases on slot ordering Branch on header_slot_number_must_increase instead of the base fee predicate, since slot ordering is the rule the cases work around. * feat(tests): cover a fork block after two missed slots Add a fork block whose spacing per slot is not a whole number of seconds, derive the cap cases from the reference slot duration, and space the missed-slot case at the usual slot duration. * docs(spec-specs): note the slot number rule in validate_header * feat(tests): cover uneven slot spacing and the 64-bit cap Add base fee cases whose spacing per slot is not a whole number of seconds, and a pair either side of where the twelve-second cap exceeds 64 bits. --------- Co-authored-by: fselmo <fselmo2@gmail.com> * fix(tooling): build the docker images on uv's trixie base (#3882) Astral stopped publishing bookworm uv images after 0.9.30, so the python3.12-bookworm-slim base is stuck below the uv 0.13.4 that #3880 requires and the repository image fails to build. Use the python3.12-trixie-slim tag, which follows current uv. * Besu: add BlockException.INVALID_SLOT_NUMBER mapping Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.com> --------- Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.com> Co-authored-by: Jihoon Song <jihoonsong@users.noreply.github.com> Co-authored-by: felix <felix314159@users.noreply.github.com> Co-authored-by: Marc <Marchhill@users.noreply.github.com> Co-authored-by: Marc Harvey-Hill <10379486+Marchhill@users.noreply.github.com> Co-authored-by: marioevz <marioevz@gmail.com> Co-authored-by: Ivan Litteri <67517699+ilitteri@users.noreply.github.com> Co-authored-by: spencer <spencer.tb@ethereum.org> Co-authored-by: fselmo <fselmo2@gmail.com> Co-authored-by: chugarchugarr <josephlerma19@gmail.com> Co-authored-by: spencer <spencer.taylor-brown@ethereum.org> Co-authored-by: raxhvl <10168946+raxhvl@users.noreply.github.com> Co-authored-by: raxhvl <raxhvl@users.noreply.github.com> Co-authored-by: Barnabé Monnot <b@barnabemonnot.com> Co-authored-by: Barnabas Busa <busa.barnabas@gmail.com> Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
fselmo
added a commit
that referenced
this pull request
Oct 27, 2026
* feat(tests): reject the new blob fee fraction one block early A client that switches to EIP-8198's update fraction on the last Amsterdam block prices blobs lower and accepts every existing fork test; the new case offers that lower price there and expects the transaction rejected. * docs(tests): correct the EIP-8198 blob suites coverage entry The outside blob suites run at the Amsterdam to Bogota transition through two tests only, and this branch changes one of their files, so the entry names them instead of saying they cover the transition unchanged. * refactor(tests): derive the EIP-8198 base fee rounding edges The base fees where an empty block stops lowering the fee and a full block's rise grows past one wei now come from the fork's numerator, denominator and elasticity, so a new ratio moves them; the values at 5/48 are unchanged. * refactor(tests): parametrize the blob fee rejection by block index The two cases now differ only in which block is rejected, as in test_base_fee_wrong_rule_across_fork, so the unreachable raise goes; the filled fixtures are unchanged. * docs(tests): name the base fee case instead of its value The comment now points at first_larger_rise_after_full_block, since the base fees are derived from the fork.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Some tests for coverage extension of EIP-8198
Related Issues or PRs
N/A.
Checklist
just static<type>(<area>): <description>, where<type>and<area>come from an appropriateC-<type>, respectivelyA-<area>, label. The title should match the target squash commit message.Cute Animal Picture
🐯