Smart Contracts with Chainlink VRF for Wheel of Fortune

We design and develop full-cycle blockchain solutions: from smart contract architecture to launching DeFi protocols, NFT marketplaces and crypto exchanges. Security audits, tokenomics, integration with existing infrastructure.
Showing 1 of 1All 1305 services
Smart Contracts with Chainlink VRF for Wheel of Fortune
Medium
~3-5 days
Frequently Asked Questions

Blockchain Development Services

Blockchain Development Stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1349
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    949
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1183
  • image_logo-advance_0.webp
    B2B Advance company logo design
    642
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    921

Developing a Wheel of Fortune on Smart Contracts with Chainlink VRF

When developing on-chain games, the most critical point is the source of randomness. If an attacker can predict or influence the outcome, trust is lost. In a Wheel of Fortune on smart contracts, we solve this problem through Chainlink VRF v2.5 — the only oracle with cryptographic proof of the result. The contract requests a random number, and only after proof verification determines the winning sector. Neither the operator nor the miner can influence the outcome — full trustlessness.

This architecture saves up to $10,000 on an audit, as the VRF module has already undergone formal verification by Chainlink. On one of the implemented projects, we reduced audit costs from $25,000 to $15,000 by using the proven VRF.

The house edge parameter is the mathematical advantage of the operator. We calculate it as the ratio of the sum of weighted multipliers to the total weight. For example, a wheel with sectors 2x-50x and MISS gives an RTP of 96.5% (house edge 3.5%). This parameter is hardcoded in the contract and cannot be changed after deployment — players verify the math on Etherscan.

Why Chainlink VRF Is the Only Acceptable Solution?

Any other randomness sources have vulnerabilities:

  • block.timestamp and block.prevrandao — the miner can reject a transaction if the outcome is unfavorable (grinding attack).
  • On-chain hash of a future block — the operator can refuse to reveal.
  • Off-chain oracle without proof — full trust in the operator.

Chainlink VRF v2.5 generates a random number with cryptographic proof that is verified in the contract. Our experience shows: this technology saves up to 80% of audit time (about $10,000), as the algorithm is already verified per Chainlink VRF documentation. Additionally, VRF is 100 times more resistant to manipulation than block.timestamp.

Setting Up a VRF Subscription

A subscription ID is created and funded with LINK tokens. The contract makes requests through this ID. Example integration:

import {VRFConsumerBaseV2Plus} from "@chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2Plus.sol";
import {VRFV2PlusClient} from "@chainlink/contracts/src/v0.8/vrf/dev/libraries/VRFV2PlusClient.sol";

contract WheelOfFortune is VRFConsumerBaseV2Plus {
    bytes32 constant KEY_HASH = 0x9fe0eebf5e446e3c998ec9bb19951541aee00bb90ea201ae456421a2ded86805;
    uint256 immutable subscriptionId;
    uint32 constant CALLBACK_GAS_LIMIT = 100_000;
    uint16 constant REQUEST_CONFIRMATIONS = 3;

    struct Spin {
        address player;
        uint256 betAmount;
        uint8 wheelType;
        uint256 requestId;
        bool fulfilled;
    }

    mapping(uint256 => Spin) public spins;
    mapping(address => uint256) public pendingSpins;

    event SpinRequested(address indexed player, uint256 indexed requestId, uint256 betAmount);
    event SpinResult(address indexed player, uint256 indexed requestId, uint8 sector, uint256 payout);

    function spin(uint8 wheelType) external payable {
        require(msg.value >= MIN_BET && msg.value <= MAX_BET, "Invalid bet");
        require(pendingSpins[msg.sender] == 0, "Spin pending");

        uint256 requestId = s_vrfCoordinator.requestRandomWords(
            VRFV2PlusClient.RandomWordsRequest({
                keyHash: KEY_HASH,
                subId: subscriptionId,
                requestConfirmations: REQUEST_CONFIRMATIONS,
                callbackGasLimit: CALLBACK_GAS_LIMIT,
                numWords: 1,
                extraArgs: VRFV2PlusClient._argsToBytes(
                    VRFV2PlusClient.ExtraArgsV1({nativePayment: false})
                )
            })
        );

        spins[requestId] = Spin({
            player: msg.sender,
            betAmount: msg.value,
            wheelType: wheelType,
            requestId: requestId,
            fulfilled: false
        });
        pendingSpins[msg.sender] = requestId;

        emit SpinRequested(msg.sender, requestId, msg.value);
    }

    function fulfillRandomWords(uint256 requestId, uint256[] calldata randomWords)
        internal override {
        Spin storage s = spins[requestId];
        require(!s.fulfilled, "Already fulfilled");
        s.fulfilled = true;
        delete pendingSpins[s.player];

        uint8 sector = _getSector(randomWords[0], s.wheelType);
        uint256 payout = _calculatePayout(s.betAmount, sector);

        if (payout > 0) {
            payable(s.player).transfer(payout);
        }

        emit SpinResult(s.player, requestId, sector, payout);
    }
}

