Розробка модуля делегування голосів у мобільному DAO-додатку

Розробка модуля делегування голосів у мобільному DAO-додатку ## Проблема: токени куплені, а голосувати не можна Уявіть: користувач придбав токени управління (наприклад, UNI) у популярному DAO, але при першому голосуванні виявляє, що його голос не враховано. Причина — механізм `ERC20Votes` з бі

Розробка та підтримка будь-яких видів мобільних додатків:

Інформаційні та розважальні мобільні програми
Новинки, ігри, довідники, онлайн-каталоги, погодні, фітнес та здоров'я, туристичні, освітні, соціальні мережі та месенджери, квіз, блоги та подкасти, форуми, агрегатори
Мобільні програми електронної комерції
Інтернет-магазини, B2B-додатки, маркетплейси, онлайн-обмінники, кешбек-сервіси, біржі, дропшиппінг-платформи, програми лояльності, доставка їжі та товарів, платіжні системи
Мобільні програми для управління бізнес-процесами
CRM-системи, ERP-системи, управління проектами, інструменти для команди продажів, облік фінансів, управління виробництвом, логістика та доставка, управління персоналом, системи моніторингу даних
Мобільні програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, платформи надання електронних послуг, платформи кешбеку, відеохостинги, тематичні портали, платформи онлайн-бронювання та запису, платформи онлайн-торгівлі

Це лише деякі з типів мобільних додатків, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 1734 послуг
Розробка модуля делегування голосів у мобільному DAO-додатку
Середній
~2-3 дні

Наші компетенції:

Часті запитання

Останні роботи

  • image_mobile-applications_feedme_467_0.webp
    Розробка мобільного додатка для компанії FEEDME
    897
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    784
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1219
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    1081
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    1004
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    600

Розробка модуля делегування голосів у мобільному 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 не може коректно підраховувати голоси, а користувачі втрачають можливість впливати на рішення. Наш мобільний додаток повністю автоматизує цей процес.

Покрокова інструкція з делегування в мобільному додатку

Розгорніть інструкцію
  1. Відкрийте додаток та перейдіть на екран управління голосами.
  2. Додаток автоматично перевіряє статус делегування через delegates().
  3. Якщо статус notDelegated, з'явиться банер з кнопкою «Делегувати».
  4. Натисніть кнопку — відкриється форма вибору делегата (своя адреса або ENS-ім'я).
  5. Підтвердьте транзакцію за допомогою біометрії або пароля.
  6. Після підтвердження голосуюча сила оновиться на головному екрані.

Цей процес займає менше 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%. Замовте розробку модуля делегування або отримайте консультацію — напишіть нам.

OpenZeppelin ERC20Votes