The published line and the local line of this repository had no common ancestor: the public one carried the hygiene pass (no host names, no internal paths), the local one carried a month of corrections that never shipped. This commit ports the local work onto the public line, keeping the public hygiene wording wherever the two touched the same sentence, and keeping the public version of AERE-CROSS-CLIENT-DETERMINISM.md entirely. Carried: LICENSE/LICENSING corrections, VERIFY-POLICY.md, CITATIONS-UNRESOLVED.md remeasured 2026-08-11, the 'audited' adjective removed from next to Bouncy Castle, citation paths rewritten to published form, AIP-8, the QA consolidation report, the second EIP validation pass, fork-height corrections, the AereSink / threshold-factory correction, the forge test floor, and the architecture-map updates.
42 KiB
Aere Network: Ethereum EIP Compatibility Matrix
Chain: Aere Network mainnet, chain ID 2800 (0xaf0). Execution client: Hyperledger Besu 26.4.0 with QBFT consensus (classical secp256k1 ECDSA, N=7 validators, f=2), approximately 0.5 second blocks. This document is a developer reference: it states, EIP by EIP, where Aere's EVM matches Ethereum mainnet and where it deliberately differs.
Aere tracks Ethereum's hard forks so that its EVM surface matches mainnet at the same addresses and opcodes: London and Shanghai apply from genesis, Cancun and Prague (Pectra) activated together at block 2,075,341, and Osaka (Fusaka) at block 2,106,597. A small set of deviations is intentional and disclosed here, because Aere is a QBFT chain with no separate beacon (consensus) layer and no blob data availability market. Anything not matching Ethereum is a design decision, not an oversight, and each is called out in the matrix and again in the deviations recap at the end.
How to read this
- Status is one of: Supported (matches Ethereum), Partial (present but materially limited on Aere), Not implemented (absent), No-op (present in the ruleset but neutralized, returns a defined zero/empty value under QBFT).
- Every row is intended to be literally true. Cells that could not be verified against the repository's genesis or fork configuration carry an explicit [VERIFY: ...] note. A
[VERIFY]note is a permanent, deliberate disclosure that the named fact is NOT MEASURED. It is published as it stands, it does not block publication, and it is closed only by a measurement, never by deletion. The full rule isVERIFY-POLICY.mdat the root of this repository. - A figure taken from a spec or a config file is a price. A figure produced by querying the running chain is a measurement. Rows marked (measured 2026-07-19) were produced by read-only JSON-RPC against
https://rpc.aere.network, and the method is stated in "How the measured gas figures were produced" at the end of this document. Nothing in this file was written by sending a transaction.
Second validation pass, 2026-07-19 (independent re-measurement)
This document was re-validated end to end against the running chain by an independent pass whose brief was to assume nothing in it was true. Every activation height was re-derived by binary search rather than read from this file; every price claim was re-measured with a freshly built and freshly calibrated probe; behavioural claims were driven with real eth_calls and compared byte for byte.
Result: the matrix held up. No gas figure, activation height, status, or economic claim in it was found to be wrong. Three open flags were closed, one was narrowed, and three points of imprecision were corrected:
blobScheduleattribution (corrected). The EIP-7691 row said the raised schedule was set "in config". The values are right (liveeth_config: target 6, max 9), butblobScheduleis absent from all four genesis files -- the schedule comes from Besu's built-in default for the active fork, not from Aere's genesis.- Blob base-fee update fraction (corrected). The EIP-7516 row cited
fake_exponential(1, 0, 3338477). 3,338,477 is the Cancun constant; the live chain reports 5,007,716, the Prague (EIP-7691) value. The 1 wei conclusion is unaffected. - SHAKE256 figure (disambiguated). "A 160-byte input" was ambiguous between total input and
datalength; the row now states the fitted gas model and the packed encoding instead of a single point.
It also propagated a correction outward. AERE-PROTOCOL-SPECIFICATION.md was still carrying the superseded Pectra and Osaka heights (2,075,363 and 2,106,606) in nine places, including its normative activation predicates and its Appendix A fork table. Those were wrong by 22 and 9 blocks and have been corrected to the measured 2,075,341 and 2,106,597. The two documents now agree.
Measurement provenance for the 2026-07-19 pass
The gas figures, the two fork-boundary heights, and the blob base fee in this document were re-derived from the live chain on 2026-07-19 while diagnosing the Nethermind second client (see aerenew/cross-client-determinism/). That pass corrected four values that had been carried from specs rather than measured: the Pectra and Osaka activation heights, the P-256 precompile gas, and the blob base fee. Each correction is called out inline.
- "The fork" or "the AerePQC hard fork" refers to Aere's client-only Besu
futureEipsmilestone (futureEipsTime = 1783820272), which activated at block 9,189,161 (2026-07-12) and bundled the native post-quantum precompiles, the EIP-2935 write path, and EIP-7939. No re-genesis was involved.
Fork timeline on chain 2800
| Ethereum fork | Aere activation | Notes |
|---|---|---|
| London, Shanghai | Genesis (block 0) | londonBlock: 0, shanghaiTime: 0 in genesis config |
| Cancun + Prague (Pectra) | Block 2,075,341 (measured 2026-07-19) | cancunTime == pragueTime == 1780189051; Cancun and Prague share one activation instant on Aere |
| Osaka (Fusaka) | Block 2,106,597 (measured 2026-07-19) | osakaTime == 1780220351 |
| AerePQC milestone (post-Osaka) | Block 9,189,161 | Besu futureEipsTime == 1783820272; PQC precompiles + EIP-2935 write path + EIP-7939 |
Correction (2026-07-19). This table previously read 2,075,363 and 2,106,606. Both were wrong. The heights are gated by timestamp, not by block number, so they have to be read off the chain, and when they were, two independent signals agreed:
| Block | Timestamp | requestsHash present |
|---|---|---|
| 2,075,340 | 1780189050 | no |
| 2,075,341 | 1780189051 (pragueTime) |
yes (sha256("")) |
| 2,106,596 | 1780220350 | yes |
| 2,106,597 | 1780220351 (osakaTime) |
yes |
Block 2,075,341 is the first block whose timestamp reaches pragueTime, and it is also the first block to carry a requestsHash at all, which is an independent confirmation of the Pectra boundary. Block 2,106,597 is the first block whose timestamp reaches osakaTime. Both agree with the checkpoints the cross-client harness derived by binary search (aerenew/cross-client-determinism/). Block heights on this chain are not a stable API: they are an observation about when a timestamp was crossed, and they are recorded here only because they are useful for locating the boundary in an explorer.
AerePQC height 9,189,161: now re-derived (2026-07-19, second pass). This was previously flagged as carried from configuration rather than measured. It has since been confirmed by the same timestamp binary search used for the other two boundaries: block 9,189,160 has timestamp 1783820271 and block 9,189,161 has timestamp 1783820272, exactly futureEipsTime, making it the first block at or past the activation instant. Note the scope of that confirmation: it establishes the height at which the configured timestamp is first crossed, which is the same standard applied to Pectra and Osaka. It is not a behavioural probe of the precompiles at that height -- the public RPC prunes historical state, so eth_call at 9,189,161 still cannot be used to watch the band switch on. The precompiles are separately confirmed live at head by direct measurement (see the Aere additions table).
The Matrix
London and Shanghai era (active from genesis)
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 1559 | Fee market (base fee, type-2 txs) | Partial | Fee-market mechanics present, plus a 1 Gwei base-fee floor live since block 10,141,734 (raised the real minimum from 7 wei). Floor boundary re-confirmed by direct measurement 2026-07-19: block 10,141,733 has baseFeePerGas = 7 wei and block 10,141,734 has baseFeePerGas = 0x3b9aca00 = 1,000,000,000 wei, and it holds at 1 Gwei at every later block sampled through head. eth_feeHistory at head likewise reports baseFeePerGas of 0x3b9aca00. Aere adds no consensus base-fee burn narrative: its "burn" is a separate validator-reward cut (see deviations). [VERIFY (narrowed 2026-07-19): base-fee disposal. Measurement rules out crediting to the coinbase (zero coinbase delta across a fee-paying block); burned-versus-routed-elsewhere is still open, see open flag 2.] |
| 3198 | BASEFEE opcode | Supported | Returns the current base fee, which is floored at 1 Gwei (see EIP-1559). |
| 3529 | Reduction in refunds | Supported | Matches Ethereum. |
| 3541 | Reject contract code starting with 0xEF | Supported | Matches Ethereum. Reserves the 0xEF lead byte (the EOF prefix). |
| 3651 | Warm COINBASE | Supported | Matches Ethereum. |
| 3855 | PUSH0 instruction | Supported | Matches Ethereum. |
| 3860 | Limit and meter initcode | Supported | Matches Ethereum. |
| 4895 | Beacon chain push withdrawals as operations | No-op | Withdrawal-operation ruleset present, but Aere has no beacon layer to originate withdrawals, so none are produced. |
Istanbul-era precompiles and pricing (active from genesis)
Aere starts at London, so every earlier fork is folded into genesis and these are all live. They are listed explicitly because they are priced rules, not feature flags: a client that carries the opcode but the wrong price produces a different gasUsed and forks. That is not hypothetical. Both EIP-1108 and EIP-152 were missing from the Nethermind second client's chainspec on 2026-07-19, which made it charge pre-Istanbul alt_bn128 prices and halt (see aerenew/cross-client-determinism/LIVE-BESU-VS-NETHERMIND-2026-07-19.md).
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 196 | alt_bn128 add and mul (0x06, 0x07) |
Supported | Matches Ethereum. Verified live: ecAdd and ecMul both return 64 bytes for the standard generator inputs. |
| 197 | alt_bn128 pairing check (0x08) |
Supported | Matches Ethereum. Verified live for k = 0, 1, 2 and 4 pairs. |
| 1108 | Reduce alt_bn128 precompile gas costs | Supported | Matches Ethereum. Post-1108 prices confirmed by measurement, not by config. Measured 2026-07-19 against the live chain: ecAdd 150, ecMul 6,000, ecPairing 45,000 + 34,000 per pair. The pre-1108 schedule (500 / 40,000 / 100,000 + 80,000 per pair) is ruled out by a margin of 34,000 gas on ecMul alone and 239,000 gas on a 4-pair ecPairing, far outside any measurement noise. This is the pricing an on-chain BN254 Groth16 verifier depends on; a client on the pre-1108 schedule starves such a verification of gas. |
| 152 | Blake2b F compression function (0x09) |
Supported | Matches Ethereum. Present and fail-closed: probed with a malformed (zero-length) input, it consumes all forwarded gas and reports failure, which is the behavior EIP-152 specifies for an input that is not exactly 213 bytes. Per-round price now measured on a well-formed 213-byte input (measured 2026-07-19): rounds = 12 costs exactly 12 gas and rounds = 100 costs exactly 100 gas, that is, cost == rounds, the EIP-152 schedule. |
| 198 | Big integer modular exponentiation (0x05) |
Supported | Matches Ethereum at Osaka pricing. Closed by measurement 2026-07-19, and the answer distinguishes the repricing generation. A minimal 1-byte base/exponent/modulus call (b=8, e=9, m=10) costs 500 gas. EIP-2565's floor is 200 and EIP-7883's is 500, so the measurement rules out EIP-2565-only pricing and confirms EIP-7883 (Osaka) modexp repricing is live on chain 2800. This was open flag 5; a client still on the EIP-2565 schedule would undercharge modexp by 300 gas at the floor and diverge. |
Cancun (block 2,075,341)
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 1153 | Transient storage (TLOAD / TSTORE) | Supported | Matches Ethereum. Confirmed live by execution (measured 2026-07-19): a state-override eth_call running TSTORE(0, 0x42); TLOAD(0) returns 0x..42. |
| 4844 | Shard blob transactions | Partial | Type-3 blob transactions are present in the EVM and the Cancun blob header fields are carried (blobGasUsed and excessBlobGas are present and both read 0x0 on live blocks), but Aere runs no blob data-availability market, so no blob is ever included and the blob fee never leaves its floor. See EIP-7516. |
| 4788 | Beacon block root in the EVM | No-op | The beacon-root ring buffer returns 0x0: a QBFT chain has no separate beacon/consensus layer to expose a root from. Live blocks carry parentBeaconBlockRoot = 0x00..00. |
| 5656 | MCOPY instruction | Supported | Matches Ethereum. Confirmed live by execution (measured 2026-07-19): a state-override eth_call using MCOPY to copy a word from offset 0 to offset 32 returns the copied value. |
| 6780 | SELFDESTRUCT only in same transaction | Supported | Matches Ethereum. |
| 7516 | BLOBBASEFEE opcode | Supported (pinned at the floor) | Corrected 2026-07-19: this previously read "No-op, returns 0". That was wrong. The opcode is live and returns 1 wei, the EIP-4844 MIN_BASE_FEE_PER_BLOB_GAS, not 0. Live blocks carry excessBlobGas = 0x0, and blob_base_fee = fake_exponential(1, 0, 5007716) = 1. Correction (2026-07-19): this previously cited an update fraction of 3,338,477. That is the Cancun BLOB_BASE_FEE_UPDATE_FRACTION; the live chain's eth_config reports baseFeeUpdateFraction = 5007716, the Prague (EIP-7691) value. The result is 1 wei either way because excessBlobGas is 0 and fake_exponential(1, 0, k) = 1 for every k, so the conclusion was right, but the constant quoted for the active fork was wrong. Confirmed by eth_feeHistory on chain 2800, which reports baseFeePerBlobGas: ["0x1", "0x1"]. Because Aere runs no blob market, excessBlobGas never rises, so the value is permanently pinned at the floor of 1 rather than being absent or zero. See the caveat on probing this opcode in "How the measured gas figures were produced". |
Prague / Pectra (block 2,075,341)
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 2537 | BLS12-381 curve precompiles | Supported | Matches Ethereum. Prices confirmed by measurement, not by config (measured 2026-07-19): BLS12_G1ADD (0x0b) 375, BLS12_G2ADD (0x0d) 600, BLS12_MAP_FP_TO_G1 (0x10) 5,500, BLS12_MAP_FP2_TO_G2 (0x11) 23,800 -- each exactly the EIP-2537 schedule. All seven BLS addresses 0x0b..0x11 are listed in the live eth_config precompile set. |
| 2935 | Save historical block hashes in state | Supported | Standard 8191-block history-storage ring buffer at 0x0000F90827F1C53a10cb7A02335B175320002935, written by consensus. Nominally listed at Pectra but the system contract was not populated on mainnet until the AerePQC fork (block 9,189,161) added the write path; from that block eth_getCode returns the canonical runtime and the 8191-block window is live. |
| 6110 | Supply validator deposits on chain | Partial | The deposit-request ruleset is part of the Pectra parity Aere tracks, but Aere has no beacon layer to consume deposits, so a deposit does not create or fund a QBFT validator (the validator set is QBFT-managed). CLOSED by measurement 2026-08-01 (head block 11,810,041, https://rpc.aere.network): eth_getCode returns 0 bytes at the EIP-6110 deposit contract 0x00000961Ef480Eb55e80D19ad83579A64c007002, at the EIP-7251 consolidation contract 0x0000BBdDc7CE488642fb579F8B00f3a590007251, and at 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02. The live header carries requestsHash = 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, which is the SHA-256 of the empty string, and parentBeaconBlockRoot = all zeros. So: none of the request system contracts is populated, and the header requests list is empty. That is exactly what "ruleset present, no beacon layer" predicts, and it is now measured rather than flagged. (Contrast EIP-2935 in the row above, which is populated, at 83 bytes.) |
| 7002 | Execution-layer triggerable withdrawals/exits | Partial | Withdrawal-request ruleset present, but no beacon layer consumes exits, so it does not affect the QBFT validator set. CLOSED by measurement 2026-08-01 (head block 11,810,041, https://rpc.aere.network): eth_getCode returns 0 bytes at the EIP-6110 deposit contract 0x00000961Ef480Eb55e80D19ad83579A64c007002, at the EIP-7251 consolidation contract 0x0000BBdDc7CE488642fb579F8B00f3a590007251, and at 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02. The live header carries requestsHash = 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, which is the SHA-256 of the empty string, and parentBeaconBlockRoot = all zeros. So: none of the request system contracts is populated, and the header requests list is empty. That is exactly what "ruleset present, no beacon layer" predicts, and it is now measured rather than flagged. (Contrast EIP-2935 in the row above, which is populated, at 83 bytes.) |
| 7251 | Increase MAX_EFFECTIVE_BALANCE (consolidations) | Partial | Consolidation-request ruleset present, but no beacon layer to act on it under QBFT. CLOSED by measurement 2026-08-01 (head block 11,810,041, https://rpc.aere.network): eth_getCode returns 0 bytes at the EIP-6110 deposit contract 0x00000961Ef480Eb55e80D19ad83579A64c007002, at the EIP-7251 consolidation contract 0x0000BBdDc7CE488642fb579F8B00f3a590007251, and at 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02. The live header carries requestsHash = 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, which is the SHA-256 of the empty string, and parentBeaconBlockRoot = all zeros. So: none of the request system contracts is populated, and the header requests list is empty. That is exactly what "ruleset present, no beacon layer" predicts, and it is now measured rather than flagged. (Contrast EIP-2935 in the row above, which is populated, at 83 bytes.) |
| 7549 | Move committee index outside signature | Not implemented | Beacon consensus-layer change only, with no execution-layer/EVM surface. It has no applicability under QBFT. |
| 7623 | Increase calldata cost | Supported | Matches Ethereum (calldata floor-cost accounting). |
| 7685 | General purpose execution layer requests | Partial | The requests framework (the umbrella for 6110/7002/7251) exists in the ruleset, but Aere has no beacon layer to consume the requests. CLOSED by measurement 2026-08-01 (head block 11,810,041, https://rpc.aere.network): eth_getCode returns 0 bytes at the EIP-6110 deposit contract 0x00000961Ef480Eb55e80D19ad83579A64c007002, at the EIP-7251 consolidation contract 0x0000BBdDc7CE488642fb579F8B00f3a590007251, and at 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02. The live header carries requestsHash = 0xe3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855, which is the SHA-256 of the empty string, and parentBeaconBlockRoot = all zeros. So: none of the request system contracts is populated, and the header requests list is empty. That is exactly what "ruleset present, no beacon layer" predicts, and it is now measured rather than flagged. (Contrast EIP-2935 in the row above, which is populated, at 83 bytes.) |
| 7702 | Set EOA account code (delegation) | Supported | Matches Ethereum. This is the EOA-delegation primitive Aere carries (and the reason EIP-3074 is not needed). Delegation resolution confirmed live (measured 2026-07-19): an account whose code is set to the designator (0xef0100 followed by a 20-byte target address) executes the target's code when called, while the same account given a non-designator 0xEF-prefixed blob (0xef9900 followed by the same address) is rejected with Invalid opcode: 0xef. So the 0xef0100 prefix is honored as a delegation indicator and no other 0xEF form is executable, which is exactly the EIP-7702 plus EIP-3541 combination. |
| 7691 | Blob throughput increase | Partial | The active blob schedule is target 6, max 9, baseFeeUpdateFraction 5,007,716 -- the EIP-7691 raised schedule -- confirmed by reading eth_config on the live chain (measured 2026-07-19). With no blob data-availability market the increase has no practical effect. Correction (2026-07-19): this row previously said the schedule was set "in config". That was wrong as to source. blobSchedule is absent from all four genesis files (aere-genesis-current.json, aere-genesis-pectra.json, aere-genesis-fusaka.json, aerenew/genesis.json); none of them declares one. The schedule the chain actually runs comes from Besu's built-in default for the active fork, not from Aere's genesis. The values are correct; the attribution was not. A reimplementer must therefore hardcode the EIP-7691 schedule rather than expect to read it out of Aere's genesis, and a client that defaults to the Cancun schedule (target 3, max 6, fraction 3,338,477) would carry a different blob-fee curve. |
Fusaka / Osaka (block 2,106,597) and the post-Osaka milestone
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 7951 | secp256r1 (P-256) signature verification at 0x100 |
Supported | Matches Ethereum's Osaka. Live and verified on chain 2800 (measured 2026-07-19). See the 0x100 row under "Aere additions" for the measured gas and semantics. Activated with the Osaka ruleset at osakaTime = 1780220351, block 2,106,597. This is the precompile Aere's passkey/WebAuthn accounts sit on, so it is load-bearing rather than decorative. |
| 7825 | Transaction gas limit cap (2^24 = 16,777,216) | Supported | Matches Ethereum; the per-transaction gas cap is enforced on chain 2800 (real transactions have executed under it). Note this is a per-transaction cap; the live block gas limit reads 0x1fffffffffffff (2^53 - 1). |
| 7939 | Count leading zeros (CLZ) opcode | Supported | Present. On Aere it activated at the post-Osaka AerePQC milestone (block 9,189,161), which the live EIP-2124 fork-id folds in. [VERIFY: activation height for 7939 specifically, confirmed against the live fork schedule.] |
| 7594 | PeerDAS (peer data availability sampling) | Not implemented | No active role under QBFT: Aere runs no blob data-availability market, so there is no data-availability sampling role to perform. |
| 7805 | FOCIL (fork-choice enforced inclusion lists) | Not implemented | No-op under QBFT: there is no fork-choice or proposer-inclusion layer to enforce inclusion lists against. |
| 7692 | EOF (EVM Object Format) mega-set | Not implemented | Not activated under the current ruleset; the 0xEF prefix stays reserved by EIP-3541 (legacy behavior). [VERIFY: confirm the AerePQC futureEips protocol spec (futureEipsTime = 1783820272, block 9,189,161) does NOT enable the EOF opcode set or EIP-3540/3670 container validation. Corroboration that EOF is off: the served genesis config and the Nethermind live-sync fork-id mirror both carry no EOF transition, and the engineering spec states EOF is not activated. The one residual risk is that this milestone rides Besu's futureEips key, which in stock Besu is EOF's staging ground, so the fork build's spec definition should be inspected to confirm EOF was not pulled in.] |
Superseded
| EIP | Name | Status | Difference from Ethereum |
|---|---|---|---|
| 3074 | AUTH / AUTHCALL (sponsored EOA actions) | Not implemented | Deliberately absent. It was superseded by EIP-7702, which Aere carries as its EOA-delegation primitive. |
Aere additions beyond Ethereum
These are callable addresses that are not part of the base Ethereum mainnet precompile set. The post-quantum band 0x0AE1..0x0AE5 is genuinely Aere-specific and live on mainnet; 0x0AE6..0x0AE8 are not on mainnet; the secp256r1 precompile at 0x100 is a shared RIP that Ethereum is standardizing in Osaka (listed here because it sits outside the classic precompile set).
| Address | Name | Status | Notes |
|---|---|---|---|
0x0AE1 |
Falcon-512 signature verify | Live on mainnet | Activated at block 9,189,161 (AerePQC fork). Thin wrapper over Bouncy Castle 1.83; NIST KAT verified. Gas 40,000, measured on the live chain 2026-07-19 and matching the committed schedule Falcon512VerifyGas = 40_000. |
0x0AE2 |
Falcon-1024 signature verify | Live on mainnet | Activated at block 9,189,161. NIST KAT verified. Gas 75,000 (measured), matching the committed FALCON1024_VERIFY_GAS = 75000. |
0x0AE3 |
ML-DSA-44 signature verify (FIPS 204) | Live on mainnet | Activated at block 9,189,161. ACVP verified. Gas 55,000 (measured). |
0x0AE4 |
SLH-DSA-SHA2-128s signature verify (FIPS 205) | Live on mainnet | Activated at block 9,189,161. ACVP verified. Gas 350,000 (measured). |
0x0AE5 |
SHAKE256 (FIPS 202) | Live on mainnet | Activated at block 9,189,161. Variable cost by input and output length. Full gas model re-derived on the live chain across 10 input shapes (measured 2026-07-19), fitting with zero residual: gas = 60 + 12 * ( ceil(len(data)/32) + ceil(min(outLen, 65536)/32) ), where the packed input is outLen (32-byte big-endian word) followed by data. Three properties are load-bearing and all three are measured, not assumed: (1) the two word counts are rounded up separately, not combined -- outLen=33, data=33 costs 108 gas (4 words), where a combined ceil((33+33)/32) model predicts 3 words and 96 gas; (2) outLen saturates at MAX_OUTLEN = 65536 -- outLen=100000, data=32 costs 24,648, identical to what 65,536 would cost; (3) the outLen framing word is not itself charged as data. Clarification (2026-07-19): this row previously read "a 160-byte input returning 65,536 bytes measured 24,684 gas", which was ambiguous. 24,684 gas corresponds to 128 bytes of data (a 160-byte total input, of which the first 32 bytes are the outLen framing word). A call with 160 bytes of actual data costs 24,696. The figure was right under one reading of "input" and wrong under the other, so it is now stated as the model plus the encoding. This independently reconfirms the separate-rounding correction made to aerenew/eips/eip-draft-shake256-precompile.md. |
0x0AE6 |
ML-KEM-768 encapsulation (FIPS 203) | Testnet only | Built and ACVP-verified (25/25) on an isolated QBFT testnet. NOT on mainnet 2800: re-confirmed 2026-07-20 by gas differential, a mainnet STATICCALL to 0x0AE6 charges 0 gas against a codeless control, versus 40,000/75,000/55,000/350,000/24,648 for the live 0x0AE1..0x0AE5. Decisive because gasRequirement is a flat 60,000 for every input, so an active 0x0AE6 would bill it even while returning empty. Note the empty return by itself proves nothing: 0x0AE5 is live and also returns empty for a short input. Founder- and audit-gated. |
0x0AE7 |
Falcon HashToPoint (SHAKE256 sampler) | Testnet only | Built and KAT-verified (12/12) on isolated testnet. NOT on mainnet 2800, re-confirmed by the same measurement. Founder- and audit-gated. |
0x0AE8 |
BabyBear/FRI STARK verify (skeleton) | Reference skeleton only | Non-working, fail-closed by construction (returns empty for every input). Not deployed on mainnet and explicitly must not be activated until the crypto core is ported. Scope caveat (2026-07-19 finding): the generic components confirmed so far verify BabyBear + FRI STARKs (Aere's OWN Plonky3 circuits), NOT SP1 6.1.0, which is Hypercube (KoalaBear multilinear); retargeting to SP1 6.1.0 is a separate ~22 to 32 person-week effort. See AERE-STARK-SP1-RECURSION-AIR-PORT-SPEC-SUMMARY.md. |
0x100 |
P256Verify / secp256r1 (EIP-7951, formerly RIP-7212) | Live on mainnet | Native P-256 signature verification for passkeys/WebAuthn. Gas 6,900, measured on the live chain 2026-07-19. Corrected: this row previously read "about 3,450 gas". That was the original RIP-7212 price, which was doubled to 6,900 when the proposal was standardized into Ethereum's Osaka as EIP-7951. Active from the Osaka/Fusaka ruleset (osakaTime = 1780220351, block 2,106,597). Standards-aligned, not Aere-proprietary. Verified semantics: a valid signature returns a 32-byte 0x..01; an invalid one returns empty (not a zero word, which is how the 0x0AE1..0x0AE4 band fails), and the full 6,900 gas is charged either way. Signature malleability is not restricted: both the low-s and high-s forms of the same signature verify, matching the spec. Cross-client confirmed: the Nethermind second client returns byte-identical results and charges identical gas. |
All post-quantum precompiles are signature/hash/KEM verifiers on the EVM path. None of them make Aere's consensus post-quantum: mainnet 2800 still seals blocks with classical secp256k1 QBFT.
Warm/cold note. The inherited Ethereum precompiles (0x01..0x0A) and the EIP-7951 verifier at 0x100 are pre-warmed under EIP-2929, so a call to them pays the 100 gas warm-access charge. The Aere-specific band at 0x0AE1..0x0AE5 is not in the pre-warmed set: a first call in a transaction pays the 2,600 gas cold-account charge on top of the verify price. Measured 2026-07-19. Budget for it when sizing a PQC-verifying transaction.
Deliberate deviations recap
The intentional differences from Ethereum, all a consequence of Aere being a QBFT chain with no beacon layer and no blob market:
-
Base fee floor plus a validator-reward burn, not a consensus base-fee burn. Aere applies a 1 Gwei EIP-1559 base-fee floor (live since block 10,141,734). Separately, Aere's "burn" is a cut of the validator coinbase block reward (37.5% under the current configuration, hard-capped at 50%), routed through the
AereCoinbaseSplitterV2splitter into immutable destinations. This must not be described as a base-fee burn.Burn parameters confirmed on chain 2026-07-19 by reading the deployed
AereCoinbaseSplitterV2at0x8C1A48eFA57b66fEE743A00E3899c29ad3Fd27b4:burnBps() = 3750(37.5%),MAX_BURN_BPS() = 5000(the 50% ceiling),sinkBps() = 1500,MAX_SINK_BPS() = 3000,rebateBps() = 4750. Every figure matches the documented configuration exactly, and3750 + 1500 + 4750 = 10000closes.Two structural facts confirm the separation is real rather than editorial. First, the live block coinbase is a plain EOA with no code (
eth_getCodeon the blockminerreturns0x), so nothing is deducted from the reward by consensus -- the split happens only when a forwarder sends the reward on to the splitter, which is application-layer wiring above consensus, exactly as described. Second, the base fee is separately confirmed not credited to that coinbase (open flag 2), so the two mechanisms do not touch. [MEASURE:AereCoinbaseSplitterV2.totalBurned()currently reads 0, while the older V1 splitter at0xb4b0eCe9011613A5b84248a9B42a0f309E6F01Ecreads 137,352,594,046,167,719 wei burned. So V2 is deployed and correctly configured but has not yet received flow; the burn described here is live as a configuration and as a V1 flow, and the V2 path is not yet carrying volume. Confirm the forwarder's current target before describing V2 as the operative path.] -
EIP-4844 blobs present, EIP-7516 BLOBBASEFEE pinned at 1 wei. Blob transactions exist in the EVM, but there is no blob data-availability market, so no blob is ever included,
excessBlobGasnever rises above 0, and the blob base fee sits permanently at the EIP-4844 floor of 1 wei. It is not 0 and the opcode is not neutralized. (Corrected 2026-07-19; this recap previously said 0.) -
EIP-4788 parent beacon block root returns 0x0. A QBFT chain has no separate beacon/consensus layer to source a root from.
-
EIP-3074 not implemented, superseded by EIP-7702. EIP-7702 is the EOA-delegation primitive Aere carries.
-
PeerDAS (EIP-7594), FOCIL (EIP-7805), and EOF (EIP-7692) have no active role under QBFT. PeerDAS has no data-availability role (no blob market), FOCIL has no fork-choice/proposer-inclusion layer to enforce, and EOF is not activated under the current ruleset (0xEF stays reserved by EIP-3541).
-
Validator-lifecycle requests (EIP-6110/7002/7251/7685) have no beacon consumer. The requests ruleset is tracked for Pectra parity, but Aere's validator set is QBFT-managed, so deposits/withdrawals/consolidations do not drive it.
-
EIP-2935 became functionally live at the AerePQC fork (block 9,189,161), not at Pectra. The Pectra ruleset nominally listed it, but the history-storage contract was not populated on mainnet until the write path shipped in the AerePQC fork.
Closed by measurement on 2026-07-19
These were open [VERIFY] flags. They are now measurements, not prices.
- Pectra/Fusaka block heights. Closed. Measured 2,075,341 and 2,106,597, by reading block timestamps either side of each activation instant and cross-checking against the first appearance of
requestsHash. The previously published 2,075,363 and 2,106,606 were wrong and have been corrected throughout this document. - P256Verify gas. Closed, and the previous figure was wrong. Measured 6,900, not 3,450. The precompile is live, verifies correctly, fails closed with an empty return, and does not restrict signature malleability.
- EIP-1108 alt_bn128 pricing. Closed. Measured
ecAdd150,ecMul6,000,ecPairing45,000 + 34,000 per pair, that is, the post-1108 schedule. - EIP-7516 blob base fee. Closed, and the previous claim was wrong. It is 1 wei (the EIP-4844 floor), not 0.
System contract population on mainnet (measured 2026-07-19)
eth_getCode at latest on chain 2800. This closes most of what was open flag 4.
| Contract | Address | Code on mainnet |
|---|---|---|
| EIP-2935 history storage | 0x0000F90827F1C53a10cb7A02335B175320002935 |
83 bytes (populated) |
| EIP-7002 withdrawal requests | 0x00000961Ef480Eb55e80D19ad83579A64c007002 |
none |
| EIP-7251 consolidation requests | 0x0000BBdDc7CE488642fb579F8B00f3a590007251 |
none |
| EIP-6110 deposit contract | 0x00000000219ab540356cBB839Cbe05303d7705Fa |
none |
| EIP-4788 beacon roots ring buffer | 0x000F3df6D732807Ef1319fB7B8bB8522d0Beac02 |
none |
Live mainnet block headers do carry requestsHash, and it is always sha256("") = 0xe3b0c442...b7852b855, the empty-requests hash. Besu computes that hash without executing the absent predeploys. This exact combination (a requestsHash in the header, but no code at the request predeploys) is what halted the Nethermind second client on 2026-07-19; see the cross-client write-up.
Because the EIP-4788 ring buffer has no code, a call to it succeeds with empty returndata rather than returning a zero word. Consumers that decode the result as a bytes32 will see 0x00..00, which is why the EIP-4788 row above is described as returning 0x0, but the distinction matters to a contract that checks returndatasize.
Open [VERIFY] flags: facts published as NOT MEASURED
Second validation pass, 2026-07-19 (independent re-measurement). All five flags below were re-attacked directly against the live chain. Three are now closed by measurement, one is narrowed, and one remains genuinely open. The instrument was re-calibrated from scratch before any of it was trusted (see the method appendix).
EOF off underCLOSED by measurement. This no longer rests on indirect corroboration. Executing candidate code at head throughfutureEips.eth_callwith a state override: the EOF v1 container magic0xef0001...is rejected withInvalid opcode: 0xef(so EIP-3540 container validation is not parsing it), and the EOF-only opcodesRJUMP(0xe0),CALLF(0xe3) andEXTCALL(0xf8) are each rejected asInvalid opcode(so the EOF opcode set is not enabled). Five independent probes, all fail-closed. EOF is not activated, and0xEFstays reserved by EIP-3541 legacy behavior. This was the highest-risk open item because the milestone rides Besu'sfutureEipskey; it is settled.- EIP-1559 base-fee disposal. Narrowed, still open. Ruled out: the base fee is not credited to the coinbase. Measured on block 10,487,561 (1 transaction,
gasUsed22,474,effectiveGasPrice1 Gwei, i.e. equal tobaseFeePerGas, so the priority tip was zero): the coinbase balance delta across that block was exactly 0 wei, where crediting the base fee would have moved 22,474,000,000,000 wei. Because the tip was zero, this cannot by itself separate "protocol-burned" from "routed elsewhere" -- both models predict a zero delta. Closing it needs a block with a nonzero priority tip and unpruned state. The chain is currently quiet (no logs in the last 5,000 blocks), and the one tipped transaction located,0xb659...9ec1at block 9,200,542 (tip 0.1 Gwei), sits below the public RPC's pruning horizon so its balances cannot be read. Either run the check on the archive node or read the client source. EIP-2935 contract bytes.CLOSED by measurement, two ways. (a) Byte level: the 83 bytes at0x0000F90827F1C53a10cb7A02335B175320002935are byte-for-byte the canonical EIP-2935 runtime0x3373...fffe14604657602036036042575f35600143038111604257611fff81430311604257611fff9006545f5260205ff35b5f5ffd5b5f35611fff60014303065500. Disassembly confirms the two jump targets are theJUMPDESTat0x42(revert path) and theJUMPDESTat0x46(theSSTOREpath taken whencaller == SYSTEM_ADDRESS), and the length is exactly 83 bytes. (b) Functional level, which is stronger: calling the contract with the block number ofhead - 100returns that block's hash, byte-identical toeth_getBlockByNumber. The ring buffer is not merely populated, it is serving correct history.- EIP-7939 activation height. Partially closed. The opcode itself is confirmed live and correct at head (measured):
PUSH1 0x01; CLZreturns 255 andPUSH0; CLZreturns 256. Only the boundary remains unverified -- whether CLZ turned on at the AerePQC milestone (block 9,189,161) or at Osaka (block 2,106,597) -- and that is still not probeable byeth_callbecause the public RPC has pruned state at both heights. Needs the archive node or a source read. EIP-198 / EIP-2565 / EIP-7883 modexp pricing.CLOSED by measurement, and the answer is specific. A minimalb=8, e=9, m=10modexp call costs 500 gas. EIP-2565's floor is 200 and EIP-7883's is 500, so EIP-7883 (Osaka) modexp repricing is live and EIP-2565-only pricing is ruled out. The concern that motivated this flag was well founded in kind: a client left on the EIP-2565 schedule undercharges modexp by 300 gas at the floor and would diverge on any modexp-using transaction.
Newly measured in this pass and previously unstated: EIP-2537 BLS12-381 prices (G1ADD 375, G2ADD 600, MAP_FP_TO_G1 5,500, MAP_FP2_TO_G2 23,800, all exactly the spec schedule); EIP-152 blake2f per-round price (cost == rounds, verified at 12 and 100 rounds); EIP-7702 delegation resolution (the 0xef0100 designator executes the target, non-designator 0xEF forms are rejected); EIP-1153 and EIP-5656 confirmed by execution rather than by ruleset membership; and the complete 0x0AE5 SHAKE256 gas model fitted across 10 shapes with zero residual.
How the measured gas figures were produced
Every gas figure marked (measured) came from the same read-only technique, and it is worth stating because the obvious techniques do not work here.
What does not work. eth_estimateGas returns a binary-search result with a small buffer (it reported 66,845 where the true cost is 66,000), and EIP-7623's calldata floor can mask a precompile's price entirely: a 160-byte call to 0x100 costs the same whether or not the precompile exists, because the floor dominates. Neither is precise enough to distinguish a 3,450 gas price from a 6,900 gas one.
What works. An eth_call with a state override that installs a small bytecode probe at a scratch address. The probe reads GAS, performs a STATICCALL to the target, reads GAS again, and returns the difference along with the call's success flag and RETURNDATASIZE. Inside the EVM there is no calldata floor, so the difference is the true charged cost plus a fixed harness overhead. That overhead is then calibrated away using two precompiles whose prices are fixed by spec and cannot drift: ecRecover at a flat 3,000 and the identity precompile at 15 + 3 per word. Both calibrations agreed on an overhead of 127 gas (100 warm-access plus 27 of probe opcodes), and the identity precompile then read back its spec price of 30 exactly. Residual noise is under 15 gas, from memory expansion inside the measured window, which is far below the margins being distinguished.
A trap worth recording. The BASEFEE opcode returns 0 inside eth_call on this chain, even though the block header and eth_feeHistory both report 1 Gwei. Besu simulates calls against a zero base fee. So eth_call is not admissible evidence about BASEFEE or BLOBBASEFEE, and the blob base fee in this document was established from eth_feeHistory and the header's excessBlobGas instead, not from the opcode. Any future probe of a fee-context opcode needs the same caution.
Recalibration note (2026-07-19, second pass). The method reproduces, but the overhead constant is a property of the probe, not of the chain, and should not be treated as a checkable figure. The second pass rebuilt the probe independently -- CALLDATACOPY, a pre-warming STATICCALL, GAS, STATICCALL, GAS, SWAP1, SUB, MSTORE, RETURN -- and calibrated to a fixed overhead of 117 gas (100 warm-access plus 17 gas of probe opcodes), not the 127 recorded above, because it uses a slightly shorter opcode sequence between the two GAS reads. The calibration itself was exact in a way worth stating as the acceptance bar: against the identity precompile at 15 + 3 * ceil(len/32) the implied overhead was 117 at every input length tested (0, 32, 64, 96, 128 and 160 bytes) with no drift, an empty-address control read exactly 117, and ecRecover read back its flat spec price of 3,000 exactly. Residual noise was zero, not merely small. Anyone rebuilding the probe should calibrate their own constant the same way and only trust the instrument once the control and a spec-fixed price both come back exact -- the number to reproduce is the measured price after subtraction, not the overhead.
The probe scripts are throwaway and were not committed. What is reproducible is the method plus the calibration constants above; anyone can rebuild the probe and should get the same numbers against https://rpc.aere.network.