Transaction protocol
The user transaction is one canonical logical PagedSpend. It consists of one
to 128 fixed Tx8x2 pages and exactly one detached authorization capsule.
Physical page
Each page has the fixed 323-byte body encoding:
| Field | Meaning |
|---|---|
epoch_anchor |
Current 144-block replay-protection anchor |
fee |
Logical fee on the first page; zero on continuations |
input_owner |
Owner shared by every live input |
inputs[8] |
Possible {slot_index, amount, creation_id} records |
outputs[2] |
Possible {slot_index, amount, owner} records |
validity_bitmap |
Live records and logical start/end markers |
is_coinbase |
False for every user page |
Bits 0–7 select inputs and bits 8–9 select outputs. Bits 10 and 11 mark the start and end of a logical group. No other bitmap bit may be set.
A record whose live bit is zero must be the all-zero canonical dummy. This removes alternate encodings of the same statement.
Group validity
A valid PagedSpend satisfies all of these rules:
- page count is between one and 128;
- only page zero has the start marker;
- only the final page has the end marker;
- every page has the same
input_ownerandepoch_anchor; - only the first page carries a non-zero fee;
- live inputs and outputs are packed densely in page order;
- the page count is minimal for those records;
- at least one input is live;
- no input appears twice;
- no output slot appears twice;
- an output slot is not also an input slot in the same spend;
- there are at most 1,020 inputs and 256 outputs;
- total input value equals total output value plus the fee;
- the detached authorization is no larger than 256 KiB.
The maximum canonical intent encoding is 303,495 bytes.
Logical transaction ID
Page-local body hashes do not independently name the payment. The logical ID is a domain-separated Poseidon2b sponge over:
version || page_count || ordered_page_hashes
The launch version is 1. Reordering, adding or removing a page changes the
ID. The authorization capsule proves knowledge of the preimage behind
input_owner for that exact logical ID.
State checks
For each input, the current slot must be occupied by the declared owner,
amount and creation_id. For each output, the target slot must be empty and
inside the active slot domain.
Output creation_id values are not transaction fields. Consensus assigns them
from the post-State allocation sequence. A user cannot choose or reuse one.
The block transition enforces all State checks atomically for the complete logical group.
Fees
The minimum fee is:
5,000
+ 100 × live_inputs
+ 700 × live_outputs
+ growth_price × max(0, live_outputs - live_inputs)
All amounts are in μNOID. growth_price begins at 2,500 μNOID per net-new
slot and is multiplied by 1, 2, 4 or 8 according to parent-State occupancy.
The State-growth component is burned. Any fee above the required minimum is a miner-claimable tip. State-preserving and State-shrinking spends have no growth burn.
Epoch anchor
Every page uses the current transaction-epoch anchor. For child height C,
the anchor is the block ID at:
floor((C - 1) / 144) × 144
for C > 0. Height 144 still consumes the height-zero anchor; height 145
begins using height 144. The mempool removes intents whose anchor is no longer
current.
Authorization and State are separate
Wallet authorization proves ownership only. It does not prove current slot membership and contains no Live State Merkle path.
The block HistoryStep proves current membership, emptiness, balance,
allocation and the post-State root. Both statements bind the same public
logical transaction.
System records
Primary reward and scheduled development payout records use the fixed physical
body type but are not user PagedSpend intents. Their shape, placement,
recipients and amounts are derived entirely from block context. They carry no
wallet authorization.
See Transaction architecture for wallet and mempool flow.