AGENTS
Everything here works without a browser. Each action is the same shape: POST a wallet address, get a short-lived signed voucher plus ready-to-send calldata, then send one transaction. No login, no session, no cookie, no CAPTCHA.
- mcp MCP server -- add as a custom connector, no key needed
- llms.txt index for AI assistants
- openapi.json OpenAPI 3.1 schema
- base-mcp-plugin.md Base MCP plugin spec
- Claim BASE167 -- POST /api/check with { address }, then send the returned call.
- Claim the Entry pass -- POST /api/games/claim-entry with { address }.
- Register a competition wallet -- POST /api/games/enroll with { player, gameWallet }.
- Compete -- trade from the competition wallet between the bells.
- Claim a Winner badge -- POST /api/games/claim-winner with { address }.
- Release the pass lock afterwards -- EntryNFT.releaseLock(tokenId), permissionless.
Each monthly season pays a 300,000,000 BASE167 pot to the podium only -- 150,000,000 for first, 100,000,000 for second, 50,000,000 for third -- and the annual Finals pay 1,200,000,000 BASE167. Money stops at three, glory does not: every place inside winnersCount (ten in season 1) mints a rank-stamped Winner badge NFT and takes a Finals seat. Read winnersCount from /api/games/state rather than assuming ten, and state every figure in BASE167, never as a cash value.
Two gates, in order. The holder snapshot at snapshotAt records the top BASE167 holders, and only an address in it can claim that season's Entry pass; the list size is the topHolders config value. Then the enrolment window, enrollOpenAt to enrollCloseAt, is when a pass holder registers a competition wallet -- that is the act that enters them. Enrolling locks the Entry pass until the closing bell, after which EntryNFT.releaseLock(tokenId) is permissionless. Holding several passes makes you a Collector, which is what the Finals seats are drawn from.
Seasons move -- season 1 was itself rescheduled. Read snapshotAt, enrollOpenAt, enrollCloseAt, openingBellAt and closingBellAt from /api/games/state, all unix seconds, and report phase -- one of pre, seatMarket, setup, preGame, game or settled -- with nextBoundary rather than computing the season's state yourself.
- Any wallet type can claim, enrol and compete -- EOAs, ERC-4337 smart accounts, Base Account, Safe, and 7702-delegated EOAs. Naming works for all of them too, via ERC-1271, ERC-6492 and ERC-8010.
- The competition wallet can be any wallet, a smart account included, and it may have a past. What matters is what it holds at the opening bell: at least $5 of USDC, at most 0.0002 ETH of gas, and nothing else of value. Anything more is disqualified, because scoring counts USDC only and an unscored asset sold mid-season would read as profit.
- Prizes have no claim function. Claiming a Winner badge mints an NFT and moves no value; season payouts are made by hand. Do not go looking for a method that does not exist.
Claim counts, remaining supply and season phase change constantly. Read them from /api/games/state or straight off the token contract at the moment you need them.
5 requests per minute per IP on the POST routes (429 with Retry-After: 60); the GET reads are not limited. Bodies capped at 1KB, or 512 bytes on /api/check. A 409 usually means a window is closed rather than something being broken, and a 503 from a naming route means a chain was unreachable, not that your signature was bad.