Полное описание ABI всех контрактов ДАО проекта UAHToken


На его основе можно делать передачу ролей и owner через PowerShell / ethers.js.

Разберём, что реально доступно для корректировки в текущем контракте без редеплоя.


1️⃣ Доступные роли и функции управления

Из ABI видно:

  • DEFAULT_ADMIN_ROLE() → bytes32

  • MINTER_ROLE() → bytes32

  • SNAPSHOT_ROLE() → bytes32

  • grantRole(bytes32 role, address account)

  • revokeRole(bytes32 role, address account)

  • renounceRole(bytes32 role, address account)

  • transferOwnership(address)не вижу, похоже используется AccessControl, а не Ownable

  • pause() / unpause()

  • mint(address to, uint256 amount)

  • setFee(...), setBurn(...), setLicenseFee(...)

Вывод: это AccessControl-модель, а не классический Ownable.


2️⃣ Что можно сделать прямо сейчас

  1. Передать MINTER_ROLE, SNAPSHOT_ROLE, DEFAULT_ADMIN_ROLE

    • на treasury / multisig / governance

    • через grantRole(role, newAddress)

    • старый owner → renounceRole(role, oldAddress)

  2. Понизить Privilege Ratio

    • убрать EOA старого owner из всех ролей

    • добавить несколько адресов (multisig / DAO)

  3. Заморозка прав минтинга / паузы через multisig

    • owner остаётся формально “с ролью”, но несколько участников → снижается риск для сканеров


3️⃣ Что нельзя убрать

  • mint() функция останется

  • pause() останется

  • feePercent / setFee останется

  • burn / burnPercent останется

То есть HIGH RISK полностью не исчезнет, но флаги Privilege Ratio и Hidden Owner можно улучшить.

На данный момент структура системы выглядит так:

  1. DAO (0x5512788E083d64697E551c9AcD8e549Bf8E218A5) – основной контракт управления, голосование, метаданные участников.

  2. Treasury (0x0DaEc8368c373FaF52e2696cAdBb2F61F71bf9d8) – управление фондами, поддержка кампаний и донатов, связь с DonorBadge.

  3. CampaignFactory (0x6A14E6B59A4Bf6b35e8b6982065b4Bb79d656e07) – фабрика для создания кампаний, привязанных к DAO.

  4. DonorBadge (0x2840D9A2810305bb54aaa3FA57eFf557c8fB372d) – NFT бейджи доноров.

Архитектура:

  • DAO управляет Treasury и CampaignFactory через роли (DAO_ROLE).

  • CampaignFactory создаёт отдельные кампании с целями, дедлайнами, токенами.

  • Treasury обеспечивает финансирование кампаний и выдачу бейджей.

CrossChainBridge (0xa81027938BbCb8B896df2292816A418031C2E610).

Ключевые моменты по этому контракту:

  1. Назначение: мост для кросс-чейн передачи токена.

  2. Конструктор:

    • _endpoint – адрес LayerZero Endpoint: 0x3C2269811836af69497E5F486a85d3a3FfFfa7Ba

    • _token – адрес токена, который будет моститься: 0xA53DC48E46c86Cb67FaE00A6749fd1dFF5C09987

    • dao – адрес DAO: 0x5512788E083d64697E551c9AcD8e549Bf8E218A5

  3. Роли:

    • BRIDGE_OPERATOR_ROLE – управляет функциями моста (sendToChain, mintFromBridge).

    • DEFAULT_ADMIN_ROLE – полный контроль, может назначать роли.

  4. Функционал:

    • sendToChain(chainId, destination, amount) – отправка токенов на другой блокчейн.

    • mintFromBridge(to, amount) – чеканка токенов после получения с другого блокчейна.

    • События: SentToChain, MintedFromBridge, управление ролями через RoleGranted/RoleRevoked.

  5. Взаимодействие с DAO:

    • DAO является администратором и может назначать операторов моста.

