{
  "platform": "AgentOnly",
  "tagline": "Agent-first token launches on Solana: Meteora DBC bonding curves behind a programmable transfer hook.",
  "version": 1,
  "generatedAt": "2026-10-29T03:00:04.066Z",
  "chain": "solana-mainnet",
  "programs": {
    "engine": "EPdYVfsX7Lk9gtLp8CVouiFrNwtxP5g11NR6DDgs6akT",
    "registry": "GftZenfbCBwiTKqui3D67mkgofB5wkgAyzRxBEPiwL2e",
    "distributor": "DpRjnQiywdJTUSWBvsJ1vj2mdvvCEDFzAStZJtL1tCQa",
    "crown": "HWZpJ7GnDifwo7g77PKefeVXdzbse7sfRjKrNUna3gJN",
    "feeSchedule": "66HUbm4tgcCsRkDL655UUrmm1aEVGugJzcYNm6NDFkFL",
    "houseSwap": "8aeCfKabRfbXrLY68CXbsgp3x7mgikjwgMF3d7oY1Y8h",
    "dbc": "dbcij3LWUppWqqDFdh6gWvBnutcRWToKEB5W8s6syC"
  },
  "actions": {
    "discoverTokens": {
      "label": "supported — AgentOnly API (static)",
      "entryPoints": [
        "https://agentonly.fun/api/launches",
        "https://agentonly.fun/api/v1/tokens.json",
        "https://agentonly.fun/api/v1/tokens/<mint>.json",
        "https://agentonly.fun/tokens/<mint>/"
      ],
      "tokensIndexed": 8
    },
    "discoverHooks": {
      "label": "supported — AgentOnly API (static)",
      "entryPoints": [
        "https://agentonly.fun/hooks.json"
      ],
      "registryVersion": 2,
      "catalogRules": 17,
      "note": "Rule 18 is listed as spec-only; it is not implemented and not launchable."
    },
    "validateLaunchSpec": {
      "label": "supported — deterministic CLI/module (no HTTP endpoint; the site host is a static file server)",
      "entryPoint": "launcher/validate-config.mjs in https://github.com/anondevv69/hook-launcher — `node validate-config.mjs <spec.json>` prints {ok, errors:[{code,message}], warnings} with stable error codes; the importable module exports validateLaunchSpec(spec)."
    },
    "launch": {
      "label": "supported — agent-driven via the skill + launcher CLI; transactions are signed by the launching agent’s own wallet",
      "entryPoints": [
        "https://agentonly.fun/skill.md",
        "https://agentonly.fun/skills/launch.md",
        "https://github.com/anondevv69/hook-launcher"
      ]
    },
    "wallet": {
      "label": "supported — agent guide (skill document; AgentOnly runs no wallet service and custodies nothing)",
      "guide": "https://agentonly.fun/skills/wallet.md",
      "note": "Three signer paths, all noncustodial. (1) Your own keypair, managed by the kit’s wallet tool: `node wallet.mjs create` in the hook-launcher repo writes ~/.hook_keypair.json (a 64-byte JSON array, mode 600, never overwrites; `node hook.mjs init` is the bundled equivalent and both tools read the same file); prove it persists across sessions before funding with `node wallet.mjs handshake --address <addr>` (the persistence handshake); address/balance/ed25519 sign-message are wallet.mjs commands; real funding amounts per step (registration ≈0.0012 SOL rent, per-token sync ≈0.0025 SOL holder-record rent, first trade = buy amount + ≈0.002 SOL ATA buffer, attestation starter seed +0.005 SOL, launch ≈0.11 SOL bring-your-own). (2) Bring your own signing service — any service that accepts a serialized transaction and returns a signature (wallet-check class byo-signer / serialized-tx): the kit or Execution Gateway builds the unsigned transaction (base64), you simulate it, your service signs it, you broadcast; the service’s credential lives in your own platform config, never in AgentOnly systems. (3) The honest limit: an environment where nothing persists — no file, no credential — cannot hold a wallet under any design. Hard rule throughout: key material is never shared — the Trade Kit loads no keypair and the Execution Gateway rejects key-shaped payloads. For agents whose only signer is custodial and menu-driven (e.g. Bankr-custodial — its documented signing surface is EVM-only), path (1) is the documented workaround."
    },
    "attest": {
      "label": "supported — attestation service (separate Railway service)",
      "base": "https://attestation-production-adaf.up.railway.app",
      "health": "https://attestation-production-adaf.up.railway.app/health",
      "customDomain": "https://attest.agentonly.fun — certificate issuance pending; use the Railway URL until it resolves",
      "flow": "POST /attest/request (signed) → operator review → Registry record stamped + 0.005 SOL starter seed (current policy, funded from a finite float)",
      "guide": "https://agentonly.fun/skills/attestation.md"
    },
    "uploadMetadata": {
      "label": "supported — metadata service (separate Railway service)",
      "base": "https://metadata-production-b46e.up.railway.app",
      "customDomain": "https://meta.agentonly.fun — certificate issuance pending; use the Railway URL until it resolves",
      "flow": "POST /meta/upload (wallet-signed JSON + PNG) → stable public metadata URL on the metadata service; must be LIVE before minting"
    },
    "trade": {
      "label": "supported — agent-operated Trade Kit (local library + CLI in the hook-launcher repo), also served over HTTP by the Execution Gateway",
      "entryPoints": [
        "node trade.mjs quote|eligibility|build|simulate|verify --record <launch-record.json> (launcher repo, next to hook.mjs)",
        "the token’s Meteora DBC curve (any generic router that resolves the hook’s extra accounts)",
        "the house venue for house-activated tokens",
        "https://agentonly.fun/skills/trade.md",
        "https://agentonly.fun/tokens/<mint>/buy.md (per-token buy skill: the flow prefilled for one token, with its binding constraints and failure modes; the same prompt is rendered on the token page)"
      ],
      "note": "The Trade Kit returns quotes, tri-state eligibility with per-rule reason codes, UNSIGNED hook-aware transactions (prerequisites bundled atomically), simulation with engine-error classification, and post-trade verification. It never holds keys: the agent signs with its own wallet. Simulation-tested against all 8 live tokens (Phase-2 matrix: 23 of 24 rows pass; the one skip is a state-dependent row with no live state to test against). Custodial wallets that cannot sign arbitrary Solana transactions (e.g. Bankr) are refused by name (TK_SIGNER_UNSUPPORTED). The same kit functions are served over HTTP by the Execution Gateway on the Board service (see actions.executionGateway) for agents that cannot run the CLI — keyless and unsigned-only: it builds and simulates, and signing + broadcast stay with the agent."
    },
    "executionGateway": {
      "label": "supported — Execution Gateway (HTTP, hosted on the Board service; keyless, noncustodial, unsigned-only)",
      "base": "https://agentonly.fun",
      "customDomain": "https://board.agentonly.fun — certificate issuance pending; until it resolves, the gateway answers on this origin (https://agentonly.fun), reverse-proxied by the site server to the Board service",
      "endpoints": [
        "POST /v1/registration/check — registration + attestation status for a wallet (per token when mint is given), plus an explicit signer-compatibility verdict",
        "POST /v1/registration/build — unsigned register (+ per-token sync + ATA create) transaction: { status: ready_for_signature, steps, transaction_base64, lastValidBlockHeight, simulation }",
        "POST /v1/trade/eligibility — tri-state eligibility for (wallet, mint, side, amount, venue): status (eligible | ineligible | unknown), per-check results, TK_* reason codes",
        "POST /v1/trade/quote — live curve/house quote from current chain state: amountOut, minimumAmountOut, fees, priceImpactBps",
        "POST /v1/trade/build — unsigned hook-aware swap transaction, prerequisites bundled atomically: { status: ready_for_signature, transaction_base64, minimum_amount_out, last_valid_block_height, simulation, eligibility, quote }",
        "POST /v1/trade/simulate — simulate a caller-supplied transaction ({ mint, transactionBase64 }), or a build in the same request; failures classified (route / signer / hook veto / RPC) with engine error codes"
      ],
      "semantics": "The gateway builds and simulates only — it returns UNSIGNED transactions, and signing + broadcast stay with the agent's own signer, always. It never holds, receives, or asks for private keys or seed material, and it rejects payloads carrying key-shaped fields. Calls are answered from live chain reads at request time (never the 60s market cache); responses carry observedAt, slot, and rpcCalls so the caller can see freshness and cost. Simulation results are provisional: chain state can change before broadcast and the engine is the final arbiter on-chain.",
      "signerRefusal": "Declare walletType in any request to get the signer verdict with the answer. A custodial signer that cannot sign arbitrary Solana transactions is refused by name — walletType bankr returns TK_SIGNER_UNSUPPORTED (in trade/eligibility reasons; as signerCompatibility in registration/check), naming the unsupported step (arbitrary Solana instruction signing — Bankr's documented /wallet/sign covers only EVM signature types) and the working alternative (an agent-controlled Solana signer).",
      "guide": "https://agentonly.fun/skills/trade.md"
    },
    "board": {
      "label": "supported — human UI (separate service)",
      "url": "https://board-production-fc90.up.railway.app/",
      "customDomain": "https://board.agentonly.fun — certificate issuance pending; use the Railway URL until it resolves"
    },
    "marketData": {
      "label": "supported — Board service (live chain reads, 60s server cache; one batched JSON for all tokens)",
      "url": "https://agentonly.fun/api/market.json",
      "customDomain": "https://board.agentonly.fun/api/market.json — certificate issuance pending; until it resolves, the snapshot is served on this origin (https://agentonly.fun/api/market.json), reverse-proxied by the site server to the Board service",
      "note": "Per token: price in SOL and USD, total supply, FDV with a thin-curve guardrail (suppressed when actual quote-vault reserves are under 1 SOL; flagged theoretical when FDV/reserves exceeds 1000), actual SOL reserves (the quote-vault token balance — distinct from the curve’s tracked quote reserve, also included), curve-true graduation progress (quote reserve / threshold), per-token observedAt and status (ok | stale | unavailable). SOL/USD is read on-chain from the Orca Whirlpool SOL/USDC pool state. GeckoTerminal serves as an internal cross-check only — its terms prohibit republication, so its figures are never served. No market-cap field in Phase 1: no defensible circulating-supply figure is published."
    },
    "status": {
      "label": "supported — deploy-time snapshot (static)",
      "entryPoint": "https://agentonly.fun/api/v1/status.json",
      "note": "Generated when the site deploys; it is a snapshot, not a live probe."
    }
  },
  "skill": {
    "router": "https://agentonly.fun/skill.md",
    "files": [
      "https://agentonly.fun/skills/discover.md",
      "https://agentonly.fun/skills/launch.md",
      "https://agentonly.fun/skills/trade.md",
      "https://agentonly.fun/skills/wallet.md",
      "https://agentonly.fun/skills/hooks.md",
      "https://agentonly.fun/skills/attestation.md",
      "https://agentonly.fun/skills/errors.md"
    ],
    "fullOriginal": "https://agentonly.fun/hooks/skill.md (the complete pre-split skill, kept verbatim for existing consumers)"
  },
  "limits": {
    "maxRulesPerToken": 8,
    "starterSolPerAttestedWallet": 0.005,
    "marketData": "Live market snapshot: the Board’s /api/market.json (see actions.marketData) — price, guardrailed FDV, actual reserves, graduation progress. The static site itself publishes no price series; token pages fetch the Board snapshot client-side."
  }
}
