Let your AI agent pay people.
Within limits it can’t cross.
STEWARD gives every contractor a budget enforced by a smart contract, writes down why every payment happened, and asks you only when a request is over policy. USDC on Arc, signed by Circle wallets, nothing to install.
The demo opens a real studio’s workspace on Arc Testnet. You can approve or decline actual requests.

A ledger checks that debits equal credits. It can’t tell you the vendor was right, the invoice was real, or that a retry didn’t pay twice.
Circle’s developer wallets say it plainly: they “do not include a built-in policy engine.” STEWARD is that engine, on-chain.
Three steps. No wallet setup for the people you pay.
- 1Set a budgetAdd a contractor: name, per-payment cap, weekly cap, funding. No wallet? STEWARD creates a Circle wallet for them and hands you a private link.
- 2They request, the agent decidesOn their link they describe the work, attach evidence and an amount. The agent screens the payee, checks evidence, caps and liquidity, pays what fits, and records the reason.
- 3You approve only the exceptionsAnything over policy waits for one tap. Everything else already happened, on-chain, with a paper trail an auditor can replay.


An inbox instead of a hot key.
Contractors, budgets, an approvals inbox, an audit log and a treasury that parks idle USDC in a yield vault between pay cycles. The owner signs from a Circle Developer-Controlled wallet; no private key lives on any server.
- Add a contractor in three steps, with a confirm summary
- Plain-English reasons: “Above the 3.00 USDC per-payment cap”
- Explorer links for every record, pay, escalate and approve transaction
- Cross-chain payout to Base Sepolia via Circle CCTP, owner-executed
Ten lines in front of any agent that pays.
The same contracts and rules, as a library. TypeScript and Python produce byte-identical decision hashes.
import { Steward } from "steward-arc-sdk";
const s = new Steward({ allowanceManager, auditLog, account });
const r = await s.decide({
allowanceId: 0n, amount: 150_000_000n, memo: "logo v2",
inputs: { evidence: "ipfs://…" }, evidence: true, screenOk: true,
});
// r.action → "PAY" | "PARTIAL" | "HOLD" | "ESCALATE" | "SCREEN_FAIL"
// r.hash → keccak256 of the canonical decision, recorded on-chain