Розробка модуля делегування голосів у мобільному DAO-додатку
Проблема: токени куплені, а голосувати не можна
Уявіть: користувач придбав токени управління (наприклад, UNI) у популярному DAO, але при першому голосуванні виявляє, що його голос не враховано. Причина — механізм ERC20Votes з бібліотеки OpenZeppelin. Токени враховуються лише після явного виклику delegate(). Поки виклик не зроблено, голосуюча сила дорівнює нулю, навіть якщо на рахунку 10 000 UNI. Це класична точка тертя в UX, яка відлякує користувачів і знижує активність в Ethereum governance. Чому це відбувається? Стандарт ERC20Votes вимагає реєстрації делегата для нарахування голосів — на відміну від звичайних токенів, де баланс одразу дає права. Розробники часто упускають цей момент, залишаючи користувачів без голосу. Наш мобільний DAO-додаток вирішує проблему на першому екрані: діагностує статус делегування та пропонує дію в один клік. Реалізація модуля під ключ займає від 2 до 5 днів залежно від складності кастомної логіки. Економія часу для команди DAO — від 40 годин розробки вручну, що при середній ставці розробника дає $4,000–$6,000 економії бюджету. Не рахуючи подальшої підтримки.
Як перевірити, чи делеговані голоси?
Визначаємо статус через виклик delegates(holder):
// 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 показуємо банер з повідомленням та кнопкою «Делегувати». Це одразу вирішує проблему 99% користувачів.
Коли потрібно делегувати голоси іншому учаснику?
Два сценарії: делегування собі або іншій адресі. Найчастіший — собі. Одна транзакція — і користувач отримує голосуючу силу. Делегування іншому вимагає вибору адреси: ручне введення, ENS або з контактів. Якщо доступний ENS, показуємо vitalik.eth замість 0xd8dA… — це знижує ризик помилки введення. Помилка при ручному введенні може коштувати втрати коштів, тому використання ENS економить до $500 на кожній операції через уникнення повторних транзакцій.
// 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 } Після транзакції оновлюємо відображення голосуючої сили на головному екрані.
Що робити, якщо потрібно відкликати делегування?
Окремої функції відкликання немає. delegate(holder) з адресою самого користувача — переделегування на себе. В UI ми використовуємо кнопку «Делегувати собі» замість «Відкликати», щоб уникнути непорозуміння.
Чому делегування необхідне для голосування?
Стандарт OpenZeppelin ERC20Votes вимагає, щоб кожен власник токенів явно призначив делегата. Інакше голосуюча сила дорівнює нулю, незалежно від балансу. Це захист від подвійного голосування та основа для квадратичного голосування. Без делегування DAO не може коректно підраховувати голоси, а користувачі втрачають можливість впливати на рішення. Наш мобільний додаток повністю автоматизує цей процес.
Покрокова інструкція з делегування в мобільному додатку
Розгорніть інструкцію
- Відкрийте додаток та перейдіть на екран управління голосами.
- Додаток автоматично перевіряє статус делегування через
delegates(). - Якщо статус
notDelegated, з'явиться банер з кнопкою «Делегувати». - Натисніть кнопку — відкриється форма вибору делегата (своя адреса або ENS-ім'я).
- Підтвердьте транзакцію за допомогою біометрії або пароля.
- Після підтвердження голосуюча сила оновиться на головному екрані.
Цей процес займає менше 30 секунд і не вимагає знання смарт-контрактів.
Порівняння сценаріїв делегування
| Сценарій | Дія | Час виконання | Ризик помилки | Вартість (газ) |
|---|---|---|---|---|
| Делегування собі | delegate(своя адреса) |
1 транзакція, ~30 с | Низький | ~$5-15 залежно від мережі |
| Делегування іншому | delegate(чужа адреса) |
1 транзакція + вибір | Середній (ENS знижує) | ~$5-15 |
| Відклик (переделегування на себе) | delegate(своя адреса) |
1 транзакція, ~30 с | Низький | ~$5-15 |
Делегування через мобільний додаток значно швидше, ніж через веб-інтерфейс DApp: транзакція підписується в один клік без зайвих завантажень. Це економить 5–10 хвилин на кожній операції.
Екран делегатів
Для DAO з публічним списком делегатів (Compound, Uniswap, ENS) ми виводимо таблицю з голосуючою силою, кількістю делегаторів та історією голосувань. Дані отримуємо через Tally API або власний субграф The Graph. Це закриває потребу в аналітиці та допомагає вибрати активного делегата.
Що входить у реалізацію під ключ
| Етап | Результат |
|---|---|
| Аналіз поточного смарт-контракту та токена | Звіт про статус делегування |
| Проектування мобільних екранів | Дизайн-макети (iOS/Android) |
| Розробка модуля делегування | Код з інтеграцією web3j/ethers |
| ENS-резолвінг | Відображення імен замість адрес |
| Тестування на тестовій мережі | Набір тест-кейсів |
| Деплой в App Store / Google Play | Готовий додаток у сторах |
| Підтримка 1 місяць після релізу | Виправлення багів, консультації |
Наша команда має 5+ років досвіду в мобільній розробці для Web3 та більше 50 успішних проектів. Ми гарантуємо дотримання App Store Review Guidelines (Section 4.2/5.1) та безпечне зберігання приватних ключів через Keychain/Android Keystore. Завдяки готовим модулям вартість розробки для стандартного DAO знижується на 30–40%. Замовте розробку модуля делегування або отримайте консультацію — напишіть нам.







