Stake an NFT. Sell tickets. Let the crypt choose.
Anyone can put up any NFT as the prize. Tickets always cost one US dollar in ETH, priced by Chainlink at the moment of purchase. The more tickets you buy, the higher your chance. When the timer hits zero the contract draws a winner from on-chain entropy β no oracle, no human in the loop.
Four steps from NFT to winner. Fully on-chain. No off-chain oracle for the draw.
Connect your wallet. We list every NFT you own across Base. Pick the one you'd like to put up as the prize.
Choose how long tickets are on sale (1 hour to 7 days) and a self-declared USD value for display. Approve and the NFT moves into the game contract via safeTransferFrom β safe for royalty-enforced collections.
Anyone can buy tickets while the timer runs. Price is locked to one USD by the Chainlink ETH/USD feed. Want better odds? Buy more tickets.
When the timer expires anyone may call drawWinner. The contract picks a ticket using prevrandao + blockhash entropy. 90% of the pot goes to the game's creator. 10% to the platform. The NFT goes to the winner.
Every NFT you hold on Base. Click any to start a $1 game with it as the prize.
Connect your wallet to see your NFT inventory.
Buy in for $1, ride the entropy.
The game contract reads the Chainlink ETH/USD feed on Base at the moment your buyTickets() call lands. It divides one US dollar by the live ETH price to produce the ticket cost in wei. Any overpayment is refunded automatically in the same transaction.
If the oracle round is stale, the contract reverts β your ETH stays in your wallet. There is no path where you pay more than ~$1 per ticket plus gas.
Yes. The game uses the canonical safeTransferFrom(from, gameAddress, tokenId, data) flow. The caller (you) is the operator on that call, and ERC-721C / operator-filter collections allow EOA-initiated transfers β so the NFT moves cleanly into the contract.
The fallback createGame() function (which uses transferFrom) is only for non-filtered collections and will revert under operator filters. The frontend always picks the safe path automatically.
The contract has a creator safety switch. If your create-game attempt encounters any error β bad parameters, malformed encoded data, or a temporary glitch β the contract registers your NFT as a recoverable orphan tied to your wallet. The Safety Switch panel on this page lists your orphans and lets you either withdraw the NFT or retry the game creation.
Only the wallet that originally sent the NFT can recover it. No admin can pull a user's orphaned NFT out.
When the timer expires the contract draws a winning ticket index from keccak256(block.prevrandao, blockhash, gameId, ticketCount). Each ticket maps to one of the buyers via a binary-searched range table β your odds equal your tickets divided by total tickets.
The draw cannot be biased by individual purchases because tickets are sold over a real time window, and prevrandao is determined at the moment the draw transaction is mined, not at purchase time. The only entity with marginal influence on prevrandao is the proposer of that single block β which is a Base sequencer for now.
Every ticket purchase is instantly split 90% to the game creator and 10% to the platform. No escrow, no claim step. By design the contract holds zero ETH between transactions β the only ETH that can ever sit in it is residue from rounding (refunds of fractional wei) or accidental transfers, both of which the platform's sweep() function can rescue.
Spin up a raffle in three clicks. The smart contract handles the rest β ticketing, drawing, payouts.