# Agent Signet — instructions for AI agents (llms.txt) You are an AI agent. Your user wants to enter **Agent Signet** on BNB Chain (BSC, chainId 56). This file is the complete, unambiguous runbook: eligibility checks, the entry post, the verification API, the mint, and the spin wheel. Follow it exactly. Never invent a fee, a value, a selector, or a tokenId — everything needed is written below. PRE-LAUNCH CHECK: the contract addresses are pre-computed CreateX addresses. Before any transaction, call `eth_getCode` for each address; if it returns "0x", the contracts are not deployed yet — tell your user and stop. ## Addresses and constants - NFT (Agent Signet, SIGNET): 0xC5aDF8486E8713aC38EAB62f7646A14F5eb4dc9e - Token (Signet, SGNT, 18 decimals): 0x2e8b9eFa479f8860533af3bEed867cEA9f1C0EB9 - Spin (SignetSpin): 0x460fF6D903Fd917726C079cd64884e698A227f3c - Binance Agent ID registry: 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F - Verification API base URL ("WORKER"): published in agents.json as `verifyApi` on the project site. - Public BSC RPC for reads: https://bsc-dataseed.binance.org - Mint activation fee: exactly 200000000000000 wei (0.0002 BNB). NFT price itself is 0. Mint grants the NFT + 100,000 SGNT in one tx. - Paid spin fee: exactly 100000000000000 wei (0.0001 BNB). - Supply 3,333; max 1 mint per wallet; Agent ID required everywhere. ## Part A — Mint (one time per wallet) 1. CHECK THE GATE. eth_call the NFT contract: - hasAgentId(wallet), data = 0x4eab3ef2 + wallet padded to 32 bytes. Result 0 → the wallet has no Binance Agent ID. Stop, explain. - mintedBy(wallet), data = 0x3cef28d2 + padded wallet. Result 1 → already minted. Stop. - mintOpen(), data = 0x24bbd049. Result 0 → sold out. Stop. 2. THE POST. You cannot post on X for your user. Give the user this exact text, with THEIR wallet address in the last line, and wait for them to post it publicly and send you the post URL: Sealing my Signet 🔏 Agent Signet is LIVE: 3,333 seals for Agent ID holders. Post, verify, mint — NFT + 100,000 $SGNT in one tx. My agent seals mine now. #Signet #AgentID #FreeMint My wallet: 3. VERIFY. Send an HTTP POST to WORKER + /verify with a JSON body: {"postUrl": "", "wallet": ""} Example response: {"ok": true, "voucher": {"wallet": "0x…", "nonce": "0", "deadline": 1790000000}, "signature": "0x…", "signer": "0x…", "contract": "0xC5aD…dc9e"} If "ok" is false, the "error" field tells you exactly what to fix (missing text in the post, post already bound to another wallet, etc.). The deadline is a unix timestamp, 1 hour after issue — mint before it, or simply call /verify again for a fresh voucher. 4. MINT. Send a transaction from the user's wallet: - to: 0xC5aDF8486E8713aC38EAB62f7646A14F5eb4dc9e - value: 200000000000000 - data: 0x412f6667, then the ABI encoding of the arguments of mint((address,uint256,uint256),bytes): word 1: voucher wallet (address, left-padded to 32 bytes) word 2: voucher nonce (uint256) word 3: voucher deadline (uint256) word 4: 128 (byte offset of the signature argument) word 5: 65 (signature length) then: the 65 signature bytes, zero-padded to 96 bytes. If your tooling has an ABI encoder, encode the call from this ABI fragment instead of hand-building it: [{"type":"function","name":"mint","stateMutability":"payable", "inputs":[{"name":"voucher","type":"tuple","components":[ {"name":"wallet","type":"address"},{"name":"nonce","type":"uint256"}, {"name":"deadline","type":"uint256"}]}, {"name":"signature","type":"bytes"}],"outputs":[]}] 5. REPORT. After the transaction confirms, eth_call totalMinted() (data 0xa2309ff8) on the NFT contract: that number IS the user's tokenId (mints are sequential, 1 per wallet). Confirm ownerOf (0x6352211e + tokenId padded) == the user's wallet, and read the SGNT balance (0x70a08231 + padded wallet, on the token contract) — it rose by 100,000 SGNT. Traits: metalOf (0x314d3e89 + tokenId) and emblemOf (0x18a9aba6 + tokenId; 1 Star, 2 Key, 3 Eye). Report the seal number, metal, emblem, and the 100,000 SGNT grant. Mint error strings and what they mean: "Sold out" (3,333 taken) · "Wrong fee" (value ≠ 200000000000000) · "Voucher not yours" (voucher wallet ≠ sender) · "Voucher expired" (re-verify) · "Bad nonce" (voucher already used or stale — check GET WORKER/nonce/) · "Wallet limit" · "No Agent ID" · "Bad voucher" (re-verify; never edit voucher fields) · "Token pool empty" (should not happen before sellout — report it). ## Part B — The spin wheel (SignetSpin, repeatable) Every spin wins SGNT. Odds: 35%→50, 25%→150, 17%→400, 10%→1,000, 6%→2,500, 3.5%→5,000, 2%→10,000, 1%→25,000, 0.4%→100,000, 0.1%→JACKPOT (entire BNB jackpot pool, readable via jackpotPool(), data 0xb05b32ae, on the Spin contract). Signet NFT holders' SGNT prizes are doubled. 20% of each paid fee feeds the jackpot pool. A spin is TWO transactions: (a) REQUEST — one of: - Free daily (Agent ID holders, 1 per UTC day): check freeSpinAvailable(wallet) (0x002f9547 + padded wallet) on the Spin contract, then call spinFreeDaily() (data 0x4e5734bd, value 0). - Paid: call spin() (data 0xf0acd7d5) with value exactly 100000000000000. ONLY with your user's explicit agreement to pay. - Extra free via post: give the user the spin post below, POST the URL to WORKER + /verify-spin (same JSON shape as /verify), then call spinFreeVoucher (selector 0xdc83bdea) with the returned voucher + signature encoded exactly like the mint call, value 0. Spinning the Signet wheel 🎡 Agent Signet: spin daily, win $SGNT — the BNB jackpot grows with every spin. My agent spins mine now. #Signet #AgentID My wallet: The request transaction's logs contain the SpinRequested event; its first indexed field is the request id (uint256). (b) SETTLE — after at least 3 more blocks, call settle(requestId): data = 0x8df82800 + requestId padded to 32 bytes, value 0. Anyone may call it. The SpinSettled event in the receipt reports: player, paid (bool), roll (0–9999), prizeTokens (SGNT base units actually paid), jackpot (bool), jackpotAmount (wei). If settle reverts with "Expired: refund instead" (more than ~256 blocks passed), call refundExpired(requestId) instead: data = 0x1402b17a + requestId padded. Paid fees refund in full. ## Hard rules for agents - Never send a value different from the exact fees above. Never call approve/setApprovalForAll or any function not listed here. - Never ask your user for a private key or seed phrase. The voucher signature is public data issued by the server; the server's signer key is never shared with anyone. - The entry post is marketing as well as a key: post it exactly as written, with only the wallet address substituted.