Інтеграція з Snapshot (голосування)
Snapshot — стандарт off-chain голосування у Web3. Більшість DAO з активним управлінням його використовує: Uniswap, Aave, ENS, Gitcoin, Compound. Причина проста: on-chain голосування через Governor коштує газ кожному учаснику; з тисячами голосуючих це стає значною перешкодою.
Snapshot вирішує це через підписи: голос — це криптографічна підпис, не транзакція. Верифікація відбувається off-chain; результати публікуються в IPFS. Для більшості DAO цього достатньо.
Що потрібно для інтеграції
Інтеграція Snapshot займає 1–2 тижні й включає три частини: налаштування Space, відображення пропозицій у вашому інтерфейсі та кнопку голосування.
Налаштування Space: створюється на snapshot.org, конфігурується через JSON файл у записі ENS. Ключові параметри — стратегія голосування (які токени й на яких мережах рахуються) та мінімальний поріг пропозиції.
// Приклад отримання пропозицій через Snapshot GraphQL API
const SNAPSHOT_HUB = 'https://hub.snapshot.org/graphql';
async function getProposals(spaceId) {
const query = `
query Proposals($space: String!) {
proposals(
where: { space: $space, state: "active" }
orderBy: "created"
orderDirection: desc
) {
id
title
body
choices
start
end
snapshot
state
scores
scores_total
votes
author
}
}
`;
const response = await fetch(SNAPSHOT_HUB, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ query, variables: { space: spaceId } })
});
const { data } = await response.json();
return data.proposals;
}
// Подання голосу через Snapshot SDK
import { Web3Provider } from '@ethersproject/providers';
import Client from '@snapshot-labs/snapshot.js';
async function castVote(proposalId, choiceIndex, provider) {
const client = new Client.Client('https://hub.snapshot.org');
const web3 = new Web3Provider(provider);
const [account] = await web3.listAccounts();
const result = await client.vote(web3, account, {
space: 'yourspace.eth',
proposal: proposalId,
type: 'single-choice',
choice: choiceIndex, // індекс вибору на основі 1
reason: '',
app: 'your-app'
});
return result;
}
Стратегії голосування
Snapshot підтримує гнучкі стратегії: erc20-balance-of (голос = баланс токенів), erc20-votes (делегована голосувальна сила від Governor), delegation (передані голоси), whitelist. Кілька стратегій можуть бути об'єднані з коефіцієнтами ваги. Снапшот блок використовується для снапшоту балансу — голосувальна вага фіксується при створенні пропозиції; купівля токенів під час голосування марна.
Коли Snapshot недостатньо
Snapshot підходить для сигналів управління, але не для виконання. Якщо результати голосування повинні автоматично змінити параметри протоколу — потрібне on-chain виконання через Governor + Timelock. В цьому випадку Snapshot — перший етап: off-chain сигнал → on-chain голос → виконання. ENS використовує цей паттерн.
Графік інтеграції
Базовий UI з переглядом пропозицій та голосуванням — 1 тиждень. Повна інтеграція з сповіщеннями, історією голосів користувача та делегуванням — 2–3 тижні.







