Впровадження делегування голосів у мобільних 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 — показуйте баннер «Ви ще не активували право голосу». Кнопка «Делегувати» — прямо в баннері.
Потік делегування
Два варіанти: делегувати собі або іншій адресі.
Делегування собі — найпоширеніший випадок. Функція 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 голосуючої сили.







