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

# Protocol Upgrade History

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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/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](/bitcoin-protocol-documentation/specification/opcodes.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hub.bsvblockchain.org/bitcoin-protocol-documentation/specification/upgrade-history.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
