Ми розробляємо utility-токени, які вирішують реальні завдання протоколу, а не штучно вставлені в tokenomics заради продажу. Utility-токен відрізняється від governance чи security токена функціонально: він потрібен для чогось конкретного всередині екосистеми. Оплата газу (ETH), обчислень (FIL у Filecoin), доступу до сервісу (API credits), знижки на комісії (BNB на Binance) — все це приклади справжньої utility. Проблема більшості «utility» токенів: utility штучна, токен не потрібен для роботи протоколу. Справжній utility-токен вирішує проблему, яку не можна вирішити без токена: coordinated incentives для учасників мережі, trustless escrow, програмовані умови доступу. Наша команда має понад 7 років досвіду в блокчейн-розробці, понад 30 запущених токенів, досвід роботи в індустрії — це дозволяє з першого разу спроектувати робочу економіку.
Проектування utility механіки
Як перевірити необхідність токена?
Перед проектуванням токена ми проводимо аналіз: чи можна замінити його на USDC або ETH? Якщо заміна можлива — власний токен не потрібен. Якщо ні — виявляємо унікальну utility. Переконливі причини мати власний токен: Governance (право голосу), Staking для безпеки (валідатори стейкають токен, слешінг при шахрайстві — skin in the game), Protocol revenue sharing (токенхолдери отримують частину комісій), інфляційні нагороди для bootstrap екосистеми. Стейкінг дозволяє знизити витрати на комісії до 20% для держателів токенів.
Capture механіка
Utility-токен повинен захоплювати частину цінності протоколу. Популярні патерни: Fee switch (протокол бере % від операцій, частина йде токенхолдерам або buyback/burn), Staking для доступу (провайдери блокують токени як гарантію), Token-denominated pricing (послуга коштує N токенів). Попит на послугу генерує попит на токен.
Реалізація: staking utility
Типовий utility-токен з staking для доступу до сервісу:
Використовуємо бібліотеку OpenZeppelin для стандартних контрактів.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Permit.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
contract UtilityToken is ERC20, ERC20Permit, AccessControl, ReentrancyGuard {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
bytes32 public constant SERVICE_ROLE = keccak256("SERVICE_ROLE");
uint256 public constant PROVIDER_STAKE_REQUIRED = 10_000 * 10**18; // 10k токенів
struct ProviderStake {
uint256 amount;
uint256 stakedAt;
bool active;
}
mapping(address => ProviderStake) public providerStakes;
mapping(address => uint256) public serviceCredits;
uint256 public constant CREDIT_PRICE = 1 * 10**18;
uint256 public burned;
event ProviderRegistered(address indexed provider, uint256 stake);
event ProviderSlashed(address indexed provider, uint256 amount, string reason);
event CreditsPurchased(address indexed user, uint256 amount);
constructor(address admin, address treasury, uint256 initialSupply)
ERC20("Utility Token", "UTL")
ERC20Permit("Utility Token")
{
_grantRole(DEFAULT_ADMIN_ROLE, admin);
_grantRole(MINTER_ROLE, admin);
_mint(treasury, initialSupply);
}
function stakeAsProvider() external nonReentrant {
require(!providerStakes[msg.sender].active, "Already registered");
require(
balanceOf(msg.sender) >= PROVIDER_STAKE_REQUIRED,
"Insufficient balance"
);
_transfer(msg.sender, address(this), PROVIDER_STAKE_REQUIRED);
providerStakes[msg.sender] = ProviderStake({
amount: PROVIDER_STAKE_REQUIRED,
stakedAt: block.timestamp,
active: true
});
_grantRole(SERVICE_ROLE, msg.sender);
emit ProviderRegistered(msg.sender, PROVIDER_STAKE_REQUIRED);
}
function purchaseCredits(uint256 creditAmount) external nonReentrant {
uint256 tokenCost = creditAmount * CREDIT_PRICE;
require(balanceOf(msg.sender) >= tokenCost, "Insufficient tokens");
uint256 burnAmount = tokenCost * 80 / 100;
uint256 treasuryAmount = tokenCost - burnAmount;
_burn(msg.sender, burnAmount);
burned += burnAmount;
_transfer(msg.sender, treasury, treasuryAmount);
serviceCredits[msg.sender] += creditAmount;
emit CreditsPurchased(msg.sender, creditAmount);
}
function consumeCredits(address user, uint256 amount) external onlyRole(SERVICE_ROLE) {
require(serviceCredits[user] >= amount, "Insufficient credits");
serviceCredits[user] -= amount;
emit CreditsConsumed(user, msg.sender, amount);
}
function slashProvider(
address provider,
uint256 amount,
string calldata reason
) external onlyRole(DEFAULT_ADMIN_ROLE) {
ProviderStake storage stake = providerStakes[provider];
require(stake.active, "Not active provider");
require(amount <= stake.amount, "Exceeds stake");
stake.amount -= amount;
_burn(address(this), amount);
burned += amount;
if (stake.amount < PROVIDER_STAKE_REQUIRED / 2) {
stake.active = false;
_revokeRole(SERVICE_ROLE, provider);
}
emit ProviderSlashed(provider, amount, reason);
}
}
Чому staking — основа utility-токена?
Staking створює зобов'язання у учасників мережі. Провайдери послуг змушені тримати токени як гарантію добросовісності. При порушенні — slashing. Це утримує цінність токена всередині екосистеми. Порівнюючи з buyback: стейкінг для доступу ефективніший за чистий buyback-спалення в 3–5 разів з точки зору утримання користувачів.
Unstaking cooldown
Провайдер не повинен миттєво виводити stake. Cooldown період — захист від slash evasion:
uint256 public constant UNSTAKE_COOLDOWN = 14 days;
mapping(address => uint256) public unstakeRequestedAt;
function requestUnstake() external {
require(providerStakes[msg.sender].active, "Not active");
unstakeRequestedAt[msg.sender] = block.timestamp;
providerStakes[msg.sender].active = false;
_revokeRole(SERVICE_ROLE, msg.sender);
}
function finalizeUnstake() external nonReentrant {
require(unstakeRequestedAt[msg.sender] > 0, "No unstake request");
require(
block.timestamp >= unstakeRequestedAt[msg.sender] + UNSTAKE_COOLDOWN,
"Cooldown not elapsed"
);
uint256 amount = providerStakes[msg.sender].amount;
providerStakes[msg.sender].amount = 0;
unstakeRequestedAt[msg.sender] = 0;
_transfer(address(this), msg.sender, amount);
}
Порівняння механік утримання цінності
| Механіка | Ефективність | Приклад |
|---|---|---|
| Staking для доступу | Висока | BNB, FIL |
| Buyback і burn | Середня | Fee → buyback |
| Fee switch | Висока | AMM протоколи |
| Інфляційні нагороди | Низька (без utility) | DeFi 2.0 |
Розподіл supply
Типовий розподіл для utility-токена протоколу:
| Алокація | % | Vesting |
|---|---|---|
| Команда і радники | 15–20% | 4 роки, cliff 1 рік |
| Інвестори | 15–25% | 2–3 роки, cliff 6 міс |
| Екосистема/гранти | 20–30% | Лінійно 3–5 років |
| Liquidity/DEX | 5–10% | TGE або за потребою |
| Treasury | 20–30% | Governance вирішує |
| Public sale / IDO | 5–15% | Частково TGE |
Загальна сума TGE — бажано не більше 15–20% supply.
Як уникнути антипатернів utility-токена?
Безкорисний buyback — buyback токена з treasury без реального revenue не створює цінності. Circular dependency — токен потрібен для використання протоколу, а протокол — для отримання токена — замкнене коло. Governance без power — токен без права змінювати параметри протоколу декоративний. Ми проектуємо механіки, кожна з яких приносить вимірну користь. Правильна токеноміка може підвищити дохідність постачальників послуг на 30–50%.
Як ми працюємо над проектом utility-токена
- Аналіз: з'ясовуємо, чи потрібен ERC20 токен, і яку utility він принесе.
- Проектування: розробляємо tokenomics та економічні моделі.
- Реалізація: пишемо смарт-контракти на Solidity з використанням OpenZeppelin.
- Тестування: покриваємо unit та fuzz тестами за допомогою Foundry.
- Аудит: перевіряємо код на вразливості (reentrancy, overflow тощо).
- Деплой та верифікація на Etherscan.
- Підтримка: місяць технічної підтримки після запуску.
Якщо ви плануєте запуск токена, зв'яжіться з нами — ми допоможемо спроектувати економіку та реалізувати контракти.
Що входить у розробку utility-токена
- Токеноміка: аналіз та white paper
- Смарт-контракти: Solidity (ERC20, staking, burn, permit)
- Тестування: Foundry (unit + fuzzing)
- Деплой та верифікація на Etherscan
- Інтеграція з гаманцями (MetaMask, WalletConnect)
- Документація для команди
- Технічна підтримка 1 місяць після запуску
Зв'яжіться з нами для оцінки вашого проекту. Отримайте консультацію з tokenomics.







