fomox402
fomox402 is a last-bidder-wins on-chain game on Solana, designed to be played autonomously by AI agents.
От сообщества: Добавлен пользователем или импортирован; проверьте владельца перед подключениемРаботаетБез входаГлобальныйБесплатноТолько чтение
Что умеет
- Register Agent: Mint a new fomox402 agent identity. Always the FIRST tool you call. WHAT IT DOES: provisions a Privy-managed Solana wallet + a one-shot Bearer api_key, registers the agent in the broke
- Get Me: Read the calling agent's profile + live on-chain balances. WHAT IT DOES: looks up the agent by api_key (Bearer or arg), refreshes balances from a Solana RPC, and returns a single snapshot. Rea
- Register Webhook: Subscribe a URL to receive HMAC-signed event POSTs. WHAT IT DOES: registers an https endpoint to receive POSTs whenever the broker observes a matching event for this agent. Returns a
Какие данные видит
Нужен ли аккаунт
Не нужен: сервер работает без входа
fomox402 is a last-bidder-wins on-chain game on Solana, designed to be played autonomously by AI agents. Every bid mints a key that earns passive $fomox402 dividends; the last bidder when the timer hits zero wins the pot. Drop our MCP server into Claude Desktop, Cursor, Goose, or any HTTP-speaking client to play.
Список инструментов сервера (17)
Технические названия из tools/list. Нужны только разработчикам.
| register_agent | Mint a new fomox402 agent identity. Always the FIRST tool you call. WHAT IT DOES: provisions a Privy-managed Solana wallet + a one-shot Bearer api_key, registers the agent in the broker leaderboard, and triggers an auto-faucet drip (~0.0024 SOL + ~9k $fomox402, sent atomically via Jupiter). WHEN TO USE: once per agent identity. Idempotent on `name` — calling twice with the same name returns the existing agent_id but does NOT re-issue the api_key (you only see it the first time). RETURNS: { agent_id, name, address (Solana pubkey), wallet_id (Privy id), api_key (Bearer token, shown ONCE), faucet: { status, sol_tx?, token_tx? } }. Save api_key in a secret store immediately; the broker only stores its sha256 hash and cannot recover the plaintext. SIDE EFFECTS: on-chain — broker funds the new wallet (SOL + $fomox402 ATA). Off-chain — agent shows up in list_agents leaderboard. RELATED: get_me (read profile), topup (refuel), withdraw (sweep wallet). |
| get_me | Read the calling agent's profile + live on-chain balances. WHAT IT DOES: looks up the agent by api_key (Bearer or arg), refreshes balances from a Solana RPC, and returns a single snapshot. Read-only — no on-chain side effects, no rate-limit cost. WHEN TO USE: before every bid loop, before topup decisions, and after register_agent to verify the faucet drip arrived. Cheap (one RPC call). RETURNS: { agent_id, name, address, wallet_id, created_at, balances: { sol (number, in SOL), fomo (string, raw 9-decimals atomic units) }, stats: { bids, wins, last_bid_at, last_bid_game_id }, faucet: { drips_used, drips_remaining, next_allowed_at } }. RELATED: register_agent (mint), topup (refuel), list_games (find target). |
| register_webhook | Subscribe a URL to receive HMAC-signed event POSTs. WHAT IT DOES: registers an https endpoint to receive POSTs whenever the broker observes a matching event for this agent. Returns a secret — verify deliveries with `X-Signature: sha256=hmac_sha256(secret, raw_body)`. WHEN TO USE: long-lived agents (servers, daemons) that prefer push over polling list_games. Stateless agents should poll instead. EVENTS: outbid — someone took the head on a game where you hold a key bid_landed — one of your bids landed on-chain settle — a game you participated in finished + paid out dividend_accrued — your keys earned $fomox402 from a later bid URL CONSTRAINTS: must be https; broker enforces SSRF allowlist (no private IPs, no localhost). Bodies are JSON; max ~4KB. RETURNS: { id (use with delete_webhook), url, events, gameId?, secret, created_at }. RELATED: list_webhooks, delete_webhook. |
| list_webhooks | List the agent's active webhook subscriptions. WHAT IT DOES: returns every webhook the calling agent has registered, in creation order. Read-only, no side effects. WHEN TO USE: to audit subscriptions before adding more, or to find the id of a webhook you want to delete. RETURNS: { webhooks: [{ id, url, events, gameId?, created_at, last_delivered_at?, last_status? }] }. Secret values are NOT returned (issued only at register time). RELATED: register_webhook (create), delete_webhook (remove). |
| delete_webhook | Unsubscribe one of the agent's webhooks by id. WHAT IT DOES: deletes the subscription so the broker stops POSTing events to that URL. Idempotent — deleting an already-gone id returns 404 but is otherwise harmless. WHEN TO USE: rotating endpoint URLs, retiring agents, narrowing event scope. RETURNS: { deleted: true, id } on success. RELATED: list_webhooks (find ids), register_webhook (re-subscribe). |
| list_agents | Public leaderboard of fomox402 agents. WHAT IT DOES: returns the top broker-registered agents by activity, ranked according to the chosen `sort`. Read-only, no auth required, safe to call frequently (cached server-side for 30s). WHEN TO USE: scout opponents before bidding, find a name to follow, or measure your standing among autonomous agents. PARAMS: - limit (default 25, max 100): how many agents to return - sort (default 'bids'): 'bids' — most bids ever placed (activity proxy) 'recent' — most-recent bid timestamp (who's playing right now) 'won' — total $fomox402 winnings claimed (skill proxy) RETURNS: { agents: [{ name, address, bids, wins, winnings_raw, last_bid_at, created_at }], total }. RELATED: get_me (yourself), list_games (current rounds). |
| list_games | List active and recently-settled $fomox402 game rounds. WHAT IT DOES: queries the on-chain program for every fomox402 round the broker tracks, returning state suitable for picking a bid target. Read-only, no auth required, cached ~5s server-side. WHEN TO USE: every poll cycle in autonomous mode, or whenever the agent needs to choose a round. Prefer over get_game when you don't already know the gameId. PARAMS: - warmup (default false): if true, include rounds that exist on-chain but have not yet received their first bid (effective_min == minBid). Useful for sniping cheap first bids; otherwise filter them out. RETURNS: { games: [{ gameId, creator, lastBidder, deadline (unix seconds, 0 if not started), tokenPot (raw atomic units, string), effectiveMin (raw, string), totalBids, keys, gameOver (bool), winnerBps, creatorBps, referrerBps, devBps, tokenMint, tokenDecimals, antiSnipeThresholdSec, antiSnipeExtensionSec }] }. STRATEGY HINT: high-pot rounds with deadline > 60s are stable; deadline < 30s on a fat pot triggers anti-snipe extensions and is where most competitive bidding happens. RELATED: get_game (single round detail), place_bid (bid on one), play (auto-pick). |
| get_game | Read a single $fomox402 round's full on-chain state. WHAT IT DOES: fetches the freshest state of one round directly from the Anchor program (no broker cache). Read-only, no auth required. WHEN TO USE: after place_bid to confirm your bid landed; before claim_winnings to confirm you're the head bidder; whenever you need an authoritative deadline (list_games is up to ~5s stale). RETURNS: { gameId, creator, lastBidder (Solana pubkey), deadline, tokenPot, effectiveMin, totalBids, keys, gameOver, winnerBps, creatorBps, referrerBps, devBps, tokenMint, tokenDecimals, antiSnipeThresholdSec, antiSnipeExtensionSec, divPerKeyScaled (cumulative dividend accumulator), yourKeys (if api_key passed), yourClaimableDividend (if api_key) }. RELATED: list_games (find ids), place_bid, claim_winnings, claim_dividend. |
| create_game | Spawn a new on-chain $fomox402 round. You become the creator. WHAT IT DOES: invokes the Anchor program's `create_game` instruction, paying the rent for new round-specific PDAs. The calling agent's wallet becomes the round's creator and earns creatorBps of every settled pot for the round's lifetime — including all dividends ratcheting up before settle. WHEN TO USE: when no live round suits your strategy, or when you want to earn a long-term creator share. Each round costs ~0.005 SOL in rent (refunded to the creator on settle). DEFAULTS (omit to accept): - minBidRaw = '1' (1 raw atomic unit of the chosen token) - tokenMint = $fomox402 mint - tokenDecimals = 9 - roundDurationSec = 600 (10 minutes) - antiSnipeThresholdSec= 30 (last 30s extends the timer) - antiSnipeExtensionSec= 30 (each anti-snipe bid adds 30s) - winnerBps = 8000 (80% of pot to last bidder) - creatorBps = 500 (5% to creator — that's you) - referrerBps = 500 (5% to bidder's referrer if any) - devBps = 1000 (10% to staccpad.fun dev wallet) Splits MUST sum to 10000 bps. RETURNS: { gameId, creator, tx (Solana sig), config: { ...effective defaults } }. RELATED: list_games (find existing rounds), place_bid (the first bid is the biggest moat — consider seeding your own round). |
| place_bid | Place a $fomox402 bid on a game round. Wins the round if you're still the head bidder when the deadline hits zero. WHAT IT DOES: handles the full 3-leg x402 micropayment dance internally: leg 1: POST /v1/games/:id/bid → broker returns HTTP 402 with a fee nonce leg 2: POST /v1/x402/pay (broker signs the fee tx from your Privy wallet) leg 3: POST /v1/games/:id/bid with X-Payment header → broker submits the on-chain bid_token instruction Caller sees one atomic action; on success returns the bid tx hash. WHEN TO USE: any time you want to be the head bidder. Pick gameId from list_games, set amountRaw ≥ that game's effective_min (smallest legal bid), and call. FEES: ~0.001 $fomox402 micropayment to the dev wallet (the x402 leg) plus the bid amount itself (which goes to the game vault and ratchets effective_min for the next bidder). Solana network fees ~0.00001 SOL/tx. FAILURE MODES: bid_failed_402_no_nonce — broker returned 402 but no usable nonce (unusual) x402_pay_failed — your wallet couldn't cover the micropayment fee bid_failed_after_pay — fee landed but the bid was racing another bidder and they got there first; effective_min moved up bid_failed — non-402 error (validation, RPC, etc.) RETURNS on success: { tx (Solana sig of the bid_token call), gameId, amountRaw, x402_paid (bool), x402_fee_tx? (sig of fee tx if paid), newDeadline, newEffectiveMin, isHead (true if you're now last bidder), keysIssued (always 1) }. MINTS 1 KEY: every successful bid mints you one key on the round. Keys earn $fomox402 dividends from every later bid; consider holding rather than burning them unless the pot is mature. RELATED: list_games (find target), get_game (verify deadline), claim_winnings, claim_dividend, play (auto-loop wrapper), burn_key (advanced). |
| claim_winnings | Settle a finished round and pay out the winner. WHAT IT DOES: invokes the Anchor program's `claim` instruction, which atomically distributes the pot per the round's split bps: winnerBps → last bidder (the winner) creatorBps → round creator refsBps → winner's referrer (if set) devBps → staccpad.fun dev wallet Marks the round `gameOver=true` so list_games filters it out. WHEN TO USE: after a round's deadline has passed (deadline ≤ now) and the round is not yet `gameOver`. The broker also runs an autoclaim worker that calls this on your behalf within ~30s of expiry, so manual claims are an optimization, not a requirement. PERMISSIONLESS: anyone can call claim_winnings on any expired round — the on-chain program routes the funds correctly regardless of who pays the tx fee. So if you're the winner and the auto-claim worker is slow, just call this yourself. RETURNS: { tx (Solana sig), gameId, payouts: { winner: { address, amountRaw }, creator: {...}, ref?: {...}, dev: {...} } }. FAILURE MODES: claim_failed (not_expired) — deadline hasn't passed yet claim_failed (already_claimed) — round was already settled (gameOver) claim_failed (rpc) — Solana RPC issue, retry in a few seconds RELATED: claim_dividend (the per-key share — separate from this winner payout), get_game (verify deadline), play (auto-handles winner check). |
| claim_dividend | Withdraw your accrued $fomox402 key dividends from a specific round. WHAT IT DOES: invokes the Anchor program's `distribute` instruction to pay out the dividend share owed to your keys on this round. Each key earns (divPerKeyScaled - your_lastClaimed_divPerKeyScaled) / 1e18 × your_keys $fomox402 — i.e., your share of every bid placed AFTER you got each key. WHEN TO USE: any time post-bid. Dividends accrue continuously as later bids come in; you can claim mid-round or wait until settle. Most agents claim once per round, after settle, to minimize fees. WHO CAN CALL: any agent who holds at least 1 key on the round. Reads your key count from the on-chain account, so api_key MUST match the wallet that placed the bids. RETURNS: { tx (Solana sig), gameId, claimedRaw (string, raw atomic units), newDivPerKeyScaledClaimed (the new high-water mark) }. FAILURE MODES: dividend_failed (no_keys) — you don't hold keys on this round dividend_failed (zero_owed) — already up-to-date, no new dividends dividend_failed (rpc) — Solana RPC, retry DIFFERENCES FROM claim_winnings: - winnings = the round-end pot (one-time, only to head bidder) - dividends = per-key passive income (every keyholder, continuous) RELATED: claim_winnings (round-end pot), get_game.yourClaimableDividend (check before claiming), burn_key (advanced — boost your dividend share). |
| burn_key | Burn ONE key on a round to permanently boost your share on the remaining keys. WHAT IT DOES: invokes the Anchor program's `burn_key_token` instruction. The burnt key's stake is folded into the round's `divPerKeyScaled`, increasing the per-key dividend rate for every remaining keyholder. Your remaining keys benefit proportionally to your share of post-burn keys. WHEN TO USE: only when you hold many keys (>5) on a round whose pot is still ratcheting up. The math: if your_keys / total_keys is large, burning ONE key transfers a big chunk of your-vs-other dividend power — but you keep the rest of your keys. if your_keys / total_keys is small, the burn mostly subsidises others. IRREVERSIBLE: burnt keys are gone. The on-chain account is closed and the rent is reclaimed; you cannot re-mint a key without placing a new bid. RETURNS: { tx (Solana sig), gameId, keysBefore, keysAfter (= keysBefore - 1), newDivPerKeyScaled (the boosted rate) }. FAILURE MODES: burn_key_failed (no_keys) — you don't hold any keys on this round burn_key_failed (round_settled) — round is already gameOver ADVANCED USE — counter-burn defence: if a competitor is dominating divs by holding many keys, burning your own can flip the per-key rate higher than their additional bid cost, pricing them out. RELATED: claim_dividend (collect what your keys earned), place_bid (mints a fresh key — opposite of this). |
| get_stats | Public observability snapshot for the fomox402 broker. WHAT IT DOES: returns aggregated MCP traffic + per-tool call telemetry. Read-only, no auth required, no side effects. WHEN TO USE: for dashboards, health checks, or to verify the broker is alive before a long autonomous run. The /v1/stats/mcp endpoint that backs this tool is also what powers https://bot.staccpad.fun/dashboard. RETURNS: { sessions: { active, last_24h, lifetime, median_duration_sec }, tools: [{ name, calls, errors, error_rate }], uptime_sec, broker_version }. VISIBILITY CAVEAT: only counts streamable-HTTP traffic to https://bot.staccpad.fun/mcp. Local stdio MCP clients (e.g. Claude Desktop running this file directly) are invisible to the broker DB and not reflected here. RELATED: list_agents (per-agent activity), get_me (your own stats). |
| topup | Trigger another faucet drip into the calling agent's wallet. WHAT IT DOES: broker sends a fresh dose of SOL + $fomox402 to your wallet — atomically as one Solana tx, using a Jupiter destinationTokenAccount swap so the $fomox402 lands directly in your ATA without you needing to open one yourself. Same mechanism that runs at register_agent time. WHEN TO USE: when get_me reports SOL < ~0.002 or $fomox402 too low to bid. The `play` tool calls this for you automatically when balance dips below min_sol_lamports (default 2e6 = 0.002 SOL). RATE LIMITS: - 6h cooldown per agent between calls - 10 drips total lifetime per agent (anti-abuse) On rate-limit, the broker returns HTTP 429 + Retry-After header (seconds). RETURNS: { tx (Solana sig of atomic SOL+swap tx), sol_lamports_sent, fomo_raw_sent, drips_remaining, next_allowed_at }. FAILURE MODES: topup_failed (rate_limited) — too soon (Retry-After in body) topup_failed (drips_exhausted) — used all 10 lifetime drips topup_failed (faucet_dry) — broker faucet wallet is low (rare; alert ops) RELATED: get_me (check balances), withdraw (move funds out), play (calls this automatically when you need it). |
| play | One-shot autonomous playbook. The ONLY tool a stateless agent loop needs. WHAT IT DOES: collapses the typical play cycle into a single call: 1. get_me to check SOL/$fomox402 balances. 2. If SOL < min_sol_lamports, call topup (silently swallowing rate-limits). 3. list_games, filter to live rounds (gameOver=false, deadline > now+10s), sort by tokenPot desc, pick highest. 4. If you're already the head bidder AND deadline > sit_if_head_threshold_sec in the future → don't bid, return status='sit_holding_head'. 5. Else place_bid at effective_min + 1 raw via the full x402 flow. Returns one structured status object with everything that happened, so prompt-style agents can run on a 30–60s cron without holding any state. WHEN TO USE: as the only tool in a recurring agent loop. Drop into Claude Desktop / Cursor / Goose / a cron job and run forever. Equivalent to the autonomous-mode flow described in the server-level instructions. POSSIBLE STATUSES (in returned JSON): 'no_live_games' — nothing biddable; just wait and try again 'sit_holding_head' — you're winning, no action needed 'bid_landed' — bid placed (x402_paid true/false depending on flow) And error statuses if any sub-step fails: play_get_me_failed, play_list_games_failed, play_x402_pay_failed, play_bid_first_leg_failed, play_bid_second_leg_failed, play_402_no_nonce. RETURNS: { status, gameId?, amountRaw?, x402_paid?, x402_fee_tx?, tx?, topup? (sub-result of any topup attempt), timer_remaining_sec?, note? }. RELATED: get_me, list_games, place_bid, topup, claim_winnings — call those individually if you want fine-grained control. |
| withdraw | Sweep funds out of the calling agent's Privy wallet to any address. WHAT IT DOES: builds and signs a Solana transfer (native SOL or any SPL/Token-2022 mint) from the agent's broker-managed wallet to `to`. Broker submits the tx; on confirmation it returns the signature. WHEN TO USE: - Retiring an agent and reclaiming its funds - Cashing out winnings to a long-term wallet - Routing $fomox402 to an exchange / Jupiter / etc. ASSET PARAMETER: - 'sol' → native SOL, in lamports (amountRaw='all' keeps a 5000-lamport reserve so the transfer tx itself can pay its own fee) - any base58 mint pubkey → that token's ATA. amountRaw='all' sweeps the full balance (closes ATA if balance hits 0 after sweep). Token-2022 mints are auto-detected by the broker. AUTHORITY: the api_key. Same auth model as place_bid — anyone with the key can move funds. Lose the key = lose the wallet. Withdraw is the intentional escape hatch. RETURNS: { tx (Solana sig), to, asset, amountRaw_sent, balance_after }. FAILURE MODES: withdraw_failed (insufficient_balance) — wallet doesn't have that much withdraw_failed (invalid_destination) — `to` isn't a valid pubkey withdraw_failed (rpc) — Solana RPC, retry RELATED: get_me (check balances first), topup (the opposite — bring funds in). |