PUNCH IN v3

Deploy on BNB Chain

Deploy page for Punch In v3. The v2 Pack Mint was hard-gated on the Whitelist Pass selling out (500/500) and the Pass stalled at 188/500, so the Pack Mint could never open. In v3 the Pass gate is REMOVED: the Pack Mint opens when the owner calls openPackMint(). The Pass contract is NOT redeployed: v3 uses the EXISTING Pass below. You sign in your OKX wallet. Muse never signs or deploys. Never paste a private key anywhere on this page.

Pass is KEPT, not redeployed: the Whitelist Pass is the EXISTING contract 0x71D4c3747296F2989CB472ed7efC9ccA197d84d8 (188 minted, mint stays open). Do NOT deploy a new Pass. The Mint in Step 5 takes this address, pre-filled below. The 188 Pass holders keep their Passes and keep the 1 free pack claim.

Locked specs (do not change)

Token$PUNCHIN, symbol PUNCHIN, supply 20,000,000 fixed. Allocation: Mint 25% (5,000,000) / Game 55% (11,000,000) / Liquidity 20% (4,000,000, stays in the owner wallet).
ChainBNB Smart Chain (56)
Whitelist PassEXISTING contract, NOT redeployed: 0x71D4c3747296F2989CB472ed7efC9ccA197d84d8. Soulbound (SBT), 500 total, 1 per wallet, FREE mint (gas only). Agent ID required + backend signature (X tasks: Follow, Like, Repost, Comment, Post). Name "Punch In Whitelist Pass", symbol PUNCHPASS. Non-transferable. The pack mint does NOT wait for the Pass to sell out in v3. Pass mint stays open on the existing contract.
Pack mint1 pack = 100 $PUNCHIN. Price starts 0.0015 BNB, tiered +0.0001 per 5,000 packs, cap 0.0023 BNB (9 tiers). Max 10 packs per wallet (+1 per invite). Total 50,000 packs (paid + free). Opens when the owner calls openPackMint() (Step 10). NO Pass sellout needed in v3. Open to everyone for the 10 paid packs.
Free packA Pass holder claims 1 pack (100 $PUNCHIN) free, once, gas only, no signature (the Pass is soulbound, so the holder IS the task completer). Requires only packMintOpen. The free pack does NOT count toward the 10 paid pack quota, so a Pass holder can hold 11 packs total (1 free + 10 paid). It DOES count toward the 50,000 pack budget.
First 10 freeLaunch promo (v3, NEW): the first 10 wallets to call claimFirstFreePack() each get 1 pack (100 $PUNCHIN) free, one per wallet, first come first served, open to anyone (Pass holder or not). After 10 are claimed the promo is over. The promo pack counts toward the 50,000 pack budget but NOT toward the 10 paid pack quota. The website reads firstFreeClaimed live and changes its text when the 10 are gone.
Dual mintRegular Mint (open to everyone, no Agent ID) AND Agent Mint (Binance Agent ID required). Same tiered price, same pool.
Life CardERC-721, 20,000 total, 0.005 BNB each, max 20 per wallet. Agent ID required. Carries serial, job, reputation, career record. 1% fixed royalty. Phase 2 (later).
Agent ID gateBinance Agent ID registry 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F. Required for Pass mint, Agent Mint, Life Card mint. Never on transfers or trading.
Backend signerThe EXISTING Pass contract holds ONE immutable signer. The Worker holds the matching private key and only signs wallets that finished the X tasks and hold an Agent ID. The Mint (v3) has NO signer and NO signature-based claim. REAL signer (live, Worker verified): 0x32c0A2DFd66beE072DE6576393A1c26FE7170736. Worker: https://punchin-v2-pass-signer.punchin.workers.dev. The Pass is NOT redeployed, so this signer does not change.
Fund rulesPaid mint BNB ACCUMULATES in the Mint contract. Owner has FULL withdraw rights at any time. NO refunds in the contract, NO automatic liquidity pool, NO LP burn, NO timelock, NO transfer lock, NO 72 hour refund-or-burn threshold, NO pool-opening threshold. The 4,000,000 liquidity $PUNCHIN stays in the owner wallet; the owner adds LP MANUALLY on PancakeSwap when ready and holds the LP tokens. Public copy must NOT promise a liquidity pool or refunds the contract does not perform.
Two phasesPhase 1 (now): Pack Mint opens immediately. The owner opens the pack mint in Step 10 (no Pass sellout needed). The Pass mint keeps running on the EXISTING Pass contract (188/500 so far). The owner can close the pack mint between 48-hour Pack Open Phases (packMintOpen) and burn unsold packs with burnUnsold. Phase 2 (later, separate announcement): Life Card. Card mint + game open later. The card mint stays CLOSED at launch (cardMintActive false). There is NO free card claim in v3.
Deploy order1) PunchInToken, 2) PunchInLifeCard, 3) PunchInMint (token, card, EXISTING Pass pre-filled), 4) PunchInGame (token, card), 5) PunchInMarket (card), 6) wire the card (setMinter, setGame), 7) fund the pools (5M mint + 11M game), 8) open the pack mint. Do NOT deploy a new Pass. Do NOT open the card mint or the game in Phase 1.
GameJobs: Ping Watcher, Inbox Sweeper, Night Dispatcher, Node Keeper, Shift Architect. Shifts 4h, cooldown 2h. Courses ~12h per session (Health 4, Driving 8, Stall 6, Captain 8). Shops: Shift Architects only, bond 2,500 (500 burned, 2,000 deed), max 3, 7 day bond claim wait.
MarketLife Card trading. BNB only, list/cancel/buy, 0% market fee, 1% royalty via royaltyInfo. No owner, no withdraw, no rescue. A directly transferred token is unrecoverable.

