Consensus Proof of Time
Explorer Home ↗ Source GitHub ↗
← explorer

Deterministic Ordering through Linear Iterations

Chain Errata

Known supply events, security incidents and chain anomalies, documented for transparency

Chain history
Current mainnetGenesis 2026-07-22 10:45:00 UTC
Genesis timestamp1784717100
First releasev6.24.0

During development, from February to July 2026, mainnet was restarted from block 0 several times. The last two restarts were on 2026-07-08 and 2026-07-22. Balances did not carry over from one chain to the next. Entries marked Previous chain happened on a chain that no longer exists.

Note: the genesis message still names v6.14.11 and April 2026. That text was not updated at the July restarts. The current chain is identified by its genesis timestamp, not by the message.

Current chain

SEC-001 High
Exposed Maintainer and Producer Keys
First committed2026-03-15 — in a testnet key template in the public source repository
Detected2026-08-08
Contained2026-08-30 — maintainer set rotated at blocks 331,442–331,457
Closed2026-08-31 — v6.26.2
Funds at riskNone — no user funds were lost. Other users' coins were never at risk.
ActionRun v6.26.1 or later. Nodes on v6.26.0 or older must upgrade manually.
What happened

A testnet key template in the public source repository contained private keys. The same keys were in use on mainnet for two roles: the five maintainer keys, which sign releases and govern the maintainer set (3 of 5 signatures required), and the keys of the 12 block producers that the project operates.

What an attacker could do
  1. With 3 of the 5 maintainer keys: sign a release and change the maintainer set. To reach auto-updating nodes, an attacker also needed publish rights on the project's GitHub releases, the only source the updater accepts.
  2. With the producer keys: produce blocks and attest as those producers, which held most of the selection weight, and withdraw their bonds.
  3. Not possible: spend other users' coins. In the UTXO model, a key signs only for its own outputs.
Response
  1. 2026-08-11 — GitHub accounts hardened: two-factor authentication, token cleanup, fewer collaborators, protected main branch and release tags.
  2. 2026-08-19 to 2026-08-28 — each exposed producer withdrew its bonds in full and registered again under new keys generated offline. No bond was lost and the chain did not fork.
  3. v6.25.0 and v6.26.0 — code that made a safe rotation possible: an on-chain trust root, governance transactions that can be mined, authorizations bound to a block height, and maintainer state that is undone on a reorg.
  4. 2026-08-30 — maintainer rotation: 10 transactions, one Remove then one Add, five times, one at a time. The signature threshold is recomputed at each change, so removing keys in a batch would have lowered it from 3 to 2.
  5. v6.26.1 and v6.26.2 — the key lists compiled into the binaries now hold only the new keys. A build test fails if any network ships a retired key.
What we observed

No unauthorized maintainer change was seen: the maintainer set was still the original five just before the rotation. Every release was published by a project account or the CI bot. All producer bonds were recovered in full.

Residual

The old private keys remain public in the repository history, and this cannot be undone. On mainnet they no longer have any authority. Binaries v6.26.0 and older still trust the old keys and cannot verify new releases — upgrade them manually.

New maintainer keys

Signing-only keys. They are not producers and hold no bonds.

  • d07ec4ec146245e0ce31800ba2cf98b9fc649aa7a4021a09e8534a7764033f8d
  • 25c24110d98f2a34c37bab8fede0791d3de1281ca499a30fb7ff5223cdb0e23c
  • 2559a47ee898f8bb9a38d90573dcca2195a97a7c787b5712ba62102e225b9e0d
  • e477c1f245612f7351f66ce7936e4ffa1e0afef26a12f90f3a86ed3544ca5b8c
  • 3fd5be3de8285140a461b12dbd7d14ce0d026b5e369e38daebf89f6f7cbc0245

Incidents: INC-I-170, INC-I-172, INC-I-175, INC-I-196

Fix commits: 544a2c1 (PR #181), 9446128 (PR #183)

Previous chains

SE-001 Low Previous chain
Supply Excess — +457 DOLI at Epoch 362
ChainPrevious mainnet (genesis 2026-04-22, retired 2026-07-08)
Date2026-05-07
Block Height130,320 (epoch boundary 362)
Impact457 DOLI excess (~0.31% of total supply at the time)
OngoingNo — that chain was retired on 2026-07-08. The current chain does not contain this excess.
Funds at riskNone — no user funds were lost or stolen
Fixv6.22.0 — spend errors are now checked, conservation invariant added
What happened

During an operational recovery from a rolling deploy incident (INC-I-062), 456 reward pool UTXOs that had already been consumed by prior epoch distributions were re-introduced into the UTXO set. At the next epoch boundary (epoch 362, height 130,320), the EpochReward transaction consumed all 816 pool UTXOs — 360 legitimate and 456 duplicates. A silent error handling defect (let _ = on spend errors) allowed the outputs to be created without valid inputs, producing 457 DOLI from nothing.

Why it wasn't caught

Three defensive checks failed simultaneously:

  1. Spend errors were silently discarded (Result not checked)
  2. Pool input verification was skipped during sync/reorg validation
  3. No post-block conservation invariant existed
Resolution

The 457 DOLI stayed on that chain until it was retired. They were consensus-agreed across all 15 nodes and mixed into normal producer reward UTXOs. A retroactive correction would have required a chain reset or a punitive burn mechanism, and neither was justified for a 0.31% anomaly with no victim. The code defects were fixed to prevent any future occurrence. That chain was later replaced for unrelated reasons (see Chain history), so the excess does not exist on the current chain.

Incident: INC-I-064

Fix commit: 7191815