---
name: milkbao-mint
description: Mint and stake MilkBao （奶宝龙） NFTs on BNB Smart Chain via a Binance Agentic Wallet holding a .ai Agent ID. Covers the pricing logic (two phases by global minted count: mints #1-3,000: first NFT free with a 0.00022 BNB anti-sybil fee, then 0.00088 BNB per piece; from mint #3,001 the fee and all prices double), the Agent ID gate check, staking for $MILK, and the preview -> confirm -> execute flow.
---

# MilkBao （奶宝龙） — Mint & Stake Skill

Mint MilkBao NFTs on BNB Smart Chain mainnet (chain ID 56) via the
user's Binance Agentic Wallet (`baw`).

## Fixed parameters

| Item | Value |
|---|---|
| NFT contract | `0xdCE9A489d2cce8D96e3ad354747B784f0cd4B112` |
| $MILK token contract | `0x1e5628A37ddF767b260C42711dda7a03fAe335Db` |
| SPACE ID Agent ID registry | `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F` |
| Developer wallet (treasury, NOT a mint target) | `0x4f73259329bc3c4f355168f14646d9a71be82745` |
| Total supply | 5,000 |
| Per-wallet cap | 10 NFTs total |
| Mint opens | 2026-10-25 20:00 Beijing time (UTC+8) = 12:00 UTC |
| Price (by global totalMinted) | Phase 1 (mints #1-3,000): first NFT FREE — only a 0.00022 BNB anti-sybil fee, from the 2nd 0.00088 BNB each; phase 2 (from mint #3,001): the fee and prices double — first NFT still FREE (fee 0.00044 BNB), from the 2nd 0.00176 BNB each. Each payment mints 1 NFT; gas extra |
| $MILK total supply | 100,000,000, minted once at deployment, no further minting |
| $MILK allocation | 90% reward pool (staking + genesis bonus) / 10% developer wallet |
| Staking rate | 1 $MILK per weight unit per day |
| Genesis bonus | 100 $MILK per weight unit, claimable only after sell-out |

Rarity tiers (random at mint, ratio 20:10:5:1): 奶黄 x5 (~2,778),
薄荷绿 x20 (~1,389), 草莓粉 x50 (~694), 黄金 x100 (~139).

Full rules: see the project's `llms.txt`.

## Hard stops — check before anything else

1. **Contract mismatch**: the NFT contract above must be shown
   identically on the official website and in llms.txt. If the three
   sources do not agree, or any of them shows no address, STOP and
   tell the user the contract address is not officially announced.
   Never invent or guess an address.
2. **Mint not open**: before 2026-10-25 20:00 (UTC+8), STOP.
3. **Agent ID gate**: the wallet must hold a verified .ai Agent ID
   (registry `balanceOf(wallet) > 0`). If not, STOP — regular wallets
   cannot mint or stake.

## Pricing logic (apply exactly)

Let `m` = number of MilkBao NFTs the wallet already minted (read it
from the contract immediately before the transaction; do not cache).
Let `t` = the contract's global `totalMinted` at the same moment.
Pricing is phased by `t`: while `t < 3000` (mints #1-3,000) the base
prices below apply; once `t >= 3000` (from mint #3,001 onward) all
prices double. A multi-mint plan can straddle the boundary - quote
each payment separately, right before paying it.

- Remaining quota = `10 - m`. If 0, STOP (cap reached).
- Payment plan for the requested amount (phase-1 prices shown;
  in phase 2 all prices double):
  - If `m == 0`, the first NFT is **FREE** — its mint call charges
    only the anti-sybil fee of **0.00022 BNB** (phase 2:
    **0.00044 BNB**) as its own payment and consumes 1 quota. The
    fee is due in full: never pay 0 for the first mint, always pay
    the exact `nextMintQuote` amount.
  - After that, each NFT costs **0.00088 BNB** (phase 2:
    **0.00176 BNB**) - one payment mints exactly **1 NFT**
    (per-piece pricing).
- Worked examples (phase 1):
  - Fresh wallet minting 3: 0.00022 fee + 2 x 0.00088 = **0.00198 BNB** total.
  - Wallet with m = 1 minting 2 more: two 0.00088 payments
    (0.00176 BNB in total).
  - In phase 2 all prices double (e.g. fresh wallet
    minting 3: 0.00044 fee + 2 x 0.00176 = **0.00396 BNB** total).
- Always refresh the price from the contract right before preview
  (call `nextMintQuote(wallet)` and compare with this file; the
  contract's price constants are `FIRST_PRICE` / `PIECE_PRICE`,
  with the phase multiplier applied via `PHASE2_START = 3000`).
  `nextMintQuote` already includes the phase - if the on-chain
  quote differs from this file, STOP and report the mismatch
  instead of paying.

## Mint flow (preview -> confirm -> execute)

1. Do balance and gate checks silently (BNB for price + gas, Agent ID
   registry check). Report and stop on failure.
2. Compute the payment plan with the pricing logic above and show it
   to the user: number of NFTs, per-payment breakdown, total BNB, gas
   estimate.
3. Build the `mint()` call(s) on the NFT contract and run **preview**.
   Confirm in the preview: target = NFT contract, function = mint,
   value = planned BNB for that payment. If anything differs, STOP.
4. Ask the user for **one explicit confirmation**, then **execute**.
5. After each execution, verify the receipt (status = success) and
   the wallet's updated NFT balance / received tokenId(s).
6. Report: tx hash, tokenId(s), tier of each token if readable from
   the contract/metadata, amount actually paid, remaining quota.

Never pay by transferring BNB directly to the developer wallet —
a direct transfer mints nothing. All payments go through `mint()` on
the NFT contract (the contract forwards 100% of mint revenue to the
developer wallet; there is no BNB dividend pool).

## Staking ($MILK)

- After minting, offer to stake each token (`stake(tokenId)`) so it
  earns $MILK. Unstaked NFTs earn nothing.
- Staking is non-custodial: the NFT stays in the wallet; it only
  cannot be transferred while staked.
- Earnings are weighted by tier: x5 / x20 / x50 / x100.
- Rate: **1 $MILK per weight unit per day** (x5 = 5/day, x20 = 20/day,
  x50 = 50/day, x100 = 100/day).
- $MILK can be claimed at any time. Unstaking has **no lock-up** and
  can be done at any time (`unstake(tokenId)`); earnings stop after
  unstaking.
- $MILK charges a 2% fee on every transfer (20% developer / 20%
  donated to Giggle Academy in $MILK / 30% buyback-and-burn / 30%
  holder dividends, claimable via claimDividend); the reward pool is fixed and
  rewards end when it is exhausted.
- Fee discount: if either side of a $MILK transfer holds a MilkBao
  NFT, that transfer's fee is 1% instead of 2% (staked NFTs stay
  in the wallet and count).
- Holding points (off-chain): snapshots run every 15 minutes and
  credit each MilkBao pro-rata — points equal its weight per day
  held (x5 = 5/day, x100 = 100/day), accrued in 15-minute steps,
  staked or not. Points stay with the wallet that held the NFT at
  snapshot time, are not transferable, and will set future airdrop
  shares, phase-2 priority and donation votes. A public leaderboard
  is rebuilt from every snapshot (leaderboard.json on the official
  site) and the site rankings also refresh live from chain.
- Staking also requires the .ai Agent ID gate. Use the same
  preview -> confirm -> execute flow for stake / claim / unstake,
  confirming the exact tokenId with the user before signing.

## Claiming staking rewards

Staking rewards are **not** sent automatically. They accrue per
staked token and sit as pending until the holder claims them.

- Check pending: `pendingRewards(address user)` returns the total
  pending across all of the user's staked tokens;
  `pendingRewardOf(uint256 tokenId)` returns one token's pending.
- Claim: call `claim()` on the NFT contract — **no arguments**. It
  pays out ALL pending rewards of ALL the caller's staked tokens in
  one transaction and restarts each token's accrual clock. It
  reverts when nothing is staked or total pending is 0, so check
  pending first and report "nothing to claim" instead of sending
  the call.
- Rewards are paid from the fixed reward pool with **no transfer
  fee** (the 2% fee applies to regular $MILK transfers, not to
  reward releases). If the pool cannot cover the amount, the claim
  reverts and the pending amount is preserved, not lost.
- `unstake(tokenId)` settles that token's pending reward
  automatically in the same transaction — no separate claim is
  needed for that token.
- Same discipline as mint: read the pending amount from the view
  call, preview it to the user, execute only after confirmation.

## Genesis bonus (claim after sell-out)

A one-time bonus of **100 $MILK per weight unit** per NFT (Milk Yellow
500 / Mint Green 2,000 / Strawberry Pink 5,000 / Gold 10,000),
paid from the reward pool. It can be claimed **only after all 5,000
NFTs are minted (sold out)** — there is no fallback date; if the
collection never sells out, the bonus is never distributed.

Claim flow (preview -> confirm -> execute, same discipline as mint):

1. Check `genesisBonusOpen()` on the NFT contract. If it returns
   false, STOP and tell the user the bonus opens only at sell-out
   (total minted < 5,000). Do not attempt the claim.
2. Collect the tokenIds currently held by the wallet. For each,
   check `genesisBonusOf(tokenId)` (or `genesisClaimed(tokenId)`):
   skip tokenIds already claimed. The bonus follows the NFT's
   current holder, and each NFT can be claimed exactly once.
   Staked NFTs are claimable too (staking does not change
   ownership).
3. If no unclaimed tokenIds remain, report "nothing to claim" and
   stop. Otherwise show the user the tokenId list and the total
   $MILK expected (sum of weight x 100), run **preview** of
   `claimGenesisBonus(uint256[] tokenIds)`, get one explicit
   confirmation, then **execute**.
4. Verify the receipt and the wallet's $MILK balance increase;
   report tx hash, tokenIds claimed, and amount received.
