> For the complete documentation index, see [llms.txt](https://docs.cyclone.xyz/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cyclone.xyz/russkii/development.md).

# Разработка

{% hint style="success" %}
На этой странице объясняется, как компилировать / развертывать / тестировать / взаимодействовать со смарт-контрактами. Существует четыре основных контракта: токен Cyclone, GovernorAlpha / Timelock, Aeolus и Cyclone (Coin, ERC20).
{% endhint %}

### Подготовка

1. Установить трюфель

   ```
   npm install -g truffle
   ```
2. Установить зависимости

   ```
   npm install
   ```
3. Установите `ioctl` -инструмент командной строки для взаимодействия с блокчейном IoTeX

установите ioctl, следуя инструкциям: <https://docs.iotex.io/developer/ioctl/install.html>

### Составляем контракты

`npm run build:contract`

### Развернуть контракты

* **CycloneToken**

1. Развернуть CycloneToken `ct`

```
ioctl contract deploy bytecode CYCLONETOKEN_BYTECODE ABI_PATH '{"_operator": "OPERATOR_ADDRESS", "_lp": "INITIAL_LP_ADDRESS"}'
```

* **Timelock & GovernorAlpha**

1. Развертывать Timelock `tl`

```
ioctl contract deploy bytecode TIMELOCK_BYTECODE TIMELOCK_ABI_PATH '{"admin_": DEPLOY_ADMIN_ADDRESS, "delay_": DELAY_IN_SEC}'
```

&#x20;   2\. Развертывать GorvernorAlpha `ga` (например, продолжительность голосования: 3 дня)

```
ioctl contract deploy bytecode GORVERNOR_BYTECODE GOVERNOR_ABI_PATH '{"timelock_": TIMELOCK_ADDRESS, "sushi_": CYCTOKEN_ADDRESS, "guardian_": ADMIN_ADDRESS, "votingDuration_": 51840}'
```

&#x20;  3\. Установите ожидающего администратора Timelock на GovernorAlpha `ga`

```
 ioctl contract invoke function TIMELOCK_ADDRESS TIMELOCK_ABI_PATH "setPendingAdmin" --with-arguments '{"pendingAdmin_": GOVERNOR_ADDRESS}'
```

&#x20;  4\. Accept Admin from GovernorAlpha `ga` triggered by guardian&#x20;

```
 ioctl contract invoke function GOVERNOR_ADDRESS GOVERNOR_ABI_PATH "__acceptAdmin"
```

* **Aeolus**

1. Добавьте ликвидность для CYC / IOTX на MimoFactory и получите токен CYC-IOTX LP
2. Разверните Aeolus `as` с `ct` адресом

```
ioctl contract deploy bytecode AEOLUS_BYTECODE ABI_PATH '{"_cycToken": CYC_TOKEN, "_lpToken" : LP_TOKEN}'
```

&#x20;   3\. Вызовите `ct.`addMinter (), чтобы установить `as` в качестве минтеров для токена CYC

```
ioctl contract invoke function CYCTOKEN_ADDRESS CYCTOKEN_ABI_PATH "addMinter" --with-arguments '{"_minter": AEOLUS_ADDRESS}'
```

* **CoinCyclone, ERC20Cyclone**

1. Развертывать Hasher `hr`

   ```
   ioctl contract deploy bytecode HASHER_BYTECODE
   ```
2. Развертывать Verifier `vr`

   ```
   ioctl contract deploy bytecode VERIFIER_BYTECODE
   ```
3. Развертывать CoinCyclone `cc`, ERC20Cyclone `ec` связано с Hasher `hr` с `as`, `vr`, `ct`, `mf`и при необходимости адрес токена XRC20

   ```
   link CoinCyclone_BYTECODE/ERC20Cyclone_BYTECODE with HASHER_ADDRESS (use linker.js)
   ```

   ```
   ioctl contract deploy bytecode CoinCyclone_LINKED_BYTECODE CoinCyclone_ABI_PATH'{"_verifier": VERIFIER_ADDRESS, "_cyctoken": CYCTOKEN_ADDRESS, "_mimoFactory": MIMOFACTORY_ADDRESS, "_aeolus": AEOLUS_ADDRESS, "_initDenomination" : DENOMINATION_AMOUNT, "_denominationRound": DENOMINATION_ROUND, "_merkleTreeHeight" : MERKLETREE_HEIGHT, "_operator": TIMELOCK_ADDRESS}'
   ```

   ```
   ioctl contract deploy bytecode ERC20Cyclone_LINKED_BYTECODE ERC20Cyclone_ABI_PATH '{"_verifier": VERIFIER_ADDRESS, "_cyctoken": CYCTOKEN_ADDRESS, "_mimoFactory": MIMOFACTORY_ADDRESS, "_aeolus": AEOLUS_ADDRESS, "_initDenomination" : DENOMINATION_AMOUNT, "_denominationRound": DENOMINATION_ROUND, "_merkleTreeHeight" : MERKLETREE_HEIGHT, "_operator": TIMELOCK_ADDRESS, "_xrc20Token" : XRC20TOKEN_ADDRESS}'
   ```
4. Вызовите `ct.addMinter ()`, чтобы установить `cc` и `ec` в качестве minters для токена CYC

   ```
   ioctl contract invoke function CYCTOKEN_ADDRESS CYCTOKEN_ABI_PATH "addMinter" --with-arguments '{"_minter": CoinCyclone_ADDRESS}'
   ioctl contract invoke function CYCTOKEN_ADDRESS CYCTOKEN_ABI_PATH "addMinter" --with-arguments '{"_minter": ERC20Cyclone_ADDRESS}'  
   ```
5. Вызов `as.`addAddressToWhitelist (), чтобы установить `cc` и `ec` в белые списки для Aeolus, чтобы вызвать `addReward ()`

   ```
   ioctl contract invoke function AEOLUS_ADDRESS AEOLUS_ABI_PATH "addAddressToWhitelist" --with-arguments '{"addr": CoinCyclone_ADDRESS}'
   ioctl contract invoke function AEOLUS_ADDRESS AEOLUS_ABI_PATH "addAddressToWhitelist" --with-arguments '{"addr": ERC20Cyclone_ADDRESS}'
   ```

### Контракты на тестирование

1. версия узла `nvm use 11.15.0`
2. построить схемы zk `npm run build`
3. если вы хотите использовать `test` сеть, просто запустите `npm run test` (дефолт).

   Если вы хотите использовать `development`сеть,

   * изменить truffle-config.js (раскомментировать сеть разработки)
   * пробег `ganache-cli i 1337`
   * пробег`npm run test`

### Взаимодействие с контрактами Cyclone \[Анонимность Майнинг]

1. Требования
2. `nvm use 11.15.0`
3. `npm install -g npx`
4. Настроить файл .env
   * `cp .env.example .env`
   * `vi .env` - добавьте свой закрытый ключ, развернутый адрес контракта и номинал
5. Построить схемы zk: `npm run build`. Обратите внимание, что если вы хотите создавать схемы zk (включая verifier.sol, proof / verify-keys) локально, вам необходимо:
   * `npm uninstall websnark`
   * `npm install websnark@"git+https://github.com/tornadocash/websnark.git#2041cfa5fa0b71cd5cca9022a4eeea4afe28c9f7"`
   * `npm run build:local` - Это может занять более 10 минут, поскольку установка доверия выполняется локально.
6. Депозит
   * Тестовая сеть

     `./client.js deposit IOTX|XRC20 --rpc http://api.testnet.iotex.one:80`
   * Mainnet

     `./client.js deposit IOTX|XRC20 --rpc http://api.iotex.one:80`
7. Снять со счета
   * Тестовая сеть

     `./client.js withdraw NOTE RECIPIENT_ADDRESS --rpc http://api.testnet.iotex.one:80 --relayer RELAYER_URL`
   * Mainnet

     `./client.js withdraw NOTE RECIPIENT_ADDRESS --rpc http://api.iotex.one:80 --relayer RELAYER_URL`

### Взаимодействие с контрактом Aeolus \[Ликвидность Майнинг]

1. Добавьте ликвидность для CYC / IOTX на MimoFactory и получите токен CYC-IOTX LP
2. Депозит

* Утвердить токен CYC-IOTX LP

```
ioctl xrc20 approve AEOLUS_ADDRESS AMOUNT -c LPTOKEN_ADDRESS
```

* Депозит CYC-IOTX LP Token

```
ioctl contract invoke function AEOLUS_ADDRESS abi/Aeolus.json "deposit" --with-arguments '{"_amount": AMOUNT}'
```

&#x20;  3\. Снять со счета

```
ioctl contract invoke function AEOLUS_ADDRESS abi/Aeolus.json "withdraw" --with-arguments '{"_amount": AMOUNT}'
```

### Взаимодействие с GovernorAlpha контракт \[Управление]&#xD;

&#x20; 1.Самостоятельно делегируйте или делегируйте свой токен CYC для управления. Если вы не делегируете свои голоса, жетон не будет считаться правом голоса.

```
ioctl contract invoke function CYCTOKEN_ADDRESS abi/CycloneToken.json "delegate" --with-arguments '{"delegatee": ADDRESS_YOU_WANT_TO_DELEGATE}' -s mainnet -y
```

&#x20;   2\. Предложите новое изменение в контрактах циклонов, таких как updateConfig, changeGovDAO и updateVerifier. У предлагающего должно быть более 1000 токенов CYC. Голосование продлится 3 дня. - Используйте [abi-encoder](https://adibas03.github.io/online-ethereum-abi-encoder-decoder/#/encode), чтобы получить закодированные данные аргумента.

```
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "propose" --with-arguments '{"targets": [CYCLONE_ADDRESS], "values": [0], "signatures": ["updateConfig(uint256,uint256,uint256,uint256)"], "calldatas": ["..."], "description": "update configs in cyclone contract"}'
```

&#x20;   3\. В течение 3 дней, в течение которых проводится голосование, держатели токенов, которые делегируют или делегируют собственные полномочия, могут голосовать за определенное предложение.

```
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "castVote" --with-arguments '{"proposalId": 1, "support": true}'
```

&#x20;  4\. Если после 3 дней голосования, если предложение набирает более 4000 голосов CYC, предлагающий может поставить транзакцию в очередь в Timelock.

```
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "queue" --with-arguments '{"proposalId": 1}'
```

&#x20;  5\. После задержки временной привязки предлагающий может выполнить транзакцию с временной привязкой.

```
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "execute" --with-arguments '{"proposalId": 1}'
```

###
