Reconnecting to wallet…
Set daily budgets, whitelist services, and pause anytime. Built on Arc — Circle's stablecoin-native L1 where USDC is the native gas token.
New here? Try the chat assistant — describe what you want in plain English.
Today's AI agents transact on behalf of users — but without on-chain controls, one compromised key or runaway bug drains the entire wallet.
A stolen agent key today means an unbounded loss — limited only by the wallet balance. Cold storage isn't an option when the agent needs to sign 24/7.
A bug, a malformed prompt, or a misbehaving plan can cause an agent to loop — burning $5,000 in API calls before anyone notices.
Application-level rate limits get bypassed when the code itself has the keys. The only enforceable limit is one the chain itself enforces.
Finance teams need to know what each AI feature is costing, who got paid, and when — without trawling through application logs that can be tampered with.
Every agentPay() call has to pass three checks
before any USDC moves. The contract enforces them; the application can't bypass them.
The owner calls
registerAgent(agent, daily, perTx)
and sets two hard caps in USDC.
The owner adds each receiver the agent is allowed to pay — APIs, vendors, contractors, anything.
The agent calls
agentPay(to, memo) payable.
The contract checks allowlist + per-tx cap + daily cap, then forwards.
┌──────────┐ setup ┌──────────────────────┐
│ Owner │ ─────────────▶ │ AgentPay.sol │
│ (user) │ register + │ ──────────────── │
└──────────┘ allowlist │ • daily caps │
│ • per-tx caps │
│ • allowlist │
│ • pause/revoke │
└──────────────────────┘
▲
│ agentPay(to, memo)
│ (msg.value = USDC)
│
┌───────────────┐
│ AI Agent │
│ (autonomous) │
└───────────────┘
│
allowlisted & │
within budget? ▼
┌───────────────┐
│ Service / API │
│ recipient │
└───────────────┘
Give each AI feature in your product its own agent — a chatbot, a fraud classifier, a content moderator — with their own daily budgets. A runaway prompt or a leaked key can lose at most one day's worth of credits.
dailyLimitAn agency in Vietnam pays freelancers in Manila, Mumbai, and Lagos. Each freelancer's wallet is whitelisted with a per-tx cap matching their tier. Settlement is instant on Arc — versus T+1 with traditional rails.
Arc treats stablecoins as the base unit of the chain. That means
msg.value in a payable function is already
denominated in USDC — and the entire contract is ~200 lines of Solidity, not 600.
Need a browser wallet (MetaMask, Rabby, OKX…) and Arc Testnet USDC from faucet.circle.com. The dashboard runs entirely client-side — no server, no tracking.
Wallet
—
Network
—
Balance
—
No agents yet. Create one to start enforcing on-chain spending limits.
No payment events yet for your agents.
Choose which wallet to connect from this browser.
What is an "agent"?
An agent is a wallet address that's allowed to spend USDC on your behalf — under rules you set and the contract enforces.
Examples: your AI bot's wallet, a deployment script wallet, or a freelancer payout pipeline. For this demo, use your own wallet as the agent — it's the simplest setup to try.
This calls agentPay(to, memo) payable
The contract checks: agent active? service in allowlist? amount ≤ per-tx? ≤ remaining daily? — then forwards USDC and emits an event with your memo.
What does this do?
Adds receiver address(es) to the agent's allowlist. Each address gets one tx
(the contract function only takes one at a time). After this, the agent can
call agentPay() to send USDC to those
addresses — within its budget caps.