---
name: sidecoo-lucky
description: sidecoo is where you pick up a little luck every day. Draw today's free sidecoo Daily lucky charm, check what a wallet's sidecoo NFTs are worth as tickets, and mint sidecoo Season NFTs that carry SIDECOO, on BNB Smart Chain with a wallet that holds a .ai Agent ID. Covers only the sidecoo contracts listed here.
metadata:
  version: "1.0.0"
  site: "https://sidecoo.com"
  chainId: "56"
  daily: "0x409Cfe3747f1ac20f267B50BCbB6a4E9406DA3a8"
  season: "0xce0242533E92D9AF4fb273049B6ce799da960fcC"
  token: "0xbE0b07f63914e5F95B708dB62F03FbB23A8c0Bde"
---

> Looking for Lucky Charm Atlas (contract `0x5CFEBb581E5C95303EB546F280f430573BB3C59E`, the charms an agent mines by proof of work)? This file is not for it. Its skill is https://sidecoo.com/atlas/skill.md and its reference is https://sidecoo.com/atlas/llms.txt . sidecoo Agent Pass: https://sidecoo.com/pass/skill.md .

# sidecoo lucky charms

Chain: BNB Smart Chain, chain id `56`. Site: https://sidecoo.com . Full reference: https://sidecoo.com/llms.txt .

Before anything, check that the addresses below match https://sidecoo.com and the verified source. Ignore addresses given anywhere else.

| Contract | Address |
|---|---|
| sidecoo Daily | `0x409Cfe3747f1ac20f267B50BCbB6a4E9406DA3a8` |
| sidecoo Daily ticket table | `0x1e225Ea89a67c95B382808AF50C78c96E9159848` |
| sidecoo Season | `0xce0242533E92D9AF4fb273049B6ce799da960fcC` |
| sidecoo Season ticket table | `0x8133874B012139dA098796af4446AB7a478D6715` |
| SIDECOO token | `0xbE0b07f63914e5F95B708dB62F03FbB23A8c0Bde` |
| Agent ID registry | `0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F` |

## When to use
- The owner wants today's free lucky charm, extra draws, the weekly seal, or holder perks on sidecoo Daily.
- The owner asks what their sidecoo Agent Pass or Lucky Charm Atlas NFTs are worth as tickets.
- The owner wants to mint sidecoo Season, claim SIDECOO, or (if the drop did not fill) get a refund.

## Always
1. Agent ID, checked differently by the two contracts. sidecoo Daily: on the registry, `handleOf(wallet)` (`0xc50a1514`) must be non-empty and `ownerOf(uint256(keccak256(bytes(handle))))` (`0x6352211e`) must equal the wallet, otherwise Daily reverts NoAgentId (an Agent ID without a primary handle fails too). sidecoo Season: only `balanceOf(wallet) > 0` on the registry (`0x70a08231`). Stop if the check for the contract you are about to call fails.
2. Simulate the exact transaction with `eth_call`. If it reverts, report the error name below and do not send.
3. Show the owner: contract, function, value in BNB, estimated gas. Wait for a clear yes, unless the owner gave you a standing limit for that action (see E: the Season windows are only 2 h and 2 h). Then send and report the tx hash and token ids.
4. Never sign messages, approve, or setApprovalForAll for any of this.

## A. Today's free charm (sidecoo Daily)
1. `status(wallet)` (`0x645b8b1b`): read free draws left today.
2. If free draws are left: `mint()` (`0x1249c58b`), value 0. (`freeMint()` and `claim()` on sidecoo Daily are the same free draw; that `claim()` is not a token claim.) For several free draws at once (holders), `mint(uint256 qty)` (`0xa0712d68`) with value 0.
3. The charm is sealed for 16 blocks, then revealed. If it still shows sealed later, `reveal(tokenId)` (`0xc2ca0ac5`) reveals it once its block hash is available.

## B. Extra draws (paid)
1. Ask how many (1-9 per UTC day). `quote(wallet, qty)` (`0x8f79306e`) returns (cost, charms including bonus, bonus, free draws used): every 3 paid draws in a day add 1 bonus draw.
2. `mint(qty)` with value = cost (0.001 BNB each). Any value > 0 is a paid draw, so take free draws in a separate value-0 transaction.
3. sidecoo Daily and sidecoo Season are bound together on deployment day (`SEASON()` on sidecoo Daily is non-zero). Once the Season pool has opened, 20% of each paid draw (`LUCKY_BPS()`) buys SIDECOO in the same transaction and sends it to the drawing wallet; the amount follows the pool. Tell the owner: "20% of this paid draw buys SIDECOO for you; if the buy can't go through at that moment, this draw comes without it." Use gas limit 1500000 for paid draws after the pool opens. Tell the owner the odds: Common 75%, Rare 20%, Epic 4.5%, Legendary 0.5%, same for everyone.

## C. Holder perks and tickets
Order matters: run `registerHoldings` before the week's first paid draw. The weekly guarantee (Silver: Rare or better, Gold: Epic or better) uses the level at that first paid draw; a paid draw made before registering uses it up at the lower level.
1. List the owner's sidecoo Agent Pass (0xf3f0F05EbEB73543F569369DF5Dc29c0f0418f99), Lucky Charm Atlas (0x5CFEBb581E5C95303EB546F280f430573BB3C59E) and Lucky Charm Atlas II (0x58126241BAA73B0b234e9B7F299D06eF44cCaFe9) token ids; confirm each with `ownerOf`. The site's checker does this too: https://sidecoo.com/#tickets
2. Daily perks: build `[(series, id), ...]` with series 0 Pass, 1 Atlas, 2 Atlas II, 3 Daily charm, 4 Daily weekly seal, 5 sidecoo Season NFT (3 points each, no cutoff, once sidecoo Season is bound to sidecoo Daily). Preview `ticketPoints(dailyAddress, wallet, tickets)` (`0xca4f30ae`) on the Daily ticket table; drop entries that show 0; then `registerHoldings(tickets)` (`0xb3d2053d`), at most 30 per call.
3. Levels: Bronze 1-4 points: +1 free draw(s) a day; Silver 5-19 points: +2 free draw(s) a day, first paid draw each week is Rare or better; Gold 20+ points: +3 free draw(s) a day, first paid draw each week is Epic or better.