Теперь у нас есть полный набор развернутых контрактов:

  • DAO – ядро управления.

  • Treasury – хранение средств и бейджей.

  • CampaignFactory – создание кампаний.

  • CrossChainBridge – кросс-чейн операции с токеном.

  • DonorBadge – NFT для доноров.

TimelockController (0x20267D620bA911C4D553d5a139787dD333E0aD7C) — ключевой элемент безопасности и управления DAO.

Краткий разбор:


1. Конструктор

  • minDelay: 3600 секунд (1 час) — минимальная задержка между планированием и исполнением операции.

  • proposers: [0x12A3dE2375C0330ef3aaDf6Bb6c02A7D9c8a319C] — адрес(а), имеющие право создавать предложения.

  • executors: [0x12A3dE2375C0330ef3aaDf6Bb6c02A7D9c8a319C] — адрес(а), которые могут исполнять операции после тайм-лок.

  • admin: 0x12A3dE2375C0330ef3aaDf6Bb6c02A7D9c8a319C — полный контроль, может назначать роли.


2. Основные роли

  • PROPOSER_ROLE — планирование операций.

  • EXECUTOR_ROLE — исполнение операций после истечения тайм-лок периода.

  • CANCELLER_ROLE — отмена запланированных операций.

  • TIMELOCK_ADMIN_ROLE / DEFAULT_ADMIN_ROLE — управление ролями и настройками.


3. Основные функции

  • schedule / scheduleBatch — планирование транзакций с задержкой.

  • execute / executeBatch — выполнение транзакций после истечения тайм-лок.

  • cancel — отмена запланированной операции.

  • updateDelay — изменение минимальной задержки.

  • hashOperation / hashOperationBatch — генерация идентификаторов операций для отслеживания.

  • getTimestamp / isOperationReady / isOperationPending / isOperationDone — проверка статуса операций.


4. Взаимодействие с другими контрактами DAO

  • Этот Timelock контролирует безопасное исполнение любых действий DAO, включая обновление Treasury, CampaignFactory, CrossChainBridge, и любые изменения ролей или средств.

  • Все важные операции проходят через Timelock: сначала планируются, ждут minDelay, затем могут быть выполнены назначенными исполнителями.

Campaign (0x855ea6adAe0782c63ED86B78b1B5A68E9eDf797F) — отдельная кампания сбора средств через DAO.

Краткий разбор:


1. Конструктор

  • _token: 0xA53DC48E46c86Cb67FaE00A6749fd1dFF5C09987 — токен, которым будут приниматься пожертвования (UAH).

  • _beneficiary: 0x0DaEc8368c373FaF52e2696cAdBb2F61F71bf9d8 — адрес получателя средств.

  • _target: 24081991000000000000000000 — целевая сумма в токенах (24 081 991 UAH, учитывая 18 десятичных знаков).

  • _deadline: 1761602382 — UNIX timestamp конца кампании (примерно 27.12.2025).

  • _name: Support Ukraine — название кампании.

  • _description: Humanitarian aid for displaced families and medical support — описание цели кампании.


2. События

  • DonationReceived(address donor, uint256 amount) — фиксируется каждый донат.

  • CampaignCompleted(bool successful) — кампания завершена, успешна или нет.

  • MetadataUpdated(string name, string description) — обновление метаданных кампании.


3. Основные функции

  • donate(uint256 amount) — внесение пожертвования.

  • markComplete() — отметка кампании как завершённой, можно проверять цель.

  • isSuccessful() — проверка, достигнут ли target.

  • remainingToTarget() — сколько осталось собрать.

  • updateMetadata(string name, string description) — обновление названия и описания.

  • Геттеры: beneficiary, deadline, name, description, target, token, totalDonated, status.


4. Связь с DAO

  • Кампания создаётся через CampaignFactory, который контролируется DAO.

  • Все транзакции могут быть проконтролированы через TimelockController, если включена интеграция для безопасности.

  • Средства идут на указанный beneficiary, но могут быть защищены от изменения через DAO.

