Config | Missing required option (rpc / payer / relay_url), dep setup issue, serialization failure | caller — fix the config |
Validation | Preflight rejects inputs (bad arity, balance mismatch, min deposit, etc.) | caller — fix the params |
InsufficientFunds | Surfaced by wallet-layer code composed on top of the engine (coin selection, balance checks). transact() itself validates balance at the circuit level via Error::Validation. | caller |
MissingUtxos | Same — surfaced by wallet-layer code that selects inputs. | caller |
Signer | Ed25519 signing failed on the v0 tx message | caller — check the keypair |
Crypto | Poseidon / HKDF / AES-GCM failure | caller — usually a serialization bug |
RootNotFound | Program error 0x1001 (proof root not in history) | retry loop — refresh tree |
BlockhashExpired | RPC returned BlockhashNotFound / TransactionExpiredBlockhashNotFound | submit_direct — refresh + resign |
StaleProofState | Circuit assertion failed (ForceEqual*, “invalid proof”) | retry loop — force chain-indexing rebuild |
Relay | Non-classified relay / RPC failure | caller — check tracing::debug! for body |