ava/receipts
What a receipt proves, and what it refuses to claim
A receipt is the one thing Ava asks you to trust, which is why it is built so you do not have to. The one below is real: supply USDC on Aave v3, block 93,291,520 on Monad, one of 8 mainnet settlements this site re-reads from a public node before it is allowed to build. Read it field by field, then read the refusals, because a wallet that never says no was never bounded.
Bounded before it runs. Proven after.
Three primitives. Together they are the difference between an agent that can move money and an agent you would let move yours.
01Sign a mandate
Asset, chain, notional cap, allowed actions. Signed by you before the agent has any authority. The model is never the signer.
{
"capital": {
"asset": "USDC",
"amount": 500
},
"chains": ["base", "monad"],
"allowedKinds": ["lend", "swap"],
"status": "active"
}02Preview, then execute
Every execution is two calls. The first returns the exact transaction and its hash and moves nothing. The second must carry that hash or it refuses.
ava_lend_execute
→ POLICY_HUMAN_CONFIRMATION_REQUIRED
previewHash: 4b37e63f…87e16
ava_lend_execute previewHash=4b37e63f…
→ filled, block 93,291,52003Get a receipt you can check
Ava re-reads the transaction from a public RPC and reports two standings separately: did it confirm on chain, and does what settled match what was authorised.
"attestation": {
"confirmed": true,
"chain": "monad",
"source": "public-rpc"
},
"proof": { "standing": "chain-confirmed" }A receipt states only what it can prove
Two standings, never merged. A transaction can confirm on chain and still not be the one you authorised. Ava reports both and calls it a fill only when both hold.
{
"receiptVersion": "ava.exec.v1",
"executionId": "exec_lend_aave_62d2a6763c984af8be707a58",
"venue": "aave",
"status": "filled",
"txHash": "0x1b23c35d5c7c58746961…26628af7",
"blockNumber": 93291520,
"attestation": {
"confirmed": true,
"chain": "monad",
"source": "public-rpc"
},
"proof": { "standing": "chain-confirmed" },
"settlement": { "standing": "matched" }
}proof.standing
chain-confirmed
The declared chain returned this transaction and its status, token, amount and recipient match the receipt.
settlement.standing
matched
Every comparable field between what was authorised and what settled agrees, and at least one was compared.
scripts/verify-settlements.mjs before every build. If the chain disagrees, the deploy fails.Verify it yourselfRefuses more often than it fills
Every refusal is a typed code with a reason the agent can read and you can audit. Silence is the failure mode Ava does not have.
MANDATE_NOTIONAL_EXCEEDED
Amount is larger than the cap you signed.
POLICY_HUMAN_CONFIRMATION_REQUIRED
Execute called without the preview hash. Nothing moved.
LEND_INSUFFICIENT_BALANCE
Wallet does not hold enough of the asset. Refused before broadcast.
PRINCIPAL_SIGNER_UNKNOWN
No signed mandate names this key. Ava will not learn one from the request.
Ask a receipt to prove itself
Nothing above needs to be taken on trust. Paste an execution id into /verify and the chain answers instead of Ava, or connect an agent and produce a receipt of your own against a cap you set.