Live on Monad TestnetChain 10143 · ERC-8004 identities

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.

Check an agent's record →

Passkey sign-in · no seed phrase · no password

Checks on every payment
10
each refusal names its reason
Transactions to revoke
1
permanent from the next block
Held by the agent
$0
it signs; it never holds funds or gas
Settles in
AUSD
Agora's dollar stablecoin, not a mock
The card
Darcactive
•••• ••••A55A
Agent
Atlas
Procurement assistant
Daily limit
$50
$30 left today
2 merchants

Policy

Active
Daily limit$50, refused on-chain above it
MerchantsLagos Cloud Hosting, Horizon Data API
Valid for30 days from issue
RevocationOne owner action, permanent
The record

Atlas's first run

Three goals on a $50 card. These are the outcomes the live demo produces on Monad Testnet.

GoalAmountVerdict
Renew monthly hostingat Lagos Cloud Hosting$20Paid
Top up API creditsat Horizon Data API$200DailyCapExceeded
Pay data feed subscriptionat Riverside Subscriptions$15MerchantNotAllowed

Refused amounts never move. Each verdict is written to the reputation registry by the merchant, so Darc cannot edit its own agents' record.

How it works

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.

01Owner · passkey

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)
02Agent · signature

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)
03Merchant · registry

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, revoked
What every payment passes

Ten 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.

#CheckRefusal reason
01The card existsCardNotFound
02It has not been revokedCardRevoked
03It has not expiredCardExpired
04The request is still freshDeadlineExpired
05It pays in the card's tokenTokenNotAllowed
06It was signed under the current policyPolicyVersionStale
07The card's agent key signed itBadAgentSignature
08The request has not been used beforeNonceUsed
09The merchant is on the card's listMerchantNotAllowed
10It fits within today's limitDailyCapExceeded
Start on testnet

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.

Monad Testnet · chain 10143Contracts verified on Sourcify