A snapshot of a network is usually a set of healthy-looking numbers. This one is a single number that was not healthy at all, and the story of what it meant.
The number
102,912. Blocks produced by the EmpoorioChain public testnet, from the 31 August relaunch to 7 September 2026, during which the chain carried zero signed transactions. Aura authored a block every six seconds; GRANDPA finalized them; the inherents (timestamps) went in; and nothing else did. Ever.
Not rejected — never sent
The runtime was not refusing transactions. It accepts signatures correctly, and tests prove it. The problem was upstream: no client knew how to build the envelope.
Runtime 208 introduced two custom signed extensions at the front of the transaction's extra field: CheckPqcPolicy (two bytes when no post-quantum signature is attached) and CheckDormantAccount (zero bytes). Substrate's standard eight follow. A client that does not know about the first one does not fail loudly — it omits it. Every subsequent byte shifts by two. The node decodes garbage and answers with the generic Bad input data provided to validate_transaction.
The format and the live chain were born together in one commit on 4 September (spec 203 → 208). There was never a window in which clients worked and then broke. They had never worked.
The five symptoms
| What was seen | What it was |
|---|---|
Zero DIDs registered although register_did is permissionless | No signed extrinsic was getting in |
An AI-reward pool of 300 M DMS with TotalDistributed = 0 | Same |
| Staking eras 2–5 with frozen budgets and zero work recorded | Same |
| "The sudo key has no permissions" | Same |
| MetaMask and Hardhat could not send anything | A different bug (SelfContainedCall), confused with this one |
For weeks these were tracked as five unrelated problems. The first four were a two-byte offset.
The fix
The envelope was documented byte by byte in FORMATO_DE_EXTRINSECOS.md — every extension, its encoded length, what it contributes to the signed-but-not-sent implicit — and an example transaction was built by hand, submitted, included in a block and moved a balance. Verified against spec 213. Eoonia, the Dart SDK and the Rust SDK now encode it; Polkadot.js does so automatically from metadata.
The snapshot a week later
| 7 Sep | 14 Sep | |
|---|---|---|
| Signed transactions in history | 0 | first on 7 Sep; Eoonia's 35/43 native operations verified since |
| DIDs registered | 0 | 1 (14 Sep) |
| Real DEX swaps | 0 | 1 (14 Sep, after the treasury account was created) |
| EVM transactions accepted | none (rejected by the runtime) | yes, since runtime 211 |
| Runtime | 208 | 220 |
What the snapshot teaches
A chain can look perfectly healthy — blocks, finality, uptime — while being unusable, if the metric you watch is the one the chain produces on its own. The number that should have been on the dashboard from day one was signed transactions per day, and it now is. The general rule the ecosystem drew: a feature is not done until it has executed a real transaction on the live chain. The test suite passed the whole time.
Based on FORMATO_DE_EXTRINSECOS.md (2026-09-07), RED.json and the runtime 211–220 records.


