Live on Monad testnet · chain 10143
A firewall and an onchain receipt for every AI agent call.
- 1 Set what the agent may call
- 2 It calls only through the firewall
- 3 Each call gets a verified, anchored receipt
AgentTrace fences what an onchain agent may call, checks from the Monad receipt whether the call achieved its purpose, and publishes that verdict to the shared ERC-8004 registries, so anyone can read an agent's record without trusting this site.
Latest executions Live
All proofs →- Latest Monad testnet block
Verify a proof yourself
Paste an execution id or transaction hash. The server re-reads the receipt from a public Monad RPC, rebuilds the proof hash and compares it with AgentProof.getAnchor, the same steps as scripts/verify-proof.mjs.
Onchain amount cap, live
Agent #012 may call DemoProtocol.deposit with amount ≤ 500. The limit lives in AgentFirewallV2 0x5b027151…, so a call above it reverts in the contract, not in this app.
Deprecated for holding assets: V1 and V2 firewalls call targets as one shared contract, so tokens left there are not separated per agent. New agents should use AgentFirewallV3, where each agent gets its own vault.
- Alloweddeposit 100 · executed0x347c1512…
How one agent action is checked
registerAgent() mints a sequential agent id owned by the wallet that signed it. The passport shows owner, capabilities and the registration transaction.
Agent #013 →Works with agents you already run
One SDK call routes an agent's transaction through its firewall and returns the proof. The same call ships as an MCP server, so Claude, Cursor, or any MCP host gets onchain tools that cannot step outside the policy.
In a scripted MCP session the Treasury Agent read its policy, made a deposit that came back verified and anchored, and was refused a withdraw before anything was sent.
import { traceCall } from "agenttrace-monad";
const r = await traceCall({
network: "monad-testnet",
signer: process.env.AGENT_KEY, // executor
firewallId: 2,
target, data, // your agent's call
});
r.proofStatus // "receipt_verified"
r.anchorTxHash // anchored in AgentProof
// off-policy: FIREWALL_REJECTED,
// nothing sentTrust model
What AgentTrace still asks you to trust, and how each part is being removed.
- One-click setupLive in /demoConnect once, confirm once (EIP-5792 batch). A scoped session key acts for the agent; everything after that verifies itself.
- Verifier quorumLive on mainnetProofs anchor only when k-of-n independent verifiers agree. Conflicts are marked disputed; anyone can challenge onchain.
- Per-agent vaultsLive on mainnetEach agent calls through its own vault, so protocol payouts never sit in a shared contract. Session keys expire.
Why an independent validator
An agent's own logs say what it meant to do. AgentTrace answers four questions from the chain instead: which agent acted, what it was allowed to do, what actually ran, and whether the intended result happened. A successful call and a verified outcome are separate verdicts.
Verdicts go to the shared ERC-8004 Validation and Reputation registries, so a wallet, marketplace, or other agent can read an agent's record without trusting this interface.
Why Monad
- Proof anchor (one verifier)
- 179,045 gas · ≈0.018 MON at 102 gwei
- Proof anchor (2-of-2 quorum)
- 248,697 + 110,178 gas · ≈0.037 MON
- Firewall execute
- 154,784 gas · ≈0.016 MON
- Block interval
- ≈0.30 s (measured, 10,000 mainnet blocks)
- Finality
- 2 blocks · ≈600 ms (Monad docs)
Gas from real Monad mainnet receipts (13 Oct 2026, 102 gwei). A per-call receipt means two extra writes per agent action: the firewall call and the anchor. At about 0.034 MON (0.016 + 0.018) and under a second per action that is practical for every call, not a sample.