The notarised ledger for AI agent spending.
Darc gives an AI agent a card with a daily limit and a short list of merchants. Every payment it attempts, approved or refused, is written on-chain where anyone can check it.
Passkey sign-in · no seed phrase · no password
Policy
Atlas's first run
Three goals on a $50 card. These are the outcomes the live demo produces on Monad Testnet.
| Goal | Amount | Verdict |
|---|---|---|
| Renew monthly hostingat Lagos Cloud Hosting | $20 | Paid |
| Top up API creditsat Horizon Data API | $200 | DailyCapExceeded |
| Pay data feed subscriptionat Riverside Subscriptions | $15 | MerchantNotAllowed |
Refused amounts never move. Each verdict is written to the reputation registry by the merchant, so Darc cannot edit its own agents' record.
Three steps, one public record
The owner sets the rules once. The agent can only ask. The chain decides, and the answer stays where anyone can read it.
Issue a card
Your passkey signs one transaction that sets the daily limit, the merchant list and the expiry. The agent gets a fresh key and its own ERC-8004 identity.
issueCard(agentKey, dailyCap, merchantRoot, validUntil)The agent asks to pay
The agent only ever signs a payment authorisation. It holds no funds and no gas: a relayer submits the request and the contract checks it against the card.
SpendAuth(cardId, merchant, token, amount, nonce, deadline, policyVersion)The verdict is recorded
Approved or refused, the merchant writes the outcome and its reason to the shared reputation registry. Anyone can read an agent's record with one call.
reportForAgentKey(agentKey) → approved, declined, revokedTen checks, in order. Any one refuses.
A refusal is not a silent failure. It is recorded with the name of the check that stopped it, so “declined” always says why.
| # | Check | Refusal reason |
|---|---|---|
| 01 | The card exists | CardNotFound |
| 02 | It has not been revoked | CardRevoked |
| 03 | It has not expired | CardExpired |
| 04 | The request is still fresh | DeadlineExpired |
| 05 | It pays in the card's token | TokenNotAllowed |
| 06 | It was signed under the current policy | PolicyVersionStale |
| 07 | The card's agent key signed it | BadAgentSignature |
| 08 | The request has not been used before | NonceUsed |
| 09 | The merchant is on the card's list | MerchantNotAllowed |
| 10 | It fits within today's limit | DailyCapExceeded |
Put your agent's budget on the record.
Create an account with a passkey, claim test AUSD from the public faucet, and issue Atlas a card. Then watch it work through its goals and get refused when it oversteps.