How to Calculate Wheel Sectors and House Edge?

Sectors are defined by weights and multipliers. House edge is configured to the client's requirements — typically from 3% to 10%. Example standard wheel:

struct Sector {
    string name;
    uint16 weight;
    uint16 multiplier;
}

Sector[] standardWheel = [
    Sector("2x",   4000, 200),
    Sector("3x",   2000, 300),
    Sector("5x",   1500, 500),
    Sector("10x",  800,  1000),
    Sector("20x",  300,  2000),
    Sector("50x",  100,  5000),
    Sector("MISS", 1300, 0),
];

RTP is calculated as sum(weight * multiplier) / 10000. For this wheel, RTP = 96.5% (house edge 3.5%). The math is verifiable in the contract.

Which Blockchains Are Best for Deployment?

Network Gas per spin VRF time Liquidity
Ethereum ~$50-100 3-5 blocks High
Arbitrum ~$0.1-0.5 1-3 blocks Medium
Base ~$0.01-0.1 1-2 blocks Growing
Polygon ~$0.01-0.05 1-2 blocks High

For high-volume betting games, Base or Polygon are optimal: transaction cost is nearly zero, and VRF arrives in 1-2 blocks. For premium projects with large bets, Ethereum is better, despite high gas — player trust is higher.

What Infrastructure Is Needed for Production?

Component Technology
Smart contracts Solidity + Foundry + OpenZeppelin
VRF Chainlink VRF v2.5
Frontend React + wagmi + viem
Animation Framer Motion / GSAP
Events viem watchContractEvent
NFT ERC-721 (boosts) + ERC-1155 (cosmetics)
Deployment Arbitrum / Base (low gas)

What Is Included in the Work?

  • Sector design and mathematical model (RTP, house edge)
  • Smart contracts with VRF integration, LP pool, NFT
  • Frontend with wheel animation, VRF waiting, wallet connect
  • Testing (unit + integration + fork tests)
  • Security audit (we recommend third-party audit)
  • Code documentation and deployment instructions
  • 1 month support after launch

We have 5+ years of experience in blockchain development and over 10 smart contracts in production. Contact us for a project estimate — request a consultation, timeline and cost are calculated individually.

Work Process

Order development and get:

  1. Game design (3-5 days) — agreement on sectors, RTP, mechanics.
  2. Smart contracts (2-3 weeks) — code with tests.
  3. Frontend (2-3 weeks) — animations, integration.
  4. Audit and deployment (1 week) — deployment and verification.

Basic version without LP and NFT — from 4 weeks. Full version with LP pool, jackpot, NFT — from 8 weeks. We handle all projects turnkey.

Wheel Animation with VRF

The animation is deterministic from the on-chain result. After receiving the SpinResult event, the frontend spins the wheel to the angle corresponding to the sector. The result is already known; the animation is just visualization.

function animateWheel(sector: number, totalSectors: number, onComplete: () => void) {
    const sectorAngle = 360 / totalSectors;
    const targetAngle = 360 * 5 + sector * sectorAngle;
    wheelElement.style.transition = 'transform 4s cubic-bezier(0.17, 0.67, 0.12, 0.99)';
    wheelElement.style.transform = `rotate(${targetAngle}deg)`;
    setTimeout(onComplete, 4000);
}

VRF waiting time on Ethereum is 3-5 blocks (~36-60 sec). On L2 — 1-3 blocks. We show animation immediately and finalize with result after response.

Additional Mechanics

NFT boosts: ERC-721 tokens provide +10% win, free spin every 24 hours, access to premium wheel. Jackpot: 1-2% of each bet feeds the pool. JACKPOT sector (0.1% probability) takes the whole pool. Psychologically powerful trigger. Daily bonus: free spin with payout limit. Increases retention.

Liquidity pool — users deposit ETH and get a share of house edge profit. Example implementation:

