Skip to content

Protect asset-bearing outputs

Outcome: you will have a short, reliable routine that makes accidental spending of an artifact effectively impossible.

Before spending from any address that might hold assets:

  1. Open the address in ZordiScan. Every inscription, ZRune balance, and ZRC-20 balance is listed against the specific output carrying it.
  2. Check the outputs you are about to spend. An output is spent whole; everything riding on it moves together. Why one output can carry hundreds of things.
  3. Use an inscription-aware wallet for any address that holds assets, and never a general-purpose wallet that shares the same seed.

The indexer publishes a per-output verdict on whether an output carries an asset, and it names every asset on the output rather than the first one it finds. Universe Wallet consults this verdict before letting a transaction spend an output.

The verdict fails closed: while any part of the chain is unread, an output with nothing recorded against it is reported as unchecked, not as clear, because an output created in an unread block is indistinguishable from one that never carried anything. A wallet that consults the verdict cannot be told an unknown output is safe to spend.

A ZRC-20 transfer happens in two steps: inscribing the transfer sets the amount aside, and spending that inscription’s output delivers it. Between the steps the amount is committed: still yours, not available to move again. Address pages show balances split into available and committed, so an attempted transfer that fails for insufficient balance has a visible explanation, and so you know a committed amount is riding on a specific output you should not spend casually.

SituationWhat happensWhat to do
You spent an asset-bearing output to a normal addressThe asset moved to the first transparent output’s ownerIf you control the destination, nothing is lost; move it deliberately next time
You spent it entirely into a shielded poolZerdinal: tracking ended permanently. ZRune: balance burnedNothing recovers either state; this is why the routine above exists
The verdict says uncheckedPart of the chain is unreadWait for coverage to complete; the status page shows progress