Fan Tokens Development

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 1 servicesAll 1306 services
Fan Tokens Development
Medium
~1-2 weeks
FAQ
Blockchain Development Services
Blockchain Development Stages
Latest works
  • image_website-b2b-advance_0.png
    B2B ADVANCE company website development
    1214
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    852
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823

Fan Tokens Development

Fan tokens — not just branded coins. Properly made fan token gives fans real rights: voting on jersey design, choosing stadium music, priority ticket access. Chiliz and Socios.com showed the model works for top clubs (Barcelona, Juventus, PSG). Question is how to replicate mechanics for smaller scale club or artist without getting empty coin with zero utility.

Technically fan-token — ERC-20 with additional logic: governance rights, access control for perks, distribution mechanism. Complexity not in code, but in tokenomics and creating real value for holders.

Token Structure

Basic Contract

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";

contract FanToken is ERC20, ERC20Votes, ERC20Permit, AccessControl {
    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant POLL_MANAGER_ROLE = keccak256("POLL_MANAGER_ROLE");

    uint256 public constant MAX_SUPPLY = 20_000_000 * 10 ** 18; // 20M tokens

    constructor(
        string memory name,
        string memory symbol,
        address admin
    ) ERC20(name, symbol) EIP712(name, "1") ERC20Permit(name) {
        _grantRole(DEFAULT_ADMIN_ROLE, admin);
        _grantRole(MINTER_ROLE, admin);
    }

    function mint(address to, uint256 amount) external onlyRole(MINTER_ROLE) {
        require(totalSupply() + amount <= MAX_SUPPLY, "Exceeds max supply");
        _mint(to, amount);
    }

    // Required override for ERC20Votes
    function _afterTokenTransfer(address from, address to, uint256 amount)
        internal override(ERC20, ERC20Votes)
    {
        super._afterTokenTransfer(from, to, amount);
    }

    function _mint(address to, uint256 amount)
        internal override(ERC20, ERC20Votes)
    {
        super._mint(to, amount);
    }

    function _burn(address account, uint256 amount)
        internal override(ERC20, ERC20Votes)
    {
        super._burn(account, amount);
    }
}

ERC20Votes provides snapshot mechanism for voting (block checkpoints), ERC20Permit — gasless approve via signature. Both extensions important: votes needed for polling contract, permit reduces friction on interaction.

Polling Contract

Voting — central mechanic. Club creates poll, holders vote with weight proportional to balance:

contract FanPoll {
    IVotes public immutable token;

    struct Poll {
        string question;
        string[] options;
        uint256 snapshotBlock;  // block for weight calculation
        uint256 startTime;
        uint256 endTime;
        uint256 minTokensRequired;  // minimum balance to participate
        mapping(uint256 => uint256) voteCounts;
        mapping(address => bool) hasVoted;
    }

    mapping(uint256 => Poll) public polls;
    uint256 public pollCount;

    event PollCreated(uint256 indexed pollId, string question, uint256 snapshotBlock);
    event Voted(uint256 indexed pollId, address indexed voter, uint256 option, uint256 weight);

    function vote(uint256 pollId, uint256 optionIndex) external {
        Poll storage poll = polls[pollId];
        require(block.timestamp >= poll.startTime, "Not started");
        require(block.timestamp <= poll.endTime, "Ended");
        require(!poll.hasVoted[msg.sender], "Already voted");

        // Weight = balance at snapshot
        uint256 weight = token.getPastVotes(msg.sender, poll.snapshotBlock);
        require(weight >= poll.minTokensRequired, "Insufficient tokens");

        poll.hasVoted[msg.sender] = true;
        poll.voteCounts[optionIndex] += weight;

        emit Voted(pollId, msg.sender, optionIndex, weight);
    }
}

snapshotBlock critical: without it someone can buy tokens right before voting, vote, and sell. Snapshot taken at poll creation, weights fixed in past.

Access Control for Perks

Fan tokens give not just voice, but physical access. Typical tier levels:

Level Threshold Perks
Bronze 1+ FAN Voting in basic polls
Silver 100+ FAN Early ticket access, exclusive content
Gold 500+ FAN Meet & greet lotteries, VIP zone
Platinum 2000+ FAN Personal messages from players, named star

For perk verification two approaches: on-chain check (contract checks balance at moment of use — simple, but balance can be temporarily borrowed) and snapshot + Merkle proof (rights fixed at specific moment — more reliable for seasonal perks).

Integration with physical world: QR code scanned at entrance, backend verifies signature signed by user wallet via WalletConnect. No private keys on device — just message signature.

Distribution and Tokenomics

Mistake #1 of fan tokens: entire supply sold via Socios/Chiliz exchange, club gets money immediately, but market saturated, price falls, holders unhappy. Sustainable model:

Typical fan-token allocation:

  • 40% — public sale via Fan Token Offering (FTO): phased, not all at once
  • 20% — club/organization: 2-3 year vesting, shows commitment
  • 15% — engagement rewards: distributed to fans for activity (attending matches, poll participation, merch purchases)
  • 15% — treasury: future partnerships, exchange listings
  • 10% — team: vesting

Engagement rewards — most important for sustainability. Tokens should organically distribute to real fans, not just traders. Mechanics: ticket scan at match = token reward, poll participation = micro-reward, merch purchase with code = reward.

Chain and Listing

For fan tokens with real user base: not mainnet Ethereum (gas too high for microtransactions). Optimal options:

Chiliz Chain (CHZ): specialized for fan-tokens, own DEX (Chiliz DEX), Socios.com integration. If goal — maximum reach of existing audience.

Polygon PoS or Polygon zkEVM: cheap gas, large ecosystem, many ready tools. Optimal for independent launch without Socios tie-in.

Base: Coinbase L2, growing audience, good liquidity. Logical choice if target audience — North American market.

CEX listing — separate process with legal and compliance sides. DEX listing (Uniswap, QuickSwap) can be done independently by adding liquidity pool.

Legal Side

Fan tokens with governance rights — potentially securities in some jurisdictions. SEC (US) and ESMA (Europe) scrutinize them. Standard defense: token doesn't give club share, doesn't promise financial return, rights — purely for participation in non-commercial voting.

Project requires legal consultation before launch. Not optional.

Work Process

Tokenomics design (1-2 weeks). Allocation, engagement rewards mechanics, tier system perks, listing criteria.

Contract development (2-3 weeks). FanToken ERC-20 + FanPoll + EngagementRewards distributor + tests.

Audit (1-2 weeks). Contracts manage valuable assets — external audit mandatory.

Backend and frontend development (2-4 weeks). Admin panel for club, holder dashboard, WalletConnect integration.

FTO launch and listing. Timeline depends on chosen platform and jurisdiction.

Cost calculated after analytics.