# 技术开发

### 准备工作

1. 安装truffle

   ```
   npm install -g truffle
   ```
2. 安装dependencies

   ```
   npm install
   ```
3. 安装 `ioctl` - 用于与IoTeX区块链交互的命令行工具。

按照说明安装ioctl: <https://docs.iotex.io/developer/ioctl/install.html>

### 编制合约

`npm run build:contract`

### 部署合约

* **旋风通证（CycloneToken）**
* 部署 CycloneToken `ct`

  ```
  ioctl contract deploy bytecode CYCLONETOKEN_BYTECODE ABI_PATH '{"_operator": "OPERATOR_ADDRESS", "_lp": "INITIAL_LP_ADDRESS"}'
  ```
* **缓冲段（Timelock ）& 治理模块（GovernorAlpha）**
* 部署 Timelock `tl`

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

1. 部署 GorvernorAlpha `ga` (例如.投票周期：3天)

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

1. 设置 Timelock的待定管理员至 GovernorAlpha `ga`

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

1. 由监护人触发，接受成为GovernorAlpha `ga` 的管理员

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

* **Aeolus**
* 在MimoFactory上为CYC / IOTX添加流动性并接收CYC-IOTX LP通证
* 以 `ct` 为地址，部署Aeolus `as`

  ```
  ioctl contract deploy bytecode AEOLUS_BYTECODE ABI_PATH '{"_sushi": CYC_TOKEN, "_sushiPerBlock" : AMOUNT, "_startBlock": BLOCK_NUMBER, "_bonusEndBlock": BLOCK_NUMBER}'
  ```
* 调用 `as`.添加 CYC-IOTX LP 通证

```
ioctl contract invoke function AEOLUS_ADDRESS ABI_PATH "add" --with-arguments '{"_allocPoint": 100, "_lpToken": LP_TOKEN_ADDRESS, "_withUpdate" : false }'
```

1. 调用 `ct`.addMinter() ，使`as` 成为 CYC 通证的生成器

   ```
   ioctl contract invoke function CYCTOKEN_ADDRESS CYCTOKEN_ABI_PATH "addMinter" --with-arguments '{"_minter": AEOLUS_ADDRESS}'
   ```
2. **IOTXCyclone, XRC20Cyclone**
3. 部署 Hasher `hr`

   ```
   ioctl contract deploy bytecode HASHER_BYTECODE
   ```
4. &#x20;部署 Verifier `vr`

   ```
   ioctl contract deploy bytecode VERIFIER_BYTECODE
   ```
5. 部署 IOTXCyclone `ic`, XRC20Cyclone `xc` ， 由Hasher `hr` （ `vr`, `ct`, `mf` ）链接，如果必要的话，还需要XRC20 通证的地址

   ```
   link IOTXCYCLONE_BYTECODE/XRC20CYCLONE_BYTECODE with HASHER_ADDRESS (use linker.js)
   ```

   ```
   ioctl contract deploy bytecode IOTXCYCLONE_LINKED_BYTECODE IOTXCYCLONE_ABI_PATH'{"_verifier": VERIFIER_ADDRESS, "_cyctoken": CYCTOKEN_ADDRESS, "_mimoFactory": MIMOFACTORY_ADDRESS, "_denomination" : DENOMINATION_AMOUNT, "_merkleTreeHeight" : MERFLETREE_HEIGHT, "_operator": TIMELOCK_ADDRESS}'
   ```

   ```
   ioctl contract deploy bytecode XRC20CYCLONE_LINKED_BYTECODE XRC20CYCLONE_ABI_PATH '{"_verifier": VERIFIER_ADDRESS, "_cyctoken": CYCTOKEN_ADDRESS, "_mimoFactory": MIMOFACTORY_ADDRESS, "_denomination" : DENOMINATION_AMOUNT, "_merkleTreeHeight" : MERKLETREE_HEIGHT, "_operator": TIMELOCK_ADDRESS, "_xrc20Token" : XRC20TOKEN_ADDRESS}'
   ```
6. 调用 `ct`.addMinter() ，使 `ic` 和`xr` 成为 CYC 通证的生成器

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

### 与旋风合约的交互\[匿名式挖矿]

1. 要求
2. `nvm use 11.15.0`
3. `npm install -g npx`
4. 设置 .env文件
   * `cp .env.example .env`
   * `vi .env` - 添加您的私钥，已部署的合约地址和面额
5. 搭建zk circuits: `npm run build`. 请注意，如果要在本地构建zk circuits（包括verifier.sol，证明/验证密钥），则需要:
   * `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`
   * 主网

     `./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`
   * 主网

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

### 与Aeolus合约的交互\[流动性挖矿]

1. 使用MimoFactory添加流动性 CYC/IOTX，并接收 CYC-IOTX LP通证
2. CYC-IOTX LP通证许可

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

1. 存款

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

1. 提取

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

### 与GovernorAlpha合约的交互\[去中心化治理]

1. 自我委托或委托您的CYC通证进行治理，如果你不把你的选票委托给别人，则通证将不被视为投票权。

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

1. 在旋风合约中提出新的变更，例如更新Tax，修改GovDAO和升级Verifier。 提议者应拥有CYC代币总供应量1％以上的额度。 投票将进行3天。
2. 使用 [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": ["updateTax(uint256)"], "calldatas": ["0x0000000000000000000000000000000000000000000000000000000000000064"], "description": "update tax in cyclone contract"}'
   ```
3. 在为期3天的投票期间，自我委托或委托的通证持有者可以对某个提案进行投票。

   ```
   ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "castVote" --with-arguments '{"proposalId": 1, "support": true}'
   ```
4. 投票持续3天时间，如果提案获得总供应量的4％以上的投票，则提案人可以将交易排队到缓冲段（Timelock）中。

   ```
   ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "queue" --with-arguments '{"proposalId": 1}'
   ```
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/introduction-chinese/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.
