Conformance
Test vectors
Twenty-four cases: eight valid runestones, fourteen cenotaphs covering all ten flaws, and two scripts that are not runestones at all. Each script is the complete output script in hex, ready to paste into the decoder.
Every vector on this page was encoded from the ord 0.29.0 rules and verified to decode to the stated outcome. Outcomes depending on the transaction's output count state the count assumed, since the same bytes can be valid in one transaction and a cenotaph in another.
How to use these
- Feed the script hex to your parser along with the stated output count.
- Compare against the expected outcome column: either a decoded runestone, or a cenotaph with a specific flaw, or no artifact at all.
- For cenotaphs, also assert the burn consequences: input runes burned, mint counted but burned, etching (if any) recorded as unmintable with default properties.
A parser that agrees on all twenty-four still needs testing against real chain data, but a parser that disagrees on any one of them will diverge from the index and, eventually, report the wrong owner of real value.
Valid runestones
| ID | Case | Script hex | Outputs | Expected decoding |
|---|---|---|---|---|
| V1 | Empty runestone | 6a5d | 2 | Runestone with no fields. Input runes transfer to the first non-OP_RETURN output. |
| V2 | Single edict transfer | 6a5d0800c0a23303e80701 | 2 | One edict: rune 840000:3, amount 1000, output 1. Remainder to output 0. |
| V3 | Two edicts, delta encoded | 6a5d0d00c0a23303e807010019f40300 | 2 | Edict 1: 840000:3, 1000, output 1. Edict 2: block delta 0 and tx delta 25 give 840000:28, 500, output 0. |
| V4 | Sweep, amount zero | 6a5d0700c0a233030001 | 2 | One edict: 840000:3, amount 0 meaning the entire remaining balance, to output 1. |
| V5 | Even split | 6a5d0700c0a233030003 | 3 | Output index 3 equals the output count, so the balance is divided evenly across all non-OP_RETURN outputs, earlier outputs taking the remainder. The identical bytes with 2 outputs are vector C6. |
| V6 | Mint | 6a5d0614c0a2331403 | 2 | Mint of rune 840000:3 (tag 20 given twice: block, then tx). Minted amount goes to output 0. |
| V7 | Mint with pointer | 6a5d0814c0a23314031601 | 2 | Same mint, plus pointer (tag 22) = 1, so the minted amount goes to output 1. |
| V8 | Full etching | 6a5d22020704c2e1d8f3d9a4f589cf100102034005924d06c0843d0ae8070888a40112a065 | 2 | Etching of BITCOIN•UNIVERSE: flags 7 (Etching, Terms, Turbo), name value 153272084900779274434, divisibility 2, spacers 64, symbol U+2692, premine 1000000, amount 1000, cap 21000, offset end 12960. Max supply 22,000,000 atomic units. |
Cenotaphs
Every one of these burns all input runes. All ten flaws are covered.
| ID | Case | Script hex | Outputs | Flaw | Why |
|---|---|---|---|---|---|
| C1 | Rune tag without Etching flag | 6a5d020404 | 2 | UnrecognizedEvenTag | Tag 4 is an etching field. With no Etching flag it is never consumed, and an unconsumed even tag is fatal. |
| C2 | Unrecognized flag bit | 6a5d020208 | 2 | UnrecognizedFlag | Flags value 8 sets bit 3, which has no assigned meaning. Bits left set after consumption are fatal. |
| C3 | Tag with no value | 6a5d03020302 | 2 | TruncatedField | Integers are 2, 3, 2: the trailing tag 2 has no following value. |
| C4 | Trailing integers in body | 6a5d0400010101 | 2 | TrailingIntegers | After the Body tag, three integers remain. Edicts come in groups of exactly four. |
| C5 | Invalid edict rune ID | 6a5d050000010200 | 2 | EdictRuneId | Block delta 0 with tx delta 1 yields ID 0:1. Block 0 with a nonzero tx index is not a valid rune ID. |
| C6 | Edict output beyond count | 6a5d0800c0a23303e80705 | 2 | EdictOutput | Output index 5 exceeds the output count of 2. Only equality is allowed, as a split. |
| C7 | Pointer beyond output count | 6a5d021605 | 2 | UnrecognizedEvenTag | Pointer 5 is not less than the output count, so the range check fails, the value is left unconsumed, and the even-tag rule fires. Note the flaw is not a dedicated pointer flaw. |
| C8 | Partial mint | 6a5d0414c0a233 | 2 | UnrecognizedEvenTag | Tag 20 needs two values. One value cannot be consumed, so it remains and is fatal. |
| C9 | Reserved even tag | 6a5d027e00 | 2 | UnrecognizedEvenTag | Tag 126 is reserved and unrecognized by definition. |
| C10 | Supply overflow | 6a5d18020308020a80808080808080808080808080808080808002 | 2 | SupplyOverflow | Etching with Terms, cap 2 and amount 2127. cap × amount overflows u128. |
| C11 | Non-pushdata opcode | 6a5d69 | 2 | Opcode | 0x69 is OP_VERIFY. Anything that is not a pushdata opcode after OP_13 is fatal, including OP_PUSHNUM opcodes. |
| C12 | Push runs past end of script | 6a5d04beef | 2 | InvalidScript | A 4-byte push is declared but only 2 bytes follow, so the script does not parse. |
| C13 | Unterminated varint | 6a5d0180 | 2 | Varint | The single payload byte 0x80 has the continuation bit set with nothing after it. |
| C14 | Overlong varint | 6a5d148080808080808080808080808080808080808000 | 2 | Varint | Nineteen continuation bytes then a terminator: the varint exceeds the 19-byte limit. |
Not runestones
These produce no artifact at all. The distinction matters: a transaction with no artifact leaves rune balances following the default transfer rule, while a cenotaph burns them.
| ID | Case | Script hex | Expected |
|---|---|---|---|
| N1 | Not an OP_RETURN output | 51 | Skipped when searching for a runestone. No artifact. |
| N2 | OP_RETURN without OP_13 | 6a04deadbeef | A plain data-carrier output. Skipped. No artifact, no cenotaph. |
Values that are ignored, not fatal
Three range checks sit on odd tags, and failing them is silent. A conformant parser must ignore the value and continue rather than rejecting the etching:
- Divisibility above 38 (tag 1): ignored, etching proceeds with divisibility 0.
- Spacers above
0x07FFFFFF(tag 3): ignored, etching proceeds with no spacers. - Symbol that is not a Unicode scalar value (tag 5): ignored, etching proceeds with no symbol.
The same out-of-range value on an even tag produces a cenotaph instead, because the value stays unconsumed. Vector C7 is that asymmetry in action.
Beyond the payload
These cases cannot be expressed as a single output script and need transaction-level or chain-level fixtures. Test them against a regtest chain:
- An etching whose name has no valid taproot commitment, or a commitment younger than 6 confirmations: the etching is disregarded, and this is not a cenotaph.
- An etching of an already-taken name, ignoring spacers: disregarded.
- An etching of a name still locked at the current height: disregarded.
- An etching with no name at all: the indexer assigns a reserved name, no commitment required.
- A mint whose terms are not satisfied: silently produces nothing and does not consume cap.
- A runestone in the second output, after a non-matching OP_RETURN in the first: found normally.
- An unparseable script in an earlier output: skipped without error, and a later valid runestone is still found.
- An edict with rune ID
0:0in a transaction that etches: refers to the newly etched rune. In a transaction that does not etch: skipped with no effect. - An edict or pointer directed at an OP_RETURN output: those runes are burned.
- A transaction with rune inputs and no non-OP_RETURN outputs: everything is burned.