Смарт контракты ввода / вывода средств из DAO

Даннный проект содержит смарт контракты для ввода и вывода средств из Berezka DAO.

Перед началом работы с проектом нужно выполнить команду:

npm install

Для компиляции контрактов используееся команда:

npx hardhat compile

Для запуска тестов контрактов используется команда:

npx hardhat test

Для деплоя контракта необходимо указать следующие переменные окружения:

export ETHERSCAN_API_KEY="<API ключ Etherscan>"
export RINKEBY_ALCHEMY_API_KEY="<API ключ Alchemy>"
export RINKEBY_PRIVATE_KEY="<Закрытый ключ от которого проводится деплой>"

Для деплоя в тестовую сеть используется префикс ключа RINKEBY. Для деплоя в основную сеть используется префикс ключа MAINNET.

Деплой контрактов выполняется командами:

npx hardhat run scripts/deploy-withdraw.js --network rinkeby
npx hardhat verify <ID контракта> --network rinkeby

Для деплоя в тестовую сеть используется наименование сети rinkeby. Для деплоя в основную сеть используется наименовани сеети ключа mainnet.

После выполняения команды run scripts/deploy-withdraw.js в консоль будет выведен идентификатор контракта в сети. Этот идентификатор контракта должен быть передан на вход команде hardhat verify для верификации контракта на Etherscan.

Withdraw (вывод средств)

Контракт на вывод средств реализован в файле Withdraw.sol. После публикации контракта в сеть необходимо провести следующие настроечные действия на стороне контракта:

Определить список возможных стейблкойнов для вывода

Для этого необходимо от лица владельца контракта (по-умолчанию тот, кто задеплоил контракт) выполнить вызов:

addWhitelistTokens([адреса стейблкойнов, например DAI, USDT, USDC])

// Обратная операция - удалением стейблкойнов из белого списка
removeWhitelistTokens([адреса стейблкойнов, например DAI, USDT, USDC])

Определить DAO с которыми работает

Для этого необходимо от лица владельца контракта (по-умолчанию тот, кто задеплоил контракт) выполнить вызов:

addDao(адрес токена дао,  адрес токен менеджера, адрес агента)

// Обратная операция - удаление DAO
removeDao(адрес токена дао)

Здесь:

  • адрес токена дао - адрес токена который выводит инвестор (например FLEX)
  • адрес токен менеджера - адрес контракта токен менеджера из организации в Aragon (закладка Organization, адрес контракта Tokens)
  • адрес ашента - адрес контракта агента из организации в Aragon (закладка Organization, адрес контракта Agent)

Выполнить конфигурацию DAO

После добавления каждого из DAO через операцию addDao необходимо провести симметричную операцию в самом DAO, то есть позволить смарт контракту Withdraw распоряжаться средствами DAO. Смарт контракту необходимы следующиее полномочия:

  • Сжигание токенов (Токен менеджер)
  • Перевод средств с агента (Агент)

Для этого необходимо для Токен менеджера:

  • В DAO зайти на закладку Permissions
  • Нажать кнпку New permission
  • Выбрать App Tokens
  • Выбрать Entity Custom Address...
  • Ввести адрес контракта
  • Выбрать Action Burn tokens
  • Нажать кнопку Add permission
  • Подписать транзакцию, и дождаться успешнго завершения голосования (статус голосования должен стать Passed (enacted))

Для этого необходимо для Агента:

  • В DAO зайти на закладку Permissions
  • Нажать кнпку New permission
  • Выбрать App Agent
  • Выбрать Entity Custom Address...
  • Ввести адрес контракта
  • Выбрать Action Transfer Agent's tokens
  • Нажать кнопку Add permission
  • Подписать транзакцию, и дождаться успешнго завершения голосования (статус голосования должен стать Passed (enacted))

Перевести управление контрактом на Агента

Чтобы устранить централизацию в управлении контрактом необходимо изменить адрес владельца контракта на адрес Агента какого-либо DAO.

Для этого необходимо на стороне контракта вызвать метод:

transferOwnership([адреса агента])

Отменить данную операцию нельзя. Если указать некорректный адрес агента - контроль над контрактом будет потерян.