> For the complete documentation index, see [llms.txt](https://protocol.bsvblockchain.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://protocol.bsvblockchain.org/specification/upgrade-history.md).

# Protocol Upgrade History

The consensus upgrade timeline — which validity rules apply at which height

This section records the **consensus** upgrades to the BSV protocol: the changes that altered which transactions or blocks are valid, and the block heights at which each took effect. It is the reference that lets a reader determine *which rules apply at which point in the chain*.

Only validity-affecting changes are listed. Upgrades that changed **only default configuration** (relay/mining policy) are noted where relevant but are not protocol changes — see the note on [Quasar](#quasar-2019).

**Ground truth.** Activation heights are taken from `chainparams.cpp` in [`bitcoin-sv/bitcoin-sv`](https://github.com/bitcoin-sv/bitcoin-sv/blob/879fc8b42168dd0e608dafd51b39c6dabad37d4d/src/chainparams.cpp) (pinned to release **v1.2.2**, commit `879fc8b`); the description of each change is taken from the consensus specifications in `bitcoin-sv-specs/protocol` `updates/`, cross-checked against the code.

## The "UTXO height" rule

From Genesis onward, the rules applied to an **input** are those in force when the **output it spends** was confirmed — not the rules at the height of the spending transaction. So the era of a script is determined per input by the height of the UTXO being spent. Heights below are **mainnet**.

## Timeline

| Date       | Upgrade      | Mainnet height       | Nature of change                                               |
| ---------- | ------------ | -------------------- | -------------------------------------------------------------- |
| 2017-08-01 | UAHF         | fork by time (MTP)   | Big blocks; mandatory `SIGHASH_FORKID` replay protection; EDA. |
| 2017-11-13 | Nov 2017     | fork by time         | LOW\_S + NULLFAIL enforced; EDA → DAA.                         |
| 2018-05    | May 2018     | fork by time         | Re-enabled opcodes; canonical number encoding.                 |
| 2018-11-15 | Nov 2018     | fork by time         | Re-enabled more opcodes; op-count 201 → 500.                   |
| 2019-07-24 | Quasar       | —                    | **No consensus change** (config only).                         |
| 2020-02-04 | Genesis      | **620,538**          | Large-scale rule reset (see below).                            |
| 2022-11-11 | Confiscation | by `EnforceAtHeight` | New confiscation-transaction class.                            |
| 2026-04-07 | Chronicle    | **943,816**          | OTDA restored; opcodes re-instated; malleability opt-outs.     |

## UAHF (2017-08-01)

Source: `updates/uahf-technical-spec.md`. The fork that created BSV's lineage. Consensus changes:

* Blocks larger than 1 MB become valid; for a block over 1 MB the maximum signature operations per block is `20000 × ceil(size / 1 MB)` and the maximum transaction size is 1 MB.
* **Mandatory replay protection:** signatures must set `SIGHASH_FORKID` (bit `0x40`), and the fork id is mixed into a BIP143-adapted signature digest (see [Sighash](/specification/signature-hashing.md)).
* Mandatory `STRICTENC` (strict signature/pubkey encoding).
* Emergency Difficulty Adjustment (EDA).

## Nov 2017

Source: `updates/nov-13-hardfork-spec.md`. Enforce **LOW\_S** (BIP146) and **NULLFAIL**; replace EDA with the current **DAA** (a 144-block-window retarget with a clamped timespan). See [Blocks](/specification/blocks.md) for the DAA.

## May 2018

Sources: `updates/may-2018-hardfork.md`, `updates/may-2018-reenabled-opcodes.md`. Re-enabled `OP_CAT`, `OP_SPLIT`, `OP_AND`, `OP_OR`, `OP_XOR`, `OP_DIV`, `OP_MOD`, `OP_NUM2BIN`, `OP_BIN2NUM`; introduced canonical numeric encoding (little-endian, sign bit, ≤ 4 bytes, minimal). The block-size default rose to 32 MB — a configuration default, not a consensus rule.

## Nov 2018

Sources: `updates/2018-11-15 BCH Upgrade Spec.md`, `updates/2018-11-15 Re-enabling Old Opcodes.md`, `updates/2018-11-15 Increase Opcode Limit.md`. Re-enabled `OP_MUL`, `OP_INVERT`, `OP_LSHIFT`, `OP_RSHIFT`; raised the operation-count limit from 201 to 500. The accepted/generated block-size defaults were configuration, not consensus.

## Quasar (2019)

Source: `updates/2019-07-24 Quasar Protocol Upgrade.md`. **Out of scope as a protocol change** — it raised only default block-size *configuration* (generated and accepted defaults). It changed no consensus rule: no previously-valid block or transaction became invalid, and vice versa. Listed here only so the timeline is complete.

## Genesis (2020-02-04)

Source: `updates/genesis-spec.md`. Mainnet height **620,538** (Testnet 1,344,302; STN 100; Regtest 10,000). The largest rule change, restoring much of the original protocol and removing many limits. Consensus changes include:

* Block size becomes a configurable consensus cap (no fixed protocol maximum).
* Removed the per-MB and per-transaction sigop limits.
* Maximum transaction size raised to 1 GB.
* Original `nLockTime`/`nSequence` meaning restored; `OP_CLTV`/`OP_CSV` revert to NOPs.
* Formal [script grammar](/specification/script.md) introduced; **unlocking scripts may contain only push data**.
* Numeric value length raised to 750,000 bytes; multisig pubkey count raised to `2³²−1` (`UINT32_MAX`).
* Removed the max script element size, max stack element count, max script size, and max ops-per-script limits, replacing them with the **stack-memory-usage** consensus rule `Σ(32 + element_size)`.
* **P2SH sunset:** an output matching the P2SH template (`OP_HASH160 <20 bytes> OP_EQUAL`) makes the transaction invalid.
* `OP_RETURN` restored: it terminates the script with validity taken from the top stack item.
* Disabled `OP_2MUL`, `OP_2DIV`, `OP_VERIF`, `OP_VERNOTIF`.

The **UTXO height rule** (above) was introduced here: inputs are judged under the rules in force when the spent UTXO confirmed.

## Confiscation Transactions (2022-11-11)

Source: `updates/confiscation-transactions.md`. Adds a new transaction class that skips script verification for whitelisted, consensus-frozen inputs. A confiscation transaction is valid only if it is txid-whitelisted and the height is at or beyond its `EnforceAtHeight`. Key points:

* Identified by the first output being an `OP_RETURN` carrying the protocol id `cftx` (a 4-byte ASCII pushdata).
* The message is `VERSION (1 byte) ‖ ORDERHASH (20 bytes) ‖ LOCATIONHINT`, where `ORDERHASH` is `RIPEMD160` of the 256-bit confiscation-order hash.
* The `OP_RETURN` payload is ≤ 80 bytes and the whole output ≤ 83 bytes.
* New maturity rule: a confiscation output cannot be spent until `CONFISCATION_MATURITY = 1000` blocks have passed (see [Consensus Rules](/specification/consensus-rules.md)).
* Consensus-frozen outputs invalidate blocks/transactions that spend them; the whitelist overrides this for valid confiscation transactions.

(The associated RPCs, configuration flags, and mempool/reorg mechanics are implementation, not protocol, and are out of scope.)

## Chronicle (2026-04-07)

Source: `updates/chronicle-spec.md`. Mainnet height **943,816** (Testnet 1,713,168; Regtest 15,000). Consensus changes:

* Restores the **Original Transaction Digest Algorithm (OTDA)** alongside BIP143, selected per signature via the `SIGHASH_CHRONICLE` bit (`0x20`) and mixable across inputs (see [Sighash](/specification/signature-hashing.md)).
* Raises the maximum script number length from 750,000 bytes to 32 MB.
* For transactions with **version > 1**, removes selective malleability restrictions — minimal encoding, LOW\_S, NULLFAIL/NULLDUMMY, MINIMALIF, clean-stack, and the Genesis data-only-in-unlocking-script rule (functional opcodes are again allowed in unlocking scripts). See [Script](/specification/script.md).
* Re-instates the opcodes `OP_VER` (`0x62`), `OP_VERIF` (`0x65`), `OP_VERNOTIF` (`0x66`), `OP_SUBSTR` (`0xb3`), `OP_LEFT` (`0xb4`), `OP_RIGHT` (`0xb5`), `OP_2MUL` (`0x8d`), `OP_2DIV` (`0x8e`), `OP_LSHIFTNUM` (`0xb6`), `OP_RSHIFTNUM` (`0xb7`) — see [Opcodes](/specification/opcodes.md).
