A Tally wallet is where your USDC sits. You own it; Tally never does. Agents move funds out of it only when — and only how — you’ve explicitly authorized.Documentation Index
Fetch the complete documentation index at: https://docs.tallyforagents.com/llms.txt
Use this file to discover all available pages before exploring further.
Mental model
Three things sit at the core of every Tally wallet:- The wallet — an Ethereum-compatible address that holds USDC.
- Signers — keys that can move funds out of the wallet. There are two kinds, covered below.
- Policies — rules that bound what each signer can do. Enforced inside Privy’s secure enclave, not by Tally’s server.
Server wallets, not browser-embedded wallets
Tally uses Privy server wallets as the underlying primitive. A server wallet lives in Privy’s infrastructure (a secure enclave with hardware-backed key isolation), not in a browser. This is a different model from “embedded wallets” — browser-side wallets where keys are held client-side. Both keep custody with the wallet owner (not Tally), but server wallets give you two properties that matter for agentic finance:- Agents can act asynchronously. You don’t need an active browser session for an agent to sign a transaction. The signer Tally holds is a separate, scoped key — not your primary key.
- No browser-side secrets to leak. Your authentication (passkey, email-OTP) only authorizes Privy to act on your behalf; no signing material ever leaves the enclave.
Anatomy of a wallet
Every wallet has:| Field | Description |
|---|---|
address | Ethereum-compatible address. Public; safe to share. |
displayName | Human-readable label. Defaults to Main Wallet for the first wallet. |
mode | test (Base Sepolia) or live (Base mainnet). Fixed at creation. |
accountId | The Tally account that owns the wallet. |
roleLabel | Optional free-text label like “operations” or “ad spend”. |
Provisioning
Your first wallet is created automatically. When you sign in for the first time, Tally provisions an account, makes you the owner, and creates a single test-mode wallet called Main Wallet on Base Sepolia. No extra steps; the wallet is ready to receive USDC the moment you land on the dashboard. Additional wallets can be created from the dashboard. Programmatic creation via the SDK is on the roadmap — for now, wallets are a per-account setup step. Test vs live wallets are separate. A wallet’s mode is fixed at creation, and live-mode wallets live on Base mainnet with a separate Privy app config. Moving an account to live mode provisions fresh live wallets — it does not “promote” the test wallet.Two kinds of signers
A signer is anything that can authorize a transaction leaving the wallet. Tally wallets have two:Owner signer (you)
You’re the wallet’s owner. Your authentication with Privy — passkey, email, or whatever method’s configured — is what gives you owner-level rights. You can:- Add or remove agent signers
- Approve or revoke policies
- Sign transactions directly (rare; mostly relevant when withdrawing funds)
Agent signer (Tally, bounded by policy)
When you grant an agent permission to spend from a wallet, the following happens, in order:- Tally generates a fresh P-256 keypair specifically for that (agent, wallet) pair.
- The private key is envelope-encrypted via AWS KMS and stored. It never leaves Tally’s infrastructure unencrypted, and Tally only decrypts it transiently — just long enough to sign a single payment request, then drops it from memory.
- The public key is registered with Privy as an additional signer on the wallet.
- A policy (see below) is created and attached to that signer.
- You sign the addition with your passkey from the dashboard. Until you do, the signer is registered but inactive.
What a policy enforces
Every agent signer has exactly one policy attached. The policy is signed during the permission flow and bounds what the signer can do. Today’s policy supports:| Field | What it bounds |
|---|---|
maxPerTxUsdc | Required. The largest single transfer this signer can make. |
dailyCapUsdc | Optional. Tally-enforced rolling 24-hour cap, on top of the enclave rules. |
recipientAllowlist | Optional. If set, transfers can only go to addresses on this list. |
contractAllowlist | Defaults to USDC. The set of contracts the signer is allowed to interact with. |
expiresAt | Optional. After this time, the signer stops working until rotated or extended. |
What this gets you
The wallet + signer + policy model lines up cleanly with the trust story:- Tally never custodies funds. We only hold per-agent signing keys, each bounded by a policy you approved.
- You can revoke any agent at any time from the dashboard. Revocation removes the signer from the wallet on-chain.
- If Tally goes away, your wallet persists. You keep control through Privy directly. Permissions stay in force or revocable — no Tally action required.
- Even a compromised Tally can’t drain your wallet. An attacker with full access to Tally’s infrastructure could sign payments — but only ones your policy already authorizes (capped per-tx, capped daily, contract-restricted, optionally recipient-restricted).
Working with wallets from your code
Today, wallets are managed from the dashboard. When you send a payment, you reference a wallet by address:tally.wallets.list() and other direct wallet-management methods are on the roadmap — until they land, the dashboard is the source of truth.
What’s on the roadmap
- ERC-4337 smart wallets. The plan is to upgrade users from server wallets to Kernel/Safe smart wallets, with the existing server wallet acting as the signer. The owner / signer / policy model carries forward unchanged — only the wallet identity shifts. No timeline yet.
- Programmatic wallet creation via the public SDK.
- Multi-signer policies (N-of-M co-signing for high-value wallets). The Privy primitives are there; the policy schema and grant UI aren’t.