Block Types
The block types used by the XE block-lattice
XE has twelve block types. Every block shares a set of common fields; each type adds its own type-specific fields.
Common fields
All blocks carry these fields:
Field
Type
Description
Type
string
Block type identifier: send, receive, mint, genesis, burn, lease, lease_accept, lease_settle, lease_cancel, lease_force_settle, multisig_open, multisig_update
Account
string
Hex-encoded ed25519 public key of the account that owns this block (64 hex chars)
Previous
string
Hash of the previous block on this account's chain; "0" for the first block
Balance
uint64
Account balance for this asset after this block
Timestamp
int64
Unix nanoseconds when the block was created
Asset
string
Asset identifier: "XE" or "XUSD"
Representative
string
Hex public key of this account's voting delegate (empty for no delegation)
Hash
string
SHA-256 over the network ID, the canonical binary encoding, and the auxiliary tail (64 hex chars) — see Encoding
Memo
string
Optional clear-text annotation, at most 64 bytes of UTF-8. Allowed on send and burn blocks only; hashed as part of the canonical bytes
Signature
string
Ed25519 signature over the hash bytes (128 hex chars)
PoWNonce
uint64
Anti-spam proof-of-work nonce (excluded from hash computation)
Signatures
array
Multisig signatures array (replaces Signature for multisig accounts)
Keyset
object
Multisig keyset for multisig_open and multisig_update blocks
[!INFO] PoW nonce exclusion The
PoWNonceis computed after signing. It is excluded fromHashcomputation so the signature remains valid regardless of the nonce value. The PoW is validated separately by checking thatblake2b(nonce || hashBytes) >= difficulty.
[!NOTE] Hash inputs
HashBlockcomputessha256(networkID || canonicalBytes || auxBytes). The network ID scopes every block to one network instance.auxBytesis empty for non-lease blocks; forlease,lease_accept,lease_settle, andlease_force_settleit frames theCertificateHashand the (public-key-sorted)Attestationsset, so those fields cannot be rewritten in transit while the hash and signature still verify.
Send (send)
Debits the sender's balance and creates a pending send for the recipient.
Type-specific fields
Field
Type
Description
Destination
string
Hex public key of the recipient account
Amount
uint64
Number of tokens to send
Validation rules
Amountmust be > 0.- Sender must have sufficient balance:
previousBalance - Amount = Balance. Destinationmust be a valid 32-byte hex-encoded public key, and must not be the sending account itself.Previousmust match the account's current frontier, andTimestampmust not go backwards on the chain.Assetmust be"XE"or"XUSD".Memo, if present, must be ≤ 64 bytes of valid UTF-8 with no ASCII control bytes other than tab and newline.
Side effects
On successful validation, a PendingSend record is created:
PendingSend{
SendHash: block.Hash,
Source: block.Account,
Destination: block.Destination,
Amount: block.Amount,
Asset: block.Asset,
}This pending send persists until the recipient creates a matching receive block.
Binary encoding
Type byte: 0x01. Tail: destination(32) + amount(8). Total canonical size: 163 bytes and up (90 header + 40 tail + 32 representative + 1 memo-length byte + memo bytes). The memo-length byte is always written, so a missing memo and an empty memo encode identically.
Receive (receive)
Credits the recipient's balance from a pending send.
Type-specific fields
Field
Type
Description
Source
string
Hash of the send block being received
Validation rules
Sourcemust reference an existing pending send whereDestinationmatches this block'sAccount.Balancemust equalpreviousBalance + pendingSend.Amount. On an open-receive (the account's first block,Previous = "0") it must equal the pending amount exactly.Assetmust match the pending send's asset.- The source must not be a live lease escrow — a lease's pending send is addressed to the provider but can only be resolved by
lease_settle,lease_cancel, orlease_force_settle, never by a plain receive. - The source send's chain position must not be covered by an unresolved conflict. A receive of a contested send is deferred (retryable) until exactly one sibling wins.
Side effects
The pending send referenced by Source is deleted. The recipient's balance increases by the send amount.
Binary encoding
Type byte: 0x02. Tail: source(32). Total canonical size: 154 bytes (90 header + 32 tail + 32 representative).
Mint (mint)
Creates new XUSD on an authorized minter's own chain. There is no counterparty and no pending entry — the minter then distributes XUSD by ordinary send → receive.
Type-specific fields
Field
Type
Description
Amount
uint64
XUSD to create, in micro-units
Validation rules
Assetmust be"XUSD". XE is never mintable — its supply is genesis plus lease emission only.Accountmust be listed in thesys.minterstate-chain config. With no minter configured, every mint is unauthorized.Amountmust be > 0;Destination,Source, andMemomust be empty.Balancemust equalpreviousBalance + Amount(or exactlyAmountwhen the mint opens the account withPrevious = "0").
Side effects
The minter's XUSD balance increases by Amount.
[!NOTE] Mint replaced the permissionless claim block Earlier revisions of the protocol had a permissionless
claimblock that let any account self-mint XUSD. It was removed: minting is now restricted to accounts registered undersys.minter, and mint blocks go through the normalAddBlockpath, so a mint race is detected and resolved as an ordinary equivocation.
Binary encoding
Type byte: 0x0D. Tail: amount(8). Total canonical size: 130 bytes (90 header + 8 tail + 32 representative).
Burn (burn)
Permanently destroys XE from the issuing account's balance. There is no destination, no pending entry, and no counterpart.
Type-specific fields
Field
Type
Description
Amount
uint64
XE to destroy, in micro-units
Validation rules
Assetmust be"XE". Burning XUSD is not supported.Amountmust be > 0 and must not exceed the account's XE balance.DestinationandSourcemust be empty.Balancemust equalpreviousBalance - Amount.Memo, if present, follows the same 64-byte UTF-8 rules as on a send.
Side effects
The XE is removed from circulation. Nothing is credited anywhere.
Binary encoding
Type byte: 0x0B. Tail: amount(8). Total canonical size: 131 bytes and up (90 header + 8 tail + 32 representative + 1 memo-length byte + memo bytes).
Genesis (genesis)
The first block of the ledger. It mints the initial XE supply to the treasury account and, optionally, pins the network's lease timing.
Type-specific fields
None beyond the common fields, plus the optional genesis-only lease-timing fields (lease_min_duration_secs, lease_settle_grace_ns, lease_force_settle_gap_ns, lease_escrow_expiry_ns, lease_archive_gap_ns, max_attestation_skew_ns).
Validation rules
- The ledger must be empty — genesis is only valid as the very first block.
- The block must match the binary's embedded genesis hash exactly.
Previousmust be"0",Timestampmust be0, andAssetmust be"XE".Balancemust equal the genesis supply: 42,000,000 XE (42_000_000 × 10^6micro-XE).Representative, if set, must be a 64-hex-character public key. It seeds the treasury's delegation so vote weight exists from block 0.
Side effects
The treasury account is opened with the full genesis supply. Any lease-timing fields present are applied as this network's timing values; fields left at zero fall back to the production defaults.
[!INFO] Lease timing is pinned at genesis A network can override the lease timing constants in its genesis block, so a compressed test network is a different genesis rather than a different binary. A genesis with no timing fields encodes byte-identically to one from before the feature existed. Read the live values from
GET /noderather than assuming the defaults.
Binary encoding
Type byte: 0x07. No type-specific tail. Total canonical size: 122 bytes (90 header + 32 representative), or 170 bytes when the 48-byte lease-timing tail is present.
Lease (lease)
Debits XUSD from the consumer to request a compute lease. This is the consumer's side of a lease transaction.
Type-specific fields
Field
Type
Description
Destination
string
Hex public key of the provider account
Amount
uint64
Total XUSD cost of the lease
VCPUs
uint64
Number of virtual CPUs requested
MemoryMB
uint64
Memory in megabytes
DiskGB
uint64
Disk in gigabytes
Duration
uint64
Lease duration in seconds
AccessPubKey
string
Optional 32-byte hex ed25519 public key used to authenticate access to the leased VM
CertificateHash
string
Hash of the provider's performance certificate, which locks in the price multiplier at offer time (required)
Validation rules
Assetmust be"XUSD".Destinationmust be set and must not be the leasing account itself.- At least one of
VCPUs,MemoryMB,DiskGBmust be > 0. Durationmust be between the network's minimum lease duration (production default 60 seconds) and 31,536,000 seconds (365 days).CertificateHashmust reference a certificate that belongs toDestinationand has not expired as of the block's timestamp.Amountmust match theLeaseCost()formula, evaluated with that certificate's price multiplier (see Cost Model).- Sender must have sufficient XUSD balance:
previousBalance - Amount = Balance.
Side effects
Creates a pending send (like a regular send) with the XUSD amount directed at the provider — the lease escrow — and records a Lease in the created state. The lease is not active until the provider creates a lease_accept block. The escrow is not a normal receivable: it is burned at settle, or refunded by lease_cancel / lease_force_settle.
Binary encoding
Type byte: 0x04. Tail: destination(32) + amount(8) + vcpus(8) + memory_mb(8) + disk_gb(8) + duration(8) + access_pub_key(32). Total canonical size: 226 bytes (90 header + 104 tail + 32 representative).
Lease Accept (lease_accept)
The provider accepts a lease, staking XUSD as collateral. This activates the lease.
Type-specific fields
Field
Type
Description
Source
string
Hash of the consumer's lease block
Amount
uint64
XUSD stake amount, ⌈cost / 5⌉ (minimum 1 micro-XUSD)
CertificateHash
string
Must be the same certificate the consumer referenced on the lease block
LockedR
uint64
R_effective at accept time, scaled ×1000
LockedPayoutCap
uint64
Hermite payout cap at accept time, scaled ×1000
LockedTWAP
uint64
TWAP at accept time, in milli-USD
Validation rules
Assetmust be"XUSD".Sourcemust reference a lease block whoseDestinationis this provider, and whose lease is still in thecreatedstate.Amountmust equal⌈leaseCost / 5⌉, minimum 1 micro-XUSD (the stake divisor is 5).- Provider must have sufficient XUSD balance:
previousBalance - Amount = Balance. - Timekeeper attestations are mandatory —
sys.timekeepersmust be configured and the attestation threshold met. Self-reported timestamps are never accepted. CertificateHashmust match the lease block's certificate, belong to this provider, and not be expired at the attested start time.LockedRmust be set, and the locked triple must match a state-chain epoch's emission parameters.
Side effects
The lease record moves to the accepted state, recording the stake and the attested start time. The provider's XUSD is locked as stake. The consumer's escrow stays alive — it is not drained here.
Attestations
Lease accept blocks carry Attestations -- signed timestamps from trusted timekeeper nodes. They are attached after the block body is built, so they are not part of the canonical encoding, but they are bound into the block hash through the auxiliary tail together with CertificateHash. Validation checks that the required number of attestations are present and their signatures are valid; the attested median becomes the lease's start time.
type TimekeeperAttestation struct {
PublicKey string // hex ed25519 pubkey of timekeeper
Timestamp int64 // unix nanos attested
Signature string // hex ed25519 sig over sha256(leaseHashBytes || timestampBytes)
}Binary encoding
Type byte: 0x05. Tail: source(32) + amount(8) + locked_r(8) + locked_payout_cap(8) + locked_twap(8). Total canonical size: 186 bytes (90 header + 64 tail + 32 representative).
Lease Settle (lease_settle)
Settles an expired lease and emits XE as a reward to the provider.
Type-specific fields
Field
Type
Description
Source
string
Hash of the original lease block
Amount
uint64
XE emission reward
Validation rules
Assetmust be"XE".Sourcemust reference a lease in theacceptedstate whose provider is this account. A lease still increateddefers the settle (retryable) until the accept lands.- The lease must have expired: the attested timestamp must be at or past
startTime + duration, and no later thanexpiry + LeaseSettleGrace(production default 1 hour). - Timekeeper attestations are mandatory.
Amountmust equal⌈cost × R_capped / 1000⌉(minimum 1 micro-XE), using the emission parameters locked onto the lease at accept time.- The consumer's escrow pending send must still exist.
Side effects
- The lease is marked as settled.
- The consumer's XUSD escrow is burned.
- The provider's XUSD stake is returned (added back to their XUSD balance).
- XE is emitted to the provider's account (
Balance = previousXEBalance + Amount).
[!INFO] XE emission Lease settlement is the mechanism by which new XE enters circulation. Providers earn XE proportional to the compute they deliver, creating a link between real-world utility and token emission.
Binary encoding
Type byte: 0x06. Tail: source(32) + amount(8). Total canonical size: 162 bytes (90 header + 40 tail + 32 representative). Unlike lease_accept, a settle carries no locked emission params — it reads them from the lease record.
Lease Cancel (lease_cancel)
The consumer withdraws a lease that no provider has accepted, refunding the escrow.
Type-specific fields
Field
Type
Description
Source
string
Hash of the consumer's own lease block
Validation rules
Assetmust be"XUSD".Sourcemust reference aleaseblock created by this same account — only the consumer can cancel.- The lease must be in the
createdstate, and its escrow pending send must still exist. Balancemust equalpreviousBalance + leaseCost(the full refund).
Side effects
The escrow pending send is deleted, the full cost is refunded to the consumer, and the lease is marked cancelled.
[!NOTE] Cancel wins over a racing accept If a cancel and an accept race across nodes, the outcome is deterministic: the cancel wins. A node that already applied the provider's accept unwinds it so the cancel proceeds, converging with nodes that saw the cancel first. The exception is a finalized accept — a finalized block legitimately won consensus and is never unwound, so the cancel is rejected instead.
Binary encoding
Type byte: 0x0A. Tail: source(32). Total canonical size: 154 bytes (90 header + 32 tail + 32 representative).
Lease Force Settle (lease_force_settle)
The consumer resolves an accepted lease that the provider never settled. It lives on the consumer's chain, disjoint from the provider's lease_settle.
Type-specific fields
Field
Type
Description
Source
string
Hash of the consumer's own lease block
Validation rules
Assetmust be"XUSD".Sourcemust reference aleaseblock created by this same account — only the consumer can force-settle.- The lease must be in the
acceptedstate, and its escrow must still exist. - Timekeeper attestations are mandatory, and the attested median must be at or past
expiry + LeaseSettleGrace + LeaseForceSettleGap— 1h25m after expiry on production timing. - The attested median must be before
expiry + LeaseEscrowExpiry(production default 365 days). Past that the refund window has closed and the escrow is considered burnt. Balancemust equalpreviousBalance + leaseCost.
Side effects
The consumer's full cost is refunded from the escrow, the provider's stake is burned (not returned, unlike lease_settle), and the lease is marked unfulfilled. No XE is emitted.
[!INFO] Disjoint windows
LeaseForceSettleGapmust exceed twice the maximum attestation skew, so no single real timestamp — even shifted by the maximum skew on each side — can satisfy both the provider's settle window and the consumer's force-settle window. The genesis validator enforces this bound on any genesis-pinned value.
Binary encoding
Type byte: 0x0C. Tail: source(32). Total canonical size: 154 bytes (90 header + 32 tail + 32 representative).
Multisig Open (multisig_open)
Opens a new multisig account with a hash-derived address.
Type-specific fields
Field
Type
Description
Keyset
object
{keys: [pubkey1, pubkey2, ...], threshold: N}
Signatures
array
[{public_key, signature}, ...] — must have threshold valid signatures
Validation rules
accountmust equalsha256(canonical(keyset))— the address is derived from the keyset.keyset.threshold >= 1and<= len(keys), no duplicate keys.- Block must have
thresholdvalid signatures from keyset members. - Account must not already exist.
- Balance must be 0.
Binary encoding
Type byte: 0x08. Tail: canonical_keyset(threshold_u32_be + num_keys_u32_be + sorted_keys_32_each). Canonical size is 130 + 32 × numKeys bytes (90 header + 8 keyset header + 32 per key + 32 representative).
Multisig Update (multisig_update)
Rotates the keyset on an existing multisig account.
Type-specific fields
Field
Type
Description
Keyset
object
New keyset {keys: [...], threshold: N}
Signatures
array
Must have threshold valid signatures from the current (old) keyset
Validation rules
- Account must be an existing multisig account.
- Signed by the current keyset's threshold.
- Balance must be unchanged.
- The account address does NOT change (derived from original keyset).
Binary encoding
Type byte: 0x09. Same tail format as multisig_open.
Summary table
Type
Byte
Asset
Debits
Credits
Creates pending
Canonical size
send
0x01
XE or XUSD
sender
--
yes
163+ bytes
receive
0x02
XE or XUSD
--
recipient
consumes pending
154 bytes
lease
0x04
XUSD
consumer
--
yes (escrow)
226 bytes
lease_accept
0x05
XUSD
provider (stake)
--
lease → accepted
186 bytes
lease_settle
0x06
XE
--
provider (emission + stake back)
burns escrow, settles lease
162 bytes
genesis
0x07
XE
--
treasury (genesis supply)
--
122 or 170 bytes
multisig_open
0x08
XE or XUSD
--
--
registers keyset
130 + 32×keys
multisig_update
0x09
XE or XUSD
--
--
rotates keyset
130 + 32×keys
lease_cancel
0x0A
XUSD
--
consumer (refund)
refunds escrow, cancels lease
154 bytes
burn
0x0B
XE
burner
--
--
131+ bytes
lease_force_settle
0x0C
XUSD
provider (stake burned)
consumer (refund)
refunds escrow, unfulfils lease
154 bytes
mint
0x0D
XUSD
--
minter
--
130 bytes
Block lifecycle
Creator Network Recipient
─────── ─────── ─────────
1. Build block fields
2. MarshalBlockCanonical()
3. HashBlock() → Hash
4. ed25519.Sign(hash) → Signature
5. ComputePoW(hash) → PoWNonce
6. Broadcast via gossip ──────►
7. VerifyBlock (hash + sig)
8. ValidatePoW (nonce)
9. Ledger validation
10. Add to account chain
11. Rebroadcast ─────────────►
12. (for sends) appears as PendingSend
13. (recipient creates receive block)