zetta

Schema Reference — v1.0

Manifest Spec v1.0

Complete schema for .agent/wallets.json. Place this file at .agent/wallets.json in the root of your agent's public repository.


Full example

.agent/wallets.json
{
  "version": "1.0",
  "agent": "AEON",
  "project": "AEON Protocol",
  "ecosystem": "Base",
  "website": "https://aeon.xyz",
  "x": "@aeonxyz",
  "did": "did:erc8004:8453:12345",
  "wallets": [
    {
      "address": "0xAbCd...1234",
      "chain": "base",
      "role": "treasury",
      "verification_method": "repo_manifest",
      "label": "Primary operating treasury",
      "notes": "Holds USDC operating reserves.",
      "active": true,
      "last_updated": "2026-06-22"
    },
    {
      "address": "0xEfGh...5678",
      "chain": "base",
      "role": "payment_receiver",
      "verification_method": "repo_manifest",
      "label": "API revenue collection",
      "active": true,
      "last_updated": "2026-06-22"
    }
  ]
}

Root fields

FieldTypeRequiredDescription
versionstringRecommendedSchema version. Use "1.0". Omitting means v0 (pre-standard).
agentstringRequiredCanonical agent name — must match the registry entry.
projectstringRecommendedProject or organization name.
ecosystemstringRecommendedPrimary chain ecosystem (Base, AEON, Virtuals, EigenCloud, etc.).
websiteURLOptionalAgent or project website URL.
xstringOptionalX/Twitter handle (with or without @).
didstringOptionalDecentralized identity. Format: did:<method>:<id>. ERC-8004 example: did:erc8004:8453:22945.
walletsarrayRequiredArray of wallet declarations. Min 1.

Wallet entry fields

FieldTypeRequiredDescription
addressstringRequiredEVM wallet address. Must be 0x + 40 hex characters.
chainstringRequiredChain this address operates on. See chain enum below.
rolestringRequiredWallet role. See role table below.
verification_methodstringRecommendedHow ownership is proven. Default: repo_manifest. See methods below.
labelstringOptionalHuman-readable label, e.g. "Primary treasury".
notesstringOptionalFreeform notes for context.
activebooleanOptionalWhether this wallet is currently operational. Default: true.
last_updatedstringOptionalISO date (YYYY-MM-DD) when this entry was last updated.

Wallet roles

Use the most specific role that applies. Roles determine how Zetta classifies on-chain flows when building financial books.

RoleFinancial classDescription
treasuryAssetPrimary treasury. Holds operating capital and reserves.
revenueInflowRevenue collection wallet. All inflows classified as income.
fee_recipientInflowProtocol fees and revenue share. Inflows classified as fee income.
payment_receiverInflowAPI payments and per-call settlement. Inflows classified as service revenue.
expenseOutflowOperational expense wallet. Outflows classified as operating costs.
operatorOutflowHot wallet for day-to-day execution. Outflows classified as operational spend.
deployerNeutralContract deployer. Historical only — excluded from ongoing P&L.
token_contractContractERC-20 token contract address. Excluded from treasury calculations.
token_bound_accountAssetERC-6551 token-bound account. Tracked as agent-controlled asset.
unknownPendingRole unclear. Declared for attribution; classification deferred.

Chain values

baseethereumarbitrumoptimismpolygonsolanaavalanchebnbzorablastlineascrollmodeother

Use other for any chain not listed. Zetta currently indexes activity on Base. Multi-chain agents should declare all active wallets with their respective chains.

Verification methods

MethodTrust levelHow it works
repo_manifestBaselineFile exists in a public repo (GitHub or Gitlawb). Default.
on_chain_signatureHighWallet signed a known message proving ownership.
multisig_ownershipHighWallet appears in a multisig owner list.
dns_recordMediumDNS TXT record links domain to wallet address.
social_postLowSocial media post declares wallet ownership.

Validation rules

address must match /^0x[a-fA-F0-9]{40}$/ — 0x + 40 hex chars
wallets[] must contain at least one entry
chain must be one of the valid chain values
role must be one of the valid role values
verification_method if present must be a valid method
last_updated if present must be YYYY-MM-DD
active if present must be a boolean
website if present must be a valid URL
x if present must match /^@?[A-Za-z0-9_]{1,50}$/
did if present must match /^did:[a-z]+:.+$/
File size max 50KB

Run these checks instantly at /validate or via the API endpoint POST /api/validate-manifest.

Validate via API

Stateless endpoint — no auth, no DB write. Returns validation errors if any.

# Validate a manifest file
curl -s -X POST https://zetta.xyz/api/validate-manifest \
  -H "Content-Type: application/json" \
  -d @.agent/wallets.json | jq .

# GitHub Actions CI check
- name: Validate manifest
  run: |
    curl -s -X POST https://zetta.xyz/api/validate-manifest \
      -H "Content-Type: application/json" \
      -d @.agent/wallets.json | jq -e '.ok == true'

Returns { ok: true, summary: { ... } } on valid manifests, { ok: false, errors: [...] } with a 422 on invalid ones.

← Overview
Examples →Validate →