Step 1 - Wallet library

Press "Load wallet library" first (needs internet for the ethers CDN).

Step 2 - Connect OKX wallet

Wallet: not connected
Chain: unknown

On connect this page AUTOMATICALLY switches your wallet to BNB Smart Chain (56). If the switch fails, switch manually in OKX before deploying.

Step 3 - Deploy PunchInToken ($PUNCHIN)

No constructor arguments. Mints the fixed 20,000,000 $PUNCHIN to the deployer (owner) in one go. No further minting is possible.

Not deployed yet.

PunchInToken: -
Constructor args for verify: none

Step 4 - Deploy PunchInLifeCard

No constructor arguments. ERC-721 Life Card, 20,000 max, 1% fixed royalty to the owner. The minter and game are set in Step 8 (one-time each).

Not deployed yet.

PunchInLifeCard: -
Constructor args for verify: none

Step 5 - Deploy PunchInMint

Three constructor arguments: the token address (Step 3), the card address (Step 4), and the Pass address. The Pass is the EXISTING contract below, pre-filled. Do NOT deploy a new Pass. No signer in v3. The pack mint opens when the owner calls openPackMint() (Step 10); no Pass sellout is needed. The owner can close it between 48-hour Pack Open Phases (packMintOpen).

Token: -
Card: -
Pass (EXISTING, pre-filled): 0x71D4c3747296F2989CB472ed7efC9ccA197d84d8

Not deployed yet.

PunchInMint: -
Constructor args for verify (copy to BscScan): -

Step 6 - Deploy PunchInGame

Two constructor arguments: the token address and the card address (filled in automatically). The game stays CLOSED at launch (gameOpen false); it opens in Phase 2.

Not deployed yet.

PunchInGame: -
Constructor args for verify (copy to BscScan): -

Step 7 - Deploy PunchInMarket

One constructor argument: the card address (filled in automatically). No owner, no fee, no withdraw, no rescue. Live as soon as it is deployed; listings need Life Cards, which come in Phase 2.

Not deployed yet.

PunchInMarket: -
Constructor args for verify (copy to BscScan): -

Step 8 - Wire the Life Card (one-time each)

Owner only. Tells the Life Card contract that the Mint may mint cards and the Game may update career records. Each can only be set ONCE, so check the addresses before you send. Both must be done before any card can be minted or played.

