# Разработка

{% 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}'
```

###


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cyclone.xyz/russkii/development.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
