Runes

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

  1. Feed the script hex to your parser along with the stated output count.
  2. Compare against the expected outcome column: either a decoded runestone, or a cenotaph with a specific flaw, or no artifact at all.
  3. 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

Expected outcome: a well-formed runestone
IDCaseScript hexOutputsExpected decoding
V1Empty runestone6a5d2Runestone with no fields. Input runes transfer to the first non-OP_RETURN output.
V2Single edict transfer6a5d0800c0a23303e807012One edict: rune 840000:3, amount 1000, output 1. Remainder to output 0.
V3Two edicts, delta encoded6a5d0d00c0a23303e807010019f403002Edict 1: 840000:3, 1000, output 1. Edict 2: block delta 0 and tx delta 25 give 840000:28, 500, output 0.
V4Sweep, amount zero6a5d0700c0a2330300012One edict: 840000:3, amount 0 meaning the entire remaining balance, to output 1.
V5Even split6a5d0700c0a2330300033Output 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.
V6Mint6a5d0614c0a23314032Mint of rune 840000:3 (tag 20 given twice: block, then tx). Minted amount goes to output 0.
V7Mint with pointer6a5d0814c0a233140316012Same mint, plus pointer (tag 22) = 1, so the minted amount goes to output 1.
V8Full etching6a5d22020704c2e1d8f3d9a4f589cf100102034005924d06c0843d0ae8070888a40112a0652Etching 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.

Expected outcome: cenotaph with the named flaw
IDCaseScript hexOutputsFlawWhy
C1Rune tag without Etching flag6a5d0204042UnrecognizedEvenTagTag 4 is an etching field. With no Etching flag it is never consumed, and an unconsumed even tag is fatal.
C2Unrecognized flag bit6a5d0202082UnrecognizedFlagFlags value 8 sets bit 3, which has no assigned meaning. Bits left set after consumption are fatal.
C3Tag with no value6a5d030203022TruncatedFieldIntegers are 2, 3, 2: the trailing tag 2 has no following value.
C4Trailing integers in body6a5d04000101012TrailingIntegersAfter the Body tag, three integers remain. Edicts come in groups of exactly four.
C5Invalid edict rune ID6a5d0500000102002EdictRuneIdBlock delta 0 with tx delta 1 yields ID 0:1. Block 0 with a nonzero tx index is not a valid rune ID.
C6Edict output beyond count6a5d0800c0a23303e807052EdictOutputOutput index 5 exceeds the output count of 2. Only equality is allowed, as a split.
C7Pointer beyond output count6a5d0216052UnrecognizedEvenTagPointer 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.
C8Partial mint6a5d0414c0a2332UnrecognizedEvenTagTag 20 needs two values. One value cannot be consumed, so it remains and is fatal.
C9Reserved even tag6a5d027e002UnrecognizedEvenTagTag 126 is reserved and unrecognized by definition.
C10Supply overflow6a5d18020308020a808080808080808080808080808080808080022SupplyOverflowEtching with Terms, cap 2 and amount 2127. cap × amount overflows u128.
C11Non-pushdata opcode6a5d692Opcode0x69 is OP_VERIFY. Anything that is not a pushdata opcode after OP_13 is fatal, including OP_PUSHNUM opcodes.
C12Push runs past end of script6a5d04beef2InvalidScriptA 4-byte push is declared but only 2 bytes follow, so the script does not parse.
C13Unterminated varint6a5d01802VarintThe single payload byte 0x80 has the continuation bit set with nothing after it.
C14Overlong varint6a5d1480808080808080808080808080808080808080002VarintNineteen 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.

Expected outcome: no artifact
IDCaseScript hexExpected
N1Not an OP_RETURN output51Skipped when searching for a runestone. No artifact.
N2OP_RETURN without OP_136a04deadbeefA 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:

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: