{
  "name": "Stampooor Pass",
  "symbol": "STPASS",
  "officialWebsite": "https://stampooor.com",
  "officialWebsiteNote": "Same address as external_url in every tokenURI.",
  "description": "Mint on-chain stamps, reveal their tier, and claim POSTAGE.",
  "chainId": 56,
  "files": {
    "llms": "llms.txt",
    "skill": "skill.md",
    "agent": "agent.json",
    "wellKnownAgent": ".well-known/agent.json",
    "page": "index.html"
  },
  "pass": "0xCFB72b0E311796C478c6b74C1cd4592BbAa17aab",
  "token": "0x6C310EABEdFD4eEd6148bf2C07241FB45a52FB42",
  "payee": "0xD48Bcb88F43701C47dFDF3955da0A943d3B7860d",
  "payeeNote": "PAYEE is a fixed address set at deployment",
  "mintEndUnixSeconds": "1794621650",
  "deployBlock": "132500907",
  "registry": "0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F",
  "registryInterface": [
    "balanceOf(address) returns (uint256)",
    "handleOf(address) returns (string)"
  ],
  "sale": {
    "maxSupplyPasses": 5555,
    "priceWei": "1000000000000000",
    "priceBnb": "0.001",
    "freeSupply": 1111,
    "freePerWalletAndHandle": 1,
    "freeSupplyNote": "The first 1,111 free passes (FREE_SUPPLY) go to Agent ID wallets: each wallet can take one free pass (FREE_PER_WALLET = 1), once per wallet and once per handle, while they last. freeMinted() and FREE_SUPPLY() show the progress. Once freeMinted() equals FREE_SUPPLY, quote() returns freeUnits=0 and every pass costs PRICE.",
    "lifetimeMintsPerWallet": 15,
    "freeMintsPerEligibleWallet": 1,
    "durationDaysRange": [
      3,
      14
    ],
    "endsAt": "mintEnd or sold out, whichever comes first",
    "finality": "Mints are final"
  },
  "units": {
    "note": "Fields ending in Tokens are whole POSTAGE. Fields ending in Wei are integers scaled by 10^18 for POSTAGE (the unit the contract views return) or BNB wei for priceWei and valueWei.",
    "tokenDecimals": 18,
    "viewReturnUnits": {
      "PRICE()": "BNB wei",
      "price()": "BNB wei",
      "FREE_SUPPLY()": "passes",
      "FREE_PER_WALLET()": "passes",
      "freeMinted()": "passes",
      "BONUS_PER_MINT()": "POSTAGE wei (18 decimals)",
      "REF_PER_PAID()": "POSTAGE wei (18 decimals)",
      "HOLDER_RESERVE()": "POSTAGE wei (18 decimals)",
      "BONUS_RESERVE()": "POSTAGE wei (18 decimals)",
      "REF_RESERVE()": "POSTAGE wei (18 decimals)",
      "PAYEE_SUPPLY()": "POSTAGE wei (18 decimals)",
      "rewardOf(uint256)": "POSTAGE wei (18 decimals)",
      "tierReward(uint256)": "POSTAGE wei (18 decimals)",
      "claimable(uint256[])": "POSTAGE wei (18 decimals)",
      "quote(address,uint256).valueWei": "BNB wei",
      "totalMinted()": "passes",
      "mintEnd()": "Unix seconds"
    }
  },
  "postage": {
    "totalSupplyAtDeploymentTokens": "1000000000",
    "totalSupplyAtDeploymentWei": "1000000000000000000000000000",
    "mintBonusPerPassTokens": "10000",
    "mintBonusPerPassWei": "10000000000000000000000",
    "referralPerPaidPassTokens": "5000",
    "referralPerPaidPassWei": "5000000000000000000000",
    "holderReserveTokens": "582700000",
    "holderReserveWei": "582700000000000000000000000",
    "mintBonusReserveTokens": "55550000",
    "mintBonusReserveWei": "55550000000000000000000000",
    "referralReserveTokens": "20000000",
    "referralReserveWei": "20000000000000000000000000"
  },
  "payeeAllocation": {
    "amountTokens": "341750000",
    "amountWei": "341750000000000000000000000",
    "percentOfDeploymentSupply": "34.175",
    "description": "341,750,000 POSTAGE (34.175%) at deployment to PAYEE, for liquidity and treasury"
  },
  "burns": {
    "releaseUnminted": "After reveal, anyone, once: burns the POSTAGE of ids that were never minted. Total supply decreases. Nothing goes to PAYEE.",
    "releaseLeftover": "After the sale ends, anyone, once: burns the unused mint-bonus and referral reserves. Total supply decreases. Nothing goes to PAYEE.",
    "payeeHoldsFromDeployment": "341,750,000 POSTAGE (34.175%) at deployment to PAYEE, for liquidity and treasury"
  },
  "tiers": [
    {
      "tierIndex": 0,
      "name": "Inverted",
      "idsInTier": 8,
      "claimPostageTokens": "1000000",
      "claimPostageWei": "1000000000000000000000000"
    },
    {
      "tierIndex": 1,
      "name": "Airmail",
      "idsInTier": 25,
      "claimPostageTokens": "500000",
      "claimPostageWei": "500000000000000000000000"
    },
    {
      "tierIndex": 2,
      "name": "Registered",
      "idsInTier": 150,
      "claimPostageTokens": "250000",
      "claimPostageWei": "250000000000000000000000"
    },
    {
      "tierIndex": 3,
      "name": "Express",
      "idsInTier": 1000,
      "claimPostageTokens": "150000",
      "claimPostageWei": "150000000000000000000000"
    },
    {
      "tierIndex": 4,
      "name": "First Class",
      "idsInTier": 1872,
      "claimPostageTokens": "100000",
      "claimPostageWei": "100000000000000000000000"
    },
    {
      "tierIndex": 5,
      "name": "Postcard",
      "idsInTier": 2500,
      "claimPostageTokens": "75000",
      "claimPostageWei": "75000000000000000000000"
    }
  ],
  "tierMapping": "tierOf(id) returns a uint8: 0 Inverted, 1 Airmail, 2 Registered, 3 Express, 4 First Class, 5 Postcard. Counts apply to all 5,555 ids.",
  "eligibility": "One free pass per Agent ID wallet (FREE_PER_WALLET = 1), while the first 1,111 free passes last (FREE_SUPPLY): freeMinted() below FREE_SUPPLY, registry balanceOf(wallet) above 0, wallet free pass unused, and (when handleOf(wallet) returns a non-empty string) handle free pass unused. A wallet that bought paid passes earlier can still take its free pass, until it reaches the 15-mint wallet limit. If handleOf fails or is empty, the wallet check alone applies. freeAvailable(wallet) returns 0 or 1 with all checks included, and returns 0 after the sale closes. Once freeMinted() equals FREE_SUPPLY, freeAvailable() returns 0 and quote() returns freeUnits=0. Any wallet, including smart-contract wallets, can pay for passes.",
  "quote": {
    "signature": "quote(address,uint256)",
    "returns": [
      "uint256 freeUnits",
      "uint256 paidUnits",
      "uint256 valueWei",
      "bool ok",
      "string reason"
    ],
    "reasons": [
      "OK",
      "QTY_ZERO",
      "REVEALED",
      "CLOSED",
      "SOLD_OUT",
      "EXCEEDS_SUPPLY",
      "WALLET_CAP"
    ],
    "overLimit": "A quantity above a limit returns ok=false; it is never trimmed.",
    "exampleReturnHex": "0x0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000071afd498d0000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000024f4b000000000000000000000000000000000000000000000000000000000000",
    "exampleReturnDecoded": {
      "freeUnits": 1,
      "paidUnits": 2,
      "valueWei": "2000000000000000",
      "ok": true,
      "reason": "OK"
    },
    "freeExhausted": "When freeMinted() equals FREE_SUPPLY (1,111), quote returns freeUnits=0, paidUnits=qty and valueWei=qty x PRICE for every wallet."
  },
  "payment": "msg.value must be at least paidUnits x PRICE (quote().valueWei). Any excess is refunded to the caller in the same transaction, so unit price x qty also succeeds. Recommended value: quote().valueWei. Network gas is separate. A smart-contract wallet that overpays must be able to receive the refund. A value above 0 and below the required value reverts with WrongValue; a value of 0 is the free claim.",
  "freeClaim": "Call mint() or mint(qty) with value 0. You get freeAvailable(wallet) passes, which is 0 or 1 (FREE_PER_WALLET). If qty is larger than that, the call mints only the free pass and does not revert. With value 0 and freeAvailable(wallet) equal to 0, the call reverts with WrongValue. mint(qty,referrer) with value 0 behaves the same way, and a free pass earns no referral reward.",
  "paidClaim": "Send value = quote(wallet, qty).valueWei, or PRICE x qty (the excess is refunded). A call with a value above 0 mints exactly qty passes. quote(wallet, qty) describes this paid path; it is not a preview of a value-0 call, so read freeAvailable(wallet) for that.",
  "afterMint": {
    "passBalanceChange": "+qty",
    "mintedByChange": "+qty",
    "totalMintedChange": "+qty",
    "postageBalanceChangeTokens": "+10000 x qty",
    "afterValueZeroCall": "After a value-0 call, read qty as the number of passes actually minted (the free pass, at most 1); the Minted event shows it.",
    "gas": "Gas grows with qty.",
    "transferEvents": "Every minted pass emits one ERC-721 Transfer(address(0), minter, tokenId) event, for free, paid and batch mints alike: qty passes emit qty Transfer events plus one Minted event.",
    "event": "Minted(address indexed minter,uint256 firstId,uint256 qty,uint256 freeUnits,uint256 paidUnits,uint256 valuePaid); new ids are firstId to firstId+qty-1"
  },
  "referral": "mint(qty,referrer) sends 5000 POSTAGE per paid pass to the referrer in the same transaction when the referrer is nonzero, is not the minter, has minted before (mintedBy above 0), the mint has at least one paid pass, and the referral reserve is not used up. Otherwise the mint goes through without a referral and does not revert. If the reserve holds less than the reward, the remainder is paid.",
  "reveal": {
    "who": "Any address, once the sale has ended (mintEnd passed or sold out).",
    "call1": "reveal() records revealBlock = block.number + 5.",
    "call2": "reveal() finishes when revealBlock < block.number <= revealBlock + 8000.",
    "tooEarly": "A call at or before revealBlock reverts with RevealTooEarly.",
    "windowExpired": "After revealBlock + 8000 the next reveal() call records a new revealBlock (RevealCommitted); then call again to finish.",
    "delayBlocks": 5,
    "windowBlocks": 8000,
    "blockTimeSecondsApprox": 0.45,
    "windowSecondsApprox": 3600,
    "randomness": "startingIndex = keccak256(blockhash(revealBlock), contract address) mod 5555; the hash is read with BLOCKHASH, or for blocks older than 256 from the EIP-2935 history contract 0x0000F90827F1C53a10cb7A02335B175320002935; if the history contract has no code or answers 0, the call records a new revealBlock instead; if the history call fails or answers in a wrong format, reveal() reverts with HashReadFailed and nothing changes",
    "tierPosition": "pos = (2357 x (id - 1) + startingIndex) mod 5555; pos 0-7 Inverted, 8-32 Airmail, 33-182 Registered, 183-1182 Express, 1183-3054 First Class, 3055-5554 Postcard"
  },
  "claim": {
    "rule": "claim(uint256[] ids): 1 to 100 ids; each id must be minted, held by the caller and not yet claimed, otherwise the whole batch reverts. POSTAGE goes to the caller, the holder. One claim per id, no deadline.",
    "claimable": "claimable(uint256[]) returns one uint256 (POSTAGE wei) for the minted, unclaimed ids in the list; ownership is not checked; 0 before reveal.",
    "listIds": "ownedIds(owner,startId,count) with count at most 1000: call with startId 1, 1001, 2001, 3001, 4001, 5001 (up to totalMinted)."
  },
  "calldataExamples": [
    {
      "call": "mint()",
      "calldata": "0x1249c58b",
      "value": "same as mint(1): quote(wallet, 1).valueWei, which is 0 when freeAvailable(wallet) is 1, otherwise 1000000000000000 wei; a call with value 0 takes the free pass when freeAvailable(wallet) is 1"
    },
    {
      "call": "mint(1)",
      "calldata": "0xa0712d680000000000000000000000000000000000000000000000000000000000000001",
      "value": "quote().valueWei: 0 when freeAvailable(wallet) is 1, otherwise 1000000000000000 wei"
    },
    {
      "call": "mint(3)",
      "calldata": "0xa0712d680000000000000000000000000000000000000000000000000000000000000003",
      "value": "quote().valueWei: 2000000000000000 wei when freeAvailable(wallet) is 1 (2 paid), 3000000000000000 wei without; a value-0 mint(3) from such a wallet mints only its 1 free pass"
    },
    {
      "call": "mint(3, 0x1111111111111111111111111111111111111111)",
      "calldata": "0x94bf804d00000000000000000000000000000000000000000000000000000000000000030000000000000000000000001111111111111111111111111111111111111111",
      "value": "same value as mint(3); the referrer is 0x1111111111111111111111111111111111111111 (example address)"
    },
    {
      "call": "quote(0x2222222222222222222222222222222222222222, 1)",
      "calldata": "0x8f79306e00000000000000000000000022222222222222222222222222222222222222220000000000000000000000000000000000000000000000000000000000000001",
      "value": "eth_call, no value; the wallet is 0x2222222222222222222222222222222222222222 (example address)"
    },
    {
      "call": "claim([5,9])",
      "calldata": "0x6ba4c1380000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000009",
      "value": "no value"
    }
  ],
  "functions": [
    {
      "signature": "mint()",
      "selector": "0x1249c58b",
      "mutability": "payable",
      "returns": "()",
      "note": "payable; same as mint(1); value 0 takes the free pass when freeAvailable(wallet) is 1, otherwise send value = quote(wallet, 1).valueWei (a larger value is refunded)"
    },
    {
      "signature": "mint(uint256)",
      "selector": "0xa0712d68",
      "mutability": "payable",
      "returns": "()",
      "note": "payable; send value = quote().valueWei (a larger value is refunded); value 0 mints only the free pass, or reverts with WrongValue when freeAvailable(wallet) is 0"
    },
    {
      "signature": "mint(uint256,address)",
      "selector": "0x94bf804d",
      "mutability": "payable",
      "returns": "()",
      "note": "payable; second argument is the referrer"
    },
    {
      "signature": "quote(address,uint256)",
      "selector": "0x8f79306e",
      "mutability": "view",
      "returns": "(uint256 freeUnits,uint256 paidUnits,uint256 valueWei,bool ok,string reason)",
      "note": "valueWei is BNB wei; reason is one of the codes listed above"
    },
    {
      "signature": "freeAvailable(address)",
      "selector": "0x9a5f5d31",
      "mutability": "view",
      "returns": "uint256",
      "note": "0 or 1 free pass in the wallet's next mint (Agent ID, wallet, handle, free-supply and wallet-cap checked); returns 0 after the sale closes"
    },
    {
      "signature": "mintedBy(address)",
      "selector": "0x3cef28d2",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes minted by the wallet, lifetime, free included"
    },
    {
      "signature": "mintOpen()",
      "selector": "0x24bbd049",
      "mutability": "view",
      "returns": "bool",
      "note": "true while the sale is open"
    },
    {
      "signature": "soldOut()",
      "selector": "0x893da6c9",
      "mutability": "view",
      "returns": "bool",
      "note": "true when totalMinted has reached the cap"
    },
    {
      "signature": "totalMinted()",
      "selector": "0xa2309ff8",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes"
    },
    {
      "signature": "totalSupply()",
      "selector": "0x18160ddd",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes (equals totalMinted)"
    },
    {
      "signature": "freeMinted()",
      "selector": "0xd10a1a2b",
      "mutability": "view",
      "returns": "uint256",
      "note": "free passes minted so far; at most FREE_SUPPLY()"
    },
    {
      "signature": "FREE_SUPPLY()",
      "selector": "0x9858cf19",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes: the most free passes in total (1,111)"
    },
    {
      "signature": "FREE_PER_WALLET()",
      "selector": "0xcd90e5af",
      "mutability": "view",
      "returns": "uint256",
      "note": "free passes one wallet (and one handle) can take (1)"
    },
    {
      "signature": "paidMinted()",
      "selector": "0x2806b8fb",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes"
    },
    {
      "signature": "mintStart()",
      "selector": "0x255e4685",
      "mutability": "view",
      "returns": "uint256",
      "note": "Unix seconds"
    },
    {
      "signature": "mintEnd()",
      "selector": "0xea2b4ab2",
      "mutability": "view",
      "returns": "uint256",
      "note": "Unix seconds"
    },
    {
      "signature": "MAX_SUPPLY()",
      "selector": "0x32cb6b0c",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes"
    },
    {
      "signature": "PRICE()",
      "selector": "0x8d859f3e",
      "mutability": "view",
      "returns": "uint256",
      "note": "BNB wei per paid pass"
    },
    {
      "signature": "price()",
      "selector": "0xa035b1fe",
      "mutability": "pure",
      "returns": "uint256",
      "note": "BNB wei per paid pass; the same value as PRICE()"
    },
    {
      "signature": "MAX_PER_WALLET()",
      "selector": "0x0f2cdd6c",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes, lifetime, free included"
    },
    {
      "signature": "reveal()",
      "selector": "0xa475b5dd",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "two calls; see Reveal"
    },
    {
      "signature": "revealBlock()",
      "selector": "0x66bb81c7",
      "mutability": "view",
      "returns": "uint256",
      "note": "block number; 0 before the first reveal() call"
    },
    {
      "signature": "revealed()",
      "selector": "0x51830227",
      "mutability": "view",
      "returns": "bool",
      "note": "true once the reveal is finished"
    },
    {
      "signature": "startingIndex()",
      "selector": "0xcb774d47",
      "mutability": "view",
      "returns": "uint256",
      "note": "set at reveal; 0 to 5554"
    },
    {
      "signature": "mintedAtReveal()",
      "selector": "0x7141375e",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes minted when the reveal finished"
    },
    {
      "signature": "REVEAL_DELAY()",
      "selector": "0xa7bc4e30",
      "mutability": "view",
      "returns": "uint256",
      "note": "blocks (5)"
    },
    {
      "signature": "REVEAL_WINDOW()",
      "selector": "0x17e931cf",
      "mutability": "view",
      "returns": "uint256",
      "note": "blocks (8000)"
    },
    {
      "signature": "HISTORY_STORAGE()",
      "selector": "0x72cb2273",
      "mutability": "view",
      "returns": "address",
      "note": "EIP-2935 block-hash history contract"
    },
    {
      "signature": "STRIDE()",
      "selector": "0x41cd8781",
      "mutability": "view",
      "returns": "uint256",
      "note": "tier permutation step (2357)"
    },
    {
      "signature": "TIERS()",
      "selector": "0x6e748f97",
      "mutability": "view",
      "returns": "uint256",
      "note": "number of tiers (6)"
    },
    {
      "signature": "tierOf(uint256)",
      "selector": "0x53f96df2",
      "mutability": "view",
      "returns": "uint8",
      "note": "tier index 0 to 5; reverts NotRevealed before reveal, BadId for 0 or above 5555"
    },
    {
      "signature": "rewardOf(uint256)",
      "selector": "0xdaa3770c",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale) per pass; reverts like tierOf"
    },
    {
      "signature": "tierName(uint256)",
      "selector": "0xddd641b0",
      "mutability": "pure",
      "returns": "string",
      "note": "name for a tier index"
    },
    {
      "signature": "tierCount(uint256)",
      "selector": "0x48380a10",
      "mutability": "pure",
      "returns": "uint256",
      "note": "ids in the tier, out of 5,555"
    },
    {
      "signature": "tierReward(uint256)",
      "selector": "0xedcfa519",
      "mutability": "pure",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale) per pass"
    },
    {
      "signature": "claimable(uint256[])",
      "selector": "0xf53bd669",
      "mutability": "view",
      "returns": "uint256 total",
      "note": "POSTAGE, 18-decimal integer (wei scale), total; 0 before reveal; ownership is not checked"
    },
    {
      "signature": "claim(uint256[])",
      "selector": "0x6ba4c138",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "1 to 100 ids; the caller must hold every id; POSTAGE goes to the caller"
    },
    {
      "signature": "claimed(uint256)",
      "selector": "0xdbe7e3bd",
      "mutability": "view",
      "returns": "bool",
      "note": "true once the id has been claimed"
    },
    {
      "signature": "claimedAmount()",
      "selector": "0x9668ceb8",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale), claimed in total"
    },
    {
      "signature": "ownedIds(address,uint256,uint256)",
      "selector": "0xbf598e1e",
      "mutability": "view",
      "returns": "uint256[] ids",
      "note": "ids in [startId, startId+count) held now by the owner; count at most 1000"
    },
    {
      "signature": "MAX_CLAIM_BATCH()",
      "selector": "0x00082645",
      "mutability": "view",
      "returns": "uint256",
      "note": "ids per claim (100)"
    },
    {
      "signature": "MAX_OWNED_SCAN()",
      "selector": "0x016553c2",
      "mutability": "view",
      "returns": "uint256",
      "note": "ids per ownedIds call (1000)"
    },
    {
      "signature": "releaseUnminted()",
      "selector": "0xf7d7df1e",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "after reveal, once, anyone: burns the POSTAGE of ids that were never minted"
    },
    {
      "signature": "releaseLeftover()",
      "selector": "0xb59d4516",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "after the sale ends, once, anyone: burns the unused mint-bonus and referral reserves"
    },
    {
      "signature": "unmintedBurned()",
      "selector": "0x5d7df935",
      "mutability": "view",
      "returns": "bool",
      "note": "true once releaseUnminted has run"
    },
    {
      "signature": "leftoverBurned()",
      "selector": "0xe85ce742",
      "mutability": "view",
      "returns": "bool",
      "note": "true once releaseLeftover has run"
    },
    {
      "signature": "withdraw()",
      "selector": "0x3ccfd60b",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "anyone can call; sends the contract's BNB to PAYEE"
    },
    {
      "signature": "BONUS_PER_MINT()",
      "selector": "0xbef8e8aa",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale) per minted pass"
    },
    {
      "signature": "REF_PER_PAID()",
      "selector": "0xabd9d9d8",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale) per paid pass"
    },
    {
      "signature": "HOLDER_RESERVE()",
      "selector": "0xf5228741",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale)"
    },
    {
      "signature": "BONUS_RESERVE()",
      "selector": "0xed8780e6",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale)"
    },
    {
      "signature": "REF_RESERVE()",
      "selector": "0x44c59173",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale)"
    },
    {
      "signature": "PAYEE_SUPPLY()",
      "selector": "0x1b45db9c",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale), sent to PAYEE at deployment"
    },
    {
      "signature": "bonusRemaining()",
      "selector": "0x982a96e3",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale), mint bonus still unspent"
    },
    {
      "signature": "refRemaining()",
      "selector": "0x6954343b",
      "mutability": "view",
      "returns": "uint256",
      "note": "POSTAGE, 18-decimal integer (wei scale), referral reserve still unspent"
    },
    {
      "signature": "PAYEE()",
      "selector": "0x7e306053",
      "mutability": "view",
      "returns": "address",
      "note": "address"
    },
    {
      "signature": "TOKEN()",
      "selector": "0x82bfefc8",
      "mutability": "view",
      "returns": "address",
      "note": "POSTAGE address"
    },
    {
      "signature": "AGENT_ID_REGISTRY()",
      "selector": "0x841b6ccc",
      "mutability": "view",
      "returns": "address",
      "note": "address"
    },
    {
      "signature": "owner()",
      "selector": "0x8da5cb5b",
      "mutability": "pure",
      "returns": "address",
      "note": "always the zero address: the contract has no owner"
    },
    {
      "signature": "freeUsed(address)",
      "selector": "0x2626c4bf",
      "mutability": "view",
      "returns": "bool",
      "note": "true once the wallet's free pass is used"
    },
    {
      "signature": "freeUsedByHandle(bytes32)",
      "selector": "0x28008a0c",
      "mutability": "view",
      "returns": "bool",
      "note": "keccak256 of the registry handle"
    },
    {
      "signature": "name()",
      "selector": "0x06fdde03",
      "mutability": "view",
      "returns": "string",
      "note": "Stampooor Pass"
    },
    {
      "signature": "symbol()",
      "selector": "0x95d89b41",
      "mutability": "view",
      "returns": "string",
      "note": "STPASS"
    },
    {
      "signature": "balanceOf(address)",
      "selector": "0x70a08231",
      "mutability": "view",
      "returns": "uint256",
      "note": "passes held now"
    },
    {
      "signature": "ownerOf(uint256)",
      "selector": "0x6352211e",
      "mutability": "view",
      "returns": "address",
      "note": "reverts for an id that is not minted"
    },
    {
      "signature": "tokenURI(uint256)",
      "selector": "0xc87b56dd",
      "mutability": "view",
      "returns": "string",
      "note": "on-chain base64 JSON with an SVG image"
    },
    {
      "signature": "supportsInterface(bytes4)",
      "selector": "0x01ffc9a7",
      "mutability": "view",
      "returns": "bool",
      "note": "ERC-165"
    },
    {
      "signature": "approve(address,uint256)",
      "selector": "0x095ea7b3",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "standard"
    },
    {
      "signature": "getApproved(uint256)",
      "selector": "0x081812fc",
      "mutability": "view",
      "returns": "address",
      "note": "standard"
    },
    {
      "signature": "isApprovedForAll(address,address)",
      "selector": "0xe985e9c5",
      "mutability": "view",
      "returns": "bool",
      "note": "standard"
    },
    {
      "signature": "setApprovalForAll(address,bool)",
      "selector": "0xa22cb465",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "standard"
    },
    {
      "signature": "transferFrom(address,address,uint256)",
      "selector": "0x23b872dd",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "standard"
    },
    {
      "signature": "safeTransferFrom(address,address,uint256)",
      "selector": "0x42842e0e",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "standard"
    },
    {
      "signature": "safeTransferFrom(address,address,uint256,bytes)",
      "selector": "0xb88d4fde",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "standard"
    }
  ],
  "tokenFunctions": [
    {
      "signature": "name()",
      "selector": "0x06fdde03",
      "mutability": "view",
      "returns": "string",
      "note": "Stampooor Postage"
    },
    {
      "signature": "symbol()",
      "selector": "0x95d89b41",
      "mutability": "view",
      "returns": "string",
      "note": "POSTAGE"
    },
    {
      "signature": "decimals()",
      "selector": "0x313ce567",
      "mutability": "view",
      "returns": "uint8",
      "note": "18"
    },
    {
      "signature": "totalSupply()",
      "selector": "0x18160ddd",
      "mutability": "view",
      "returns": "uint256",
      "note": "1,000,000,000 x 10^18 at deployment; decreases when POSTAGE is burned"
    },
    {
      "signature": "MAX_SUPPLY()",
      "selector": "0x32cb6b0c",
      "mutability": "view",
      "returns": "uint256",
      "note": "the deployment supply, 1,000,000,000 x 10^18"
    },
    {
      "signature": "balanceOf(address)",
      "selector": "0x70a08231",
      "mutability": "view",
      "returns": "uint256",
      "note": "wei scale"
    },
    {
      "signature": "allowance(address,address)",
      "selector": "0xdd62ed3e",
      "mutability": "view",
      "returns": "uint256",
      "note": "standard"
    },
    {
      "signature": "transfer(address,uint256)",
      "selector": "0xa9059cbb",
      "mutability": "nonpayable",
      "returns": "bool",
      "note": "standard"
    },
    {
      "signature": "approve(address,uint256)",
      "selector": "0x095ea7b3",
      "mutability": "nonpayable",
      "returns": "bool",
      "note": "standard"
    },
    {
      "signature": "transferFrom(address,address,uint256)",
      "selector": "0x23b872dd",
      "mutability": "nonpayable",
      "returns": "bool",
      "note": "standard"
    },
    {
      "signature": "burn(uint256)",
      "selector": "0x42966c68",
      "mutability": "nonpayable",
      "returns": "()",
      "note": "destroys the caller's own POSTAGE; total supply decreases"
    }
  ],
  "events": [
    {
      "signature": "Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)",
      "topic0": "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
      "note": "ERC-721"
    },
    {
      "signature": "ApprovalForAll(address indexed owner, address indexed operator, bool approved)",
      "topic0": "0x17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31",
      "note": "ERC-721"
    },
    {
      "signature": "Claimed(address indexed owner, uint256 indexed tokenId, uint256 amount)",
      "topic0": "0x987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a",
      "note": "amount is POSTAGE wei"
    },
    {
      "signature": "LeftoverBurned(uint256 amount)",
      "topic0": "0xfb08b47cfd605f6210fabb724266f1a7a9ecb70276f12753802256f5324ff883",
      "note": "POSTAGE wei burned"
    },
    {
      "signature": "Minted(address indexed minter, uint256 firstId, uint256 qty, uint256 freeUnits, uint256 paidUnits, uint256 valuePaid)",
      "topic0": "0x9045b28c8427bc83571801c0916c82f9ec27d9233ce8c25ac55e60cdf1ba3008",
      "note": "valuePaid is the BNB kept for paid passes (refunds excluded); ids are firstId to firstId+qty-1"
    },
    {
      "signature": "Referred(address indexed referrer, address indexed minter, uint256 paidUnits, uint256 amount)",
      "topic0": "0x37ad3f0dfd230f119d4a647760b82837e0a6bdd1e154b75990f170f3567196dc",
      "note": "amount is POSTAGE wei sent to the referrer"
    },
    {
      "signature": "RevealCommitted(uint256 revealBlock)",
      "topic0": "0xf1f26af95d1e8cc525acaeb28483a05a915ddfd514713d30cf50744887c154c4",
      "note": "first reveal() call, or a restart after the window"
    },
    {
      "signature": "Revealed(uint256 startingIndex)",
      "topic0": "0x15120e52505e619cbf6c2af910d5cf7f9ee1befa55801b078c33e93880b2d609",
      "note": "reveal finished"
    },
    {
      "signature": "Transfer(address indexed from, address indexed to, uint256 indexed tokenId)",
      "topic0": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
      "note": "ERC-721; emitted once per minted pass as Transfer(address(0), minter, tokenId)"
    },
    {
      "signature": "UnmintedBurned(uint256 amount)",
      "topic0": "0xc126243656db33a57c8fd6816147cfbf5903f48302e5f36ae1d57569646b4b97",
      "note": "POSTAGE wei burned"
    },
    {
      "signature": "Withdrawn(uint256 amount)",
      "topic0": "0x430648de173157e069201c943adb2d4e340e7cf5b27b1b09c9cb852f03d63b56",
      "note": "BNB wei sent to PAYEE"
    },
    {
      "signature": "MetadataUpdate(uint256 _tokenId)",
      "topic0": "0xf8e1a15aba9398e019f0b49df1a4fde98ee17ae345cb5f6b5e2c27f5033e8ce7",
      "note": "EIP-4906: metadata of a pass changed (emitted on claim)"
    },
    {
      "signature": "BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId)",
      "topic0": "0x6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c",
      "note": "EIP-4906: metadata of minted passes changed (emitted on reveal)"
    }
  ],
  "tokenEvents": [
    {
      "signature": "Approval(address indexed owner, address indexed spender, uint256 value)",
      "topic0": "0x8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925",
      "note": "standard"
    },
    {
      "signature": "Transfer(address indexed from, address indexed to, uint256 value)",
      "topic0": "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef",
      "note": "a burn is a Transfer to the zero address"
    }
  ],
  "errors": [
    {
      "signature": "PayeeZero()",
      "selector": "0x600c0b1c",
      "meaning": "constructor: payee is the zero address"
    },
    {
      "signature": "BadDuration()",
      "selector": "0x4d84c2e9",
      "meaning": "constructor: duration outside 3 to 14 days"
    },
    {
      "signature": "QtyZero()",
      "selector": "0xd481977e",
      "meaning": "qty is 0 (quote reason QTY_ZERO)"
    },
    {
      "signature": "Closed()",
      "selector": "0x1cdde67b",
      "meaning": "sale ended (CLOSED)"
    },
    {
      "signature": "RevealStarted()",
      "selector": "0x3bcc93d3",
      "meaning": "reveal has started (REVEALED)"
    },
    {
      "signature": "SoldOut()",
      "selector": "0x52df9fe5",
      "meaning": "all passes minted (SOLD_OUT)"
    },
    {
      "signature": "ExceedsSupply()",
      "selector": "0x2d573a55",
      "meaning": "qty is above the passes left (EXCEEDS_SUPPLY)"
    },
    {
      "signature": "HashReadFailed()",
      "selector": "0x60d773fd",
      "meaning": "reveal(): the EIP-2935 history contract call failed or answered in a wrong format; nothing changes, try again"
    },
    {
      "signature": "WalletCap()",
      "selector": "0x94048683",
      "meaning": "would exceed 15 lifetime mints (WALLET_CAP)"
    },
    {
      "signature": "WrongValue()",
      "selector": "0x98d4901c",
      "meaning": "msg.value below paidUnits x PRICE"
    },
    {
      "signature": "RefundFailed()",
      "selector": "0xf0c49d44",
      "meaning": "the refund of an overpayment could not be delivered to the caller"
    },
    {
      "signature": "RevealLocked()",
      "selector": "0x5b8e912f",
      "meaning": "reveal() or releaseLeftover() before the sale has ended"
    },
    {
      "signature": "AlreadyRevealed()",
      "selector": "0xa89ac151",
      "meaning": "reveal already finished"
    },
    {
      "signature": "RevealTooEarly()",
      "selector": "0xc349402d",
      "meaning": "second reveal() call in a block at or before revealBlock"
    },
    {
      "signature": "NotRevealed()",
      "selector": "0xb2c9bc88",
      "meaning": "needs a finished reveal"
    },
    {
      "signature": "BadId()",
      "selector": "0x08e235ff",
      "meaning": "id is 0, above 5555, or not minted where a minted id is required"
    },
    {
      "signature": "NotOwner()",
      "selector": "0x30cd7471",
      "meaning": "caller does not hold the id"
    },
    {
      "signature": "AlreadyClaimed()",
      "selector": "0x646cf558",
      "meaning": "the id was claimed already (also for a repeated id)"
    },
    {
      "signature": "BadBatch()",
      "selector": "0x86bdc25c",
      "meaning": "ids length is 0 or above 100"
    },
    {
      "signature": "AlreadyReleased()",
      "selector": "0x63b4904e",
      "meaning": "that release already ran"
    },
    {
      "signature": "WithdrawFailed()",
      "selector": "0x750b219c",
      "meaning": "PAYEE did not accept the BNB"
    },
    {
      "signature": "ScanTooLarge()",
      "selector": "0xffce22e4",
      "meaning": "ownedIds count above 1000"
    }
  ],
  "security": [
    "No owner or admin (owner() returns the zero address); no pause function; no price-change function",
    "Contracts are not upgradeable",
    "Pass cap, paid price, free-pass cap (1,111) and POSTAGE deployment supply are fixed in code",
    "POSTAGE has no mint function after its constructor; holders can burn their own POSTAGE",
    "withdraw() sends BNB to PAYEE only; PAYEE is a fixed address set at deployment",
    "tokenURI is generated fully on-chain"
  ],
  "verification": {
    "pass_bscscan": "https://bscscan.com/address/0xCFB72b0E311796C478c6b74C1cd4592BbAa17aab#code",
    "token_bscscan": "https://bscscan.com/address/0x6C310EABEdFD4eEd6148bf2C07241FB45a52FB42#code",
    "pass_sourcify": "https://repo.sourcify.dev/contracts/full_match/56/0xCFB72b0E311796C478c6b74C1cd4592BbAa17aab/",
    "token_sourcify": "https://repo.sourcify.dev/contracts/full_match/56/0x6C310EABEdFD4eEd6148bf2C07241FB45a52FB42/"
  },
  "transactionPolicy": "Verify the deployed source and bytecode, the chain, the destination, the quote and the exact native value; simulate or preview; confirm there are no approve or authorization changes; follow your wallet's transaction policy before submitting."
}
