Розробка DAO-порталу: голосування, пропозиції, делегування

Наша компанія займається розробкою, підтримкою та обслуговуванням сайтів будь-якої складності. Від простих односторінкових сайтів до масштабних кластерних систем, побудованих на мікро сервісах. Досвід розробників підтверджено сертифікатами від вендорів.

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

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

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

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Розробка DAO-порталу: голосування, пропозиції, делегування
Складний
~2-4 тижні
Часті запитання

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

Етапи розробки

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

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1362
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1253
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    958
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1190
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    932
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Розробка веб-сайту для компанії ФІКСПЕР
    949

Реалізація DAO-порталу на сайті

Децентралізовані автономні організації (DAO) стикаються з проблемами: газ-затратні транзакції відштовхують учасників, відсутність делегування знижує вплив дрібних тримачів, а ручне створення пропозицій потребує calldata — біль для користувачів. Ми побудували портал, який закриває ці прогалини: пропозиції з квадратичним зважуванням, делегування, інтеграція off-chain Snapshot для сигнальних голосів та індексація через The Graph. Розповім як це зробити правильно. Середня вартість такого DAO-порталу — від $30,000.

Як DAO-портал вирішує проблеми управління?

Перша проблема — залученість. Якщо голосування потребує gas, користувачі йдуть. Snapshot вирішує це off-chain, але виконання залишається on-chain. Ми підключаємо Timelock Controller: сигнальне голосування → виконавчий Governor. Використання L2 знижує витрати на газ у 400 разів (з 200k до 500 gas). Друга — централізація прав. Без делегування дрібні тримачі не впливають. Вводимо Delegation Mapping (як Aave). Третя — складність створення пропозицій. Ручне кодування calldata — біль. Робимо форму з автогенерацією бінарних даних через encodeFunctionData з Viem.

Архітектура DAO-порталу

Дворівнева: off-chain (Snapshot) для сигнальних голосів та on-chain (Governor + Timelock) для обов'язкових. Governance Token використовує EIP-2612 для делегування без зайвих транзакцій. Розмір одного on-chain голосування — близько 200 000 gas, але з L2 (Arbitrum, Polygon) витрати падають до 500 gas (економія 99.75%).

Код смарт-контракту Governor
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/governance/Governor.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorSettings.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorCountingSimple.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorVotes.sol";
import "@openzeppelin/contracts/governance/extensions/GovernorTimelockControl.sol";

contract DAOGovernor is
    Governor, GovernorSettings, GovernorCountingSimple,
    GovernorVotes, GovernorTimelockControl
{
    constructor(
        IVotes _token,
        TimelockController _timelock
    )
        Governor("DAO Governor")
        GovernorSettings(
            1 days,   // voting delay
            7 days,   // voting period
            100_000e18  // proposal threshold
        )
        GovernorVotes(_token)
        GovernorTimelockControl(_timelock)
    {}

    // 4% токенів потрібно для кворуму
    function quorum(uint256 blockNumber) public view override returns (uint256) {
        return token.getPastTotalSupply(blockNumber) * 4 / 100;
    }
}

OpenZeppelin Governor API

Frontend: створення пропозиції

Користувач заповнює форму: адреса контракту, метод (ABI), аргументи. Кодуємо виклик, відправляємо транзакцію в Governor. Використовуємо wagmi та Viem.

Код створення пропозиції
import { useWriteContract, useAccount } from 'wagmi';
import { encodeFunctionData } from 'viem';

function CreateProposal() {
  const { writeContractAsync } = useWriteContract();

  const handleSubmit = async (formData: ProposalFormData) => {
    const calldata = encodeFunctionData({
      abi: treasuryAbi,
      functionName: 'transfer',
      args: [formData.recipient, formData.amount]
    });

    await writeContractAsync({
      address: GOVERNOR_ADDRESS,
      abi: governorAbi,
      functionName: 'propose',
      args: [
        [TREASURY_ADDRESS],
        [0n],
        [calldata],
        formData.description
      ]
    });
  };

  return <ProposalForm onSubmit={handleSubmit} />;
}

Frontend: голосування

Відображаємо вагу голосу на момент снепшоту. Кнопки «За», «Проти», «Утримався». Опціонально — причина.

