version u32 ≥ 1 (≥ 2: valid_until present, relative locks on)
inputs varint n, n × [prev_txid 32 | prev_vout u32 | sequence u32]
outputs varint n, n × [asset_id 32 | amount u64 | lock]
issuances varint n (≤8), n × [ticker varstr(≤16) | name varstr(≤256) | decimals u8 |
amount u64 | max_supply u64 | flags u8 | metadata_hash 32]
mints varint n (≤8), n × [asset_id 32 | amount u64]
freezes varint n (≤64), n × [asset_id 32 | lock | frozen u8 (0|1)]
clawbacks varint n (≤ #inputs), n × [input_index u32]
lock_time u32
valid_until u32 version ≥ 2 only (0 = never expires)
memo varbytes (≤ 256)
witnesses #inputs × [varint k, k × varbytes] (full serialization only)
txid = TH("txid", serialization without witnesses).
wtxid = TH("wtxid", full serialization), except a coinbase's wtxid equals its txid.
Coinbase = a transaction with zero inputs.
5.1 Context-free rules (check_transaction)
version ≥ 1. Version 1 has valid_until = 0. Coinbases are version 1. Versions above 2 follow
version-2 rules (reserved for soft forks). Witness count equals input count. Full size
≤ max_tx_size (1,000,000).
At least one output. Every amount ≤ 2⁶³−1. Spendable (non-burn) outputs have amount ≥ 1.
The per-asset output sum must be ≤ 2⁶³−1.
Coinbase: no issuances, mints, freezes or clawbacks; every output is native ARRK.
Non-coinbase: no duplicate inputs.
Issuances: each passes §7.1. Tickers are unique within the transaction.
Mints: never ARRK; amount 1..2⁶³−1; no duplicate asset.
Freezes: never ARRK; the target lock is not BURN; no duplicate (asset, lock) pair.
Clawbacks: unique indices, each < #inputs, and the witness at each such index MUST be empty.