avaConnect

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,520

03Get 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.

GET /v1/receipts/exec_lend_aave_62d2a6763c984af8be707a58200
{
  "receiptVersion": "ava.exec.v1",
  "executionId": "exec_lend_aave_62d2a6763c984af8be707a58",
  "venue": "aave",
  "status": "filled",
  "txHash": "0x1b23c35d5c7c5874696126628af7",
  "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.

Block 93,291,520 on Monad. Re-read from a public RPC by scripts/verify-settlements.mjs before every build. If the chain disagrees, the deploy fails.Verify it yourself

Refuses 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.