{to, value, data, chainId} — before it reaches a signer, and the harness decodes the calldata deterministically, judges it against your mandate with the EVM’s own standards in the loop, and returns a signed verdict whose requestHash binds to those exact bytes. Alchemy provides the data; Chance provides the verdict.
What gets recognized
The venue accepts any standard EVM transaction request, whichever tools composed it. The classifier decodes recipients, spenders and raw amounts straight from the calldata, converts wei to native units, resolves the chain id to a named network, and flags the things agents gloss over: an approval that never expires, a
transferFrom spending someone else’s balance, a “0 ETH” transaction that moves a six-figure token amount inside data. Because token decimals and symbols live in contract state — not calldata — the harness resolves them with a live read-only lookup and reasons over:
EVM ERC-20 APPROVE: grant spender 0x51b4…cb44 an allowance of UNLIMITED (2^256−1, the infinite-approval sentinel) on token contract 0x8335…2913 on Base (chainId 8453). No tokens move now; the spender may transferFrom later at will. — resolved: the contract reports symbol “USDC”, decimals 6.That decode step is what catches the classic onchain-agent failure: an agent whose plan says “swap 200 USDC on the usual router” while the transaction it composed quietly grants an unlimited allowance to an address nobody has ever seen. The approval moves nothing at signing time — it looks free — but it hands the spender the wallet’s entire current and future balance of that token. The judge sees the decoded grant, not the agent’s description. If a selector can’t be decoded or a token can’t be resolved, the verdict leans ESCALATE rather than trusting the agent’s own account: fail closed, never allow on assumption.
Use it from your bot
Wrap the transaction you were already going to sign:venue is optional — transaction-request shapes carrying calldata are auto-detected — but passing venue: "alchemy" is good hygiene ("evm" still works as a legacy alias), and freeform action descriptions still work (mode: "semantic").
Use it from Claude or ChatGPT
If your agent already has Alchemy’s MCP connected (https://mcp.alchemy.com/mcp), add the hosted Chance connector alongside it (https://harness.chance.cc/api/mcp, see Connectors) and give the agent one standing instruction:
Before signing or broadcasting any transaction you compose with Alchemy’s tools, callThe pairing is deliberate: Alchemy’s tools give the agent the chain data to build the transaction, and Chance gates the one moment that matters — the payload on its way to the signer. Agents with signing tools then get gated automatically; agents without them still give you provable pre-sign checks in chat.verify_intentwith my rules as the intent and the exact transaction object () as the action, withvenue: "alchemy". Only proceed on ALLOW; on BLOCK or ESCALATE, stop and tell me why.
How the harness knows the Alchemy stack
The judge works from a versioned snapshot of the standards themselves — the JSON-RPC transaction object, the ERC-20 specification and its selector/calldata encoding rules, the ABI encoding spec, EIP-155 chain ids, Circle’s canonical USDC contract addresses, and the Alchemy MCP tool surface — plus a curated brief of the venue’s footguns (allowances as standing custody grants, decimal-blind raw amounts, unauthenticated symbol strings, chainless payloads). Static knowledge is never fetched at verdict time; the only live calls are read-only token-metadata lookups (symbol()/decimals() on the target contract) that resolve raw amounts into human units, and what they resolve is recorded in the verdict’s hash-chained transcript. Every documentation page the judge consults is chained with its content hash — the receipt proves exactly which knowledge, at which version, informed the decision. See Architecture.
What the receipt adds for Alchemy
On top of the standard proof bundle (transcript root, judge signature, onchain anchor), venue-aware verdicts carryvenue: "alchemy", the actionFamily, the decoded actionType (native-transfer, erc20-transfer, erc20-approve, erc20-transfer-from, contract-call), mode: "structured", the knowledge-snapshot version — and the resolved token metadata (symbol, decimals, chain) when a live lookup succeeded, all inside the hash-chained transcript.
Roadmap: escrowed execution — the same contract, but an ALLOW triggers signing by a Chance-held key and a BLOCK physically never reaches one. The payload-first contract above is forward-compatible with it.
