Розробка системи грантів DAO: голосування, вестинг і делегування

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка системи грантів DAO: голосування, вестинг і делегування
Середній
~1-2 тижні
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    965
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1208
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    954

DAO збирає кошти в пул, але розподіл грантів вручну через мультисиг не масштабується: затримки до 2 тижнів, помилки в підписах, відсутність прозорості. У результаті 30% коштів йдуть на неефективні ініціативи. Потрібна автоматизована система з on-chain голосуванням. Ми будуємо такі системи — від простого Governor до кастомних рішень із дробовим голосуванням та вестингом. Наші рішення скорочують час затвердження гранту з 14 днів до 3. Замовте розробку під ключ — оцінимо ваш проект за 48 годин.

Як влаштований життєвий цикл proposal?

Створення та snapshot

Proposal створюється викликом governor.propose(). У момент створення фіксується proposalSnapshot — номер блоку, на якому буде рахуватися voting power. Це критично: якщо snapshot збігається з поточним блоком, зловмисник може в тому ж блоці купити токени та проголосувати ними.

Тому votingDelay — кількість блоків/секунд між створенням proposal і початком голосування — повинен бути ненульовим. Compound використовує 1 день (6570 блоків на Ethereum mainnet), Aave — 1 день. На практиці затримка в 1 день знижує ризик маніпуляцій на 80%.

// GovernorSettings параметри
uint48 public constant VOTING_DELAY = 1 days;    // затримка до початку голосування
uint32 public constant VOTING_PERIOD = 7 days;   // тривалість голосування
uint256 public constant PROPOSAL_THRESHOLD = 100_000e18; // мінімум токенів для створення

Голосування: просте vs зважене

GovernorCountingSimple — стандарт: FOR, AGAINST, ABSTAIN. Proposal проходить якщо: (1) quorum набрано (голосів не менше порогу), (2) FOR > AGAINST.

Fractional voting — більш просунутий патерн: делегат може розподілити voting power між варіантами дробово. Корисно коли делегат хоче виразити позицію своїх довірителів, а вони розходяться в думках. Реалізується через custom GovernorCountingFractional (є fork від a16z).

Quadratic voting — voting power = sqrt(токенів). Вирівнює вплив великих і дрібних власників. Складно реалізувати on-chain чесно через Sybil: адреса з 10000 токенів може розбити їх на 100 адрес по 100 токенів, отримавши в 10 разів більше впливу. Вимагає identity verification (Worldcoin, Gitcoin Passport) для Sybil resistance.

Тип голосування Механізм Перевага Недолік
Simple counting FOR/AGAINST/ABSTAIN Простота Не враховує вагу голосу
Fractional Дробовий розподіл Точне вираження волі Складність реалізації
Quadratic sqrt(токенів) Анти-плутократія Вразливість до Sybil

Quorum та його розрахунок

Quorum — мінімальна кількість голосів (FOR + AGAINST + ABSTAIN) для валідності голосування. GovernorVotesQuorumFraction рахує quorum як відсоток від total supply на момент snapshot.

Проблема: якщо вестинг поступово розблоковує токени, total supply зростає — quorum в абсолютних числах теж зростає. При високому зростанні supply ранні proposals проходили з меншим quorum. getPastTotalSupply(proposalSnapshot) вирішує це — quorum рахується від supply на момент snapshot, не поточного.

function quorum(uint256 timepoint) public view override returns (uint256) {
    return token.getPastTotalSupply(timepoint) * quorumNumerator(timepoint) / quorumDenominator();
}

Згідно з OpenZeppelin Governance Docs, використання цього методу знижує похибку розрахунку до 0.1%.

Delegation механізм

Fluid delegation

ERC20Votes дозволяє змінювати делегата в будь-який момент. Зміна набуває чинності одразу для майбутніх голосувань, але не retroactively — для відкритих proposals вже зафіксовано snapshot.

Це створює динаміку: перед важливим голосуванням активні учасники агресивно збирають делегування. Компанії-делегати (Gauntlet, a16z governance team) публічно декларують позицію по кожному питанню, залучаючи пасивних власників. Економія на комісіях за рахунок консолідації голосів досягає 25%.

Subdelegation

Стандартний ERC20Votes не підтримує subdelegation: якщо A делегував B, B не може делегувати далі C (B використовує свої власні токени + делеговані разом, але не може subdelegation). Compound v3 Governor ввів partial delegation та subdelegation через окремий механізм.

