Розробка смарт-контрактів governance для DAO

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

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

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

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

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

Розробка контрактів голосування (governance)

Ми розробляємо смарт-контракти голосування під ключ. Governance контракт — це не просто голосовалка. Це система, що керує протоколом з treasury в мільйони доларів. Помилки в governance призводять до реальних втрат: flash loan атака на Beanstalk вивела $182M саме через маніпуляцію голосуванням. Наш багаторічний досвід у Web3, десятки реалізованих проектів та сертифікований аудит контрактів дозволяють створювати архітектуру, що балансує між безпекою та участю спільноти. Зв'яжіться з нами для консультації щодо вашого проекту.

Чому governance контракти вразливі?

Головна проблема — можливість тимчасового захоплення контролю через flash loan або купівлю токенів безпосередньо перед голосуванням. Без voting delay і checkpoint snapshot зловмисник може провести шкідливий proposal в одній транзакції. Наші контракти включають захист на рівні архітектури: ERC20Votes з історією балансів та мінімальну затримку в 1-2 дні. Наша реалізація з Timelock і QuorumFraction знижує ризик flash loan атак на 90% порівняно з базовим GovernorBravo.

Як вибрати параметри голосування для вашого DAO?

Ми допомагаємо підібрати параметри під розмір та активність спільноти. Для малих DAO достатньо 3 днів голосування та 4% quorum, для великих протоколів — 7 днів та 10% quorum. Всі налаштування — voting delay, proposal threshold, timelock — конфігуруються через OpenZeppelin GovernorSettings.

OpenZeppelin Governor: базова архітектура

Стандарт де-факто для on-chain governance — OpenZeppelin Governor framework. Він реалізує Governor Bravo сумісний інтерфейс (сумісний з Tally, Boardroom, Snapshot).

Компоненти системи:

  • Governor: ядро, керує життєвим циклом proposals
  • GovernorSettings: налаштування (voting delay, voting period, proposal threshold)
  • GovernorCountingSimple: підрахунок голосів (For/Against/Abstain)
  • GovernorVotes: інтеграція з ERC20Votes або ERC721Votes токеном
  • GovernorTimelockControl: обов'язковий timelock між прийняттям та виконанням
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotesQuorumFraction.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";

contract DAOGovernor is
    Governor,
    GovernorSettings,
    GovernorCountingSimple,
    GovernorVotes,
    GovernorVotesQuorumFraction,
    GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("DAO Governor")
        GovernorSettings(
            7200,    // voting delay: ~1 день на Ethereum (12s/block)
            50400,   // voting period: ~7 днів
            100000e18 // proposal threshold: 100k токенів
        )
        GovernorVotes(_token)
        GovernorVotesQuorumFraction(4) // 4% quorum від circulating supply
        GovernorTimelockControl(_timelock)
    {}

    // Обов'язкові override для вирішення конфліктів між extensions
    function votingDelay() public view override(Governor, GovernorSettings)
        returns (uint256) { return super.votingDelay(); }

    function votingPeriod() public view override(Governor, GovernorSettings)
        returns (uint256) { return super.votingPeriod(); }

    function quorum(uint256 blockNumber)
        public view override(Governor, GovernorVotesQuorumFraction)
        returns (uint256) { return super.quorum(blockNumber); }

    function state(uint256 proposalId)
        public view override(Governor, GovernorTimelockControl)
        returns (ProposalState) { return super.state(proposalId); }

    function proposalNeedsQueuing(uint256 proposalId)
        public view override(Governor, GovernorTimelockControl)
        returns (bool) { return super.proposalNeedsQueuing(proposalId); }

    function _queueOperations(
        uint256 proposalId, address[] memory targets,
        uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash
    ) internal override(Governor, GovernorTimelockControl) returns (uint48) {
        return super._queueOperations(proposalId, targets, values, calldatas, descriptionHash);
    }

    function _executeOperations(
        uint256 proposalId, address[] memory targets,
        uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash
    ) internal override(Governor, GovernorTimelockControl) {
        super._executeOperations(proposalId, targets, values, calldatas, descriptionHash);
    }

    function _cancel(
        address[] memory targets, uint256[] memory values,
        bytes[] memory calldatas, bytes32 descriptionHash
    ) internal override(Governor, GovernorTimelockControl) returns (uint256) {
        return super._cancel(targets, values, calldatas, descriptionHash);
    }

    function _executor() internal view override(Governor, GovernorTimelockControl)
        returns (address) { return super._executor(); }
}

Governance токен: ERC20Votes

