Реализация делегирования голосов в мобильном DAO-приложении
Делегирование — механизм ERC20Votes (OpenZeppelin), позволяющий держателю токенов передать голосующую силу другому адресу без передачи самих токенов. Пока пользователь не вызвал delegate(), его токены не учитываются в голосованиях Governor — даже если на счету 10 000 UNI.
Это частый источник путаницы: пользователь купил токены, но не может голосовать. Первый экран DAO-приложения должен решать именно эту проблему.
Проверка статуса делегирования
// iOS — проверка, делегированы ли голоса
func getDelegationStatus(holder: EthereumAddress) async throws -> DelegationStatus {
let delegatee = try await governanceToken.delegates(account: holder)
let votingPower = try await governanceToken.getVotes(account: holder)
if delegatee == .zero {
return .notDelegated
} else if delegatee == holder {
return .selfDelegated(votes: votingPower)
} else {
return .delegatedTo(address: delegatee, votes: votingPower)
}
}
При .notDelegated — показывать баннер «Вы ещё не активировали право голоса». Кнопка «Делегировать» — прямо в баннере.
Flow делегирования
Два варианта: делегировать себе или другому адресу.
Делегирование себе — самый частый случай. Функция delegate(holder) — одна транзакция. После подтверждения пользователь видит свой голосующий вес.
Делегирование другому — выбор адреса (ввод вручную, ENS или из контактов). Показывай ENS-имя если доступно: vitalik.eth понятнее 0xd8dA....
// Android — вызов delegate через web3j
suspend fun delegateVotes(delegatee: String): String {
val function = Function(
"delegate",
listOf(Address(delegatee)),
emptyList()
)
val encodedFunction = FunctionEncoder.encode(function)
val txHash = web3j.ethSendRawTransaction(
buildSignedTx(to = tokenContractAddress, data = encodedFunction)
).send().transactionHash
return txHash
}
После делегирования — обновить значок голосующей силы на главном экране DAO.
Отзыв делегирования
delegate(holder) с адресом самого пользователя — переделегирует на себя. Отдельной функции «снять делегирование» нет: нельзя полностью убрать делегата без указания нового. Объясни это в UI: кнопка «Делегировать себе» вместо «Отозвать».
Экран делегатов
Для DAO с публичным списком делегатов (Compound, Uniswap, ENS) — показывай список с голосующей силой, числом делегаторов, историей голосований. Данные через Tally API или собственный субграф The Graph.
Сроки: 2–3 дня: проверка статуса, делегирование на себя/другого, ENS-резолвинг, обновление UI голосующей силы.







