Реалізація 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 днів.