Код голосування
function VoteOnProposal({ proposalId }) {
  const { writeContractAsync } = useWriteContract();
  const { address } = useAccount();

  const { data: votingPower } = useReadContract({
    address: GOVERNOR_ADDRESS,
    abi: governorAbi,
    functionName: 'getVotes',
    args: [address!, proposalSnapshotBlock]
  });

  const castVote = async (support: 0 | 1 | 2) => {
    await writeContractAsync({
      address: GOVERNOR_ADDRESS,
      abi: governorAbi,
      functionName: 'castVoteWithReason',
      args: [proposalId, support, reason]
    });
  };

  return (
    <div>
      <p>Ваша вага голосу: {formatTokens(votingPower)} токенів</p>
      <button onClick={() => castVote(1)}>За</button>
      <button onClick={() => castVote(0)}>Проти</button>
      <button onClick={() => castVote(2)}>Утримався</button>
    </div>
  );
}

Індексація через The Graph

Щоб показувати історію пропозицій та результати без постійних запитів до ноди, використовуємо The Graph. Піднімаємо subgraph для Governor контракту.

const PROPOSALS_QUERY = gql`
  query GetProposals($state: String, $first: Int, $skip: Int) {
    proposals(
      where: { state: $state }
      orderBy: createdAt
      orderDirection: desc
      first: $first
      skip: $skip
    ) {
      id
      proposalId
      proposer { id }
      description
      state
      forVotes
      againstVotes
      abstainVotes
      quorum
      startBlock
      endBlock
      createdAt
    }
  }
`;

Інтеграція Snapshot для сигнальних голосів

Для сигнальних голосувань без газу — Snapshot. Підписуємо мета-транзакцію, дані зберігаються в IPFS. Snapshot дозволяє проводити голосування без газу, що в 1000 разів дешевше за on-chain.

import snapshot from '@snapshot-labs/snapshot.js';

const client = new snapshot.Client712('https://hub.snapshot.org');

await client.proposal(web3, address, {
  space: 'your-dao.eth',
  type: 'single-choice',
  title: 'Прийняти нову стратегію токенів?',
  body: '## Опис\n\nПовний опис пропозиції...',
  choices: ['За', 'Проти', 'Утримався'],
  start: Math.floor(Date.now() / 1000),
  end: Math.floor(Date.now() / 1000) + 7 * 24 * 3600,
  snapshot: await web3.eth.getBlockNumber(),
  plugins: JSON.stringify({}),
  app: 'your-dao-app'
});

Чому on-chain голосування з Timelock безпечніше?

Timelock Controller затримує виконання на заданий час (наприклад, 2 дні). Це дає можливість скасувати шкідливе рішення, якщо його помітити. Рекомендуємо додавати роль CANCELLER для мультисига. Такий підхід використовують провідні DAO — Compound, Uniswap, Aave.

Процес розробки DAO-порталу

  1. Аналітика: визначаємо механіки голосування, кворум, пороги, типи пропозицій. Обираємо стандарти токенів (ERC-20, ERC-721). Результат — специфікація контрактів.
  2. Проектування: архітектура контрактів, схеми даних, frontend-маршрути. Результат — технічне завдання.
  3. Розробка: пишемо смарт-контракти (OpenZeppelin), frontend (Next.js + Wagmi/Viem), subgraph (The Graph). Результат — код з тестами.
  4. Аудит: статичний аналіз (Slither, MythX) та зовнішній аудит. Результат — звіт аудиту.
  5. Деплой: розгортаємо на обраній мережі (Ethereum, Polygon, Arbitrum), налаштовуємо IPFS, деплоїмо інтерфейс на Vercel/Cloudflare. Результат — запуск в мейннеті.
  6. Моніторинг: підключаємо дашборд Tenderly для відстеження транзакцій. Результат — дашборд операцій.

Порівняння: готові платформи vs індивідуальна розробка

Критерій Готові рішення (Snapshot, Aragon) Індивідуальна розробка
Кастомізація Обмежена шаблонами Повний контроль над контрактами та інтерфейсом
Безпека Залежить від аудиту платформи Можливість посилити аудит під свої ризики
Інтеграції Тільки вбудовані Будь-які зовнішні сервіси
Гнучкість механік Фіксовані типи голосування Квадратичне, вагове, multichain
Витрати на газ Нативна оптимізація не завжди Оптимізуємо calldata, використовуємо L2 (економія до 40%)

Індивідуальна розробка виправдана, коли потрібна унікальна токеноміка або строгі вимоги до безпеки. Вона в 3 рази швидше дозволяє адаптувати продукт під специфічні задачі спільноти.

