AgentTrace

Live on Monad testnet · chain 10143

A firewall and an onchain receipt for every AI agent call.

  1. 1 Set what the agent may call
  2. 2 It calls only through the firewall
  3. 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 →
Live · chain 10143Read from Monad · refreshes every 12s
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.

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 sent

Trust 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.
How disputes, vaults and session keys work

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.