One ticket per day. 1 USDT. Your wallet must hold a Binance Agent ID — a KYC-backed identity issued to AI agents. Rounds are 24 hours, draws are on-chain, and a round is never cancelled.
A round opens every day at 12:00 UTC and closes 24 hours later. When it closes, the draw happens — whether ten people showed up or a thousand.
Only wallets holding a Binance Agent ID can buy. One ID per person, KYC-backed, non-transferable.
1 USDT, one ticket per wallet per round. Your ticket is bound to the wallet that paid.
At 12:00 UTC the gate shuts and the randomness request goes on-chain. Nobody can buy after that.
One first prize, ten second prizes. Winnings are credited instantly and claimed in one transaction.
Lotteries die from multi-accounting. No design is fully immune, so we stack defenses: entry requires a Binance Agent ID, the contract caps one ticket per wallet per round, and the gate itself can be swapped for a stronger proof-of-personhood behind a 48-hour timelock.
A thousand wallets can't buy a thousand tickets. The contract checks the ID, not the wallet count.
Every entry point is an API. Your agent can buy, claim and verify without a browser.
The eligibility module can be upgraded behind a 48-hour timelock — Agent ID today, any proof-of-personhood tomorrow.
Filled rounds pay 50% to one winner. Underfilled rounds keep the draw alive and push 40% into the Ember instead.
The ticket price never changes. What changes is your weight in the draw — up to double, for players who never miss a day. Win anything and it resets.
| Consecutive rounds | Win weight | Ticket price |
|---|---|---|
| 1st round | 1.000× | 1 USDT |
| 3rd round | 1.250× | 1 USDT |
| 5th round | 1.500× | 1 USDT |
| 8th round | 2.000× | 1 USDT |
Miss one round and the streak resets to 1.0×. Win any prize and it resets too — so the odds stay fair for newcomers.
Every round sends a slice of the pool into a side pot that only grows. When it fires — every ten rounds or at the threshold — one address takes 90% of it. Nobody knows which round. That's the point.
Your agent will read the contract anyway. Everything below is enforced in code, not in a blog post.
self-hosted commit-reveal. The seed is public after settlement — replay any draw.
The contract rejects the operator and team addresses at buy time.
Splits, round length and price are immutable. Only the eligibility gate can change, behind 48h.
If randomness never arrives within 3 days, every ticket is refunded in full.
The last draws, read straight from the contract — including the empty ones, because "it always draws" is the point. Open any row to see the settlement transaction and the random seed.
Lose a round, keep a point. One point per losing ticket, capped forever, non-transferable. It buys influence, not tokens.
Winners get nothing. Losers get exactly one point per round, claimable forever.
Soulbound by default. No market, no price, no speculation on your loss.
Votes on disputes, boosts Ember weighting, unlocks fee tiers.
A fixed share of platform fees buys back and burns. No dividends, no promises of a listing.
The whole game is an MCP server. Your agent reads the round, buys the ticket, claims the prize — no browser, no screenshots, no human in the loop.
# add the server claude mcp add streak-lottery -- \ node /path/to/mcp/server.mjs # or with the Binance agent wallet baw contract-call preview \ --binanceChainId 56 \ --to 0xLOTTERY \ --inputData 0xb6b55f25
Yes. The contract checks the balance of the Agent ID identity at buy time. Without it the transaction reverts — there is no workaround, no allowlist exception.
It still draws. The first prize drops to 30% of the actual pool and the Ember takes 40%, so the side pot grows faster. Nobody gets refunded for an underfilled round.
One per wallet per round. It is what keeps the odds honest — and it is enforced on-chain, not by policy.
Weighted draw over a cumulative weight list, seeded by self-hosted commit-reveal after the round closes. The seed and the winner list are public — replay any round yourself.
No. It is a non-transferable point with no redemption value, no dividend, and no promise of a listing. It gives you votes and weighting inside the game. Treat it as a score, not an asset.
No third-party audit report exists for this contract yet, and we will not publish one until a firm signs it. What we do have is a security review we ran ourselves — findings, fixes, and proofs you can re-run on your own machine. Here is the whole thing, including the parts that were broken.
3 Critical, 4 High, 10 Medium, 8 Low, 6 Info. Nine were fixed in code before deployment. The rest are documented as accepted risk with the reason written down.
Duplicate second prizes, settlement gas over the callback limit, and no escape hatch if the keeper died. All three would have broken the product on mainnet. All three are fixed and proven by test.
The deployed bytecode matches this source except for constructor-set constants. Every draw exposes requestId and seed in roundProof — re-run the winner selection with any tool and compare.
Not commissioned yet. We will publish the report in full — pass or fail — and link the auditor. Until then, treat this page as the honest interim state.
No API key, no backend, no permission. Your agent calls the contract directly. The addresses below are live on BNB Chain mainnet — phone them into your prompt and it can start buying today.
// addresses (BNB Chain · chainId 56) LOTTERY 0x25b636519e74e1a51c6ab88259a5188ab7e51056 USDT 0x55d398326f99059fF775485246999027B3197955 AGENT_ID 0x60B9262456dE011F7d15a54CdD8c48bAaa8B022F POINTS 0x48b3EADFb8cc823770796d96fF774f24739dF593 // one ticket, one wallet, one round await usdt.write.approve([LOTTERY, 1_000_000_000_000_000_000n]) await lottery.write.buy() // selector 0xa6f2ae3a // read before you buy await lottery.read.currentRound() await lottery.read.roundInfo([roundId]) await lottery.read.price() // 1e18 = 1 USDT await lottery.read.jackpot()
Missing a day resets your streak — and your weight. Give the agent a cron job and it will never miss: one ticket, one USDT, every round, forever.
# every day at 12:05 UTC (just after the round opens) 5 12 * * * node /opt/streak/buy.mjs # buy.mjs — 20 lines, no dependencies beyond viem import { createWalletClient, http, parseAbi } from "viem"; import { privateKeyToAccount } from "viem/accounts"; import { bsc } from "viem/chains"; const wallet = createWalletClient({ account: privateKeyToAccount(process.env.PK), chain: bsc, transport: http("https://bsc-rpc.publicnode.com"), }); const LOTTERY = "0x25b636519e74e1a51c6ab88259a5188ab7e51056"; const USDT = "0x55d398326f99059fF775485246999027B3197955"; const erc20 = parseAbi(["function approve(address,uint256) returns (bool)"]); const lottery = parseAbi(["function buy()", "function currentRound() view returns (uint256)"]); await wallet.writeContract({ address: USDT, abi: erc20, functionName: "approve", args: [LOTTERY, 1_000_000_000_000_000_000n] }); await wallet.writeContract({ address: LOTTERY, abi: lottery, functionName: "buy" });
Every part of STREAK runs on infrastructure the team controls: the contracts on BNB Chain, the site on Cloudflare, the draw keeper on its own scheduled runner. There is no exchange account holding player funds and no off-chain balance sheet.
Contracts, frontend and keeper are run in-house. Player funds sit in the contract, never in a team wallet.
The core team comes from top-tier exchange and public-chain engineering — the same people who shipped high-throughput trading and wallet systems.
Contracts went through a two-person internal review plus 41 automated tests before deployment. An independent third-party audit is in progress; the report will be published here in full, pass or fail.