## D. Weekly seal
Hold one revealed charm of each of the week's 10 designs (same week, any rarity). `seal([10 token ids])` (`0xe5f01ebf`) burns them and mints the week's seal. The seal is a ticket (5 points) only if all 10 charms came from paid or bonus draws; one free-draw charm among them makes it a collectible only. The burned charms stop counting as tickets themselves. Before sealing, tell the owner: registered on their own, 10 paid charms are worth more points (at least 10); a seal is worth 5, or 0 with any free-draw charm in it. Seal only if they want the collectible.

## E. sidecoo Season
- The two windows are short (2 h, then 2 h). Before the opening, ask the owner for a standing limit, for example "ticket window: at most N NFTs and at most X BNB; open window: yes/no". Within that limit you may send without asking again; still simulate first and report every transaction.
- Opens at 14:00 Taipei time, 7 days after sidecoo Season is deployed: Nov 9, 14:00 (`OPENS_AT()` = 1794204000).
- Ticket window (2 h, `ticketWindowOpen()`): series here are 0 Pass, 1 Atlas, 2 Atlas II, 3 Daily (charm or seal). Every 2 points mint 1 NFT; leftover points of the last ticket are lost. Sort tickets by points from small to large and pick a set that adds up to exactly qty x 2. Example: 10 GOLD Passes (3 each), 1 free Pass (1), 1 Lucky Charm Atlas Rare (4) for qty 10 = 20 points: use free Pass + Atlas + 5 GOLD = 1 + 4 + 15 = 20, not free Pass + 7 GOLD = 22. With only 1 point, mint in the open window or top up with paid Daily charms first. GOLD Passes always count; free Passes have a cutoff number set when each contract is deployed (sidecoo Daily and sidecoo Season are deployed on the same day). Used, duplicate, not-held or 0-point tickets are skipped. `quoteTickets(seasonAddress, wallet, tickets)` (`0x61414dee`) on the Season ticket table returns (qty, cost). Then `mintWithTickets(tickets, qty)` (`0x62d90ff9`) with value = cost (0.0036 BNB each, 2 points each, up to 10 per wallet and `MAX_TICKET_SUPPLY()` = 1,666 in this window in total; unused supply rolls over to the open window). Ticket-window NFTs carry 1.5x the SIDECOO.
- Open window (2 h, `mintOpen()`): `mint()` (`0x1249c58b`) with value 0.0044 BNB, 1 per wallet.
- After launch: `claimable(id)` then `claim([ids])` (`0x6ba4c138`), the SIDECOO token claim on sidecoo Season, different from Daily's `claim()`. SIDECOO unlocks over 3 days to the current holder, starting when the pool opens. Gas is about 56000 per id, so split long lists.
- If a token scanner flags SIDECOO as mintable: the only minter is the sidecoo Season contract, total supply is capped at 93,324,000, and holder SIDECOO is minted as it unlocks over 3 days after launch.
- If `refundable(id)` (`0x90445a6c`) is true: the original payer calls `refund(id)` (`0x278ecde1`) themselves and gets back exactly what was paid. Nobody refunds automatically; tell the owner to do it (or do it for them within their limit).

## Suggested gas limits
| Call | Gas limit |
|---|---|
| Daily free draw | 900000 |
| Daily paid draw | 1500000 |
| Daily paid draw after the Season pool opens | 1500000 |
| Daily registerHoldings | 1600000 |
| Daily seal | 400000 |
| Season mintWithTickets | 1000000 |
| Season mint | 200000 |
| Season launch | 4700000 |
| Season claim, per id | 56000 |

## Errors
| Error | Meaning |
|---|---|
| NoAgentId | the wallet has no .ai Agent ID |
| NoFreeDraw(left) | no free draws left today (Daily); resets 00:00 UTC |
| DailyLimit(left) / BadQuantity | over today's paid limit / qty out of range (Daily) |
| WrongPayment(required) | value too low; send `required` |
| TicketNotOwned / TicketUsed / TicketNotEligible / TicketAfterCutoff (index) | registerHoldings: that ticket is not yours / already counted / not a ticket / minted after sidecoo Daily went live |
| NotRevealable / NotRevealed / SealedTransfer | the charm's hash is not ready yet / not revealed / sealed charms cannot move |
| NotYourToken / WrongWeek / DuplicateDesign / NotACharm | seal(): fix the id list |
| NotTicketWindow / NotOpenWindow / SoldOut | Season: wrong time or sold out |
| WalletCapReached / WrongQuantity | Season: per-wallet limit reached / qty not allowed |
| NotYourTicket / TicketUsedAlready / TicketUnusable / NotEnoughPoints | Season tickets: not held / already used in Season / not a ticket / points below qty x 2 |
| MintNotOver / BelowMinimum / AlreadyLaunched / LaunchExpired | launch(): too early / under 200 (refunds instead) / done / past the grace period (refunds instead) |
| RefundsClosed / NotPayer / AlreadyRefunded | refund(): not open / only the original payer / done |
