{
  "@context": "https://a2a-protocol.org/v1",
  "@type": "AgentCard",
  "name": "AI100WEB TON Agent",
  "description": "Agent for TON operations around the AI100WEB owner wallet (wallet_v5r1) and the Agentic Wallets (TEP-85 SBT, operator-key) it owns. Supports balance checks, unsigned transfer previews, and domain resolution via MCP.",
  "url": "https://ai100web.pages.dev/a2a",
  "provider": {
    "organization": "AI100WEB",
    "url": "https://ryounoi100web.com"
  },
  "tonid": "aec8ffd8-8262-415d-96a5-024f6bfc8e69",
  "version": "0.3.0",
  "protocolVersion": "0.3.0",
  "capabilities": {
    "streaming": false,
    "pushNotifications": false
  },
  "defaultInputModes": [
    "application/json",
    "text/plain"
  ],
  "defaultOutputModes": [
    "application/json"
  ],
  "skills": [
    {
      "id": "check-balance",
      "name": "Check Balance",
      "description": "Get balance of the owner wallet, its Agentic Wallets, or any address",
      "tags": [
        "ton",
        "balance",
        "wallet"
      ]
    },
    {
      "id": "transfer-ton",
      "name": "Transfer TON",
      "description": "Prepare an UNSIGNED TON transfer (simulation / ready-to-sign preview). Never signs or broadcasts; execute always becomes pending_approval.",
      "tags": [
        "ton",
        "transfer"
      ]
    },
    {
      "id": "resolve-domain",
      "name": "Resolve Domain",
      "description": "Resolve .ton domain to wallet or records",
      "tags": [
        "ton",
        "dns"
      ]
    },
    {
      "id": "swap-quote",
      "name": "Swap Quote",
      "description": "Indicative GRAM/TON <-> USDT quote from the public read-only STON.fi swap simulation. Free, answered at the proxy, never executes a swap.",
      "tags": [
        "ton",
        "swap",
        "quote",
        "free"
      ],
      "examples": [
        "{\"type\":\"propose\",\"skill\":\"swap-quote\",\"input\":{\"from\":\"GRAM\",\"to\":\"USDT\",\"amount\":\"10\"}}"
      ],
      "pricing": {
        "amount": "0",
        "currency": "XTR"
      }
    },
    {
      "id": "transfer-simulate",
      "name": "Transfer Simulate",
      "description": "Dry-run a TON transfer: address checksum, amount and comment validation plus a fee estimate. simulated:true, never signed or broadcast. Free, answered at the proxy.",
      "tags": [
        "ton",
        "transfer",
        "simulate",
        "free"
      ],
      "examples": [
        "{\"type\":\"propose\",\"skill\":\"transfer-simulate\",\"input\":{\"to\":\"UQBzg5yX7h5m-DLINTeWzxc5lwmPjJrgMtWisw4rRUDYdSXZ\",\"amount\":\"0.5\"}}"
      ],
      "pricing": {
        "amount": "0",
        "currency": "XTR"
      }
    },
    {
      "id": "ton-balance",
      "name": "TON Balance",
      "description": "Resolve the TON balance of an address (via TON MCP tools). Forwarded to the AI100WEB inbox.",
      "tags": [
        "ton",
        "web3",
        "mcp"
      ],
      "pricing": {
        "amount": "5",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      }
    },
    {
      "id": "ton-dns-resolve",
      "name": "TON DNS Resolve",
      "description": "Resolve a .ton domain to its wallet address (via TON MCP tools). Forwarded to the AI100WEB inbox.",
      "tags": [
        "ton",
        "dns",
        "mcp"
      ],
      "pricing": {
        "amount": "5",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      }
    },
    {
      "id": "ai-analyze",
      "name": "On-chain & Data Analysis",
      "description": "Analyse a wallet, token, or dataset and return a structured report. Forwarded to the AI100WEB inbox.",
      "tags": [
        "analysis",
        "web3",
        "ai"
      ],
      "pricing": {
        "amount": "50",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      }
    },
    {
      "id": "ai-summarize",
      "name": "Summarize",
      "description": "Condense text or documents into a faithful summary. Forwarded to the AI100WEB inbox.",
      "tags": [
        "summarize",
        "ai"
      ],
      "pricing": {
        "amount": "30",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      }
    },
    {
      "id": "ai-content",
      "name": "Content Generation",
      "description": "Produce polished, ready-to-use content from a brief. Forwarded to the AI100WEB inbox.",
      "tags": [
        "content",
        "ai"
      ],
      "pricing": {
        "amount": "30",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      }
    },
    {
      "id": "ai-orchestrate",
      "name": "Multi-agent Orchestration",
      "description": "Plan a goal into subtasks, run an agent team, and synthesize a complete result. Forwarded to the AI100WEB inbox.",
      "tags": [
        "orchestrate",
        "agents",
        "ai"
      ],
      "pricing": {
        "amount": "150",
        "currency": "XTR",
        "alsoAccepts": [
          "TON"
        ]
      },
      "sub_agents": [
        {
          "name": "Trader Agent",
          "description": "Trading tasks: balance checks, indicative swap quotes, transfer dry-runs and unsigned transfer previews.",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "trader",
            "trader-2"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#trader",
            "/config/client-keys.json#trader-2"
          ],
          "skills": [
            "check-balance",
            "ton-balance",
            "swap-quote",
            "transfer-simulate",
            "transfer-ton"
          ],
          "trust_level": "internal-simulated+verified-key; transfer-ton execute/over-cap → owner-approval-required",
          "simulated": true,
          "constraints": "transfer-ton returns an unsigned preview only (simulated:true, never signed/broadcast); execute or > perTaskMaxTon/perDayMaxTon → 202 pending_approval."
        },
        {
          "name": "NFT Collector Agent",
          "description": "NFT tasks: list/inspect NFTs and SBTs of a wallet. No dedicated NFT/SBT skill is declared in this card; uses on-chain analysis and balance reads.",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "nft-collector",
            "nft-collector-2"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#nft-collector",
            "/config/client-keys.json#nft-collector-2"
          ],
          "skills": [
            "ai-analyze",
            "check-balance",
            "ton-balance"
          ],
          "trust_level": "internal-simulated+verified-key",
          "simulated": true,
          "gap": "No declared nft-list/sbt skill yet; the website dashboard reads NFTs/SBTs from tonapi.io but that is not an A2A skill."
        },
        {
          "name": "Domain Buyer Agent",
          "description": "TON DNS tasks: resolve .ton domains to wallets and check whether a name resolves (availability hint only).",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "domain-buyer"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#domain-buyer"
          ],
          "skills": [
            "resolve-domain",
            "ton-dns-resolve"
          ],
          "trust_level": "internal-simulated+verified-key",
          "simulated": true,
          "gap": "No purchase/auction skill; availability is inferred from resolve results only. resolve-domain is a mock that knows the owner domains."
        },
        {
          "name": "Auditor Agent",
          "description": "Audit tasks: verify wallets/domains, check Ed25519 signatures against the public key registry, verify the audit hash chain, and cross-check sub-agent outputs.",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "auditor"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#auditor"
          ],
          "skills": [
            "check-balance",
            "ton-balance",
            "resolve-domain",
            "ton-dns-resolve",
            "ai-analyze"
          ],
          "trust_level": "internal-simulated+verified-key; verifier role",
          "simulated": true,
          "alsoUses": [
            "GET /a2a/audit (export, verify with AuditChain.verifyChain)",
            "GET /config/client-keys.json (public keys)"
          ]
        },
        {
          "name": "Payment Agent",
          "description": "Payment tasks: micropayment quotes and the XTR/402 flow, quote only (propose). Never pays, signs or broadcasts.",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "payment-agent"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#payment-agent"
          ],
          "skills": [
            "transfer-simulate",
            "swap-quote"
          ],
          "trust_level": "internal-simulated+verified-key; quote-only",
          "simulated": true,
          "quoteOnly": [
            "ton-balance",
            "ton-dns-resolve",
            "ai-analyze",
            "ai-summarize",
            "ai-content",
            "ai-orchestrate"
          ],
          "constraints": "Only type \"propose\" (price quote) on paid skills; payment itself is the upstream inbox 402 gate."
        },
        {
          "name": "A2A Test Agent",
          "description": "Protocol conformance testing: signatures, replay, declared-skills-only, caps, rate limits (test fixture tier).",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "a2a-test-agent"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#a2a-test-agent"
          ],
          "skills": [
            "check-balance",
            "resolve-domain",
            "swap-quote",
            "transfer-simulate",
            "transfer-ton",
            "ton-balance"
          ],
          "trust_level": "internal-simulated (test fixture)+verified-key",
          "simulated": true,
          "limits": "policy.agents.a2a-test-agent: perDayMaxTon 2, requestsPerMinute 5; paid skills and execute are never sent to the real inbox."
        },
        {
          "name": "Grok Bot",
          "description": "Orchestrator / builder / operator assistant: plans goals into sub-tasks, dispatches them to the persona agents, collects results and hands them to the Auditor.",
          "endpoint": {
            "url": "https://ai100web.pages.dev/a2a",
            "role": "client-via-gateway",
            "note": "Simulated persona bot run by the owner; no public HTTP endpoint of its own. It acts as an external A2A client and calls this gateway with Ed25519-signed envelopes."
          },
          "keyIds": [
            "grok-bot"
          ],
          "publicKeyRef": [
            "/config/client-keys.json#grok-bot"
          ],
          "skills": [
            "check-balance",
            "resolve-domain",
            "swap-quote",
            "transfer-simulate",
            "ton-balance",
            "ton-dns-resolve"
          ],
          "trust_level": "internal-simulated+verified-key; orchestrator",
          "simulated": true,
          "constraints": "Client key only (not the operator key, not the owner key). Cannot approve transfers."
        }
      ],
      "orchestration": {
        "status": "designed — sub-agent dispatch is not executed by this gateway; ai-orchestrate is forwarded to the upstream a2a-inbox, which enforces payment (402).",
        "flow": [
          "plan",
          "dispatch signed sub-tasks (each persona signs with its own Ed25519 client key)",
          "collect",
          "Auditor verify (signatures + outputs + audit chain)",
          "audit hash (X-Audit-Hash, hash-chained log)",
          "result"
        ],
        "verification": {
          "signatures": "gateway (Ed25519, replay nonce, declared-skills-only)",
          "outputs": "Auditor Agent cross-check",
          "approvals": "human owner only (over-cap transfers, every transfer-ton execute)"
        },
        "keys": {
          "clientKeys": "one Ed25519 key per persona; public halves in /config/client-keys.json. Private halves are currently all held on the owner build box (off-server, never deployed); recommended: each bot holds only its own.",
          "operatorKey": "system only (Agentic Wallet operator); never given to sub-agents",
          "ownerKey": "human only; never held by an agent or the server"
        },
        "spec": "docs/AI-ORCHESTRATE.md"
      },
      "data_collection_sources_ref": "#/data_collection_sources"
    }
  ],
  "authentication": {
    "schemes": [
      "ed25519-signed-envelope"
    ],
    "credentials": "Sign UTF-8 `${X-A2A-Timestamp}.${rawBody}` with your registered Ed25519 key; send X-A2A-Key-Id, X-A2A-Timestamp (unix seconds, ±300s) and X-A2A-Signature (base64, 64 bytes). Unsigned, stale, replayed or unknown-key requests get 401."
  },
  "securitySchemes": {
    "ed25519-signed-envelope": {
      "type": "apiKey",
      "in": "header",
      "name": "X-A2A-Signature",
      "description": "Ed25519 signed envelope. Headers: X-A2A-Key-Id (registered client name), X-A2A-Timestamp (unix seconds, max skew 300s), X-A2A-Signature (base64 Ed25519 signature over `${timestamp}.${rawBody}`). Public keys: https://ai100web.pages.dev/config/client-keys.json Registration: https://ryounoi100web.com/#/docs (docs/REGISTER-AGENT.md)."
    }
  },
  "security": [
    {
      "ed25519-signed-envelope": []
    }
  ],
  "metadata": {
    "wallet": "UQBzg5yX7h5m-DLINTeWzxc5lwmPjJrgMtWisw4rRUDYdSXZ",
    "domains": [
      "a2aprotocol.ton",
      "mcpprotocol.ton",
      "ryounoi100web.ton"
    ],
    "envelope": {
      "type": "propose | execute",
      "skill": "<skill id>",
      "input": {}
    },
    "routing": {
      "proxy": [
        "swap-quote",
        "transfer-simulate"
      ],
      "jsonrpcMock": [
        "check-balance",
        "transfer-ton",
        "resolve-domain"
      ],
      "inbox": [
        "ton-balance",
        "ton-dns-resolve",
        "ai-analyze",
        "ai-summarize",
        "ai-content",
        "ai-orchestrate"
      ]
    },
    "settlement": "Paid inbox skills keep the inbox's own Telegram Stars (XTR) 402 gate; the proxy never takes payment.",
    "safety": "No keys held server-side. Nothing is signed or broadcast by this agent.",
    "security": {
      "signedEnvelope": {
        "scheme": "ed25519-signed-envelope",
        "headers": [
          "X-A2A-Key-Id",
          "X-A2A-Timestamp",
          "X-A2A-Signature"
        ],
        "signedBytes": "UTF-8 `${timestamp}.${rawBody}`",
        "maxSkewSeconds": 300,
        "replay": "identical signature rejected within the window; include a unique `nonce` field in the body",
        "enforcedBefore": "per-agent rate limiting, skill dispatch and proxying (401)"
      },
      "scope": {
        "rule": "declared-skills-only",
        "source": "this agent card (skills[].id)",
        "undeclared": "403 skill_not_declared",
        "policy": "https://ai100web.pages.dev/config/policy.json"
      },
      "limits": {
        "policy": "https://ai100web.pages.dev/config/policy.json",
        "perTaskMaxTon": "1",
        "perDayMaxTon": "10",
        "rateLimit": "requestsPerMinute per agent → 429 (in addition to the per-IP limit)",
        "overCap": "202 pending_approval (not executed)",
        "transferExecute": "always 202 pending_approval; owner approval via Supabase Auth; result is an unsigned payload the owner signs in their own wallet",
        "ipRateLimit": {
          "perMinute": 5,
          "status": "429 + Retry-After",
          "appliesTo": [
            "POST /a2a",
            "GET /a2a/audit",
            "GET /a2a/approvals"
          ],
          "notLimited": "static pages, agent cards, GET /a2a status",
          "checkedBefore": "signature verification",
          "clientIp": "CF-Connecting-IP",
          "enforcement": "best-effort in-memory per isolate until Supabase credentials are configured (then a2a_rate, hashed IP key)"
        }
      },
      "audit": {
        "log": "hash-chained (record_hash = sha256(prev_hash | id | ts | agent | skill | type | request_sha256 | response_sha256))",
        "responseHeader": "X-Audit-Hash",
        "export": "https://ai100web.pages.dev/a2a/audit",
        "verify": "https://ryounoi100web.com/#/audit",
        "anchoring": "Merkle root over a record range, written as an UNSIGNED transfer comment 'AI100WEB-AUDIT v1 root=<hex> from=<id> to=<id>' that the owner signs manually; this service never broadcasts",
        "sbt": "future design only (TEP-85 SBT), not implemented"
      },
      "keys": "This service holds no wallet/owner private key and never signs or broadcasts TON transactions."
    }
  },
  "tonIdentity": {
    "tonid": "aec8ffd8-8262-415d-96a5-024f6bfc8e69",
    "tonidStatus": "declared by the owner; not verified on-chain by this service",
    "ownerWallet": {
      "address": "UQBzg5yX7h5m-DLINTeWzxc5lwmPjJrgMtWisw4rRUDYdSXZ",
      "rawAddress": "0:73839c97ee1e66f832c8353796cf173997098f8c9ae032d5a2b30e2b4540d875",
      "dns": "a2aprotocol.ton",
      "type": "wallet_v5r1",
      "role": "owner wallet (not an Agentic Wallet)"
    },
    "agenticWallets": [
      {
        "name": "AI100WEB",
        "address": "0:0b22825a8dc98fdeec0de64302e1590750ee6de3a8c1b7972513e72cd3aaf83c",
        "type": "agentic-wallet-sbt",
        "collection": "0:72435f6abd6c56ed589b49b18481989832a8a51d8e72d5afde7922f655a5e17f",
        "owner": "0:73839c97ee1e66f832c8353796cf173997098f8c9ae032d5a2b30e2b4540d875"
      },
      {
        "name": "ryounoi100web",
        "address": "0:adb048d745cd4bf3526aeef3e396c0e086ce061f2564e57c005442692fb298d3",
        "type": "agentic-wallet-sbt",
        "collection": "0:72435f6abd6c56ed589b49b18481989832a8a51d8e72d5afde7922f655a5e17f",
        "owner": "0:73839c97ee1e66f832c8353796cf173997098f8c9ae032d5a2b30e2b4540d875"
      }
    ],
    "domains": [
      "a2aprotocol.ton",
      "mcpprotocol.ton",
      "ryounoi100web.ton"
    ],
    "checked": {
      "on": "2026-10-28",
      "source": "tonapi.io v2, read-only",
      "facts": "Both SBTs are held by the owner wallet in the 'Agentic Wallets' collection; a2aprotocol.ton, mcpprotocol.ton and ryounoi100web.ton resolve to the owner wallet; the owner wallet interface is wallet_v5r1.",
      "notVerified": "tonid (declared only)"
    }
  },
  "gramAddress": "ryounoi100web.ton",
  "protocols": {
    "negotiation": "A2A/1.0 (Ed25519 signed envelopes)",
    "execution": "MCP (Model Context Protocol) tools",
    "settlement": "Telegram Stars (XTR) + TON"
  },
  "endpoints": {
    "a2a": "https://ai100web.pages.dev/a2a",
    "upstreamInbox": "https://rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox",
    "upstreamNote": "reached only through the signed /a2a gateway",
    "telegram": "https://t.me/",
    "a2aNote": "temporary: the gateway is served from ai100web.pages.dev until the custom domain is connected"
  },
  "data_collection_sources": {
    "_comment": "Where each declared skill gets its data / AI, based on this repo's code (lib/proxy-core.js, lib/gateway.js, js/a2a.js, config/policy.json). The upstream inbox code is not in this repo, so its providers are stated as not disclosed rather than guessed.",
    "check-balance": {
      "route": "jsonrpc-mock",
      "source": "local A2A mock core (js/a2a.js, mock MCP get_balance)",
      "ai": null,
      "live": false,
      "note": "mock data (source:\"mock\"); the website dashboard separately reads tonapi.io → toncenter.com"
    },
    "transfer-ton": {
      "route": "proxy",
      "source": "local unsigned preview at the gateway (lib/gateway.js transferPreview + proxy-core transferSimulate)",
      "ai": null,
      "live": false,
      "note": "never signed/broadcast; execute → pending_approval"
    },
    "resolve-domain": {
      "route": "jsonrpc-mock",
      "source": "local A2A mock core (js/a2a.js, mock MCP resolve_dns; knows the owner domains)",
      "ai": null,
      "live": false
    },
    "swap-quote": {
      "route": "proxy",
      "source": "STON.fi public API https://api.ston.fi/v1/swap/simulate (read-only)",
      "ai": null,
      "live": true
    },
    "transfer-simulate": {
      "route": "proxy",
      "source": "local simulation at the gateway (address checksum, amount/comment validation, fixed fee estimate)",
      "ai": null,
      "live": false
    },
    "ton-balance": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "not applicable / not disclosed",
      "note": "card describes it as \"via TON MCP tools\"; the inbox's underlying TON data provider is not visible in this repo"
    },
    "ton-dns-resolve": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "not applicable / not disclosed",
      "note": "card describes it as \"via TON MCP tools\"; provider not visible in this repo"
    },
    "ai-analyze": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "upstream a2a-inbox (provider not disclosed/unknown)"
    },
    "ai-summarize": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "upstream a2a-inbox (provider not disclosed/unknown)"
    },
    "ai-content": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "upstream a2a-inbox (provider not disclosed/unknown)"
    },
    "ai-orchestrate": {
      "route": "inbox",
      "source": "upstream a2a-inbox (Supabase Edge Function rdmvbmwijmdpmxttibxl.supabase.co/functions/v1/a2a-inbox)",
      "ai": "upstream a2a-inbox (provider not disclosed/unknown)",
      "note": "sub_agents are declared on the skill entry; their sub-calls use the sources listed for each skill above"
    }
  }
}
