Реалізація DAO-порталу на сайті
Децентралізовані автономні організації (DAO) стикаються з проблемами: газ-затратні транзакції відштовхують учасників, відсутність делегування знижує вплив дрібних тримачів, а ручне створення пропозицій потребує calldata — біль для користувачів. Ми побудували портал, який закриває ці прогалини: пропозиції з квадратичним зважуванням, делегування, інтеграція off-chain Snapshot для сигнальних голосів та індексація через The Graph. Розповім як це зробити правильно. Середня вартість такого DAO-порталу — від $30,000.
Як DAO-портал вирішує проблеми управління?
Перша проблема — залученість. Якщо голосування потребує gas, користувачі йдуть. Snapshot вирішує це off-chain, але виконання залишається on-chain. Ми підключаємо Timelock Controller: сигнальне голосування → виконавчий Governor. Використання L2 знижує витрати на газ у 400 разів (з 200k до 500 gas). Друга — централізація прав. Без делегування дрібні тримачі не впливають. Вводимо Delegation Mapping (як Aave). Третя — складність створення пропозицій. Ручне кодування calldata — біль. Робимо форму з автогенерацією бінарних даних через encodeFunctionData з Viem.
Архітектура DAO-порталу
Дворівнева: off-chain (Snapshot) для сигнальних голосів та on-chain (Governor + Timelock) для обов'язкових. Governance Token використовує EIP-2612 для делегування без зайвих транзакцій. Розмір одного on-chain голосування — близько 200 000 gas, але з L2 (Arbitrum, Polygon) витрати падають до 500 gas (економія 99.75%).
Код смарт-контракту Governor
// 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/GovernorTimelockControl.sol"; contract DAOGovernor is Governor, GovernorSettings, GovernorCountingSimple, GovernorVotes, GovernorTimelockControl { constructor( IVotes _token, TimelockController _timelock ) Governor("DAO Governor") GovernorSettings( 1 days, // voting delay 7 days, // voting period 100_000e18 // proposal threshold ) GovernorVotes(_token) GovernorTimelockControl(_timelock) {} // 4% токенів потрібно для кворуму function quorum(uint256 blockNumber) public view override returns (uint256) { return token.getPastTotalSupply(blockNumber) * 4 / 100; } } OpenZeppelin Governor API
Frontend: створення пропозиції
Користувач заповнює форму: адреса контракту, метод (ABI), аргументи. Кодуємо виклик, відправляємо транзакцію в Governor. Використовуємо wagmi та Viem.
Код створення пропозиції
import { useWriteContract, useAccount } from 'wagmi'; import { encodeFunctionData } from 'viem'; function CreateProposal() { const { writeContractAsync } = useWriteContract(); const handleSubmit = async (formData: ProposalFormData) => { const calldata = encodeFunctionData({ abi: treasuryAbi, functionName: 'transfer', args: [formData.recipient, formData.amount] }); await writeContractAsync({ address: GOVERNOR_ADDRESS, abi: governorAbi, functionName: 'propose', args: [ [TREASURY_ADDRESS], [0n], [calldata], formData.description ] }); }; return <ProposalForm onSubmit={handleSubmit} />; } Frontend: голосування
Відображаємо вагу голосу на момент снепшоту. Кнопки «За», «Проти», «Утримався». Опціонально — причина.
Код голосування
function VoteOnProposal({ proposalId }) { const { writeContractAsync } = useWriteContract(); const { address } = useAccount(); const { data: votingPower } = useReadContract({ address: GOVERNOR_ADDRESS, abi: governorAbi, functionName: 'getVotes', args: [address!, proposalSnapshotBlock] }); const castVote = async (support: 0 | 1 | 2) => { await writeContractAsync({ address: GOVERNOR_ADDRESS, abi: governorAbi, functionName: 'castVoteWithReason', args: [proposalId, support, reason] }); }; return ( <div> <p>Ваша вага голосу: {formatTokens(votingPower)} токенів</p> <button onClick={() => castVote(1)}>За</button> <button onClick={() => castVote(0)}>Проти</button> <button onClick={() => castVote(2)}>Утримався</button> </div> ); } Індексація через The Graph
Щоб показувати історію пропозицій та результати без постійних запитів до ноди, використовуємо The Graph. Піднімаємо subgraph для Governor контракту.
const PROPOSALS_QUERY = gql` query GetProposals($state: String, $first: Int, $skip: Int) { proposals( where: { state: $state } orderBy: createdAt orderDirection: desc first: $first skip: $skip ) { id proposalId proposer { id } description state forVotes againstVotes abstainVotes quorum startBlock endBlock createdAt } } `; Інтеграція Snapshot для сигнальних голосів
Для сигнальних голосувань без газу — Snapshot. Підписуємо мета-транзакцію, дані зберігаються в IPFS. Snapshot дозволяє проводити голосування без газу, що в 1000 разів дешевше за on-chain.
import snapshot from '@snapshot-labs/snapshot.js'; const client = new snapshot.Client712('https://hub.snapshot.org'); await client.proposal(web3, address, { space: 'your-dao.eth', type: 'single-choice', title: 'Прийняти нову стратегію токенів?', body: '## Опис\n\nПовний опис пропозиції...', choices: ['За', 'Проти', 'Утримався'], start: Math.floor(Date.now() / 1000), end: Math.floor(Date.now() / 1000) + 7 * 24 * 3600, snapshot: await web3.eth.getBlockNumber(), plugins: JSON.stringify({}), app: 'your-dao-app' }); Чому on-chain голосування з Timelock безпечніше?
Timelock Controller затримує виконання на заданий час (наприклад, 2 дні). Це дає можливість скасувати шкідливе рішення, якщо його помітити. Рекомендуємо додавати роль CANCELLER для мультисига. Такий підхід використовують провідні DAO — Compound, Uniswap, Aave.
Процес розробки DAO-порталу
- Аналітика: визначаємо механіки голосування, кворум, пороги, типи пропозицій. Обираємо стандарти токенів (ERC-20, ERC-721). Результат — специфікація контрактів.
- Проектування: архітектура контрактів, схеми даних, frontend-маршрути. Результат — технічне завдання.
- Розробка: пишемо смарт-контракти (OpenZeppelin), frontend (Next.js + Wagmi/Viem), subgraph (The Graph). Результат — код з тестами.
- Аудит: статичний аналіз (Slither, MythX) та зовнішній аудит. Результат — звіт аудиту.
- Деплой: розгортаємо на обраній мережі (Ethereum, Polygon, Arbitrum), налаштовуємо IPFS, деплоїмо інтерфейс на Vercel/Cloudflare. Результат — запуск в мейннеті.
- Моніторинг: підключаємо дашборд Tenderly для відстеження транзакцій. Результат — дашборд операцій.
Порівняння: готові платформи vs індивідуальна розробка
| Критерій | Готові рішення (Snapshot, Aragon) | Індивідуальна розробка |
|---|---|---|
| Кастомізація | Обмежена шаблонами | Повний контроль над контрактами та інтерфейсом |
| Безпека | Залежить від аудиту платформи | Можливість посилити аудит під свої ризики |
| Інтеграції | Тільки вбудовані | Будь-які зовнішні сервіси |
| Гнучкість механік | Фіксовані типи голосування | Квадратичне, вагове, multichain |
| Витрати на газ | Нативна оптимізація не завжди | Оптимізуємо calldata, використовуємо L2 (економія до 40%) |
Індивідуальна розробка виправдана, коли потрібна унікальна токеноміка або строгі вимоги до безпеки. Вона в 3 рази швидше дозволяє адаптувати продукт під специфічні задачі спільноти.
Що входить в роботу
- Смарт-контракти DAO (Governor, Timelock, Governance Token) з тестами та документацією
- Frontend на Next.js з інтерфейсом голосування, формами пропозицій, делегуванням
- Індексація The Graph для швидкого доступу до даних
- Інтеграція Snapshot для сигнальних голосувань (опціонально)
- Інструкція з розгортання та навчання команди
- Підтримка після запуску (1 місяць)
Результат та терміни
Ви отримуєте повний набір смарт-контрактів з тестами. Frontend на Next.js з роутингом, формами, відображенням даних. Інтеграція з Snapshot (опціонально). Індексатор The Graph. Інструкція з розгортання та навчання команди.
Ми гарантуємо чистоту коду, дотримання Solidity best practices та використання перевірених патернів OpenZeppelin. Кожен контракт проходить багаторівневий аудит. Наша команда має 5+ років досвіду в блокчейн-розробці та понад 50 успішних запусків DAO в мейннеті — від DeFi до NFT-спільнот.
Типові помилки при розробці DAO: неправильне налаштування quorum (занадто низький або високий), ігнорування відкликання голосу (revocation), відсутність механізму оновлення контрактів (upgradeability).
Замовте DAO-портал під ключ! Термін реалізації: від 4 до 8 тижнів. Вартість: від $25,000. Пишіть нам для безкоштовної оцінки вашого проекту — ми підготуємо пропозицію протягом 2 днів.