mapping(address => uint256) public lpShares;
uint256 public totalShares;
uint256 public houseBalance;

function addLiquidity() external payable {
    uint256 shares = totalShares == 0
        ? msg.value
        : (msg.value * totalShares) / houseBalance;
    lpShares[msg.sender] += shares;
    totalShares += shares;
    houseBalance += msg.value;
}

function removeLiquidity(uint256 shares) external {
    require(lpShares[msg.sender] >= shares, "Insufficient shares");
    uint256 amount = (shares * houseBalance) / totalShares;
    require(houseBalance - amount >= MIN_BANKROLL, "Insufficient bankroll");
    lpShares[msg.sender] -= shares;
    totalShares -= shares;
    houseBalance -= amount;
    payable(msg.sender).transfer(amount);
}

Minimum bankroll = MAX_BET * max_multiplier. At 50x and 1 ETH — 50 ETH reserve. Contact us for turnkey development — get a free project estimate. Our team has Solidity certifications and audit experience.

Game Economy, Contracts, and On-Chain Mechanics

We’ve seen this scenario multiple times. Axie Infinity generated substantial revenue monthly at its peak, but within 18 months the token crashed by 98% and the audience by 95%. The cause—lack of sinks: players earned SLP and cashed out, while burn mechanisms were insufficient. An analysis of Axie’s economy (Collins Dictionary) confirmed the model turned into a Ponzi scheme. We provide end-to-end GameFi development: from tokenomics to smart contracts, so your economy doesn’t repeat this mistake. Let’s evaluate your project at a meetup or online.

Play-to-Earn Economy Break Points

Inflationary tokenomics without sinks. Players earn tokens through gameplay. If sinks (burn or consumption mechanisms) are insufficient, supply outpaces demand. Price drops. Player fiat income declines. Players leave. A death spiral.

The right structure is a dual-token model with clear separation: a governance/value token with limited supply and a utility/reward token for in-game economy. The utility token must be actively consumed: item crafting, upgrades, entry fees, breeding. Examples: GODS/FLUX in Gods Unchained, AXS/SLP in Axie (though sinks were insufficient there). Historical data shows that without sinks, token supply inflates by 5–10% monthly, leading to price collapse within 6–9 months.

Effective Sink Mechanisms

  • Breeding/crafting — burning utility token to create a new NFT (e.g., Axie). Typical burn costs range from $5–$15 per action, removing 0.5–2% of total supply annually.
  • Character upgrades — each evolution requires token burning, consuming 0.1–0.3% of circulating supply per upgrade cycle.
  • PvP entry fee — token burn for tournament entry, part goes to prize pool. This can burn up to 0.5% of supply per week in active games.
  • Item durability — item breaks after N battles, token spent on repair. Cost per repair ~$0.50–$2.
  • Financial mechanics — staking with lock-up, removing tokens from circulation for a period. Typical lock-up periods of 30–90 days reduce circulating supply by 15–25%.

On-Chain vs Off-Chain: Boundary and Trade-offs

It’s not necessary to put all game logic on-chain—each transaction costs gas and takes 12 seconds. A game cycle is milliseconds. Balance:

Component On-chain Off-chain Examples
Asset Ownership + NFT items, land
Transfer/Trading + Marketplaces
Finance (staking, rewards) + Staking vaults, DAO
Random generation + (via VRF) Chainlink VRF
Gameplay + Battle system, movement
Game world state + Coordinates, health points
Matchmaking + Server-side logic

Gameplay results are transferred to blockchain via signed messages from server or ZK-proof. Verifiable off-chain with ZK: game server generates ZK-proof of session correctness, contract verifies proof and issues rewards. Implementations: Cartridge (Starknet), zkSync game rollups. Gas savings from batching proofs can reach 90% compared to per-action on-chain validation.

How Does Dual-Token Model Prevent Economic Collapse?

Governance token (limited supply) acts as value store and is used for major decisions. Utility token (minted via gameplay) is consumed by sink mechanisms, ensuring deflationary pressure. The ratio of governance to utility tokens in the initial pool should be 1:10 to 1:20. Simulation shows that a 30% burn rate on utility token keeps supply growth below 3% per year, preserving player income and token price.

Implementation of NFT Game Items

Standard: ERC-1155 for fungible items (resources, consumables) + ERC-721 for unique (characters, land). ERC-1155 provides up to 60% gas savings on batch transfers.

How to Implement Dynamic NFTs Without Overloading the Blockchain?