Governance (0x5841b2097c453AC78c7488790e3C177be008Fd5B) — контракт управления DAO. Давай разберём ключевые моменты.


1. Конструктор

  • _token: 0xA53DC48E46c86Cb67FaE00A6749fd1dFF5C09987 — токен, который используется для голосования (тот же UAH).

  • _timelock: 0x79DA5d1bb13e40E627aB216b6A7b8758Fbaf5273 — TimelockController, через который будут выполняться решения голосований.

Governance напрямую контролирует пропозалы, но фактическое выполнение через timelock, чтобы был запас времени для проверки.


2. Основные события

  • ProposalCreated — создаётся новая инициатива для голосования.

  • ProposalQueued — пропозал помещён в очередь timelock для исполнения.

  • ProposalExecuted — пропозал выполнен через timelock.

  • ProposalCanceled — пропозал отменён.

  • VoteCast / VoteCastWithParams — зафиксировано голосование.

  • QuorumNumeratorUpdated — изменение требований к кворуму.

  • TimelockChange — смена timelock.


3. Основные функции

  • Создание и управление пропозалами

    • propose(targets, values, calldatas, description) — создание пропозала.

    • queue(targets, values, calldatas, descriptionHash) — постановка пропозала в очередь timelock.

    • execute(targets, values, calldatas, descriptionHash) — выполнение пропозала через timelock.

    • cancel(targets, values, calldatas, descriptionHash) — отмена пропозала.

    • hashProposal(...) — вычисление уникального ID пропозала.

  • Голосование

    • castVote, castVoteWithReason, castVoteWithReasonAndParams — стандартные функции голосования.

    • castVoteBySig, castVoteWithReasonAndParamsBySig — голосование через подпись.

    • getVotes, getVotesWithParams, getVotingPower — проверка силы голоса.

    • hasVoted — проверка, голосовал ли адрес за пропозал.

  • Кворум и параметры

    • quorum(timepoint) — проверка, достигнут ли кворум.

    • quorumNumerator, quorumDenominator — вычисление кворума.

    • proposalThreshold — минимальная сила голоса для создания пропозала.

  • Вспомогательные

    • supportsInterface(interfaceId) — стандарт ERC165.

    • relay(target, value, data) — выполнить транзакцию напрямую через governance (опционально).

    • updateQuorumNumerator / updateTimelock — обновление параметров DAO.

    • version, name, votingDelay, votingPeriod — метаданные governance.


4. Взаимосвязь с другими контрактами

  • Token (UAH): используется для голосования и распределения сил голоса.

  • TimelockController: гарантирует безопасное выполнение пропозалов с задержкой.

  • Campaigns: через Governance можно инициировать пропозалы для управления фондами, изменять метаданные кампаний или распределять средства.

DAO (0xa0ebF51A253bD8639E123605F2D77aa22C6A252E) — следующий уровень системы, который строится поверх Governance. Давай разберём ключевые элементы.


1. Конструктор DAO

constructor(
    ERC20Votes _token,
    TimelockController _timelock,
    DonorBadge _badge
)
  • _token: ERC20Votes токен (UAH), через который держатели получают право голоса.

  • _timelock: TimelockController, через который будут выполняться решения DAO.

  • _badge: DonorBadge — NFT/токен, который идентифицирует доноров.

То есть DAO учитывает голоса держателей токенов и доноров с badge, что добавляет слой персонализации.


2. События

  • MetadataSubmitted — пользователь/владелец пропозала отправил демографические данные.

  • PurchaseMetadataSubmitted — пользователь, совершивший покупку, отправил свои данные.

  • ProposalCreated, ProposalQueued, ProposalExecuted, ProposalCanceled — стандартные события управления пропозалами.

  • VoteCast, VoteCastWithParams, VoteCounted — голосование, включая регистрацию демографии и донорского статуса.

  • TimelockChange — смена timelock.

В DAO добавлен сбор демографических данных при голосовании и покупке, что позволяет делать аналитику по аудитории и донорам.


