For anyone who lets an AI agent trade or move treasury funds on Monad. The agent's limits live in a policy the model cannot argue with, every decision is proved on-chain, and the venue itself reverts any order the policy did not sign.
Inside the policy. The attestor signed a grant for exactly this call, and the venue accepted it.
Transaction on MonadThe policy said no. The agent sent it anyway with a grant it forged, and the gate reverted it on-chain.
Refused(BAD_SIGNATURE)Told a forwarded email had approved an exception, Claude placed the $25,000 order. The exchange tool asked Chancela first. Not filled.
Read the transcriptThe agent is ERC-8004 #10277 in the official registry and its funds sit in a ChancelaAccount, which makes a call only with a grant for exactly that call. It trades on Uniswap V3, a protocol that has never heard of Chancela. The amounts are a cent; the chain and the DEX are real.
An LLM proposes an action. A deterministic policy engine authorizes it. Swap the model and the decision is unchanged.
An action not explicitly granted is refused. Unknown actions are refused. A crash is refused. There is no permissive fallback.
Every decision is anchored on Monad, including the blocked ones. A registry that only proves the allows proves nothing.
Some actions need their owner. They approve with a passkey over the exact decision, and Monad verifies that signature itself, with its native P-256 precompile.
The SDK and the MCP server check every permission against the attestor the owner registered on-chain. This service can refuse to answer. It cannot forge a yes.
An owner holds one passkey. It derives a separate key for every agent — no seed phrase, nothing stored — and each key is registered on-chain.
One command, from an empty folder. It checks a live decision against the attestor the owner registered on Monad, runs the policy engine again on your machine, then forges a grant and sends the order anyway: Monad reverts it three ways. The on-chain part works with this site switched off.
chancela-check on npm$ npx chancela-check ✓ forged grant, $200 order sent anyway Monad: Refused(BAD_SIGNATURE) $ npx chancela-check replay <id> ✓ same inputs, same verdict as on Monad
No account and no API key. Pick the one that matches how your agent is built.
curl -X POST \
https://chancela.xyz/api/agents/TA-001/authorize \
-H 'content-type: application/json' \
-d '{"action":"CREATE_CUSTOMER",
"parameters":{"name":"Maria"}}'npm install chancela-sdk viem await chancela.guard(agentId, action, params, () => wallet.send(...))
{ "mcpServers": { "chancela": {
"command": "npx",
"args": ["-y", "chancela-mcp"] } } }Ask the agent to move money. Watch the policy engine say no, on-chain.