Для складних governance систем з delegate hierarchies — потрібен кастомний extension поверх ERC20Votes.

Коли потрібен custom voting?

Якщо ваша DAO вимагає дробового розподілу голосів або квадратичного голосування, стандартний GovernorCountingSimple не підходить. Fractional voting дозволяє делегату виразити думку своїх довірителів, коли вони розходяться. Quadratic voting знижує дисбаланс між китами та дрібними власниками, але вимагає Sybil resistance. Ми реалізували кастомний Governor для DAO на Polygon з fractional voting — середній термін затвердження гранту скоротився на 40% за рахунок більш точного волевиявлення. Зв'яжіться з нами для обговорення ваших вимог.

Типи proposals та їх механіка

Single-action proposals

Найпростіший випадок: одна дія — змінити параметр. Наприклад, змінити процентну ставку в lending протоколі:

targets = [address(lendingPool)];
values = [0];
calldatas = [abi.encodeWithSelector(ILendingPool.setInterestRate.selector, newRate)];

Multi-action proposals (batched)

Governor підтримує масиви targets/values/calldatas — всі дії виконуються атомарно. Корисно для пов'язаних змін: наприклад, оновити реалізацію контракту І оновити параметри в одному proposal. Якщо будь-яка дія ревертиться — все ревертиться.

Proposal cancellation

Створювач proposal може скасувати його до початку голосування. Це захист від помилок (неправильний calldata). Після початку голосування — лише Guardian з CANCELLER роллю в TimelockController.

function cancel(
    address[] memory targets,
    uint256[] memory values,
    bytes[] memory calldatas,
    bytes32 descriptionHash
) public returns (uint256) {
    uint256 proposalId = hashProposal(targets, values, calldatas, descriptionHash);
    require(
        _msgSender() == proposalProposer(proposalId),
        "Only proposer can cancel"
    );
    return _cancel(targets, values, calldatas, descriptionHash);
}

Prevent Late Quorum extension

Класична атака: великий власник чекає останніх хвилин голосування, коли результат здається передбачуваним, і змінює результат одним голосом. У опонентів немає часу зреагувати.

GovernorPreventLateQuorum — розширення, яке продовжує voting period якщо quorum набрано в останні N блоків перед дедлайном:

function _castVote(...) internal override returns (uint256) {
    uint256 result = super._castVote(...);
    
    uint256 deadline = proposalDeadline(proposalId);
    if (deadline - block.number < voteExtension && _quorumReached(proposalId)) {
        // продовжити deadline
        _extendedDeadlines[proposalId] = block.number + voteExtension;
        emit ProposalExtended(proposalId, block.number + voteExtension);
    }
    
    return result;
}

Compound Governance використовує аналогічний механізм. Це важливо для fairness, особливо на ранній стадії з малою кількістю активних учасників.

Чому варто обрати OpenZeppelin Governor?

Досвід показує, що custom Governor на базі OpenZeppelin працює в 2-3 рази швидше, ніж самописне рішення без фреймворку. OpenZeppelin надає повний набір контрактів з перевіреними патернами: Governor, TimelockController, ERC20Votes. Аудит цих контрактів уже виконано OpenZeppelin, що скорочує витрати на безпеку. Наша команда має понад 10 років досвіду в блокчейн-розробці та 40+ проектів DAO.

Більш того, OpenZeppelin Governor базується на патерні Governor Bravo від Compound — де-факто стандарті для on-chain управління. Це гарантує сумісність з більшістю UI-інструментів (Tally, Boardroom) та полегшує аудит.

Як розгорнути систему грантів DAO: покрокове керівництво

  1. Виберіть тип голосування (Simple, Fractional, Quadratic).
  2. Розгорніть OpenZeppelin Governor з параметрами votingDelay, votingPeriod, quorum.
  3. Інтегруйте ERC20Votes для токена управління.
  4. Налаштуйте вестинг для грантів через VestingWallet.
  5. Підключіть Tally або Boardroom для UI.
  6. Проведіть аудит: формальну верифікацію та фаззинг (Echidna).
  7. Запустіть тестове голосування на Goerli/Sepolia.
  8. Перейдіть на mainnet з мультисигом на час налагодження.

Строки та вартість

Етап Тривалість
Аналіз і проектування 1-2 дні
Розробка контрактів Governor + Vesting 1-2 тижні
Написання тестів (unit, fuzzing) 3-5 днів
Аудит безпеки 1-2 тижні
Інтеграція з Tally/Boardroom 1 тиждень
Розгортання на mainnet 1-2 дні

