AGENT TRANSACTION CHECK · BEFORE IT SIGNS

Your agent says what it means to pay.
We check the transaction does exactly that.

An AI agent that pays in crypto signs whatever it is handed: a checkout page, a payment request, a transaction another tool built for it. The Agent Transaction Check sits between that transaction and the signature. Your agent states its intent (this token, this amount, this recipient) and we run the transaction against the live chain, then answer allow, warn or block with the reason for every check. The right token, the exact amount, the right recipient, and nothing else: no extra transfers, no spending rights handed out, no change to who controls the wallet.Your agent states what it means to pay. We run the transaction against the live chain and answer allow, warn or block: right token, exact amount, right recipient, and nothing else.

Per check0.03 USDC
ChainsBase, Ethereum, Polygon
VerdictAllow · warn · block
ChecksOn-chain payments
01 · WHAT IT COVERS

Payments your agent makes on-chain. Nothing else.

The check answers one question: is this exactly the payment my agent means to make? It is built for that one kind of transaction, and says so rather than guessing at others.

Checked

  • An agent paying: sending a token to one recipient
  • As a transaction, or as a gasless signed payment (EIP-3009, used by x402)
  • On Base, Ethereum and Polygon
  • In USDC, USDT, DAI, WETH or the chain’s own coin (ETH, POL)

Not checked

  • Swaps, trades and bridging
  • Staking, lending and deposits into a protocol
  • Buying or minting NFTs, contract deployments, governance votes
  • Approvals or permits as the goal
  • Other chains, other tokens, and card or off-chain payments

It never waves through what it was not built for. Ask about anything other than a payment and the request is refused, uncharged. Send a transaction that does more than the stated payment (a swap, a deposit, a mint) and it is blocked.

Chainchain_idTokens
Base8453ETH, USDC, DAI, WETH
Ethereum1ETH, USDC, USDT, DAI, WETH
Polygon137POL, USDC, USDT, DAI, WETH
02 · WHY

An agent cannot read calldata. We can.

A person paying a merchant looks at the wallet screen before approving. An agent paying on its own has no such moment: it trusts the transaction it was given. A swapped recipient, a look-alike token, an extra transfer tucked inside a batch, an unlimited approval, or a call that quietly hands the wallet to someone else all look like any other hex string.

The check gives the agent that moment back, as an API call. It compares what the transaction would actually do on the current chain with what the agent says it intends, and refuses anything that does not match.

Rule-based, not a model. Every check is a fixed comparison: the same transaction and intent always get the same verdict, and nothing the agent was shown can talk its way past it.

03 · WHAT WE CHECK

Every payment, against eight questions

The transaction is run against the latest block, and its real effects are compared with the stated intent. Payments routed through a router or a smart wallet still match: what counts is what leaves the sender and what reaches the recipient.

CheckWhat it confirmsIf it fails
Official tokenThe money leaving is the real USDC (or other listed token), not a look-alike contract with the same nameBlock
Exact amount outExactly the stated amount leaves the sender, not a cent moreBlock
Right recipientExactly the stated amount reaches the stated recipientBlock
Nothing else leavesNo other token, native coin or NFT leaves the senderBlock
No spending rightsThe payment grants no one the right to spend the wallet’s tokens later. A limited approval warns; an unlimited one, an NFT operator or a Permit2 allowance blocksWarn / block
It succeedsThe transaction does not revertBlock
No change of controlNowhere in the transaction does control of anything change: no new Safe owner, module or guard, no ownership handover, no proxy upgrade, no module install, no role grant, no timelocked call queued, and no EIP-7702 delegation of the walletBlock
Balances agreeToken balances measured before and after agree with what the transaction reports moving, which catches a token that moves money without saying soBlock

Your own policy, optional. Add a maximum amount, a list of allowed tokens or a list of allowed recipients, and anything outside them is blocked too.

04 · MESSAGES TO SIGN

Gasless payments, checked field by field

Many agent payments, x402 among them, are a signed message rather than a transaction. Send the message instead and we decode it on our servers, without touching the chain:

05 · CALL IT

One request before every signature

Use the same API key your agent already uses for audits (create one in the workspace under Create API key). Send the transaction exactly as it will be signed:

POST https://check.grisoco.com/v1/check
Authorization: Bearer grisoco_sk_…

{
  "chain_id": 8453,
  "from": "0xYourAgentWallet…",
  "intent": { "type": "payment", "token": "USDC", "amount": "5.00", "recipient": "0xMerchant…" },
  "tx": { "to": "0x…", "data": "0x…", "value": "0x0" },
  "policy": { "max_amount": "50", "allowed_recipients": ["0xMerchant…"] }
}

The answer is one verdict to act on, with everything behind it: every check with its result and a plain-English reason, what would leave the wallet, and the block it was checked at. Any failed check means block; otherwise any warning means warn; otherwise allow.

{
  "check_id": "chk_…",
  "verdict": "block",
  "summary": "The recipient 0xMerchant… would receive nothing, not 5 USDC.",
  "checks": [
    { "id": "I1", "status": "pass", "message": "The USDC leaving is the official USDC." },
    { "id": "I3", "status": "fail", "message": "The recipient 0xMerchant… would receive nothing, not 5 USDC." },
    …
  ],
  "sender_changes": [ { "symbol": "USDC", "amount": "-5000000", "display": "-5 USDC", … } ],
  "block": 21894411,
  "charged_cents": 3
}

Send "signature": { "typed_data": … } in place of "tx" for a message to sign.

06 · FOR AI AGENTS

Read by machines, too

If you are an agent, or building one, everything here is available in a form you can load:

Two rules, or the check means nothing.

  1. The intent comes from your user’s task, never from the payment request. Take the token, amount and recipient from what your user asked for, not from the checkout page or merchant. If the same party supplies the transaction and the intent, the check only confirms they match each other.
  2. Fail closed. Sign only on allow. No answer, an error, a timeout or a 400 all mean do not sign. Retry a 503 after Retry-After, back off on a 429, and allow about 10 seconds per call: the first check after a quiet spell starts the service.

How to act on the answer:

VerdictWhat your agent should do
allowSign. No risks were detected at the block named in the answer
warnDo not sign on its own. Something needs a decision first, such as a limited approval or a payment authorization that is not valid yet
blockDo not sign. The checks list says which check failed and why
07 · PRICE

0.03 USDC per verdict

See pricing.

08 · YOUR DATA

Checked, then forgotten

The details are in section 4 of our privacy policy.

BEFORE YOUR AGENT SIGNS

Give your agent a second look at every payment

One API key, a funded balance, and one call before each signature.

A verdict reads “no risks detected at block N”: it describes what the transaction did when run against that block, and the chain can change before your transaction is included. It is not a guarantee that a transaction or signature is safe, and it does not replace your own controls. The Agent Transaction Check is governed by section 13 of the Terms of Service.