We create fan tokens with tangible utility: voting on kit design, priority ticket access, NFT perks, and reward mechanics. Platforms like Chiliz and Socios.com validated the model with top clubs, but replicating it for mid-tier clubs or artists is nontrivial. An empty ERC-20 without thoughtful tokenomics quickly dies.
Technically, a fan token is a custom ERC-20 with extensions: governance rights via ERC20Votes, access control for privileges, and distribution through engagement rewards. The main difficulty lies not in writing code but in tokenomics and creating real demand. Without these, the coin remains a digital artifact.
Why Fan Tokens Require Legal Scrutiny
A fan token with voting rights can be deemed a security in the US, EU, and other countries. The SEC and ESMA carefully scrutinize such projects. According to ESMA Guidance on Crypto Assets, tokens with voting rights may be classified as securities. To mitigate risks, the token must not promise financial returns—only participation in non-commercial voting. A legal opinion is mandatory before an FTO launch. Our experience shows that ignoring legal aspects leads to exchange blocking and lawsuits.
How to Ensure Sustainable Tokenomics
A typical mistake is selling 100% of the supply at launch via DEX or CEX. The price plummets, disappointing holders. A proven approach is distributed issuance:
- 40% — public sale (FTO in portions)
- 20% — club fund with a 2-year vesting
- 15% — engagement rewards (for activity)
- 15% — treasury for partnerships
- 10% — development team with vesting
Engagement rewards are the most critical part. Tokens should go to real fans, not traders. Mechanics: scanning a match ticket = reward, participating in a poll = micro-reward, buying merchandise with a promo code = reward. Proper supply distribution reduces volatility and saves up to 30% on marketing. The estimated cost of smart contract development ranges from $15,000 to $30,000.
Basic Fan Token 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);
}
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 a snapshot mechanism (checkpoints per block), ERC20Permit enables gasless approval via signature. Both extensions are critical: votes for voting, permit for reducing transaction costs. Using these modules from the OpenZeppelin library ensures the absence of typical vulnerabilities.
Polling Contract
contract FanPoll {
IVotes public immutable token;
struct Poll {
string question;
string[] options;
uint256 snapshotBlock;
uint256 startTime;
uint256 endTime;
uint256 minTokensRequired;
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");
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);
}
}
The snapshotBlock parameter is key: it fixes voting weight at the time of poll creation, preventing last-minute token purchases. This mechanism increases trust in the results.
Access Control for Perks
Holder privileges are implemented via tier levels, verifiable by balance or snapshot + Merkle Proof. A typical scheme:
| Level | Token Threshold | Perks |
|---|---|---|
| Bronze | 1+ | Voting in basic polls |
| Silver | 100+ | Early ticket access, exclusive content |
| Gold | 500+ | Meet & greet lottery, VIP zone |
| Platinum | 2000+ | NFT perks (exclusive avatars, skins), personal messages from players |
For verification at physical events, we use QR code + WalletConnect signature. The backend checks the signature and tier without storing private keys, ensuring security even if the database is compromised.
How to Choose a Network for the Fan Token?
For fan tokens with a real user base, Ethereum mainnet is unsuitable due to high gas fees for microtransactions. Comparison of popular options:
| Network | Gas (average) | Audience | Integration with Socios |
|---|---|---|---|
| Chiliz Chain | < $0.001 | Large in sports community | Native, yes |
| Polygon PoS | ~ $0.01 | Broad, many tools | None, independent launch |
| Base (Coinbase L2) | < $0.005 | Rapidly growing | None, but strong Coinbase brand |
Chiliz Chain is 1000x cheaper than Ethereum in average fees. Choosing Chiliz Chain can reduce transaction costs by up to 70% compared to Polygon. Listing on a DEX costs from $5,000, on a CEX from $15,000. DEX listing (Uniswap, QuickSwap) can be done independently by adding a liquidity pool.
What’s Included in the Work
Our engineers provide:
- Tokenomics: a detailed document with allocation, vesting, engagement mechanics, and simulations.
- Smart contracts: ERC-20 with voting, polling, and reward distributor. Full test suite (Foundry).
- Security audit: external audit by partners (Ministry of Security) with a report. Estimated audit cost: $5,000 to $15,000.
- Backend and frontend: admin panel for the club, holder portal with WalletConnect.
- Legal support: offer templates, opinion confirming non-security status.
- Post-launch support: 1 month of monitoring and fixes.
We provide a full cycle—from tokenomics to launch—with up to 50% savings on transactions when using L2. Contact us to discuss your project—we will prepare an individual estimate.
Work Process by Stages
- Analytics and tokenomics: Study the audience, club/artist goals. Design reward mechanics and tier system.
- Contract development: Write Solidity 0.8.x using OpenZeppelin, Foundry. Test coverage >95%.
- Audit and verification: Check for reentrancy, overflows, MEV risks. Use Slither, Mythril, Echidna.
- Integration and DevOps: Set up admin panel, holder dashboard, wallets. Deploy to chosen L1/L2.
- Launch and support: Consultation on FTO, help with DEX/CEX listing. 30 days post-release monitoring.
Estimated timeline: Tokenomics design—1–2 weeks; Contract development—2–3 weeks; External audit—1–2 weeks; Backend + frontend—2–4 weeks; FTO launch and listing—from 2 weeks. Total timeframe—8–12 weeks. Cost is calculated individually after analytics. Get a consultation: describe your project—we will assess the timeline and stages.
We guarantee transparent code and full documentation. Our smart contracts have undergone 5+ external audits for various projects. Our accumulated experience spans over 50 successful launches in the crypto sector. Contact us to discuss your project.







