Development
이 페이지에서는 스마트 계약을 컴파일 / 배포 / 테스트 / 상호 작용하는 방법을 설명합니다. Cyclone 토큰, GovernorAlpha / Timelock, Aeolus 및 Cyclone (Coin, ERC20)의 네 가지 주요 계약이 있습니다.
Preparation
Install truffle
npm install -g truffleInstall dependencies
npm installInstall
ioctl- the command-line tool to interact with IoTeX blockchain
install ioctl following the instructions: https://docs.iotex.io/developer/ioctl/install.html
Compile contracts
npm run build:contract
Deploy contracts
CycloneToken
Deploy a CycloneToken
ct
ioctl contract deploy bytecode CYCLONETOKEN_BYTECODE ABI_PATH '{"_operator": "OPERATOR_ADDRESS", "_lp": "INITIAL_LP_ADDRESS"}'Timelock & GovernorAlpha
Deploy Timelock
tl
ioctl contract deploy bytecode TIMELOCK_BYTECODE TIMELOCK_ABI_PATH '{"admin_": DEPLOY_ADMIN_ADDRESS, "delay_": DELAY_IN_SEC}' 2. Deploy GorvernorAlpha ga (e.g., voting duration:3 days)
ioctl contract deploy bytecode GORVERNOR_BYTECODE GOVERNOR_ABI_PATH '{"timelock_": TIMELOCK_ADDRESS, "sushi_": CYCTOKEN_ADDRESS, "guardian_": ADMIN_ADDRESS, "votingDuration_": 51840}' 3. Set Timelock's pending admin to GovernorAlpha ga
ioctl contract invoke function TIMELOCK_ADDRESS TIMELOCK_ABI_PATH "setPendingAdmin" --with-arguments '{"pendingAdmin_": GOVERNOR_ADDRESS}' 4. Accept Admin from GovernorAlpha ga triggered by guardian
ioctl contract invoke function GOVERNOR_ADDRESS GOVERNOR_ABI_PATH "__acceptAdmin"Aeolus
Add Liquidity for CYC/IOTX on MimoFactory and receive CYC-IOTX LP Token
Deploy an Aeolus
aswithctaddress
ioctl contract deploy bytecode AEOLUS_BYTECODE ABI_PATH '{"_cycToken": CYC_TOKEN, "_lpToken" : LP_TOKEN}' 3. Invoke ct.addMinter() to set as to be minters for CYC token
ioctl contract invoke function CYCTOKEN_ADDRESS CYCTOKEN_ABI_PATH "addMinter" --with-arguments '{"_minter": AEOLUS_ADDRESS}'CoinCyclone, ERC20Cyclone
Deploy Hasher
hrioctl contract deploy bytecode HASHER_BYTECODEDeploy Verifier
vrioctl contract deploy bytecode VERIFIER_BYTECODEDeploy CoinCyclone
cc, ERC20Cycloneeclinked by Hasherhrwithas,vr,ct,mfand if necessary, XRC20 token addresslink 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}'Invoke
ct.addMinter()to setccandecto be minters for CYC tokenioctl 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}'Invoke
as.addAddressToWhitelist() to setccandecto be whitelists for Aeolus to invokeaddReward()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}'
Test contracts
node version
nvm use 11.15.0build zk circuits
npm run buildif you want to use
testnetwork, just runnpm run test(default).If you want to use
developmentnetwork,modify truffle-config.js (uncomment development network)
run
ganache-cli i 1337run
npm run test
Interaction with Cyclone contracts [Anonymity Mining]
Requirements
nvm use 11.15.0npm install -g npxSet up .env file
cp .env.example .envvi .env- add your private key, deployed contract address and denomination value
Build zk circuits:
npm run build. Note that if you want to build zk circuits (including verifier.sol, proof/verify-keys) locally, you need to:npm uninstall websnarknpm install websnark@"git+https://github.com/tornadocash/websnark.git#2041cfa5fa0b71cd5cca9022a4eeea4afe28c9f7"npm run build:local- It might take more than 10 minutes as it performs the trust-setup locally.
Deposit
Testnet
./client.js deposit IOTX|XRC20 --rpc http://api.testnet.iotex.one:80Mainnet
./client.js deposit IOTX|XRC20 --rpc http://api.iotex.one:80
Withdraw
Testnet
./client.js withdraw NOTE RECIPIENT_ADDRESS --rpc http://api.testnet.iotex.one:80 --relayer RELAYER_URLMainnet
./client.js withdraw NOTE RECIPIENT_ADDRESS --rpc http://api.iotex.one:80 --relayer RELAYER_URL
Interaction with Aeolus contract [Liquidity Mining]
Add Liquidity for CYC/IOTX on MimoFactory and receive CYC-IOTX LP Token
Deposit
Approve CYC-IOTX LP Token
ioctl xrc20 approve AEOLUS_ADDRESS AMOUNT -c LPTOKEN_ADDRESSDeposit CYC-IOTX LP Token
ioctl contract invoke function AEOLUS_ADDRESS abi/Aeolus.json "deposit" --with-arguments '{"_amount": AMOUNT}'3. Withdraw
ioctl contract invoke function AEOLUS_ADDRESS abi/Aeolus.json "withdraw" --with-arguments '{"_amount": AMOUNT}'Interaction with GovernorAlpha contract [Governance]
Self-delegate or delegate your CYC token for governance. If you do not delegate your votes, the token will not be considered as voting power.
ioctl contract invoke function CYCTOKEN_ADDRESS abi/CycloneToken.json "delegate" --with-arguments '{"delegatee": ADDRESS_YOU_WANT_TO_DELEGATE}' -s mainnet -y2. Propose a new change in cyclone contracts such as updateConfig, changeGovDAO, and updateVerifier. The proposer should have more than 1000 CYC Token. Voting will run for 3 days. -- Use abi-encoder to get encoded argument data.
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"}'3. During the 3 days of voting duration, token holders who self-delegate or delegate can cast votes for a certain proposal.
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "castVote" --with-arguments '{"proposalId": 1, "support": true}'4. After 3 days of voting duration, if the proposal gets more than 4000 CYC votes, the proposer can queue the transaction into Timelock.
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "queue" --with-arguments '{"proposalId": 1}'5. After the timelock delay, the proposer can execute the transaction in timelock.
ioctl contract invoke function GOVERNOR_ADDRESS abi/GovernorAlpha.json "execute" --with-arguments '{"proposalId": 1}'Last updated
Was this helpful?