Даннный проект содержит смарт контракты для ввода и вывода средств из 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.sol
. После публикации контракта в сеть необходимо провести следующие настроечные действия на стороне контракта:
Для этого необходимо от лица владельца контракта (по-умолчанию тот, кто задеплоил контракт) выполнить вызов:
addWhitelistTokens([адреса стейблкойнов, например DAI, USDT, USDC])
// Обратная операция - удалением стейблкойнов из белого списка
removeWhitelistTokens([адреса стейблкойнов, например DAI, USDT, USDC])
Для этого необходимо от лица владельца контракта (по-умолчанию тот, кто задеплоил контракт) выполнить вызов:
addDao(адрес токена дао, адрес токен менеджера, адрес агента)
// Обратная операция - удаление DAO
removeDao(адрес токена дао)
Здесь:
- адрес токена дао - адрес токена который выводит инвестор (например FLEX)
- адрес токен менеджера - адрес контракта токен менеджера из организации в Aragon (закладка Organization, адрес контракта Tokens)
- адрес ашента - адрес контракта агента из организации в Aragon (закладка Organization, адрес контракта Agent)
После добавления каждого из 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([адреса агента])
Отменить данную операцию нельзя. Если указать некорректный адрес агента - контроль над контрактом будет потерян.