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
| Field | Type | Required | Description |
|---|---|---|---|
| version | string | Recommended | Schema version. Use "1.0". Omitting means v0 (pre-standard). |
| agent | string | Required | Canonical agent name — must match the registry entry. |
| project | string | Recommended | Project or organization name. |
| ecosystem | string | Recommended | Primary chain ecosystem (Base, AEON, Virtuals, EigenCloud, etc.). |
| website | URL | Optional | Agent or project website URL. |
| x | string | Optional | X/Twitter handle (with or without @). |
| did | string | Optional | Decentralized identity. Format: did:<method>:<id>. ERC-8004 example: did:erc8004:8453:22945. |
| wallets | array | Required | Array of wallet declarations. Min 1. |
Wallet entry fields
| Field | Type | Required | Description |
|---|---|---|---|
| address | string | Required | EVM wallet address. Must be 0x + 40 hex characters. |
| chain | string | Required | Chain this address operates on. See chain enum below. |
| role | string | Required | Wallet role. See role table below. |
| verification_method | string | Recommended | How ownership is proven. Default: repo_manifest. See methods below. |
| label | string | Optional | Human-readable label, e.g. "Primary treasury". |
| notes | string | Optional | Freeform notes for context. |
| active | boolean | Optional | Whether this wallet is currently operational. Default: true. |
| last_updated | string | Optional | ISO 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.
| Role | Financial class | Description |
|---|---|---|
| treasury | Asset | Primary treasury. Holds operating capital and reserves. |
| revenue | Inflow | Revenue collection wallet. All inflows classified as income. |
| fee_recipient | Inflow | Protocol fees and revenue share. Inflows classified as fee income. |
| payment_receiver | Inflow | API payments and per-call settlement. Inflows classified as service revenue. |
| expense | Outflow | Operational expense wallet. Outflows classified as operating costs. |
| operator | Outflow | Hot wallet for day-to-day execution. Outflows classified as operational spend. |
| deployer | Neutral | Contract deployer. Historical only — excluded from ongoing P&L. |
| token_contract | Contract | ERC-20 token contract address. Excluded from treasury calculations. |
| token_bound_account | Asset | ERC-6551 token-bound account. Tracked as agent-controlled asset. |
| unknown | Pending | Role unclear. Declared for attribution; classification deferred. |
Chain values
baseethereumarbitrumoptimismpolygonsolanaavalanchebnbzorablastlineascrollmodeotherUse 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
| Method | Trust level | How it works |
|---|---|---|
| repo_manifest | Baseline | File exists in a public repo (GitHub or Gitlawb). Default. |
| on_chain_signature | High | Wallet signed a known message proving ownership. |
| multisig_ownership | High | Wallet appears in a multisig owner list. |
| dns_record | Medium | DNS TXT record links domain to wallet address. |
| social_post | Low | Social 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 50KBRun 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.