One-liner

666 pixel Agent avatars, with the image and the metadata 100% written into the contract on BNB Chain. Minting has no gate — any wallet on BNB Chain can call mint(). The first 200 are free, one per wallet, and they are soulbound: they can never be transferred or sold. The remaining 466 are paid, transferable, starting at 0.002 BNB and stepping up by 0.0005 BNB every 50 tokens. Passing a referrer address to mint() pays that address 20% of the price.

This project has exactly one source of revenue: the mint fee. No token, no staking, no dividends, no roadmap promises, no referral programme. Buying one is buying a very cheap on-chain pixel image that can never go offline, plus a receipt that you were an early Agent user.

Supply & pricing

Total supply is fixed at 666 and cannot be inflated. There is no team reserve — the constructor mints nothing, so totalSupply() starts at 0 and every single token must be paid for.

The price is a pure function of tokenId:

priceAt(id) = 0  for  id ≤ 200
priceAt(id) = PRICE_START + tier × PRICE_STEP   where   tier = (id − 201) / 50

PRICE_START = 0.002 BNB, PRICE_STEP = 0.0005 BNB, TIER_SIZE = 50, FREE_QUOTA = 200. Two hundred free Founder tokens plus ten paid tiers of 50 plus a 16-token tail make exactly 666 (666 = 200 + 50 × 9 + 16).

TiertokenIdUnit priceQuantitySubtotalFrame
Founder1 – 200FREE2000 BNBsoulbound
Tier 1201 – 2500.002000 BNB500.1000 BNBnone
Tier 2251 – 3000.002500 BNB500.1250 BNBnone
Tier 3301 – 3500.003000 BNB500.1500 BNBnone
Tier 4351 – 4000.003500 BNB500.1750 BNBnone
Tier 5401 – 4500.004000 BNB500.2000 BNBnone
Tier 6451 – 5000.004500 BNB500.2250 BNBnone
Tier 7501 – 5500.005000 BNB500.2500 BNBnone
Tier 8551 – 6000.005500 BNB500.2750 BNBnone
Tier 9601 – 6500.006000 BNB500.3000 BNBnone
Tier 10651 – 6660.006500 BNB160.1040 BNBfinal

A full sell-out corresponds to 3.5964 BNB in total mint volume. There is no price-changing function anywhere in the contract — not "we won't change it", there is simply no such entry point in the code.

Prices are denominated in BNB, so the dollar figure drifts with the BNB price. 0.002 BNB was about 1.4 USD when the contract was written; it is about 2 USD at BNB ≈ $742. No oracle is involved on purpose — fewer moving parts.

Mint rules

Eligibility

There is none. mint() checks the supply counter and nothing else — any address on BNB Chain can call it. Version 3 required holding a .ai Agent ID; that gate was removed in version 4 and cannot be re-added. hasAgentId() still exists in the ABI for compatibility and always returns true.

One restriction does apply, to Founder tokens. Token ids 1–200 can never be transferred: transferFrom, safeTransferFrom and list() all revert with SOULBOUND. Paid tokens (201–666) move freely.

Quantity limits

  • Max 5 per transaction (MAX_PER_TX)
  • Max 5 per address in total (MAX_PER_WALLET)
  • A free Founder token: exactly 1 per wallet, and mint() rejects any free claim with qty ≠ 1
  • 666 tokens therefore need at least 293 distinct wallets to sell out (200 free + 93 paid)

Payment

mint(qty) sums priceAt() over the ids it is about to issue. Sending less reverts with UNDERPAID; sending more is accepted and the excess is refunded in the same transaction. Any extra gas is yours; the contract keeps none of it. A free claim needs msg.value = 0 — you pay gas only.

Switches

The owner can pause minting with setMintOpen(false), but cannot change the price, change the supply, change the free quota, un-soulbound a Founder token, or change the referral rate.

Art & metadata