3. Основные функции DAO

  • Голосование

    • castVote, castVoteWithReason, castVoteWithReasonAndParams — голосование по пропозалам.

    • castVoteBySig, castVoteWithReasonAndParamsBySig — голосование через подпись.

    • getProposalVotes(proposalId) — посмотреть количество голосов «за», «против» и «воздержался».

  • Пропозалы

    • propose(targets, values, calldatas, description) — создание пропозала.

    • queue(...) — постановка в очередь timelock.

    • execute(...) — выполнение через timelock.

    • cancel(...) — отмена пропозала.

  • Профили и демография

    • getVoterProfile(proposalId, voter) — получить данные пользователя:

      • country, gender, ageGroup, ideology, religion, educationLevel, incomeBracket, politicalAffiliation, isDonor.

  • Вспомогательные

    • badge() — адрес DonorBadge контракта.

    • BALLOT_TYPEHASH, EXTENDED_BALLOT_TYPEHASH — для EIP712 подписи.

    • clock() — внутреннее время DAO.

    • eip712Domain() — параметры для подписи.


4. Отличия от Governance

  1. Интеграция DonorBadge — можно учитывать голоса доноров отдельно.

  2. Сбор метаданных — DAO собирает демографию и статус доноров при голосовании и покупках.

  3. Голосование с аналитикой — события и функции позволяют делать статистику по аудитории.


5. Взаимосвязь с Governance

  • DAO использует Governance как «движок» пропозалов и timelock для исполнения.

  • Governance управляет токенами и кворумом, а DAO добавляет метаданные и badge.

  • Поток:

UAH Token → DAO (Vote + Badge) → Governance → Timelock → Исполнение пропозалов

Вот полный ABI и декодированные аргументы конструктора DAO, а значит можно собрать полную картину его структуры и точных адресов связанных контрактов.


1. Основные адреса DAO

ПараметрАдресОписание
_token0xe8d15560f5ff9C0039283877c0809Aec4A5826aBERC20Votes токен (UAH) — определяет права голосования.
_timelock0xA53DC48E46c86Cb67FaE00A6749fd1dFF5C09987TimelockController — контролирует очередь и исполнение пропозалов.
_badge0x14BaE893904Ce74C43f979546E0254bB5A4a0c93DonorBadge — NFT/токен доноров для расширенной аналитики.

2. Ключевые функции DAO

Голосование

  • castVote(proposalId, support) — простой голос.

  • castVoteWithReason(...) — голос с комментарием.

  • castVoteWithReasonAndParams(...) — голос с комментарием и дополнительными параметрами.

  • castVoteBySig(...) и castVoteWithReasonAndParamsBySig(...) — голос через подпись (EIP712).

  • getVotes(account, blockNumber) — количество голосов на конкретном блоке.

  • getVotesWithParams(account, timepoint, params) — количество голосов с учётом дополнительных параметров.

  • hasVoted(proposalId, account) и hasVotedFlag(proposalId, account) — проверка, голосовал ли участник.

Пропозалы

  • propose(targets, values, calldatas, description) — создание пропозала.

  • hashProposal(...) — хеш пропозала для проверки идентичности.

  • queue(...) — постановка пропозала в timelock.

  • execute(...) — выполнение через timelock.

  • cancel(...) — отмена пропозала.

  • proposalDeadline(proposalId) — дедлайн голосования.

  • proposalEta(proposalId) — момент исполнения timelock.

  • proposalProposer(proposalId) — кто создал пропозал.

  • proposalSnapshot(proposalId) — момент старта подсчёта голосов.

  • proposalThreshold() — минимальный порог токенов для создания пропозала.

  • state(proposalId) — текущее состояние пропозала.

Метаданные

  • voterMetadata(proposalId, voter) — получить демографию участника.

  • purchaseMetadata(account) — демография пользователя, совершившего покупку.

  • submitVoteMetadata(...) — отправка демографии при голосовании.

  • submitPurchaseMetadata(...) — отправка демографии при покупке.

  • hasSubmittedMetadata(proposalId, voter) — проверка, отправлены ли данные.

