Ward
Agent Payments / Solana

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

Primitives

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.

cap_per_tx100.000000 USDC
cap_per_day1,000.000000 USDC
daily_spent42.500000 USDC
windowUTC+0

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.

16payees max
O(n)lookup

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.

<1 slotconfirm
L1anchored
CPI-on-ERpath

06 / Revoke

Kill switch, always on.

Pause the vault or revoke a single card. Effective the next slot.

How it works

Four moves from custody to autonomy.

  1. 01

    Treasurer creates a vault

    One PDA per treasurer wallet. Single asset, single owner, single admin.

  2. 02

    Spawn an agent card

    Bind an agent pubkey to a policy: caps, allowlist, expiry. Card is a child PDA.

  3. 03

    Agent spends on its own

    The agent signs. The program checks policy. Settlement is private.

  4. 04

    Treasurer sees every cent

    View key decrypts the tail ledger. No third party in the middle.

SDK

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.
spawn-card.tstypescript
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,
  },
});
Get started

Give your agent a wallet
it can't empty.

Connect a treasurer wallet, create a vault, and spawn a card in under a minute.