Traits are read from different bit ranges of keccak256(abi.encodePacked(PROVENANCE, tokenId)): eight dimensions in total:

DimensionValuesCountBit offset
HeadBlock / Rounded / Wide5seed >> 2
EyesSingle / Double / Void / Visor4seed >> 6
MouthLine / Dot / Smile / Silent4seed >> 10
AntennaNone / Stalk / Twin / Ears4seed >> 14
Palette10 bright colors10seed >> 18
Accent10 outline colors10seed >> 22
Glow10 glow colors10seed >> 26
Background4 dark colors4seed % 4

tokenURI() returns base64-encoded JSON, and the image field is a base64-encoded SVG. Both are assembled by the contract on the spot and read no external resource. The attributes order in the JSON is fixed at Tier / Head / Eyes / Mouth / Antenna / Palette / Edition.

This site reproduces the same rendering algorithm in the browser, for the gallery's batch display. The rendered result is byte-for-byte identical to the un-framed part of the SVG in the on-chain tokenURI() output — that is guarded by a contract test case, not by a verbal promise. The frame is added by the contract only (svgOf()), because it depends on the tier.

PROVENANCE is a bytes32 written into the constructor at deployment and cannot be modified afterwards. It guarantees that "the rules were nailed down in advance": anyone can recompute exactly the same image from the same PROVENANCE + tokenId, so the project cannot hold back rare pieces for itself once minting opens. It is not a random number, and there is no reveal stage.

This contract reuses the PROVENANCE of the first version, so a given tokenId draws the same face it always did — the only difference is the frame, which is new.

Secondary market

Market logic lives directly inside the NFT contract: no separate matching contract, and no approval to any third-party marketplace needed.

  • list(tokenId, price) — the holder lists; the price is set by the seller (> 0)
  • cancel(tokenId) — only the lister can cancel
  • buy(tokenId) — fills at the listing price; no gate of any kind

On a fill MARKET_FEE_BPS = 300, i.e. 3% to the treasury, and the seller receives 97% immediately, with no second claim step. If a listed token is moved away by a direct transferFrom, the listing automatically becomes invalid, so "already sold but still fillable" cannot happen.

The contract also declares a 5% royalty through ERC2981 (royaltyInfo). External marketplaces that honour the standard will pay it to the fee recipient; those that ignore ERC2981 will not, and there is nothing the contract can do about that.

Direct transfers between wallets, or just giving one to a friend, cost nothing from the contract.

Why the free tier is soulbound

The first version of this project gave its first 2,000 tokens away free. It lasted one night.

On-chain, the aftermath is unambiguous: 896 tokens went to 87 addresses. Those addresses averaged 177 lifetime transactions each and a balance of 0.027 BNB; 37% of them minted exactly the 5-per-wallet cap and stopped. They were not users. They were airdrop farms running scripts. The tokens were transferable, so the farms could sell them — that was the whole business model.

The second version added a server-side signature so that a free mint required a real X post from the wallet. It worked exactly as designed — the scripts could not get past it. It also revealed the other half of the problem: over the following days, four addresses bothered to complete that flow. The third and fourth versions dropped the free tier entirely; version 4 sold zero in twenty-two hours.

A free tier with transferable tokens buys you scripts. A free tier with soulbound tokens buys you nothing at all — which is exactly the point. There is no arbitrage, so the only people who claim one are people who want the avatar. That is the whole design: give the free tier back, remove the reason to farm it, and let the paid tiers carry the revenue. Version 5 went live and had nine distinct wallets claim Founder tokens within three minutes, one each — no farm pattern.

Contract capability boundary

Spelling out what the owner can and cannot do, so nobody has to guess:

ActionCan owner do itNotes
Pause / resume mintingYessetMintOpen
Change the fee recipientYessetFeeRecipient
Withdraw accrued feesYeswithdraw, any address
Transfer contract ownershipYestransferOwnership
Change the priceNoconstant, no entry point
Change supply / inflateNoMAX_SUPPLY is a constant
Change the tier sizeNoTIER_SIZE is a constant
Re-enable a mint gateNonot in the contract
Change PROVENANCENoimmutable
Touch someone else's tokenNothere is no admin transfer
Change the market fee or royaltyNoconstants, 300 and 500 bps
Get more than one free Founder tokenNo1 per wallet, enforced in the contract
Un-soulbound a Founder tokenNothe check is on the token id, not on a flag

Where the money goes

Mint revenue accrues to the contract and is withdrawn by the owner, in one transaction, to any address. There is no per-transaction splitting and no referral accounting:

  • 100% of mint revenue to the treasury (feeRecipient)
  • 3% of secondary-market fills to the treasury, 97% to the seller immediately
  • 5% declared as an ERC2981 royalty for external marketplaces

None of it flows into a "holder dividend pool" — the reason is in the next section.

Risk & non-promises

What is not promised:

  • No promised floor price, no promised buyback, no promised yield or APR of any kind
  • No promised exchange listings, no promised partners, no promised "ecosystem value"
  • No promise of any future utility. This Pass is what it is now, and that is what it stays

Risks you should accept:

  • The paid tiers may sell very few, or none. The free tier generates wallets, not revenue; the honest base case for paid tokens is single digits
  • The 200 Founder tokens cannot be resold, so they will never appear on the secondary market — that is by design, not a bug
  • Among 666 pixel images of the same kind, a collision is possible (combination space 768,000 — unlikely, but not impossible)
  • Secondary-market liquidity depends entirely on whether anyone bids; the contract provides no market making at all
  • The contract may contain bugs. It has had no third-party audit, only a complete local end-to-end test run (82 assertions, including a full 666-token sell-out)

On "why there is no dividend": we did the math — assume all 1.904 BNB of paid tiers sells out and 100% is distributed to the 666 holders; that is 0.0054 BNB each, a few dollars at the exchange rate when this was written. Bringing reentrancy attack surface and gas cost into the contract for that amount would be trading safety for a gimmick. Not doing it.

Contract info

ItemValue
NetworkBNB Smart Chain (chainId 56)
Contract address0xff5c3878d5577c4178654196e1db4c511d2dfd27
StandardERC-721 + ERC2981 (hand-written, no OpenZeppelin dependency)
Solidity0.8.24
Runtime bytecode22,068 B
PROVENANCE0xf33d1f95ef57b92d213d9bd3c34ac3507d884f9a1070b7b068fa03608ed3e926
PROVENANCE sourcekeccak256(utf8("PIXELOX-AGENT-PASS-V1"))
Mint gatenone (v4)
Market fee300 bps (3%)
ERC2981 royalty500 bps (5%)
Deploy block130,445,602 · 2026-10-29 17:01:26 (+08)
Reproducible build from source (BscScan no longer offers free source verification for BSC, so here is a fingerprint you can check yourself)
Compilersolc 0.8.24 · optimizer enabled · runs 200 · viaIR off
Constructor args(0x60B9…022F, 0xf4b4…7381, 0xf33d1f95…3e926)
Deployment transaction0x7cb867fe9973b0b584c2fbe938a6d3070965831d2c2b36729eb0a571a78e2951
creation length21,224 B
creation keccak2560xb90860c27cf0dea3f1607d545f1c7d853a597c7ce0cbddd7bdcc7707f3ca73ef
Runtime keccak2560xcddb844311df9a52ca94a28ba57e93da819bb80ba3b05a635d6e9da6e8496717

Compile PixeloxAgentPassV3.sol with the compiler settings above, append the three ABI-encoded constructor args, and keccak256 of the resulting byte string equals 0xb90860c…73ef — the same value the deployment transaction carries on-chain. As long as that number matches, the code running on-chain is this source, with no section of it swapped in afterwards.

View contract on BscScan See the gallery