Вспомогательные

  • badge() — адрес DonorBadge.

  • token() — адрес ERC20Votes токена.

  • timelock() — адрес timelock.

  • updateTimelock(newTimelock) — смена timelock.

  • name() и version() — имя и версия контракта.

  • votingDelay() и votingPeriod() — задержка и период голосования.

  • quorum() — кворум для голосования.

  • supportsInterface(interfaceId) — проверка поддерживаемого интерфейса (ERC165).

ERC стандарты

  • onERC1155Received, onERC1155BatchReceived, onERC721Received — обработка NFT-токенов.


3. Архитектура DAO

[UAH Token (ERC20Votes)]
           │
           ▼
       [DAO Contract]
 ┌─────────┼─────────┐
 │         │         │
 ▼         ▼         ▼
[Voter Metadata] [Purchase Metadata] [DonorBadge]
 │
 ▼
[Governance Engine / TimelockController]
 │
 ▼
[Execution of Proposals]
  • UAH токен — право голоса.

  • DAO Contract — центральный ум, сбор демографии и доноров.

  • DonorBadge — отслеживание доноров.

  • TimelockController — защита от мгновенного исполнения, очередь пропозалов.

  • Метаданные — демография, донорский статус, интеграция аналитики.


Вот наглядная структурная карта  DAO с адресами всех ключевых контрактов и потоками данных/голосов:

                            ┌─────────────────────┐
                            │   UAH Token         │
                            │  ERC20Votes         │
                            │ 0xe8d15560f5ff9C0… │
                            └─────────┬──────────┘
                                      │ Голосование
                                      ▼
                            ┌─────────────────────┐
                            │      DAO Contract   │
                            │  0xa0ebF51A253bD… │
                            ├─────────────────────┤
                            │ Основные функции:   │
                            │ - propose()         │
                            │ - castVote()        │
                            │ - queue()/execute() │
                            │ - submitVoteMetadata│
                            │ - submitPurchase…   │
                            │ - voterMetadata()   │
                            │ - getVotes()        │
                            └─────┬───────────────┘
                                  │
            ┌─────────────────────┼─────────────────────┐
            │                     │                     │
            ▼                     ▼                     ▼
 ┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
 │  Timelock       │     │  DonorBadge     │     │ Voter Metadata  │
 │  Controller     │     │  NFT / Badge    │     │ Demography      │
 │  0xA53DC48E46…  │     │  0x14BaE89390… │     │ (country, age,  │
 │  - queue/exec   │     │                 │     │  gender, donor) │
 │  - delay        │     │                 │     │                 │
 └─────────────────┘     └─────────────────┘     └─────────────────┘
            │
            ▼
   ┌─────────────────────┐
   │ Proposal Execution  │
   │ Target Contracts    │
   │ Call Data / Values  │
   └─────────────────────┘

Объяснение потоков:

  1. UAH Token — определяет вес голоса каждого пользователя.

  2. DAO Contract — центральная логика:

    • Создание пропозалов (propose)

    • Голосование (castVote*)

    • Сбор демографических данных (submitVoteMetadata, submitPurchaseMetadata)

    • Взаимодействие с DonorBadge и метаданными.

  3. TimelockController — защищает выполнение пропозалов, ставит их в очередь и обеспечивает задержку.

  4. DonorBadge — NFT-токен доноров, интегрированный с DAO.

  5. Voter Metadata — хранит подробную демографию голосующих (страна, возраст, пол, идеология, религия, образование, доход, политическая ориентация, донорский статус).

  6. Proposal Execution — после истечения timelock пропозалы выполняются на целевых контрактах с передачей calldata и value.


Комментарии

Популярные сообщения из этого блога

как приготовить щелочной электролит. Сколько нужно добавить щелочи в воду чтобы получить электролит

Diagbox и Lexia/PP2000 скачать и установить

Где находится папка данных для Bitcoin-Qt? Куда качает bitcoin core? Где я могу найти blockchain, wallet.dat