Not wired yet.

Step 9 - Fund the pools

Owner only. Approves the Mint and Game to pull $PUNCHIN from your wallet, then funds the mint pool with 5,000,000 and the game pool with 11,000,000. The remaining 4,000,000 stays in your wallet as the liquidity allocation; it is never sent to a contract. You add LP manually on PancakeSwap later.

Pools not funded yet.

Step 10 - Open the pack mint (Phase 1)

Owner only. Opens the Pack Mint (packMintOpen). In v3 this alone opens pack minting: there is no Pass sellout condition. The first 10 wallets to call claimFirstFreePack() then get 1 free pack each; after that, packs are paid (0.0015 BNB start, tiered). Pass holders claim their 1 free pack with claimFreePack(). The Pass mint keeps running on the EXISTING Pass contract (already open, 188/500); there is nothing to open for it here. Do NOT open the card mint or the game here. Those are Phase 2, later, with a separate announcement.

Pack mint not open yet.

Owner panel

If you closed this page after deploying, paste the contract addresses here and press Load contracts. The panel then works without redeploying.

Mint:
Token:
Card:
Pass (EXISTING, pre-filled):
Game:
Market:

Owner: -
Pass mint open: -
Passes sold: -
Pass signer: -
Pack mint open: -
First 10 free claimed: -
Packs sold: -
Free packs claimed: -
Card mint active: -
Game open: -
Mint pool: -
Game pool: -
Mint BNB balance: -

Pack phases (48 hours each): close the pack mint when a phase ends, then burn the unsold packs' $PUNCHIN and refund the buyers of that phase manually. Burn amount is in whole $PUNCHIN.


Burn unsold $PUNCHIN:
Owner panel ready. Deploy the contracts first, or load their addresses above.

Phase 2 - Life Card (LATER, separate announcement)

Do NOT do this at launch. Phase 2 is a separate phase with its own announcement. When it starts: open the card mint (0.005 BNB each, max 20 per wallet, Agent ID required), then open the game. The market is already live from Step 7. There is NO free card claim in v3.

Phase 2 not started. Card mint and game are closed.

Verify on BscScan (after deploy)

Compiler: solc 0.8.28, Optimizer: enabled, runs 200, viaIR: true, EVM version: cancun, License: MIT.
Verification method: Standard JSON Input - upload the matching file from verify/ for each contract.
PunchInToken: file PunchInToken.sol, verify JSON verify/verify-input-punchin-v3-token.json, flattened source flattened/PunchInToken.flattened.sol, constructor args: none.
PunchInLifeCard: file PunchInLifeCard.sol, verify JSON verify/verify-input-punchin-v3-lifecard.json, flattened source flattened/PunchInLifeCard.flattened.sol, constructor args: none.
PunchInMint: file PunchInMint.sol, verify JSON verify/verify-input-punchin-v3-mint.json, flattened source flattened/PunchInMint.flattened.sol, constructor args: token address, card address, EXISTING Pass address 0x71D4c3747296F2989CB472ed7efC9ccA197d84d8, ABI-encoded (shown after Step 5).
PunchInGame: file PunchInGame.sol, verify JSON verify/verify-input-punchin-v3-game.json, flattened source flattened/PunchInGame.flattened.sol, constructor args: token address, card address, ABI-encoded (shown after Step 6).
PunchInMarket: file PunchInMarket.sol, verify JSON verify/verify-input-punchin-v3-market.json, flattened source flattened/PunchInMarket.flattened.sol, constructor args: card address, ABI-encoded (shown after Step 7).
PunchInToken and PunchInLifeCard use verify/verify-input-punchin-v3-token.json and verify/verify-input-punchin-v3-lifecard.json (no constructor args). The Pass is NOT verified here: it is the EXISTING contract, already verified in v2.
After verify, paste the five new contract addresses into the website config (punchin.fun) so the Mint, Status, Market, and the game go live. The Pass address stays the existing one.