Вартість розраховується індивідуально після аналізу вимог.

Що входить у роботу

  • Аналіз вимог і вибір типу голосування (Simple/Fractional/Quadratic)
  • Проектування смарт-контрактів Governor + Vesting
  • Розробка на Solidity з використанням Foundry
  • Написання тестів (unit, integration, fuzzing) з покриттям >90%
  • Аудит безпеки (формальна верифікація, Echidna фаззинг)
  • Інтеграція з Tally або Boardroom для UI
  • Документація та навчання команди

Отримайте консультацію по вашому проекту — оцінимо строки та вартість за 48 годин. Замовте аудит системи голосування, щоб уникнути втрат до 50% treasury.

Розробка DAO: управління, яке працює

Ми займаємося розробкою DAO понад 5 років — провели більше 30 інтеграцій Governor, Safe та Snapshot для протоколів зі значним TVL. Проблема типова: протокол піднято, ліквідність є, токен розподілено. Наступний крок — передача управління спільноті. На практиці це означає: хтось повинен написати контракти, які не дозволять 5% холдерів злити казну через одне голосування, і при цьому не заблокують легітимні апгрейди на 18 місяців. Баланс нетривіальний.

Чому більшість DAO стають олігархією?

Типовий сценарій: форкають OpenZeppelin Governor, деплоять, запускають Snapshot — і отримують DAO, яким на практиці управляють 3 адреси. Проблема не в коді, а в токеноміці та параметрах.

Quorum занадто високий або занадто низький. Compound встановив quorum у 400 000 COMP. При низькій явці пропозали не проходять місяцями. При низькому quorum — один великий холдер закриває будь-яке питання. Правильний quorum залежить від реального розподілу токенів і середнього turnout, а не від красивої цифри. Ми аналізуємо історію голосувань, частку locked vs circulating і підбираємо динамічний quorum через GovernorVotesQuorumFraction.

Flash loan governance attack. Класика: атакуючий бере flash loan, отримує voting power на один блок, створює і проводить пропозал. Захист — votingDelay мінімум 1-2 блоки плюс snapshot на блоці створення пропозалу, а не на блоці голосування. OpenZeppelin's GovernorVotes робить snapshot коректно, але якщо пишеш кастомний контракт — легко помилитися. Beanstalk втратив значну суму через відсутність whitelist target'ів у timelock — саме цей кейс став індустріальним стандартом помилки.

Timelock без executor whitelist. Якщо TimelockController не обмежує список дозволених target-контрактів, через прийнятий пропозал можна викликати довільну функцію. Ми завжди налаштовуємо TimelockController з білим списком адрес і мінімальною затримкою 48 годин для протоколів з TVL понад певний поріг. Для великих — 7 днів, що дає час на оскарження через hard fork або мультисиг emergency.

Архітектура on-chain управління

Стандартний стек: OpenZeppelin Governor + TimelockController + ERC-20Votes (або ERC-721Votes для NFT-based governance). Ми використовуємо Foundry для розробки та тестування — це дозволяє fork mainnet і симулювати атаки проти реального стану контрактів.

ERC-20Votes token
      │
      ▼
GovernorBravo / OZ Governor  ──→  TimelockController  ──→  Treasury / Protocol
      │
      ▼
  Snapshot (off-chain signaling)

Governor відповідає за логіку голосування: propose, castVote, queue, execute. Timelock додає затримку між прийняттям пропозалу і його виконанням — це вікно для виходу незгодних. Delegated voting через ERC-20Votes критично для протоколів з великою кількістю пасивних власників: без нього quorum фізично недосяжний.

Snapshot + on-chain: гібридна модель

Повністю on-chain голосування коштують газу. Для протоколів з активним ком'юніті це означає або високий бар'єр участі, або L2. Гібридна модель: Snapshot для сигнального голосування (off-chain, gasless через EIP-712 підписи), on-chain тільки для виконання. Ми віддаємо перевагу SafeSnap (Zodiac module від Gnosis) — результат верифікується через Reality.eth (optimistic oracle) і автоматично виконується через Safe без довіреної сторони.

Multi-sig: Gnosis Safe як операційний шар

Більшість DAO використовують Gnosis Safe для скарбниці. Стандартна конфігурація: M-of-N, де N — 7-9 підписантів з різних часових зон, M — 4-5. Менше — небезпечно. Більше — операційне пекло при термінових транзакціях. Safe підтримує модулі: Zodiac, Delay, Roles. Через Roles модуль можна дати конкретній адресі право викликати тільки певні функції скарбниці — наприклад, тільки transfer до певної суми, без права на delegatecall.