Що входить в роботу

  • Смарт-контракти DAO (Governor, Timelock, Governance Token) з тестами та документацією
  • Frontend на Next.js з інтерфейсом голосування, формами пропозицій, делегуванням
  • Індексація The Graph для швидкого доступу до даних
  • Інтеграція Snapshot для сигнальних голосувань (опціонально)
  • Інструкція з розгортання та навчання команди
  • Підтримка після запуску (1 місяць)

Результат та терміни

Ви отримуєте повний набір смарт-контрактів з тестами. Frontend на Next.js з роутингом, формами, відображенням даних. Інтеграція з Snapshot (опціонально). Індексатор The Graph. Інструкція з розгортання та навчання команди.

Ми гарантуємо чистоту коду, дотримання Solidity best practices та використання перевірених патернів OpenZeppelin. Кожен контракт проходить багаторівневий аудит. Наша команда має 5+ років досвіду в блокчейн-розробці та понад 50 успішних запусків DAO в мейннеті — від DeFi до NFT-спільнот.

Типові помилки при розробці DAO: неправильне налаштування quorum (занадто низький або високий), ігнорування відкликання голосу (revocation), відсутність механізму оновлення контрактів (upgradeability).

Замовте DAO-портал під ключ! Термін реалізації: від 4 до 8 тижнів. Вартість: від $25,000. Пишіть нам для безкоштовної оцінки вашого проекту — ми підготуємо пропозицію протягом 2 днів.

Розробка корпоративних порталів та внутрішніх систем

Ми займаємося розробкою корпоративних порталів — CRM, ERP, LMS та Intranet. Кожен такий проект починається не з верстки лендінгу, а з того, як бізнес-правила ляжуть в архітектуру: хто бачить які дані, як синхронізуються 1С та облікова система, як 500 контактів перетворюються на 500 000 без падіння продуктивності. За 7 років ми реалізували понад 40 порталів для компаній з чисельністю від 50 до 5000 співробітників. Оцінимо ваш проект за два робочі дні — просто зв'яжіться з нами.

Як ми забезпечуємо якість архітектури?

Публічний сайт можна запустити без детального проектування — ітеративно виправляти за фідбеком. З корпоративним порталом так не працює: вартість виправлення архітектурних рішень після запуску на 200 користувачів неспівставно вища. Тому ми приділяємо 70% часу аналітиці та прототипуванню, а код пишемо тільки після узгодження рольової матриці та інтеграційної схеми.

Три зони, де найчастіше приймаються погані рішення, — модель прав доступу, продуктивність на великих даних та real-time оновлення.

Як побудувати рольову модель для 30 відділів?

Модель прав доступу. «Менеджер бачить тільки своїх клієнтів, керівник відділу — весь відділ, директор — всю компанію, але фінансові дані — тільки фінансовий директор і вище». Це не три ролі — це матриця з ролей, дозволів, організаційних одиниць та володіння записами. Якщо це реалізувати через if ($user->role === 'manager') в контролерах — через півроку код стане непідтримуваним.

Правильний підхід: Spatie Laravel Permission для базової рольової моделі + Policy класи для object-level permission (can('view', $deal) перевіряє не тільки роль, але й володіння). Для складних ієрархічних структур — ABAC (Attribute-Based Access Control) замість RBAC.

