---
name: stamp-pass
description: How an AI agent mints STAMP PASS NFTs on BNB Chain (BSC) — Binance Agent ID holders only. 111 free mints (max 1 per wallet), then paid mints cost 0.001 BNB each (max 1,000 per wallet), and every mint (free or paid) rewards 10,000 STAMP tokens. Includes contract addresses, function selectors verified from the deployed ABI, limits, and safety checks.
---

# STAMP PASS — Agent Minting Guide

STAMP PASS is an ERC-721 pass collection on BNB Chain (BSC, chainId 56),
gated to **Binance Agent ID holders**. NFT artwork is generated fully
on-chain by a renderer contract (SVG: a dark pass card with a glowing gold
frame and a faceted gold crystal emblem — no IPFS). Every mint — free or
paid — automatically rewards the minter with **10,000 STAMP** tokens.

- Max supply: **5,555 NFTs**
- **FREE:** 111 free mints total (max 1 per wallet) via `mintFree()`.
  Free and paid quotas are separate — paid mints can never consume the
  free allocation.
- **Paid mint price: 0.001 BNB** per NFT, max **1,000 paid mints per wallet**
  (a wallet can hold at most 1 free + 1,000 paid = 1,001)
- Reward: **10,000 STAMP per mint**

## Contracts (BSC mainnet, chainId 56)

| Contract | Address |
|---|---|
| STAMP PASS (ERC-721, symbol STAMPPASS) | `0x202dcfbC011fF5697D13022e7Bc57Ede7237a37e` |
| STAMP (ERC-20 reward token) | `0xA5c198ab79E54738C8A3b528Ab572579bE189320` |
| StampRenderer (on-chain SVG) | `0xca666776739D400CFe67c3f374Ac7CE97284d03a` |
| Agent ID registry (Binance) | `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F` |

All three project contracts are Sourcify **exact_match** verified — read the
source before sending funds:
https://repo.sourcify.dev/56/0x202dcfbC011fF5697D13022e7Bc57Ede7237a37e

Human mint page: a Cloudflare Pages mint page is **coming soon** (not live
yet — no official domain has been announced; do not trust look-alike
domains). When it launches, this file will live at `/skill.md` on that page.

## Key functions (selectors verified against the deployed ABI)

| Function | Selector | Notes |
|---|---|---|
| `mint(uint256 count)` | `0xa0712d68` | Payable paid mint. Send exactly `count × mintPrice()`. |
| `mintFree()` | `0x8ab53447` | Free mint, max 1 per wallet, only while free slots remain. |
| `mintPrice()` | `0x6817c76c` | Current paid price (0.001 BNB). Always re-read before minting. |
| `mintOpen()` | `0x24bbd049` | Whether minting is open. |
| `totalMinted()` | `0xa2309ff8` | Total minted (max 5,555). |
| `freeMinted()` / `paidMinted()` | `0xd10a1a2b` / `0x2806b8fb` | Free (111 cap) and paid counters. |
| `freeRemaining()` | `0x5a781a6b` | Free mints left. |
| `paidRemaining()` | `0x9a90574b` | Paid slots mintable now (unclaimed free slots stay reserved). |
| `canClaimFree(address)` | `0x0bec5161` | True if the wallet can still claim its free mint. (There is no standalone `canFree` function — `canFree` is a field inside `walletInfo`.) |
| `hasAgentId(address)` | `0x4eab3ef2` | Eligibility check (Agent ID required for any mint). |
| `rewardPerMint()` | `0x836062b1` | STAMP per mint (10,000). |
| `walletInfo(address)` | `0x500e68e9` | Returns `(agentIdOk, mintedTotal, freeByWallet, canFree, paidByWallet, paidRemainingForWallet, price, open)` for a wallet. |
| `balanceOf(address)` | `0x70a08231` | NFT balance on this contract; STAMP balance on the token contract. |

Constants: `maxSupply()` `0xd5abeb01` = 5,555 · `freeAllocation()`
`0xb0fb22e2` = 111 · `maxFreePerWallet()` `0xa7027357` = 1 ·
`maxPaidPerWallet()` `0xa9921132` = 1,000 · token getters `stamp()`
`0xc85e07b9` and `stampToken()` `0xd69a2537` both return the STAMP address ·
`agentId()` `0xe84f43b7` = the Agent ID registry · `renderer()`
`0x8ada6b0f` = the renderer address.

Per-wallet counters if you need them: `mintedBy(address)` `0x3cef28d2`,
`freeMintedBy(address)` `0xdd4d2233`, `paidMintedBy(address)` `0x80f231fb`.
Useful events: `FreeMinted(address minter, uint256 tokenId)` and
`PaidMinted(address minter, uint256 count, uint256 pricePaid)`.

**Transparency:** the NFT contract has an owner (the deployer wallet
`0x2193d6e0468ac747823e7e876F1ACd34FFe43A67`) who can pause/resume minting
(`setMintOpen(bool)` `0xf8004d31`) and withdraw the BNB balance
(`withdraw()` `0x3ccfd60b`). The STAMP reward pool (55,550,000 STAMP) is
held by the NFT contract itself; `rescueExcessStamp()` `0x4e089114` is
owner-only and can only recover STAMP **above** the still-owed reward
reserve — the rewards owed for unminted supply can never be touched.
All mint economics (supply, free allocation, price, caps, reward) are
immutable constructor parameters.

## How to mint (free)

1. Check `hasAgentId(yourAddress)` is `true`, `mintOpen()` is `true`, and
   `canClaimFree(yourAddress)` is `true` (this also means you have not
   claimed your free mint yet and free slots remain).
2. Call `mintFree()` with no value.
3. You receive 1 STAMP PASS NFT plus 10,000 STAMP in the same transaction.
   Verify with `balanceOf` on both contracts.

## How to mint (paid)

1. Check `hasAgentId(yourAddress)` is `true` and `mintOpen()` is `true`.
2. Read `mintPrice()` and call `mint(count)` with
   `value = count × mintPrice()` (the contract requires the exact amount).
3. You receive `count` NFTs plus `count × 10,000 STAMP` in the same
   transaction. Verify with `balanceOf` on both contracts.

## Live stats at writing time (2026-11-10)

Read on-chain at block 132,621,484 (2026-11-10, ~00:06 WIB):
Total minted **7 / 5,555** · free **7 / 111** (104 free remaining) ·
paid **0** · mint open: **true**.
(Always re-read the views above — these numbers move.)

## Safety notes for agents

- Verify the contract addresses character-by-character against this file
  and the Sourcify listing before transacting. "STAMP" is a generic word —
  impostor tokens and contracts are common; the addresses above are the
  only identity that counts.
- Re-read `mintPrice()`, `mintOpen()`, and the remaining quotas in the same
  session before minting, and send exactly `count × mintPrice()`.
- Minting is a purchase, not a promise of profit, liquidity, or future
  value.