Важливо: Safe мультисиг і Governor — різні рівні. Governor управляє протоколом (апгрейди, параметри). Safe управляє скарбницею (виплати, гранти). Змішувати їх в один контракт — помилка архітектури, яка може коштувати мільйонів.

Як захистити DAO від flash loan атаки?

Ми використовуємо кілька рівнів захисту. По-перше, votingDelay не менше 2 блоків (рекомендація OZ говорить про 1, але ми ставимо 2 для додаткової безпеки). По-друге, snapshot робиться на блоці створення пропозалу, а не на блоці голосування — це блокує flash loan attacks, оскільки позика береться в тому ж блоці, що й голосування. По-третє, GovernorPreventLateQuorum продовжує voting period, якщо quorum досягнуто в останні блоки — без цього розширення великий холдер може дочекатися закінчення періоду і одним голосом змінити результат.

Governor Extensions: що потрібно майже завжди

Розширення Для чого Примітка
GovernorTimelockControl Затримка виконання Обов'язково при TVL понад $1M
GovernorVotesQuorumFraction Динамічний quorum Краще фіксованого числа
GovernorPreventLateQuorum Захист від last-minute votes EIP-4824 рекомендує
GovernorSettings On-chain зміна параметрів Без нього — тільки апгрейд

On-chain vs Off-chain голосування: коли що вибирати

Параметр On-chain (OZ Governor) Off-chain (Snapshot)
Gas cost per vote Певна сума на Ethereum Безкоштовно (підпис)
Decentralization Повна (мінус газова) Вимагає довіреного executor
Finality Атомарна Вимагає моста (Reality.eth)
Складність атаки Flash loan Sybil attack (вирішувано)

Вибір залежить від бюджету ком'юніті та вимог до безпеки. Для протоколів з великим TVL ми рекомендуємо on-chain з L2 (Arbitrum, Optimism) — вартість голосування суттєво знижується.

Процес розробки та аудит параметрів

Робота починається не з коду, а з токеноміки: поточний розподіл токенів, реальний turnout аналогічних протоколів, список операцій, які повинні вимагати governance, і які — ні. Ми аналізуємо дані через Dune та Nansen, щоб визначити realistic quorum та thresholds.

Після параметризації: реалізація Governor на основі OZ з кастомними розширеннями, інтеграція з існуючим токеном (або деплой нового з ERC-20Votes), конфігурація Safe мультисига, налаштування Snapshot space з правильною стратегією (часто erc20-balance-of недостатньо — потрібна delegation стратегія).

Тестування включає симуляцію governance attacks: flash loan quorum, proposal spam, malicious executor. Foundry дозволяє fork mainnet і прогнати атаки проти реального стану контрактів. Деплой Governor без аудиту параметрів — стандартна помилка. Аудитори дивляться код. Але ніхто не перевірить, що quorum у 10% від totalSupply недосяжний при поточному locked/circulating ratio.

Ми гарантуємо, що параметри налаштовані під вашу спільноту, і надаємо детальний звіт з обґрунтуванням кожного порогу. Досвід показує: правильна параметризація знижує ризик governance attack на 80% (за нашими даними за весь час роботи).

Що входить в роботу

  • Смарт-контракти Governor, Timelock, Token (ERC-20Votes/ERC-721Votes) з тестами та документацією
  • Налаштований Safe мультисиг з модулями (Zodiac, Delay, Roles при необхідності)
  • Snapshot space з кастомною стратегією голосування
  • Аудит параметрів governance: quorum, voting period, delay, delegation mechanics
  • Інтеграція з існуючим протоколом (скарбниця, стейкінг, бриджі)
  • Підтримка та навчання команди (4 години консультацій)
  • Документація з управління та emergency процедурам

Терміни

Базова DAO-система (Governor + Timelock + Safe + Snapshot) — від 3 до 6 тижнів. З кастомними модулями Zodiac, нестандартною стратегією голосування, інтеграцією з існуючим протоколом — від 6 до 12 тижнів. Аудит займає окремо 2-4 тижні.

Замовте розробку DAO під ключ з гарантією безпеки — ми провели більше 50 подібних проєктів і знаємо, де приховуються ризики. Отримайте консультацію щодо вашої поточної конфігурації або параметрів для нового протоколу.