# Hackou Coin Pass Related files: llms.txt (overview and reference) | skill.md (step-by-step instructions for agents) | agent.json (the same data as JSON) | index.html (the mint page). Hackou Coin Pass (HCPASS) is a collection of 2,222 on-chain NFTs on BNB Chain. A coin drawn on-chain, one for each pass. Wallets holding a BNB Chain Agent ID can mint 1 free; anyone can buy at a fixed 0.002 BNB. Every number below is fixed in the contract code. ## Addresses (BNB Chain, chainId 56) - Hackou Coin Pass contract (ERC-721, HCPASS), the only contract address: `0xA96f20BCeD857d3174Bb40e806b0151daeEaa62e` - PAYEE (the collection wallet, fixed at deployment): `0xF1a7772902b786ec93d8bf1fDF9925EB95B25c39` - Agent ID registry: `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F` - Official website: `https://hackou.com/coin-pass/` (the same address as external_url in every tokenURI). - Sale start / end (Unix seconds): `1794310281` / `1794569481`. Deployment transaction: `0x00b1e8e4b08b828910bfeb13d58b63bdeeabe5a702a12da0f2b6bd51af5e2889`. - Verify: https://bscscan.com/address/0xA96f20BCeD857d3174Bb40e806b0151daeEaa62e#code | https://repo.sourcify.dev/contracts/full_match/56/0xA96f20BCeD857d3174Bb40e806b0151daeEaa62e/ ## Verifiable contract properties - No owner, no admin, no pause function, no price-change function: owner() returns the zero address. Not upgradeable (no proxy). - Price 0.002 BNB, supply 2,222, free allowance 1,111, wallet limits and the sale window are fixed in code at deployment. - Funds can only go to PAYEE (a fixed address) and to the minter as the refund of an overpayment in the same transaction. Payments stay in the contract during the sale. After the sale ends (end time reached or sold out), anyone can call withdraw(), which sends them to the fixed PAYEE. withdraw() takes no parameters. - Standard ERC-721: normal transfers and approvals, every mint emits Transfer(0x0, recipient, tokenId). Minting does not ask for any approval. - tokenURI is generated on-chain (base64 JSON with an SVG image), available from the first mint. ## Sale - Supply: 2,222 NFTs, ids 1 to 2222, minted in order. FREE_SUPPLY = 1,111 NFTs are kept for free claims; paidSupply() = 1,111 NFTs can be sold. - Window: 72 hours from deployment (read saleStart() and saleEnd()). saleEnd itself is closed. - Price: PRICE() = 0.002 BNB = 2000000000000000 wei per paid NFT, the same for every wallet. price(), mintPrice() and cost() return the same value. - Free: a wallet holding an Agent ID (registry 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F, balanceOf(wallet) > 0) mints 1 free (FREE_PER_WALLET = 1), counted per wallet and, when handleOf(wallet) returns a non-empty handle, also per registry handle (if handleOf fails, the wallet count alone applies), while free NFTs remain. freeAvailable(wallet) gives the number this wallet can claim now. - Paid: any wallet (no Agent ID needed). Paid sales are open from the start, together with free claims. PAID_PER_WALLET = 10. - Wallet limit: MAX_PER_WALLET = 11 NFTs in total (1 free + 10 paid), counted by mintedBy(wallet) (lifetime mints, not current holdings). MAX_PER_TX = 10 per call. - remainingQuota(wallet): how many NFTs this wallet can still mint now in total (free + paid); one call mints at most MAX_PER_TX = 10. - Smart-contract wallets can mint; a contract recipient must implement onERC721Received. ## Functions All mint functions are payable. The required value is quote(...).valueWei; anything above it is returned to the sender in the same transaction. Sending less reverts with Underpaid(required, sent). Limits never trim a quantity: a call that does not fit reverts. | Function | What it does | value | |---|---|---| | mint() | 1 NFT: free if the caller has free allowance, else paid | 0 if freeAvailable ≥ 1, else PRICE | | mint(uint256 qty) | qty NFTs: the caller's free allowance first, the rest paid | (qty − free part) × PRICE | | mint(address referrer) | as mint(), with a referrer | as mint() | | mint(uint256 qty, address referrer) | as mint(qty), with a referrer | as mint(qty) | | freeMint(), mintFree(), claimFree(), freeMint(uint256 qty) | free only | must be 0 | | mintPaid(uint256 qty), publicMint(uint256 qty), publicMint() | paid only (free allowance not used) | qty × PRICE | | mintTo(address recipient, uint256 qty) | paid NFTs for another address (set your own recipient; the recipient's limits apply) | qty × PRICE | | withdraw() | sends collected payments to PAYEE; anyone can call it after the sale ends | 0 | - mint(address referrer) and mint(qty, referrer): same as mint() / mint(qty); REFERRAL_BPS() is 0, so the referrer argument has no effect (Minted.referrer is 0x0) and claimReferral() has nothing to pay. - Sending PRICE × qty to mint(qty) always covers the price: if part is free, that part is refunded to the sender in the same transaction (a contract sender must be able to receive BNB; otherwise send quote().valueWei). ## quote `quote(address wallet, uint256 qty)` returns `(uint256 freeUnits, uint256 paidUnits, uint256 valueWei, bool ok, string reason)` for mint(qty) sent by `wallet`. `quoteMint(address wallet, uint256 qty, uint8 mode)` does the same for mode 0 = mint, 1 = paid entries and mintTo (pass the recipient), 2 = free entries. `costOf(wallet, qty)` returns valueWei and reverts when the mint would fail. `canMintFor(wallet, qty, mode)` returns (ok, reason). reason is one of: OK, BAD_MODE, BAD_QUANTITY (qty 0), TX_LIMIT (qty above MAX_PER_TX), SALE_NOT_STARTED, SALE_ENDED, FREE_CLOSED, NO_AGENT_ID, FREE_EXHAUSTED (free allowance or free supply used up), PAID_SUPPLY_EXHAUSTED, WALLET_LIMIT, SOLD_OUT. When ok is false, the three numbers are 0. State can change between a quote and your transaction, so simulate the exact transaction (eth_call with your from, data and value) before sending. ## Reads PRICE(), price(), mintPrice(), cost(), MAX_SUPPLY(), maxSupply(), totalMinted(), totalSupply(), remainingSupply(), FREE_SUPPLY(), paidSupply(), freeMinted(), paidMinted(), freeRemaining(), FREE_PER_WALLET(), PAID_PER_WALLET(), MAX_PER_WALLET(), maxPerWallet(), MAX_PER_TX(), maxPerTx(), mintedBy(address), freeMintedBy(address), paidMintedBy(address), freeAvailable(address), paidAvailable(address), remainingQuota(address), hasAgentId(address), mintOpen(), saleOpen(), isFreeOpen(), isPaidOpen(), saleStart(), saleEnd(), saleClosed(), owner(), PAYEE(), agentIdRegistry(), raisedWei(), withdrawable(), tokenURI(uint256), contractURI(), isPaidEdition(uint256). ## After a successful mint(qty) - balanceOf(you) and mintedBy(you) are up by qty; totalMinted is up by qty. - qty Transfer events and one Minted(payer, recipient, quantity, freeUnits, paidUnits, costWei, referrer) event. - BNB spent: valueWei plus gas (about 0.1–0.25M gas for a one-NFT call; more for larger quantities). - Free editions are silver coins; paid editions are gold. ## Selectors mint() 0x1249c58b · mint(uint256) 0xa0712d68 · mint(address) 0x6a627842 · mint(uint256,address) 0x94bf804d · mintPaid(uint256) 0x26c7f77c · publicMint() 0x26092b83 · publicMint(uint256) 0x2db11544 · freeMint() 0x5b70ea9f · freeMint(uint256) 0x7c928fe9 · mintFree() 0x8ab53447 · claimFree() 0xf366afc9 · mintTo(address,uint256) 0x449a52f8 · quote(address,uint256) 0x8f79306e · PRICE() 0x8d859f3e · remainingQuota(address) 0xd872e413