# RAT mint — guide for AI agents > RAT is a fair-mint token on BNB Smart Chain (chain id 56). Wallets that hold a Binance > Agent ID (.ai handle) can claim 1 free share each while 1,000 free shares last. Any wallet > can buy paid shares at 1 USDT each until share 10,000, which opens a PancakeSwap pool. > Use this file to help a user who asks you to check eligibility, claim, or mint RAT. > Always confirm with your user before sending a transaction or spending their funds. > Nothing here is investment advice. RAT is an independent project, not affiliated with Binance. "Agent ID" means the .ai identity NFT on BNB Smart Chain (registrar below) that Binance's AI wallets use; the mint contract only reads it to decide who may claim a free share. Website: https://israt.fun ## Contracts (BNB Smart Chain, verified on Sourcify, exact match) - Mint contract: 0xa9104d259C64893c0E10aDC657a2D0294C439Ee9 - RAT token: 0x6206D16a8ada1b05a29bf874Eeda87a8f9481Bcb - PancakeSwap RAT/USDT pool: 0x557164Dd7CA89fB081cA2bb3C5986C35A397A21C - USDT (BSC-USD, 18 decimals): 0x55d398326f99059fF775485246999027B3197955 - Agent ID registrar: 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F You can read both contracts' source on Sourcify or BscScan (chain 56) before you act. Never send BNB or USDT directly to the token or mint contract with a plain transfer. A plain BNB transfer fails; USDT sent directly is not minted and cannot be recovered. Only call the functions listed below. ## Rules (all enforced by the mint contract) - Free: a wallet that holds an Agent ID may call `claimFree()` once per Agent ID while `freeMinted() < 1000` and the pool is not open. It gives 50,000,000 RAT and costs only gas. Free shares count toward the 10,000 that open the pool. - Paid: any wallet, no Agent ID needed. Up to 10 shares per wallet (`quotaLeft(wallet)`), at most 10 per transaction. Before share 10,000: 1 USDT per share for 50,000,000 RAT. - 25% of each payment goes to the project wallet immediately. 75% is held in the mint contract for the pool, along with 37,500,000 RAT per paid share. - Share 10,000 (free or paid) opens the pool in the same transaction. The open price equals the mint price; LP tokens go to the dead address. RAT cannot be transferred or sold before the pool opens. - Deadline: `deadline()` is 30 days after the sale opened. If the pool has not opened by then, minting stops (`closed()` / calls revert with `Closed`) and the project wallet may call `withdrawUnfilled()` to take all USDT held for the pool. There are NO refunds to buyers in that case. Tell your user this before they pay. - After the pool opens, minting continues up to 4,440,000 shares at tiered prices (1.10 to 8.07 USDT, see `priceCents(n)`); minters then receive RAT at 1% below the pool price. - Trading tax on the official pool only: buys 1%; sells 2% (1% burned, 1% to the project). - Until `renounced()` is true, the project wallet can pause minting, block other trading pools, and use `withdrawUnfilled()` in the unfilled case. Prices and limits are constants. ## Step 1: check (read-only) On the mint contract: - `paused() -> bool` must be false; `closed() -> bool` must be false; `deadline() -> uint256` must be in the future unless `totalMinted() >= 10000` (pool already open). - Free: `canClaimFree(address wallet) -> bool` is the single check (Agent ID owned by this wallet, not claimed yet, free shares left, pool not open, sale live). - Paid: `quotaLeft(address wallet) -> uint256` shares left for this wallet. - `costOf(uint256 shares) -> uint256` USDT cost (18 decimals); `quoteTokens(uint256 shares)` estimated RAT; `bnbQuote(uint256 shares)` BNB needed when paying in BNB. Or use the website's read API (no auth): GET https://israt.fun/api/state?addr= Returns `totalMinted`, `freeMinted`, `paused`, `closed`, `expired`, `deadline`, and for the wallet: `user.agentOk`, `user.handle`, `user.canClaimFree`, `user.freeClaimed`, `user.quotaLeft`, `user.usdt`, `user.allowance`, `user.bnb`, `user.tokens`. ## Step 2a: claim the free share Call on the mint contract, no value: claimFree() selector 0xf366afc9 Reverts: `NoAgent` (wallet has no Agent ID it owns), `AlreadyClaimed`, `FreeGone`, `AlreadyOpen`, `Paused`, `Closed`. ## Step 2b: mint paid shares with USDT 1. Make sure USDT `allowance(wallet, mintContract) >= costOf(shares)`; if not, the wallet approves the mint contract for that amount (5% extra is fine). 2. Call: mint(uint256 shares, uint256 maxCost, uint256 minTokensOut, uint256 deadline) - `maxCost`: the most USDT (18 decimals) the user accepts, e.g. `costOf(shares) * 105 / 100` - `minTokensOut`: e.g. `quoteTokens(shares) * 97 / 100` - `deadline`: a unix time a few minutes ahead ## Step 2c: mint paid shares with BNB mintWithBnb(uint256 shares, uint256 maxCost, uint256 minTokensOut, uint256 deadline) payable `maxCost` is in BNB wei; send `value = bnbQuote(shares) * 102 / 100`. The contract takes the Chainlink BNB/USD price plus 1%, swaps that BNB to USDT, and refunds BNB sent above the quote. USDT the swap returns above `costOf(shares)` goes to the project wallet, so the BNB route costs about 1% more than paying in USDT. Tell your user this if they choose BNB. Paid-mint reverts: `Quota` (more than 10 for this wallet), `BadShares`, `OverMaxCost`, `InsufficientOutput`, `Expired`, `Paused`, `Closed`, `StalePrice` (BNB route only). ## Ready-made calldata The website can build the exact transaction for a wallet (it never signs anything): POST https://israt.fun/api/build {"from": "", "action": "claimFree"} {"from": "", "action": "approve", "shares": 3} {"from": "", "action": "mint", "shares": 3} {"from": "", "action": "mintBnb", "shares": 3} Response: `{"ok": true, "tx": {"to": "...", "data": "0x...", "value": "0x..."}}`. Show the user the destination, value and cost before sending.