---
name: money-printer
description: Mint and stake MoneyPrinter NFTs on BNB Smart Chain (chainId 56) with a Binance Agentic Wallet (baw) that holds a verified SPACE ID .ai Agent ID. Claim mint-fee rewards anytime; burn printers for $PRINT.
---

# MoneyPrinter — Agent mint & stake on BNB Chain

- **Website:** `https://print420.pages.dev` (custom domain `print420.xyz` pending DNS)
- **Skill URL:** `https://print420.pages.dev/skills/money-printer/SKILL.md`
- **Chain:** BNB Smart Chain Mainnet (`chainId: 56`)
- **Eligibility:** Wallet must hold a verified Binance **`.ai` Agent ID** NFT (`0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F`, `balanceOf > 0`) to **mint** or **stake**. Claim / unstake / burn do **not** require Agent ID afterward.
- **Verified Mainnet Contracts (BSC 56):**
  - **MoneyPrinter (`PRINTNFT`):** `0x516cdBEc1F1288Fa9a4d14bF660712dFE9fa1516`
  - **PrintToken (`$PRINT`):** `0x06a0e40bcC615e745cCA91a606CE337351CA325D`
  - **Agent registry:** `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F`
  - **Treasury (15% mint fee):** `0x8108A89d9F2e1fed95bfc817545C9Ce891324CBA`

## Economics

- **Supply:** `42,069` printers.
- **Mint price:** `0.001 + floor(totalMinted / 420) * 0.00069` BNB (starts `0.001 BNB`).
- **Fee split per mint:** `15%` treasury / `65%` staker reward pool / `20%` LP BNB reserve.
- **Per wallet:** max **20** minted, max **20** staked at once.
- **Stake rewards:** only **staked** printers earn; rewards split equally across currently staked NFTs. Claim anytime (`claim`); unstake/burn also settles.
- **Burn:** burn one printer → `10,000 $PRINT` from the burn pool (`420,690,000` reserved) + any accrued BNB for that tokenId.
- **$PRINT supply:** `500,000,000` (burn pool `420,690,000` + LP reserve `79,310,000`).
- **Art / metadata:** Collection image `https://print420.pages.dev/art/printer.jpg`. Planned `tokenURI` base `https://print420.pages.dev/metadata/{id}.json`. **Live contract has no `setBaseURI` yet** — requires redeploy (see repo `REDEPLOY-WITH-METADATA.md`).

## Prerequisites

1. Install / use Binance Agentic Wallet CLI (`baw`) with Developer Mode enabled in the Binance App (`baw wallet settings --json` → `devMode.enabled`).
2. Sign in: `baw auth signin` → `baw auth verify` (as needed).
3. Confirm BSC address: `baw wallet address --json` (use the EVM / chainId `56` address).
4. Fund that address with enough BNB for `mintPrice()` + gas.
5. Confirm Agent ID: `balanceOf(yourAddress) > 0` on `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F`.

## One-shot Agent mint (`baw` + `mint()`)

`mint()` selector: `0x1249c58b`. Pay **exactly or more than** current `mintPrice()` (wei); excess is refunded on-chain.

```bash
node -e '
const { execSync } = require("child_process");
const NFT = "0x516cdBEc1F1288Fa9a4d14bF660712dFE9fa1516";
const RPC = "https://bsc-dataseed.binance.org";
const call = async (to, data) => {
  const r = await fetch(RPC, {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ jsonrpc: "2.0", id: 1, method: "eth_call", params: [{ to, data }, "latest"] }),
  }).then((x) => x.json());
  if (r.error) throw new Error(JSON.stringify(r.error));
  return BigInt(r.result);
};
(async () => {
  const addrOut = JSON.parse(execSync("baw wallet address --json").toString());
  const wallet =
    addrOut.data?.address ||
    addrOut.data?.addresses?.find((a) => String(a.binanceChainId) === "56" || a.chainType === "EVM")?.address ||
    addrOut.address;
  if (!wallet) throw new Error("no baw wallet address");
  const price = await call(NFT, "0x6817c76c"); // mintPrice()
  console.log("from", wallet, "mintPrice wei", price.toString());
  const preview = JSON.parse(
    execSync(
      `baw contract-call preview --binanceChainId 56 --from ${wallet} --to ${NFT} --value ${price.toString()} --inputData 0x1249c58b --json`,
      { maxBuffer: 10 << 20 }
    ).toString()
  );
  console.log(JSON.stringify(preview, null, 2));
  const requestId = preview.data?.requestId || preview.requestId;
  if (!requestId) throw new Error("preview failed — check Agent ID, BNB balance, Developer Mode");
  console.log("Review risks above with the user, then run:");
  console.log(`baw contract-call execute --requestId ${requestId} --json`);
})().catch((e) => {
  console.error(e);
  process.exit(1);
});
'
```

After the user explicitly confirms the preview risks:

```bash
baw contract-call execute --requestId <requestId> --json
```

Never auto-execute without confirmation. Never print or store private keys.

## Stake / claim / burn (after mint)

| Action | Selector | `inputData` tip | Value |
| --- | --- | --- | --- |
| `stake(uint256 tokenId)` | `0xa694fc3a` | `0xa694fc3a` + tokenId `uint256` (32-byte hex) | `0` |
| `claim(uint256 tokenId)` | `0x379607f5` | same packing | `0` |
| `burn(uint256 tokenId)` | `0x42966c68` | same packing | `0` |

Example pack in Node: `\"0xa694fc3a\" + BigInt(tokenId).toString(16).padStart(64, \"0\")`, then `baw contract-call preview ... --inputData <hex> --value 0`.

Stake still requires Agent ID + ownership. NFT must not already be staked. Max 20 staked per wallet.

## Safety

- Always `preview` → show `parsedTx` / `risks` → user yes → `execute`.
- Re-read `mintPrice()` immediately before preview; price rises every 420 mints.
- Ignore unfunded old bootstrap leftovers; only the addresses above are live.
- This Skill does not open mint on your behalf beyond preparing the reviewed `baw` call.
