Интеграция с Snapshot (голосование)
Snapshot — стандарт off-chain голосования в Web3. Большинство DAO с активным governance используют его: Uniswap, Aave, ENS, Gitcoin, Compound. Причина проста: on-chain голосование через Governor стоит gas каждому участнику, при нескольких тысячах голосующих это существенный барьер.
Snapshot решает это через подписи: голос — это cryptographic signature, не транзакция. Верификация происходит off-chain, результаты публикуются в IPFS. Для большинства DAO этого достаточно.
Что нужно для интеграции
Интеграция Snapshot в продукт занимает 1–2 недели и включает три части: настройку Space, показ предложений в вашем интерфейсе и кнопку голосования.
Настройка Space: создаётся на snapshot.org, конфигурируется JSON-файлом в ENS-записи домена. Ключевые параметры — стратегия подсчёта голосов (какие токены и в какой сети учитываются) и минимальный threshold для создания предложения.
// Пример получения списка предложений через 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-based индекс выбора
reason: '',
app: 'your-app'
});
return result;
}
Стратегии голосования
Snapshot поддерживает гибкие стратегии: erc20-balance-of (голос = баланс токена), erc20-votes (delegated voting power из Governor), delegation (переданные голоса), whitelist. Можно комбинировать несколько стратегий с весовыми коэффициентами. Snapshot block используется для snapshot баланса — голосовой вес фиксируется на момент создания предложения, купить токены во время голосования бесполезно.
Когда Snapshot недостаточно
Snapshot подходит для governance сигналов, но не для исполнения решений. Если результат голосования должен автоматически изменить параметр протокола — нужен on-chain execution через Governor + Timelock. В этом случае Snapshot используют как первый этап: off-chain сигнал → on-chain голосование → исполнение. Этот паттерн использует ENS.
Сроки интеграции
Базовый UI с просмотром предложений и голосованием — 1 неделя. Полноценная интеграция с уведомлениями, историей голосов пользователя и делегированием — 2–3 недели.