Item attributes change during gameplay (experience, durability, upgrades). Two approaches:

  • Fully on-chain: attributes stored in contract mapping, tokenURI generated from attributes via SVG/JSON encoding. Expensive in gas with frequent updates (e.g., $0.50 per update). Used for land and key assets.
  • Hybrid: attributes stored off-chain, tokenURI contains state hash. Updates signed by server, verified on-chain during transfer or sale. Cheaper ($0.02 per update) but requires server trust or ZK.

Breeding and crafting. Contract: two parent NFTs → pay utility token (burn) → mint new NFT with attributes dependent on parents + Chainlink VRF for randomness. Without VRF, miners can manipulate randomness via block selection.

// Simplified breeding with Chainlink VRF
function breed(uint256 parent1Id, uint256 parent2Id) external {
    require(ownerOf(parent1Id) == msg.sender);
    require(ownerOf(parent2Id) == msg.sender);
    require(breedingToken.burnFrom(msg.sender, BREEDING_COST));

    uint256 requestId = vrfCoordinator.requestRandomWords(...);
    pendingBreeds[requestId] = BreedRequest(parent1Id, parent2Id, msg.sender);
}

function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
    BreedRequest memory req = pendingBreeds[requestId];
    uint256 childAttributes = deriveAttributes(req.parent1Id, req.parent2Id, randomWords[0]);
    _mintWithAttributes(req.requester, childAttributes);
}

Marketplace and Royalties

An integrated marketplace gives control over fee structure and custom logic (e.g., banning item trading below a certain level). Royalties per EIP-2981 are standard but not enforceable: Blur and other marketplaces ignore on-chain royalties. For enforcement—whitelist-only transfer (only through contracts that pay royalties). Sacrifice composability for rights protection. Typical marketplace fee is 2.5–5% per transaction, generating recurring revenue.

Staking and Rewards Distribution

Staking NFTs is a mechanic for player retention. Problem: distributing rewards with thousands of stakers requires constant transactions (expensive). Solution—reward-per-share pattern (as in MasterChef from SushiSwap): global accRewardPerShare, upon claim or state change, debt is recalculated by formula pendingReward = stakedAmount * (accRewardPerShare - userRewardDebt). O(1) complexity regardless of staker count. Gas savings up to 70% compared to per-element distribution. Over a year with 10,000 stakers, this translates to roughly $40,000 saved in gas.

Why Is Reward-Per-Share Pattern Critical for Scalability?

Direct per-user reward updates cost O(n) per block, consuming more than 200,000 gas for 1,000 stakers. Reward-per-share reduces this to 30,000–50,000 gas per user claim, enabling thousands of stakers. Many early P2E games collapsed under gas costs that exceeded reward value. This pattern scales to tens of thousands without infrastructure overhead.

Process and Timelines

We start with a game economics document: token flows, mint/burn mechanics, projected supply schedule, sink analysis. Before writing code, the economy is modeled (Cadence, Python simulation).

GameFi Building Process: 5 Stages

  1. Economic modeling — 1–2 weeks. Develop dual-token model, calculate sinks, outline incentives for long-term holding.
  2. Token contract development — 2–3 weeks. ERC-20 for governance, ERC-20 for utility, with configurable mint/burn policy.
  3. NFT smart contracts — 3–5 weeks. ERC-721 / ERC-1155 with dynamic metadata, breeding/crafting, Chainlink VRF.
  4. Staking + rewards — 2–3 weeks. Contract based on reward-per-share, interfaces for frontend.
  5. Marketplace (optional) — 2–4 weeks. Custom marketplace with enforced royalty.

Work Deliverables

  • Source code for all smart contracts with tests (Foundry/Hardhat)
  • Architecture and economics documentation
  • Integration with Chainlink, Tenderly for monitoring
  • Code audit and formal verification (Slither, Mythril, Echidna)
  • Team training on contract interaction
  • Post-deployment support (3 months)

Basic GameFi stack (tokens + NFTs + staking + marketplace) — 8 to 16 weeks. Full game with on-chain randomness, breeding, dynamic NFTs — 4–8 months. ZK-based verifiable gameplay — a separate project from 6 months.

Contact us for an audit of your tokenomics—we’ll assess risks and refine sink mechanisms. Order GameFi project development—receive a ready product with proven economy. We guarantee contract stability and code transparency. Our experience includes dozens of implemented Web3 projects, including audits of 15+ P2E games. Get a consultation to start your project.