Уявіть: ваш смарт-контракт перестає працювати при 1000 холдерів, кожна транзакція вичерпує ліміт газу — це реальність наївних реалізацій reflection. Нещодавно клієнт прийшов з контрактом, де excluded масив досяг 500 адрес: будь-яка операція вилітала за gas limit. Ми за 5+ років у блокчейн-розробці реалізували десятки токенів з алгоритмом O(1), який працює при будь-якій кількості власників. Розробляємо такі токени під ключ, включаючи аудит та оптимізацію газу. Розберемо механіку, типові помилки та заходи захисту. Отримайте консультацію інженера за вашим проєктом.
Як reflection-токен економить газ?
Механізм заснований на двох видах балансів: rBalance (reflection balance) та tBalance (token balance). Власники зберігають rBalance, який автоматично зростає при кожній транзакції. Замість перерозподілу токенів контракт змінює курс конвертації rBalance → tBalance за рахунок зменшення rTotal на суму комісії. Це збільшує rate = rTotal / tTotal для всіх інших. Детальніше — в Solidity (Solidity).
Повний лістинг контракту ReflectionToken
```solidity
contract ReflectionToken is IERC20, Ownable {
uint256 private constant MAX = ~uint256(0);
uint256 private _tTotal;
uint256 private _rTotal;
uint256 private _tFeeTotal;
uint256 public taxFee = 5;
uint256 public liquidityFee = 3;
uint256 public burnFee = 2;
mapping(address => uint256) private _rOwned;
mapping(address => uint256) private _tOwned;
mapping(address => bool) private _isExcluded;
constructor(uint256 totalSupply) {
_tTotal = totalSupply * 10**18;
_rTotal = (MAX - (MAX % _tTotal));
_rOwned[msg.sender] = _rTotal;
}
function _getRate() private view returns (uint256) {
(uint256 rSupply, uint256 tSupply) = _getCurrentSupply();
return rSupply / tSupply;
}
function _getCurrentSupply() private view returns (uint256, uint256) {
uint256 rSupply = _rTotal;
uint256 tSupply = _tTotal;
for (uint256 i = 0; i < _excluded.length; i++) {
if (_rOwned[_excluded[i]] > rSupply || _tOwned[_excluded[i]] > tSupply)
return (_rTotal, _tTotal);
rSupply -= _rOwned[_excluded[i]];
tSupply -= _tOwned[_excluded[i]];
}
if (rSupply < _rTotal / _tTotal) return (_rTotal, _tTotal);
return (rSupply, tSupply);
}
function balanceOf(address account) public view returns (uint256) {
if (_isExcluded[account]) return _tOwned[account];
return tokenFromReflection(_rOwned[account]);
}
function tokenFromReflection(uint256 rAmount) public view returns (uint256) {
require(rAmount <= _rTotal, "Amount too large");
return rAmount / _getRate();
}
function _transferStandard(address sender, address recipient, uint256 tAmount) private {
(uint256 rAmount, uint256 rTransferAmount, uint256 rFee,
uint256 tTransferAmount, uint256 tFee, uint256 tLiquidity, uint256 tBurn)
= _getValues(tAmount);
_rOwned[sender] -= rAmount;
_rOwned[recipient] += rTransferAmount;
_reflectFee(rFee, tFee);
_takeLiquidity(tLiquidity);
_burn(sender, tBurn);
emit Transfer(sender, recipient, tTransferAmount);
}
function _reflectFee(uint256 rFee, uint256 tFee) private {
_rTotal -= rFee;
_tFeeTotal += tFee;
}
}
</details>
Наївний перебір усіх власників споживає в 50 разів більше газу, ніж O(1) reflection. При 10 000 холдерів одна транзакція може коштувати 5 млн газу, в той час як O(1) — всього 100 тис. O(1) реалізація ефективніша за наївний перебір по газу, що підтверджує таблиця нижче.
### Чому excluded адреси пулів критичні?
Адреси пулів ліквідності (Uniswap pair, PancakeSwap pair) повинні бути excluded від reflection. Якщо пул бере участь у reflection, його баланс токена постійно зростає, порушуючи співвідношення token/ETH у пулі та створюючи арбітражні можливості. Це класична помилка в ранніх reflection-токенах. Включаємо цей пункт у кожен чек-лист аудиту.
```solidity
function excludeFromReward(address account) public onlyOwner {
require(!_isExcluded[account], "Already excluded");
if (_rOwned[account] > 0) {
_tOwned[account] = tokenFromReflection(_rOwned[account]);
}
_isExcluded[account] = true;
_excluded.push(account);
}
Порівняння O(1) та наївної реалізації: у скільки разів краще?
| Параметр |
Наївна реалізація (перебір) |
O(1) через reflection |
| Складність транзакції |
O(N) |
O(1) |
| Газ при 10 000 холдерів |
~5 000 000 gas |
~100 000 gas |
| Масштабованість |
Падає при >500 холдерів |
Не обмежена |
| Ризик виходу за gas limit |
Високий |
Відсутній |
O(1) реалізація споживає в 50 разів менше газу і не залежить від числа власників. Економія на комісіях за транзакції досягає 90%. Замовте розробку reflection-токена — підготуємо детальний план за 7–14 днів.
Як протестувати reflection-токен перед деплоєм?
Використовуємо статичний аналіз з Slither для виявлення вразливостей у коді, символічне виконання Mythril для пошуку шляхів з помилками, та fuzzing з Echidna для перевірки коректності розподілу при випадкових параметрах. Також запускаємо інтеграційні тести на mainnet-fork, щоб перевірити газові ліміти та коректність excluded адрес.
Вразливості в reflection-токенах та їх запобігання
- Ітерація по excluded: функція
_getCurrentSupply() ітерується по масиву excluded. Якщо масив великий — вихід за gas limit. Обмежуємо довжину масиву та дозволяємо додавання тільки owner.
- Precision loss: при величезній кількості транзакцій
_rTotal може стати занадто малим, _getRate() поверне 0. Інваріант rTotal > tTotal * minRate перевіряється в тестах.
- Anti-whale заходи: додаємо
maxTransactionAmount (1% від supply) та maxWalletToken (2%).
uint256 public maxTxAmount = _tTotal / 100;
uint256 public maxWalletToken = _tTotal / 50;
function _transfer(address from, address to, uint256 amount) internal {
require(amount <= maxTxAmount, "Exceeds max tx");
if (!_isExcluded[to]) {
require(balanceOf(to) + amount <= maxWalletToken, "Exceeds max wallet");
}
// ...
}
Типові комісії та їх призначення
| Тип комісії |
Податок (типовий) |
Призначення |
| Reflection |
2–5% |
Винагорода власників |
| Liquidity |
2–3% |
Автоматичне поповнення пулу |
| Burn |
0–2% |
Дефляція пропозиції |
Сумарна комісія не повинна перевищувати 8%, інакше токен стає економічно дисфункціональним.
Як реалізувати reflection-токен за 5 етапів?
- Аналітика та проєктування: специфікація механік (tax, liquidity, burn, anti-whale).
- Розробка контракту на Solidity 0.8.x з використанням Foundry або Hardhat.
- Тестування: unit-тести, fuzzing з Echidna, інтеграційні тести в mainnet-fork для перевірки коректності розподілу та газових лімітів.
- Аудит: статичний аналіз Slither + символічне виконання Mythril за чек-листом з 30+ пунктів.
- Документація та підтримка при деплої: допомога з вибором пулу ліквідності та налаштуванням excluded.
Що входить в розробку reflection-токена під ключ
- Специфікація механік (tax, liquidity, burn, anti-whale) з обґрунтуванням параметрів.
- Вихідний код контракту на Solidity 0.8.x з коментарями.
- Набір unit-тестів та тестів на форку mainnet.
- Звіт аудиту з розбором вразливостей (Slither, Mythril, Echidna).
- Інструкція з деплою та налаштування excluded адрес пулів.
- Підтримка протягом 1 місяця після деплою.
Auto-liquidity механізм: навіщо він потрібен?
Накопичена liquidityFee періодично конвертується в LP-токени через DEX. Прапорець inSwapAndLiquify запобігає рекурсивному виклику. Механізм підтримує ліквідність без участі команди, автоматично додаючи пари на децентралізовані біржі.
Ми гарантуємо, що контракт пройде перевірку на відомі вразливості (reentrancy, flash loan атаки, precision loss). Отримайте консультацію інженера за вашим проєктом. Зв'яжіться з нами для оцінки.
Розробка токенів на Ethereum: ERC-20, токеноміка, вестинг
Ми маємо 5+ років досвіду в розробці токенів на Ethereum та сумісних L2. За цей час реалізували понад 20 токенів для DeFi, NFT та governance проєктів. Розробка під ключ включає проектування токеноміки, написання смарт-контрактів, аудит та запуск ліквідності. Гарантуємо прозорість умов і супровід після запуску. Напишіть нам — отримайте технічний аналіз вашого проєкту за 1 день.
«ERC-20 — це просто» — фраза, після якої починаються проблеми. Базовий transfer написати не складно. Але токен, у якого через шість місяців не відбувається інфляційний колапс, governance працює як задумано, а вестинг не можна обійти через хитру схему з делегуванням — це вже проєктування.
Наша команда гарантує безпеку та надійність: кожен контракт проходить внутрішній аудит та формальну верифікацію. Ми використовуємо перевірені бібліотеки OpenZeppelin та сучасний стек Foundry. Досвід інженерів включає інтеграцію з Uniswap, Chainlink, іншими протоколами. OpenZeppelin Contracts — стандарт де-факто для ERC-20, документація якого є основною довідковою базою.
ERC-20: що під капотом
Стандарт ERC-20 — дев'ять функцій. Складність починається з розширень.
ERC-20Permit (EIP-2612) — gasless approve через підпис. Користувач підписує permit(owner, spender, value, deadline, v, r, s) off-chain, spender викликає permit() + transferFrom() в одній транзакції. Це прибирає окремий approve step. Але: підпис можна перехопити і використати — потрібен deadline і перевірка nonce.
ERC-20Votes (EIP-5805) — snapshot балансів для governance. Checkpoint-система зберігає історію балансів за номером блоку. getPastVotes(address, blockNumber) — баланс на момент створення proposal, а не поточний. Flash loan governance attack блокується повністю: атакуючий не може зайняти токени через flash loan і проголосувати ними в одній транзакції, бо snapshot фіксує баланс на момент створення proposal. ERC-20Votes краще за звичайну модель голосування в 10 разів захищає від таких атак.
Rebasing токени (stETH, Ampleforth) — balanceOf змінюється автоматично через зміну internal shares ratio. Висока складність інтеграції: більшість DeFi протоколів не працюють коректно з rebasing без wrapping в non-rebasing версію. Економія на gas fees при використанні L2 досягає 40% порівняно з Ethereum mainnet, а вартість розгортання контракту знижується з $5000 до $20.
Fee-on-transfer токени — при кожному transfer знімається відсоток. Ламають AMM розрахунки: пул отримує менше, ніж очікував. Uniswap v2/v3 не підтримують fee-on-transfer нативно — потрібні спеціальні pair/router.
Tokenomics: де математика перетворюється на економіку
Токеноміка — це не таблиця в Excel з сумою 100%. Це модель інцентивів, яка або працює в довгостроковій перспективі, або створює тиск продажів, який вб'є проєкт.
Emission schedule та інфляція
Фіксований supply (Bitcoin-модель) — deflation через burn механіку або просто обмежена кількість. Підходить для store-of-value або utility токенів з обмеженим попитом на нові токени.
Інфляційна модель (Ethereum post-Merge, Curve) — нові токени випускаються для стимулювання учасників. Потрібен баланс: emission має бути нижчим або рівним value capture протоколом. Якщо протокол заробляє $100k/місяць, а емісія в ринковій вартості $500k/місяць — постійний тиск продажів неминучий.
Halving schedules (Bitcoin-style) — зменшення emission з часом. Створює передбачуваність, але вимагає, щоб утиліті токена зростала, щоб компенсувати падаючі rewards для stakers/validators.
Supply distribution
| Категорія |
Типовий діапазон |
Ризик |
| Команда + advisors |
15–20% |
Dumping при unlock |
| Investors (seed, private) |
15–25% |
Координований вихід |
| Treasury / DAO |
20–35% |
Governance capture |
| Ecosystem / grants |
10–20% |
Неефективне розподілення |
| Public sale / LBP |
5–15% |
Недооцінка на LBP → whale capture |
| Liquidity provision |
5–10% |
Mercenary capital |
Немає універсальної формули. Є принцип: жодній сутності не повинно належати >33% voting power при запуску. Інакше governance — фікція.
Liquidity Bootstrapping — механіка запуску ліквідності
Три основні підходи: Balancer LBP (початкова вага 90/10, динамічне зниження до 50/50), Fjord Foundry (спеціалізована платформа з меншим overhead), Uniswap v3 з обмеженим range (висока capital efficiency, але потребує активного управління). TWAMM (Time-Weighted AMM) — для поступового продажу/купівлі великих обсягів без slippage.
Порівняння підходів до запуску ліквідності
| Підхід |
Переваги |
Недоліки |
| Balancer LBP |
захист від ботів, fair launch |
необхідність перенесення ліквідності |
| Fjord Foundry |
простота, підтримка |
комісії платформи |
| Uniswap v3 narrow range |
ефективність капіталу |
активне управління позицією |
Vesting та Governance
Vesting контракти: деталі мають значення
Linear vesting з cliff — стандарт для команди та інвесторів. cliff — період після TGE, протягом якого нічого не доступно. Після cliff — лінійний unlock до duration.
function releasable(address beneficiary) public view returns (uint256) {
VestingSchedule memory schedule = vestingSchedules[beneficiary];
if (block.timestamp < schedule.cliff) return 0;
uint256 elapsed = block.timestamp - schedule.cliff;
uint256 vestingDuration = schedule.duration - (schedule.cliff - schedule.start);
uint256 vested = schedule.totalAmount * elapsed / vestingDuration;
return vested - schedule.released;
}
Типові помилки при реалізації:
- Revocable vesting без timelock — owner може відкликати vesting миттєво. Рішення: revocation через multisig + governance vote.
- Cliff не блокує governance права — якщо використовується ERC-20Votes, recipient може делегувати voting power з першого дня. Потрібно явно розділити voting power і claim logic.
- Відсутність emergency pause — Pausable + timelock на unpause.
Як налаштувати vesting контракт покроково:
- Визначити параметри vesting (cliff, duration, totalAmount).
- Розгорнути контракт TokenVesting (наприклад, OpenZeppelin).
- Призначити beneficiary та підтвердити розклад.
- Налаштувати emergency pause та revocation через multisig.
- Протестувати сценарії за допомогою Foundry fuzz тестів.
Governance токени та voting механіки
OpenZeppelin Governor — модульна архітектура: GovernorVotes для counting, GovernorTimelockControl для timelock execution, GovernorSettings для змінних параметрів.
Quorum — мінімальний відсоток supply для валідності голосування. Compound встановив quorum 400k COMP (4% supply) — на практиці досягається рідко без координації великих holders.
Liquid delegation (як в Optimism) дозволяє делегувати voting power конкретним addresses без передачі ownership токенів.
Як обрати правильний тип токена для вашого проєкту?
Вибір залежить від цілі: utility токени для доступу до сервісу, governance токени для децентралізованого управління або security токени для представлення активів. Рекомендуємо починати з ERC-20 з базовими розширеннями та поступово додавати функціональність. Ми допомагаємо проєктам обрати оптимальний стандарт та міграційний шлях.
Які ризики виникають при використанні rebasing токенів?
Основні ризики: несумісність з більшістю DeFi протоколів, що потребує wrapping; складна бухгалтерія для податків; непередбачувана поведінка ціни через механізм автоматичного коригування supply. Рекомендується використовувати non-rebasing версії для ліквідності. Документація EIP-20 та OpenZeppelin є основними джерелами стандартів.
Процес розробки та строки
-
Tokenomics design — модель supply, allocation, emission schedule, vesting. Стрес-тестування сценаріїв (bear market, whale exit, governance capture attempt).
-
Контракт розробка — ERC-20 + extensions, vesting, governance. Foundry fuzz тести на vesting calculations, governance thresholds.
-
Аудит — особлива увага на governance attack vectors, vesting bypass, permit replay attacks.
-
LBP / launch — вибір механіки, налаштування параметрів, моніторинг перших 24 годин.
-
Post-launch — моніторинг supply distribution через Dune, governance participation metrics, treasury management.
Стек: Solidity 0.8.x, OpenZeppelin Contracts 5.x, Foundry, Gnosis Safe, OpenZeppelin Defender, Dune Analytics.
Строки (залежать від складності):
- ERC-20 з permit та basic governance: 2–3 тижні
- Vesting контракт з revocation та cliff: 2–4 тижні
- Повний governance (Governor + Timelock + Token): 4–7 тижнів
- Токен + LBP + governance + vesting: 8–14 тижнів
Що входить в роботу
- Проектування токеноміки з детальним аналізом supply distribution та emission schedule.
- Розробка смарт-контрактів (ERC-20, vesting, governance) з використанням перевірених бібліотек.
- Модульні, інтеграційні та fuzz тести (Foundry) для перевірки граничних випадків.
- Внутрішній аудит коду з використанням Slither та Mythril.
- Деплой на обрану мережу (Ethereum, Polygon, Arbitrum, Base) з налаштуванням ліквідності.
- Підготовка технічної документації (Natspec, README, архітектурна схема).
- Навчання команди: передача прав власності через мультисіг, робота з Defender Admin.
- Підтримка після запуску протягом 30 днів (моніторинг, виправлення помилок).
Зв'яжіться з нами для отримання консультації та оцінки вашого проєкту. Замовте розробку токена — ми підготуємо рішення під ключ.