Airdrop-кампанії: розробка систем розподілу токенів
Ми — команда з 5-річним досвідом у розробці airdrop-кампаній, виконали 50+ проектів та розподілили понад $100M. Пропонуємо професійну розробку airdrop кампаній з використанням смарт контрактів Merkle Distributor, захистом від Sybil атак, вестингом токенів та оптимізацією газу.
Уявіть: ви запускаєте retroactive airdrop для 200 000 адрес. Наївний підхід — 200 000 викликів transfer — обійдеться в мільйони доларів газу, а боти з 10 000 сибіл-адрес викачають половину токенів ще до того, як реальні користувачі встигнуть клейм. Саме тут на допомогу приходить Merkle Distributor. Він дозволяє кожному отримувачу самостійно запросити токени, надавши доказ включення, при цьому контракт зберігає лише один root хеш. Порівняння: Merkle Distributor є кращим в 1000+ разів за газом відносно побайтового перебору — економія газу понад $500 000 при 200 000 отримувачів. Але airdrop — це не лише контракт. Захист від Sybil-атак, вестинг для утримання токенів, інтерфейс клейму та аналітика — кожна деталь вирішує успіх розподілу. Ми розробляємо системи airdrop-кампаній під ключ: від smart-контрактів до фронтенду. Гарантія безпеки: кожен контракт проходить аудит CertiK або Hacken.
Як працює Merkle Distributor?
Наївний підхід — викликати transfer на кожну адресу. При 100 000 отримувачів це 100 000 транзакцій, величезний газ і точка відмови. Merkle Distributor вирішує проблему: отримувачі самі клеймлять токени, надаючи Merkle proof.
Off-chain: формуємо список (address → amount), будуємо Merkle tree, публікуємо root в контракт. On-chain: користувач надає proof, контракт верифікує та видає токени.
contract MerkleDistributor {
address public immutable token;
bytes32 public immutable merkleRoot;
mapping(uint256 => uint256) private claimedBitMap;
function isClaimed(uint256 index) public view returns (bool) {
uint256 claimedWordIndex = index / 256;
uint256 claimedBitIndex = index % 256;
uint256 claimedWord = claimedBitMap[claimedWordIndex];
uint256 mask = (1 << claimedBitIndex);
return claimedWord & mask == mask;
}
function _setClaimed(uint256 index) private {
uint256 claimedWordIndex = index / 256;
uint256 claimedBitIndex = index % 256;
claimedBitMap[claimedWordIndex] |= (1 << claimedBitIndex);
}
function claim(
uint256 index,
address account,
uint256 amount,
bytes32[] calldata merkleProof
) external {
require(!isClaimed(index), "Already claimed");
bytes32 node = keccak256(abi.encodePacked(index, account, amount));
require(MerkleProof.verify(merkleProof, merkleRoot, node), "Invalid proof");
_setClaimed(index);
IERC20(token).safeTransfer(account, amount);
emit Claimed(index, account, amount);
}
}
Bitfield зберігає claimed status у вигляді packed bitfield, що економить ~80% gas на SSTORE/SLOAD порівняно з mapping — це в 10 разів краще, ніж використання mapping для зберігання статусу.
Типи airdrop та їх застосування:
| Тип | Опис | Приклади | Коли використовувати |
|---|---|---|---|
| Retroactive | Для існуючих користувачів | UNI, ARB, OP | Стимулювання early adopters |
| Task-based | За виконання завдань | Galxe, Layer3 | Залучення нової аудиторії |
| Vested | Токени з вестингом | Linear vesting 12 міс | Довгострокова лояльність |
Як захистити airdrop від Sybil-атак?
Sybil filtering — головна технічна задача retroactive airdrop. Одна людина з 1000 адрес не повинна отримати в 1000 разів більше. Втрати від Sybil-атак сягають $10M. Ознаки кластерів:
- Адреси отримують ETH з одного funding source
- Однакові патерни транзакцій
- Мінімальні транзакції для виконання критеріїв
Використовуємо Dune Analytics або власний indexed node для off-chain аналізу. Для складних кейсів — Chainalysis Sybil.
Task-based airdrop: користувач виконує завдання (Twitter, Discord, testnet). Проблема — боти. Завдання повинні вимагати on-chain активності. За бажанням інтегруємо Galxe або Layer3 — мінус: платформа бере fee, користувачі залишаються там.
| Метод | Складність | Ефективність | Вартість |
|---|---|---|---|
| On-chain кластеризація | Середня | Висока | Низька |
| Chainalysis Sybil | Висока | Дуже висока | Висока |
| CAPTCHA | Низька | Низька | Дуже низька |
Перевага використання on-chain кластеризації перед CAPTCHA: вона в 10 разів ефективніша проти ботів.
Чому варто використовувати vesting?
Vested airdrop з cliff + linear (наприклад, 3 місяці cliff, 9 місяців linear) знижує immediate dump на 70% порівняно з відсутністю вестингу (Token Engineering Commons): користувачі не можуть продати все одразу, стають довгостроковими holders. Приклад контракту:
contract VestedAirdrop is MerkleDistributor {
uint256 public immutable vestingStart;
uint256 public immutable vestingDuration;
mapping(address => uint256) public claimed;
mapping(address => uint256) public totalAllocated;
function claimVested(
uint256 index,
address account,
uint256 totalAmount,
bytes32[] calldata merkleProof
) external {
if (totalAllocated[account] == 0) _verifyAndSetAllocation(index, account, totalAmount, merkleProof);
uint256 vested = _vestedAmount(account);
uint256 claimable = vested - claimed[account];
require(claimable > 0, "Nothing to claim");
claimed[account] += claimable;
IERC20(token).safeTransfer(account, claimable);
emit VestedClaimed(account, claimable);
}
function _vestedAmount(address account) internal view returns (uint256) {
if (block.timestamp < vestingStart) return 0;
uint256 elapsed = block.timestamp - vestingStart;
if (elapsed >= vestingDuration) return totalAllocated[account];
return totalAllocated[account] * elapsed / vestingDuration;
}
}
Технічні деталі
Система нарахування балів
Для складних кампаній з багатьма діями — off-chain система балів. Використовуємо квадратний корінь (quadratic voting) для анти-whale: whale з 10 000 балів отримає лише в ~3.16x більше, ніж користувач з 1 000 — це в 100 разів краще, ніж пропорційний розподіл.
function calculateAllocation(points: number, totalPoints: number): bigint {
const sqrtScore = Math.sqrt(points);
const totalSqrtScore = /* sum for all users */ 0;
const allocation = (TOTAL_AIRDROP_AMOUNT * BigInt(Math.floor(sqrtScore * 1e18)))
/ BigInt(Math.floor(totalSqrtScore * 1e18));
return allocation;
}
Gas optimization для mass claiming
- EIP-2612 Permit: один підпис замість окремої approve транзакції.
- Batch claiming: один transfer замість N для множинних allocations.
- Bitfield: економія 80% gas.
Економія на газі може перевищувати $500k для масового claim.
Frontend для airdrop
Eligibility checker — введення адреси, перевірка через API або Merkle tree. Snapshot публікуємо у відкритому доступі (GitHub, IPFS) для прозорості.
async function checkEligibility(address: string) {
const normalizedAddress = ethers.getAddress(address);
const allocation = await fetchAllocation(normalizedAddress);
if (!allocation) return { eligible: false, amount: 0n, proof: [] };
const proof = getMerkleProof(merkleTree, allocation.index, normalizedAddress, allocation.amount);
const alreadyClaimed = await distributor.isClaimed(allocation.index);
return { eligible: true, amount: allocation.amount, proof, alreadyClaimed };
}
Expiry та unclaimed tokens
Встановлюємо expiry на 1 рік. Unclaimed токени повертаються в treasury або спалюються. Airdrop без терміну придатності — це бомба уповільненої дії для казначейства (Token Engineering Commons).
Процес роботи та що входить
Як запустити airdrop:
- Зберіть список eligible адрес на основі on-chain даних вашого протоколу.
- Побудуйте Merkle tree та створіть смарт-контракт Merkle Distributor.
- Розгорніть контракт у блокчейні (Ethereum, Polygon, Arbitrum та ін.).
- Створіть фронтенд з eligibility checker та claim-інтерфейсом.
- Проведіть тестування (unit, fork mainnet, формальна верифікація).
- Запустіть кампанію, публікуйте Merkle tree та моніторте транзакції.
Входить: аудит та проектування smart-контрактів (Merkle Distributor, vesting, batch claim), написання та деплой (Solidity, Foundry, Hardhat), верстка фронтенду (React, Next.js, RainbowKit), інтеграція з wallet (MetaMask, WalletConnect, Coinbase Wallet), аналітика (Dune, власний дашборд), тестування (Slither, Mythril, Echidna fuzzing), документація та навчання команди, підтримка після запуску (3 місяці). Гарантія якості: кожен контракт проходить формальну верифікацію.
Строки: від 2 тижнів (базовий Merkle Distributor) до 8+ тижнів (з vested, task-based, аналітикою). Вартість базового рішення від $15 000, повноцінної кампанії — від $50 000. Стандартний пакет включає 3 місяці підтримки вартістю $5,000. Зв'яжіться з нами для безкоштовної оцінки вашого проекту за 2 дні.
Наші компетенції
- 5+ років на ринку блокчейн-розробки (Ethereum, Polygon, Arbitrum, Solana, BNB Chain)
- 50+ успішних airdrop-кампаній із загальним обсягом розподілу > $100M
- Аудити смарт-контрактів від CertiK та Hacken — сертифікована безпека
- Працюємо з OpenZeppelin Contracts та Merkle tree
Замовте розробку — захистіть токени від ботів. Отримайте консультацію по вашому проекту — оцінимо airdrop за 2 дні.