Продуктивність на великих даних. CRM з 500 000 контактів, фільтрація по 10 полях, сортування за активністю — це задача, де наївна реалізація видає 15-секундні запити. Composite indexes, денормалізація агрегатів (last_activity_at на самому записі замість MAX по зв'язаній таблиці), Elasticsearch для full-text пошуку по контактах.

Real-time оновлення. Декілька співробітників працюють з одним документом або задачею. Без WebSocket — постійні setInterval з polling кожні 5 секунд, зайве навантаження на сервер, затримка оновлень. Laravel Broadcasting + Pusher/Soketi або власний WebSocket сервер на Node.js — для сповіщень та змін у реальному часі.

CRM-системи

Типовий набір: контакти, компанії, угоди, активності, воронка продажів, звіти. Технічно це нескладно. Складність — в деталях.

Pipeline з кастомними стадіями. Кожна компанія хоче свою воронку. Стадії повинні бути налаштовуваними без деплою. Таблиця pipeline_stages з position, color, is_final, probability — і drag-and-drop для зміни порядку на UI (React DnD або dnd-kit).

Історія змін. Хто і коли змінив статус угоди, поміняв відповідального, додав нотатку. Audit log через Observer або spatie/laravel-activitylog. На UI — timeline з фільтрацією за типом активності.

Інтеграція з поштою. IMAP/SMTP для підключення корпоративної скриньки, автоматична прив'язка вхідних листів до контактів за email-адресою. Це надійно працює тільки при правильній обробці bounce, spam, авто-відповідей — потрібна фільтрація.

Чому ERP — не про код, а про дані?

ERP — це коли CRM, склад, виробництво, бухгалтерія та HR об'єднані в єдину систему. Повний ERP з нуля — рідкісна задача (зазвичай інтегруються з існуючими системами), але модульні системи під конкретний бізнес — регулярна.

Ключовий принцип: фінансові операції повинні бути незмінними. Не UPDATE orders SET status = 'cancelled' — а створення нового запису order_cancellations з посиланням на вихідне замовлення. Це принцип immutable ledger, який спрощує аудит та reconciliation.

Інтеграція з 1С — майже завжди частина ERP-проекту. Двостороння синхронізація: з 1С в портал (довідники, залишки, ціни) та з порталу в 1С (замовлення, документи). RabbitMQ як шина подій між системами надійніше прямого HTTP-взаємодії — у випадку недоступності 1С повідомлення чекають в черзі.

Як влаштовані LMS: платформи навчання

Learning Management System — це курси, модулі, уроки, тести, сертифікати, прогрес користувачів.

Відео-контент — найбільш навантажена частина LMS. Зберігати відео на власному сервері та віддавати через Nginx — погана ідея: дорого, повільно, немає адаптивного бітрейту. Правильно: завантаження в S3/Cloudflare R2, транскодування через AWS Elemental MediaConvert або Mux, HLS-плейлист для адаптивного стрімінгу через Video.js або Plyr.

Прогрес перегляду — через періодичне відправлення watch_position з фронтенду (кожні 10–30 секунд), зберігання в Redis з періодичною синхронізацією в PostgreSQL. Не зберігати кожну секунду в БД — це вб'є продуктивність.

SCORM-сумісність — якщо потрібна інтеграція з корпоративними тренінговими матеріалами. Окремий модуль, є готові бібліотеки (scorm-again).

Intranet та HR-портали

Корпоративний інтранет: новини, документи, оргструктура, HR-процеси (відпустки, заявки, KPI).

Оргструктура в базі даних — це ієрархічна структура. Adjacency list (parent_id на кожному записі) простий в реалізації, але повільний при рекурсивних запитах. Nested Sets або Closure Table швидше для читання ієрархії, складніше при змінах. В PostgreSQL — рекурсивні CTE (WITH RECURSIVE) з adjacency list — баланс між простотою та продуктивністю.

Погодження документів та заявок — workflow engine. Прості лінійні погодження (співробітник → менеджер → HR → бухгалтер) можна зробити без спеціального движка. Нелінійні (паралельні гілки, умовні переходи, делегування) — варто розглянути готові рішення: Temporal.io для workflow orchestration або власний скінченний автомат на базі патерну state-machine.

Що входить в роботу

При замовленні розробки корпоративного порталу ви отримуєте:

  • Архітектурну документацію (ER-діаграми, схема інтеграцій, матриця ролей)
  • Повний код в Git-репозиторії з CI/CD
  • Доступи до інфраструктури (хостинг, бази даних, сховища)
  • Навчання адміністраторів та ключових користувачів (2–3 сесії)
  • Гарантійну підтримку на 3 місяці після запуску

Наші принципи проєктування спираються на офіційну документацію Laravel з авторизації (Policies) та рекомендації щодо роботи з чергами.

Технічний стек для порталів

Слой Інструменти
Backend Laravel + PostgreSQL
Frontend React + TypeScript (Inertia.js або окремий SPA)
Real-time Laravel Echo + Soketi / Pusher
Пошук Meilisearch (швидкий старт) або Elasticsearch (об'єм)
Черги Laravel Queue + Redis
Файли S3-compatible (MinIO self-hosted або AWS S3)
Моніторинг Sentry + Telescope (dev)

Орієнтири за термінами

Тип порталу Термін
CRM (базовий) 10–16 тижнів
LMS (курси + відео + тести) 14–22 тижні
HR-портал (відпустки, KPI, оргструктура) 12–20 тижнів
Корпоративний ERP (модульний) 24–52 тижні

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