A governed wallet
for every AI agent.
Ward lets treasurers issue agent cards with hard-coded spend caps, payee allowlists, and expiry. Settled privately on Solana.
Devnet live · Mainnet soon
Built around the agent, not the human.
Every card is a PDA on Solana with policy hard-coded at issue time. Agents can spend; they can never exceed.
01 / Caps
Per-tx and per-day caps.
A hard ceiling on what an agent can move per transaction and per day. Enforced on-chain, not in the SDK.
02 / Privacy
Private settlement.
Settlement runs through MagicBlock's ephemeral rollup. The tail ledger is encrypted; only your view key reveals it.
- Tail ledger encrypted
- Decrypt with view key
- Anchored to L1
- Audit without exposing
03 / Allowlist
Lock spending to known payees.
Up to 16 payees per card. Anything else reverts.
04 / Expiry
Cards die on schedule.
A unix timestamp at issue time. After it, the card is dead weight.
05 / Speed
Solana throughput, agent-grade.
CPI-on-ER means agent transfers settle at rollup speed and stay anchored to L1.
06 / Revoke
Kill switch, always on.
Pause the vault or revoke a single card. Effective the next slot.
Four moves from custody to autonomy.
- 01
Treasurer creates a vault
One PDA per treasurer wallet. Single asset, single owner, single admin.
- 02
Spawn an agent card
Bind an agent pubkey to a policy: caps, allowlist, expiry. Card is a child PDA.
- 03
Agent spends on its own
The agent signs. The program checks policy. Settlement is private.
- 04
Treasurer sees every cent
View key decrypts the tail ledger. No third party in the middle.
One TypeScript call to issue an agent.
@ward/sdk wraps every instruction. Hand it a connection and a wallet; it builds, signs, and submits.
- Anchor IDLs published to @ward/idl.
- Type-safe policy and account shapes.
- x402 v2 protocol shapes for HTTP payment flows.
- View key helpers for tail-ledger decryption.
import { Ward } from "@ward/sdk";
const ward = new Ward({ connection, wallet });
const { instruction, vault } = await ward.buildInitializeVaultIx({
owner,
admin: owner,
assetMint, // USDC mint
});
await ward.spawnCard({
owner,
agent: agentPubkey,
policy: {
capPerTx: 100_000_000n, // 100 USDC
capPerDay: 1_000_000_000n, // 1k USDC
payeeAllowlist: [vendorA, vendorB],
expiresAt: 0n, // never
dayBoundaryOffset: 0,
},
});Give your agent a wallet
it can't empty.
Connect a treasurer wallet, create a vault, and spawn a card in under a minute.