diff --git a/deployment/katanaDeployment.js b/deployment/katanaDeployment.js index e2dd2107..e8098941 100644 --- a/deployment/katanaDeployment.js +++ b/deployment/katanaDeployment.js @@ -2,7 +2,7 @@ require('@nomiclabs/hardhat-ethers'); const inquirer = require('inquirer'); const fs = require('fs'); const path = require('path'); -const configPath = path.join(__dirname, './katana_input.json'); +const configPath = path.join(__dirname, './katana_mainnet_input.json'); const configParams = JSON.parse(fs.readFileSync(configPath, 'utf8')); let gasPrice; @@ -19,11 +19,14 @@ async function fetchNextGasPrice(BN, message) { gasPrice = new BN.from(gasPrice).mul(new BN.from(10).pow(new BN.from(9))); } -async function verifyContract(hre, contractAddress, ctorArgs) { - await hre.run('verify:verify', { +async function verifyContract(hre, contractAddress, ctorArgs, contract) { + let args = { address: contractAddress, - constructorArguments: ctorArgs, - }); + constructorArguments: ctorArgs + }; + + if (contract != undefined) args.contract = contract; + await hre.run('verify:verify', args); } let kncAddress; @@ -41,6 +44,7 @@ task('deployGovInfra', 'deploys staking, governance, voting power strategy and e const BN = ethers.BigNumber; const [deployer] = await ethers.getSigners(); deployerAddress = await deployer.getAddress(); + console.log(`deployer: ${deployerAddress}`); // contract deployment await fetchNextGasPrice(BN, 'staking deployment'); @@ -98,6 +102,30 @@ task('deployGovInfra', 'deploys staking, governance, voting power strategy and e await votingPowerStrategy.deployed(); console.log(`votingPowerStrategy address: ${votingPowerStrategy.address}`); + await fetchNextGasPrice(BN, 'treasury pool deployment'); + const TreasuryPool = await ethers.getContractFactory('TreasuryPool'); + const treasuryPool = await TreasuryPool.deploy(deployerAddress, [], {gasPrice: gasPrice}); + await treasuryPool.deployed(); + console.log(`treasury pool address: ${treasuryPool.address}`); + + await fetchNextGasPrice(BN, 'reward distribution deployment'); + const RewardDist = await ethers.getContractFactory('RewardsDistributor'); + const rewardDist = await RewardDist.deploy(daoOperator, {gasPrice: gasPrice}); + await rewardDist.deployed(); + console.log(`reward distribution address: ${rewardDist.address}`); + + await fetchNextGasPrice(BN, 'reward pool deployment'); + const RewardPool = await ethers.getContractFactory('RewardPool'); + const rewardPool = await RewardPool.deploy(longExecutor.address, [rewardDist.address], {gasPrice: gasPrice}); + await rewardPool.deployed(); + console.log(`reward pool address: ${rewardPool.address}`); + + await fetchNextGasPrice(BN, 'liquidation strategy deployment'); + const LiqStrat = await ethers.getContractFactory('NoSwappingLiquidationStrategy'); + const liqStrat = await LiqStrat.deploy(longExecutor.address, treasuryPool.address, rewardPool.address, {gasPrice: gasPrice}); + await liqStrat.deployed(); + console.log(`liquidation strategy address: ${liqStrat.address}`); + // export addresses exportAddresses({ staking: kyberStaking.address, @@ -105,8 +133,15 @@ task('deployGovInfra', 'deploys staking, governance, voting power strategy and e shortExecutor: shortExecutor.address, longExecutor: longExecutor.address, votingPowerStrategy: votingPowerStrategy.address, + treasury: treasuryPool.address, + rewardDistribution: rewardDist.address, + rewardPool: rewardPool.address, + noSwapLiqStrategy: liqStrat.address }); + await fetchNextGasPrice(BN, 'approve liq strat in treasury pool'); + await treasuryPool.authorizeStrategies([liqStrat.address], {gasPrice: gasPrice}); + // set executors and voting power strategy in governance await fetchNextGasPrice(BN, 'authorizing executors in governance'); await kyberGovernance.authorizeExecutors([shortExecutor.address, longExecutor.address], {gasPrice: gasPrice}); @@ -122,6 +157,8 @@ task('deployGovInfra', 'deploys staking, governance, voting power strategy and e await kyberStaking.transferAdminQuickly(longExecutor.address, {gasPrice: gasPrice}); await fetchNextGasPrice(BN, 'transferring governance admin to long executor'); await kyberGovernance.transferAdminQuickly(longExecutor.address, {gasPrice: gasPrice}); + await fetchNextGasPrice(BN, 'transferring treasury admin to long executor'); + await treasuryPool.transferAdminQuickly(longExecutor.address, {gasPrice: gasPrice}); console.log('verify contracts...'); // verify addresses @@ -150,6 +187,20 @@ task('deployGovInfra', 'deploys staking, governance, voting power strategy and e longExecutorConfig.minimumQuorum, ]); await verifyContract(hre, votingPowerStrategy.address, [kyberGovernance.address, kyberStaking.address]); + await verifyContract( + hre, + treasuryPool.address, + [deployerAddress, []], + "contracts/treasury/TreasuryPool.sol:TreasuryPool" + ); + await verifyContract(hre, rewardDist.address, [daoOperator]); + await verifyContract( + hre, + rewardPool.address, + [longExecutor.address, [rewardDist.address]], + "contracts/reward/RewardPool.sol:RewardPool" + ); + await verifyContract(hre, liqStrat.address, [longExecutor.address, treasuryPool.address, rewardPool.address]); console.log('setup completed'); process.exit(0); } diff --git a/deployment/katana_mainnet_input.json b/deployment/katana_mainnet_input.json new file mode 100644 index 00000000..5dd3d1f0 --- /dev/null +++ b/deployment/katana_mainnet_input.json @@ -0,0 +1,27 @@ +{ + "knc": "0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202", + "epochPeriod": 1209600, + "starttime": 1619507227, + "shortExecutor": { + "delay": 43200, + "gracePeriod": 345600, + "minimumDelay": 3600, + "maximumDelay": 86400, + "minVoteDuration": 345600, + "maxVotingOptions": 8, + "voteDifferential": 1, + "minimumQuorum": 400 + }, + "longExecutor": { + "delay": 604800, + "gracePeriod": 604800, + "minimumDelay": 86400, + "maximumDelay": 1209600, + "minVoteDuration": 604800, + "maxVotingOptions": 8, + "voteDifferential": 400, + "minimumQuorum": 1500 + }, + "daoOperator": "0xe6a7338cba0a1070adfb22c07115299605454713", + "outputFilename": "katana_mainnet_deployment.json" +} diff --git a/deployment/katana_input.json b/deployment/katana_testnet_input.json similarity index 92% rename from deployment/katana_input.json rename to deployment/katana_testnet_input.json index c59f51ca..552a6eaa 100644 --- a/deployment/katana_input.json +++ b/deployment/katana_testnet_input.json @@ -23,5 +23,5 @@ "minimumQuorum": 400 }, "daoOperator": "0xddf05698718ba8ed1c9aba198d38a825a64d69e2", - "outputFilename": "katana_ropsten_deployment.json" -} + "outputFilename": "katana_testnet_deployment.json" +} \ No newline at end of file diff --git a/test/rewardDistributor.js b/test/rewardDistributor.js index 1ae8fc4f..29ea1c87 100644 --- a/test/rewardDistributor.js +++ b/test/rewardDistributor.js @@ -46,7 +46,7 @@ let maxIncrease = precisionUnits.div(new BN(5)); contract('RewardsDistributor', function (accounts) { before('one time init', async () => { admin = accounts[1]; - tokenAmount = precisionUnits.mul(new BN(100000000)); + tokenAmount = precisionUnits.mul(new BN(100000000000)); knc = await Token.new('Kyber Network Crystal', 'KNC', tokenAmount); usdc = await Token.new('USD Coin', 'USDC', tokenAmount); wbtc = await Token.new('Wrapped Bitcoin', 'WBTC', tokenAmount); @@ -61,9 +61,9 @@ contract('RewardsDistributor', function (accounts) { rewardsDistributor = await RewardsDistributor.new(admin); await treasury.authorizeStrategies([rewardsDistributor.address], {from: admin}); - // send 5M of each token and 1000 eth to treasury - tokenAmount = precisionUnits.mul(new BN(5000000)); - ethAmount = precisionUnits.mul(new BN(1000)); + // send 100M of each token and 2000 eth to treasury + tokenAmount = precisionUnits.mul(new BN(100000000)); + ethAmount = precisionUnits.mul(new BN(2000)); await Promise.all( tokens.map(async (token, index) => { await token.transfer(treasury.address, tokenAmount);