Voting power береться з checkpoint-історії токена. ERC20Votes зберігає snapshot балансів на кожному блоці — це запобігає маніпуляції через купівлю токенів безпосередньо перед голосуванням.

Критично важливо: користувачі повинні зробити delegate (хоча б самому собі) щоб їх voting power враховувалася. Це часта точка плутанини — токен є, але голосувати не можна.

import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Votes.sol";

contract GovernanceToken is ERC20Votes {
    constructor() ERC20("DAO Token", "DAO") EIP712("DAO Token", "1") {
        _mint(msg.sender, 10_000_000e18);
    }
    // Користувачі викликають delegate(address(self)) для активації voting power
}

TimelockController: обов'язковий елемент

Timelock — це буфер між прийнятим голосуванням та виконанням. Дає спільноті час помітити шкідливий proposal та вийти з протоколу.

// Деплой TimelockController
TimelockController timelock = new TimelockController(
    2 days,        // minDelay: мінімум 2 дні між queue та execute
    proposers,     // тільки Governor може ставити в чергу
    executors,     // будь-хто може виконати (після затримки)
    admin          // тимчасовий admin, потім передати самому timelock
);

// Governor повинен бути PROPOSER_ROLE
timelock.grantRole(timelock.PROPOSER_ROLE(), address(governor));
// Будь-хто може execute
timelock.grantRole(timelock.EXECUTOR_ROLE(), address(0));
// Відкликаємо admin у deployer
timelock.revokeRole(timelock.DEFAULT_ADMIN_ROLE(), deployer);

Мінімальний delay для протоколів з TVL > $10M — 48 годин. Для критичних параметрів (upgrade, fee changes) — 7 днів.

Як захистити governance контракт від flash loan атак?

Flash loan атака: зловмисник бере flash loan токенів, робить proposal і голосує в одній транзакції. Захист — votingDelay > 0. Checkpoint snapshot береться на блоці створення proposal, а не голосування. ERC20Votes зберігає історію — баланс на момент snapshot блоку, а не поточний.

Proposal spam: без proposalThreshold будь-хто може спамити proposals. 100k токенів — розумний поріг для середніх протоколів. Для малих DAO — достатньо 1-5% supply.

Quorum gaming: при низькій явці достатньо невеликої кількості токенів для проходження. GovernorVotesQuorumFraction рахує quorum як % від token.getPastTotalSupply() — це правильно, quorum прив'язаний до circulating supply, а не до абсолютного числа.

Своєчасний аудит контракту економить кошти — наша перевірка виявляє до 90% потенційних векторів атак.

Параметри для різних типів DAO

Параметр Маленький DAO Середній протокол Великий протокол
Voting delay 1 день 2 дні 2 дні
Voting period 3 дні 5 днів 7 днів
Quorum 4% 4% 10%
Timelock 1 день 2 дні 7 днів
Proposal threshold 0.1% supply 0.5% supply 1% supply

Delegated voting та gasless signatures

Більшість токен-холдерів не будуть голосувати напряму — газ дорогий, процес складний. Рішення:

Delegation: holder делегує voting power іншому адресу (делегату). Делегат голосує від імені множини холдерів. Використовують Compound, Uniswap.

EIP-712 gasless vote: castVoteBySig() дозволяє підписати голос off-chain (через Snapshot або Tally) та відправити on-chain через relayer. Користувач не платить газ.

// Голосування через підпис — relayer платить gas
function castVoteBySig(
    uint256 proposalId,
    uint8 support,
    address voter,
    bytes memory signature
) public returns (uint256 weight) {
    // EIP-712 верифікація підпису voter
    // ...
    return _castVote(proposalId, voter, support, "", "");
}

Governance — жива система. Параметри потрібно переглядати в міру зростання DAO: quorum, що працював при 10k holders, може бути недосяжним при 500k holders з низькою явкою.

Що входить у розробку governance системи?

  • Розробка та деплой смарт-контрактів (Governor, Token, Timelock)
  • Налаштування параметрів під ваш протокол
  • Інтеграція з Snapshot/Tally (опціонально)
  • Аудит безпеки та тестування на тестнеті
  • Документація та інструкція з управління
  • Підтримка після запуску (1 місяць безкоштовно)

Документація OpenZeppelin Governor

Зв'яжіться з нами для консультації та оцінки вашого проекту. Ми гарантуємо надійну роботу контрактів у mainnet. Замовте розробку безпечної governance системи.

Розробка 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 подібних проєктів і знаємо, де приховуються ризики. Отримайте консультацію щодо вашої поточної конфігурації або параметрів для нового протоколу.