Everything you need to launch and run a white-label, provably-fair on-chain casino on the MAY protocol β from zero to a live branded site with a working back-office.
State channels, not server trust. Every play session is an on-chain payment channel on Arbitrum One (ChannelManager V4). The player deposits RUSD into the channel; the house escrows an allocation. Every round is then settled off-chain by both parties co-signing the new channel state β instant and gas-free β while the contract guarantees either side can always settle on-chain.
Provable fairness β zero external oracles. Randomness is fully two-party. At channel open the session seed is fixed by commit-reveal: the house publishes houseSeedCommit = keccak256(abi.encode(houseSeed)) before it ever sees the player's seed; the player's wallet signature binds both playerSeed and that commitment; the open transaction reveals houseSeed and the contract enforces sessionSeed = keccak256(abi.encode(houseSeed, playerSeed, channelId)) (no Pyth, no VRF, no fee float). Each round then additionally requires hash-chain preimages committed by both parties before play: outcome_k = keccak256(playerReveal_k, houseReveal_k, sessionSeed, channelId, k) mod N. Neither side can predict or steer an outcome; every round's math β and the seed itself β is re-verifiable in the fairness verifier. Game rules (blackjack, roulette 0β36, punto banco baccarat) are enforced by on-chain verifier contracts β a state that violates the rules cannot settle.
Brand accounting is native to the contract. Channels carry an operator/brand address; brand markup accrues on-chain (FeeSplitter.brandAccrued) and is claimable only by your wallet via claimBrand(). Nobody β including the platform β can redirect your accrual.
Open the provisioning wizard:
claimBrand accrual. Use a wallet you control; it cannot be changed after provisioning without the platform.maycasino.xyz/t/<your-brand>/. Typically live in 1β3 minutes. All 16 pages, games, wallet flows, bonuses and your gated admin work on your URL.brand.json baked into a separate instance) is a platform upgrade β domain registration (~$11β40/yr) plus hosting.The bonus engine is wallet-reputation based: fresh wallets start at zero; on-chain deposits and settled real wagering volume unlock tiers; tier credit = creditPct% of the wallet's deposits, locked until the wallet wagers credit Γ withdrawalWagerMultiple.
The farming problem: a "bonus farmer" grinds the wagering requirement on your lowest-house-edge game with minimum-variance (near-even-money) bets. Their expected cost of unlocking is:
expected cost = credit Γ withdrawalWagerMultiple Γ minHouseEdge
farmer profit = credit β expected cost
= credit Γ (1 β withdrawalWagerMultiple Γ minHouseEdge)
β the config is FARMABLE (+EV for the farmer) iff
withdrawalWagerMultiple Γ minHouseEdge < 1
| Lowest-edge game enabled | House edge used | Minimum safe multiple |
|---|---|---|
| Blackjack | 0.50% | β₯ 200 |
| Baccarat | 1.06% | β₯ 95 |
| Roulette (European) | 2.70% | β₯ 38 |
| House mini-games only | 2.00% (conservative) | β₯ 50 |
The π GO LIVE validator enforces this: tier configs where the multiple Γ your lowest enabled edge is under 1 are rejected with the exact numbers. Keep creditPct β€ 25 and remember the multiple is a floor, not a target β a margin above the minimum covers variance and imperfect play tracking.
The protocol keeps compliance decentralized and vendor-free: no Chainalysis, no KYC vendors at protocol level. If you enable amlOpenListCheck, the house node screens every session-open address against the public OFAC SDN digital-currency list (open data, refreshed daily) and refuses to open sessions for listed addresses β before any funds move.
Honest limits: open-list screening only. No clustering, no graph analysis, no vendor risk scores. If your jurisdiction requires KYC/full AML, you layer your own provider on top at the brand level β the protocol does not stand in the way, and does not do it for you.
Your back-office lives at /admin.html under your tenant URL. Access = connect the operator wallet + sign a one-time message (free). Modules:
brandAccrued claimable via one-click claimBrand() (contract-enforced to your wallet).Signals are computed by the house node from its own session data (wallet-reputation is the anti-abuse foundation β no external vendors):
| Signal | What it detects | Weight |
|---|---|---|
| Bonus-farm pattern | High share of near-even-money bets placed while bonus credit was locked (min-variance grinding) | 40 |
| Rapid cycling | Openβclose cycles under 10 minutes with <5 RUSD wagered (probing / airdrop-style behavior) | 25 |
| Shared funding source | Multiple wallets whose earliest incoming RUSD transfer came from the same parent address (one-hop only) | 25 |
| Sanctions attempts | Session opens attempted while on the public OFAC SDN list | 100 |
Thresholds are configurable per brand (riskThresholds in brand.json). Actions: π· flag (annotation) and β block β the house node refuses new session opens for that wallet on your brand. Both require your operator wallet's signature.
forceClose. The protocol guarantees exit β that guarantee is exactly why players trust the system, and it applies to abusers too. Blocking is a business decision about future service, not a seizure tool.Honest limitations: funding analysis is one-hop RUSD transfers only (no clustering); volume-based signals live in the node's ledger, which is rebuilt from chain for deposits but resets wagering counters on node restarts; tenant deposit attribution is runtime-only (boot-time chain rebuilds land on the platform ledger).
Every game page has π Emergency withdraw β it submits forceClose with the latest dual-signed state directly to the contract. After the challenge window, funds pay out exactly per that state. No house cooperation needed. This works even if the platform disappears entirely.
The node checkpoints open channels' latest dual-signed states on-chain before shutdown, and clients can recover sessions from GET /session/:address. Abandoned channels are reconciled automatically.
Your operator wallet gates admin/risk actions and receives accrual. If compromised, contact the platform to rotate the address in your tenant config (config change; on-chain accrual already claimed cannot be recovered β use a hardware wallet).
Is my casino a separate deployment? No β shared static site + shared house node, path-routed at /t/<brand>/. Own-domain dedicated deploy is an upgrade. Settlement is the same audited contract set either way.
Who holds player funds? The ChannelManager contract escrows them per channel. Not you, not the platform's web servers.
Can I change the game math? No. Game rules are enforced by on-chain verifiers; that is the product. You choose which games to enable, plus markup ppm.
What data can I lose? The bonus/risk ledger's wagering counters are only as durable as the node disk (deposits rebuild from chain). Treat reputation volume as best-effort operational data, not accounting. On-chain accounting (deposits, closes, fees, your accrual) is permanent.
Multiplayer / poker? Deliberately not offered β solo-vs-house only, eliminating collusion vectors by design.
Where's the brand kit? The wizard's β¬ DOWNLOAD BRAND KIT bundles brand.json, your logo and step-by-step notes β useful for the own-domain upgrade path.
π Create your brand β Β· π Operator dashboard β Β· π‘ Fairness verifier β