From 2f26562ee0209844060395a0a4652cd6058a26e7 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 20 Apr 2022 17:37:28 +0100 Subject: [PATCH 01/37] feat: Modularising tokens and guild script --- scripts/deploy-dxvote.js | 49 +------- scripts/utils/deploy-guilds.js | 214 +++++++++++++++++++++++++++++++++ scripts/utils/deploy-tokens.js | 49 ++++++++ 3 files changed, 267 insertions(+), 45 deletions(-) create mode 100644 scripts/utils/deploy-guilds.js create mode 100644 scripts/utils/deploy-tokens.js diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 59806bd8..b8c1d3ab 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -10,6 +10,7 @@ const MAX_UINT_256 = const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; const { encodePermission } = require("../test/helpers/permissions"); +const deployTokens = require("./utils/deploy-tokens"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); @@ -102,52 +103,10 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") await waitBlocks(1); // Deploy Tokens - let tokens = {}; - await Promise.all( - deploymentConfig.tokens.map(async tokenToDeploy => { - console.log( - "Deploying token", - tokenToDeploy.name, - tokenToDeploy.symbol - ); - const totalSupply = tokenToDeploy.distribution.reduce(function ( - prev, - cur - ) { - return new BigNumber(prev).plus(cur.amount.toString()); - }, - 0); - - let newToken; - switch (tokenToDeploy.type) { - case "ERC20": - newToken = await ERC20Mock.new(accounts[0], totalSupply.toString()); - await tokenToDeploy.distribution.map(async tokenHolder => { - await newToken.transfer(tokenHolder.address, tokenHolder.amount, { - from: accounts[0], - }); - }); - break; - case "ERC20SnapshotRep": - newToken = await ERC20SnapshotRep.new(); - await newToken.initialize( - tokenToDeploy.name, - tokenToDeploy.symbol, - { - from: accounts[0], - } - ); - await tokenToDeploy.distribution.map(async tokenHolder => { - await newToken.mint(tokenHolder.address, tokenHolder.amount, { - from: accounts[0], - }); - }); - break; - } - tokens[tokenToDeploy.symbol] = newToken; - addresses[tokenToDeploy.symbol] = newToken.address; - }) + const { tokens, addresses: tokenAddresses } = await deployTokens( + deploymentConfig ); + addresses.concat(tokenAddresses); // Deploy Avatar let avatar; diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js new file mode 100644 index 00000000..8dd5d598 --- /dev/null +++ b/scripts/utils/deploy-guilds.js @@ -0,0 +1,214 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); +const { default: BigNumber } = require("bignumber.js"); + +export async function deployTokens(deploymentConfig, tokens) { + // Deploy Guilds + let guilds = {}; + let proposals = { + dxvote: [], + }; + const networkContracts = {}; + const guildRegistry = await GuildRegistry.new(); + + // Each guild is created and initialized and use a previously deployed token or specific token address + await Promise.all( + deploymentConfig.guilds.map(async guildToDeploy => { + console.log("Deploying guild", guildToDeploy.name); + const GuildContract = await hre.artifacts.require( + guildToDeploy.contractName + ); + const newGuild = await GuildContract.new(); + await newGuild.initialize( + tokens[guildToDeploy.token].address, + guildToDeploy.proposalTime, + guildToDeploy.timeForExecution, + guildToDeploy.votingPowerForProposalExecution, + guildToDeploy.votingPowerForProposalCreation, + guildToDeploy.name, + guildToDeploy.voteGas, + guildToDeploy.maxGasPrice, + guildToDeploy.maxActiveProposals, + guildToDeploy.lockTime, + permissionRegistry.address + ); + if (guildToDeploy.contractName === "SnapshotRepERC20Guild") + await tokens[guildToDeploy.token].transferOwnership(newGuild.address, { + from: accounts[0], + }); + await guildRegistry.addGuild(newGuild.address); + guilds[guildToDeploy.name] = newGuild; + addresses[guildToDeploy.name] = newGuild.address; + proposals[guildToDeploy.name] = []; + addresses[guildToDeploy.name + "-vault"] = await newGuild.getTokenVault(); + }) + ); + + await guildRegistry.transferOwnership(avatar.address); + networkContracts.utils.guildRegistry = guildRegistry.address; + + console.log("Contracts deployed:", networkContracts); + + // const startTime = deploymentConfig.startTimestampForActions; + + // Increase time to start time for actions + // await hre.network.provider.request({ + // method: "evm_increaseTime", + // params: [startTime - (await web3.eth.getBlock("latest")).timestamp], + // }); + + const ipfs = await IPFS.create(); + + // Execute a set of actions once all contracts are deployed + for (let i = 0; i < deploymentConfig.actions.length; i++) { + const action = deploymentConfig.actions[i]; + + // if (action.time) + // await network.provider.send("evm_increaseTime", [action.time]); + console.log("Executing action:", action); + + switch (action.type) { + case "approve": + await tokens[action.data.asset].approve( + addresses[action.data.address] || action.data.address, + action.data.amount, + { from: action.from } + ); + break; + + case "transfer": + action.data.asset === NULL_ADDRESS + ? await web3.eth.sendTransaction({ + to: addresses[action.data.address] || action.data.address, + value: action.data.amount, + from: action.from, + }) + : await tokens[action.data.asset].transfer( + addresses[action.data.address] || action.data.address, + action.data.amount, + { from: action.from } + ); + break; + + case "proposal": + const proposalDescriptionHash = ( + await ipfs.add( + JSON.stringify({ + description: action.data.description, + title: action.data.title, + tags: action.data.tags, + url: "", + }) + ) + ).cid.toString(); + const proposalCreationTx = + action.data.scheme === "ContributionReward" + ? await ( + await ContributionReward.at(contributionReward.address) + ).proposeContributionReward( + avatar.address, + contentHash.fromIpfs(proposalDescriptionHash), + action.data.reputationChange, + action.data.rewards, + action.data.externalToken, + action.data.beneficiary, + { from: action.from } + ) + : await ( + await WalletScheme.at(addresses[action.data.scheme]) + ).proposeCalls( + action.data.to.map(_to => addresses[_to] || _to), + action.data.callData, + action.data.value, + action.data.title, + contentHash.fromIpfs(proposalDescriptionHash), + { from: action.from } + ); + proposals.dxvote.push( + proposalCreationTx.receipt.logs[0].args._proposalId + ); + break; + case "vote": + await votingMachine.vote( + proposals.dxvote[action.data.proposal], + action.data.decision, + action.data.amount, + action.from, + { from: action.from } + ); + break; + case "stake": + await votingMachine.stake( + proposals.dxvote[action.data.proposal], + action.data.decision, + action.data.amount, + { from: action.from } + ); + break; + case "execute": + try { + await votingMachine.execute(proposals.dxvote[action.data.proposal], { + from: action.from, + gas: 9000000, + }); + } catch (error) { + console.log("Execution of proposal failed", error); + } + break; + case "redeem": + await votingMachine.redeem( + proposals.dxvote[action.data.proposal], + action.from, + { from: action.from } + ); + break; + case "guild-createProposal": + const guildProposalDescriptionHash = ( + await ipfs.add( + JSON.stringify({ description: action.data.proposalBody, url: "" }) + ) + ).cid.toString(); + const guildProposalCreationTx = await guilds[ + action.data.guildName + ].createProposal( + action.data.to.map(_to => addresses[_to] || _to), + action.data.callData, + action.data.value, + action.data.totalActions, + action.data.title, + contentHash.fromIpfs(guildProposalDescriptionHash).toString(), + { from: action.from } + ); + proposals[action.data.guildName].push( + guildProposalCreationTx.receipt.logs[0].args.proposalId + ); + break; + case "guild-lockTokens": + await guilds[action.data.guildName].lockTokens(action.data.amount, { + from: action.from, + }); + break; + case "guild-withdrawTokens": + await guilds[action.data.guildName].withdrawTokens(action.data.amount, { + from: action.from, + }); + break; + case "guild-voteProposal": + console.log(proposals); + await guilds[action.data.guildName].setVote( + proposals[action.data.guildName][action.data.proposal], + action.data.action, + action.data.votingPower + ); + break; + case "guild-endProposal": + await guilds[action.data.guildName].endProposal( + proposals[action.data.guildName][action.data.proposal], + { from: action.from } + ); + break; + default: + break; + } + } +} diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js new file mode 100644 index 00000000..8110d23c --- /dev/null +++ b/scripts/utils/deploy-tokens.js @@ -0,0 +1,49 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); +const { default: BigNumber } = require("bignumber.js"); + +export async function deployTokens(deploymentConfig) { + const ERC20Mock = await hre.artifacts.require("ERC20Mock"); + const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); + + let tokens = {}; + await Promise.all( + deploymentConfig.tokens.map(async tokenToDeploy => { + console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); + const totalSupply = tokenToDeploy.distribution.reduce(function ( + previous, + current + ) { + return new BigNumber(previous).plus(current.amount.toString()); + }, + 0); + + let newToken; + switch (tokenToDeploy.type) { + case "ERC20": + newToken = await ERC20Mock.new(accounts[0], totalSupply.toString()); + await tokenToDeploy.distribution.map(async tokenHolder => { + await newToken.transfer(tokenHolder.address, tokenHolder.amount, { + from: accounts[0], + }); + }); + break; + case "ERC20SnapshotRep": + newToken = await ERC20SnapshotRep.new(); + await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol, { + from: accounts[0], + }); + await tokenToDeploy.distribution.map(async tokenHolder => { + await newToken.mint(tokenHolder.address, tokenHolder.amount, { + from: accounts[0], + }); + }); + break; + } + tokens[tokenToDeploy.symbol] = newToken; + addresses[tokenToDeploy.symbol] = newToken.address; + }) + ); + + return { tokens, addresses }; +} From 3c0985101f9723f607f0e50c30bcc4c19d520261 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 26 Apr 2022 10:07:03 +0100 Subject: [PATCH 02/37] feat: New scripts for guilds --- .../.hardhat-dependency-compiler | 1 + .../proxy/transparent/ProxyAdmin.sol | 3 + .../TransparentUpgradeableProxy.sol | 3 + .../truffle/contracts/Realitio.sol | 3 + package.json | 1 + scripts/deploy-dxvote.js | 1 + scripts/deploy-guilds-develop.js | 158 ++++++++++++++++++ scripts/deploy-guilds.js | 109 ++++++++++++ scripts/test.sh | 122 ++++++++++++++ scripts/utils/deploy-guilds.js | 7 +- scripts/utils/deploy-tokens.js | 12 +- 11 files changed, 407 insertions(+), 13 deletions(-) create mode 100644 contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler create mode 100644 contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol create mode 100644 contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol create mode 100644 contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol create mode 100644 scripts/deploy-guilds-develop.js create mode 100644 scripts/deploy-guilds.js create mode 100755 scripts/test.sh diff --git a/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler b/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler new file mode 100644 index 00000000..8d6654c4 --- /dev/null +++ b/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler @@ -0,0 +1 @@ +directory approved for write access by hardhat-dependency-compiler diff --git a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol new file mode 100644 index 00000000..4dc8a2f1 --- /dev/null +++ b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol new file mode 100644 index 00000000..bb639533 --- /dev/null +++ b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol b/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol new file mode 100644 index 00000000..62394192 --- /dev/null +++ b/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol @@ -0,0 +1,3 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity >0.0.0; +import "@realitio/realitio-contracts/truffle/contracts/Realitio.sol"; diff --git a/package.json b/package.json index ab61f563..7a433beb 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ ], "scripts": { "test": "npx hardhat test && rm -r contracts/hardhat-dependency-compiler", + "attempt": "./scripts/test.sh", "coverage": "./scripts/coverage.sh", "compile": "rm -rf artifacts cache contracts/hardhat-dependency-compiler && npx hardhat compile", "deploy": "node scripts/deploy.js", diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index b8c1d3ab..c18a5909 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -21,6 +21,7 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") return new Promise(resolve => setTimeout(resolve, ms)); } + console.log("yo"); let addresses = {}; // Parse string json config to json object diff --git a/scripts/deploy-guilds-develop.js b/scripts/deploy-guilds-develop.js new file mode 100644 index 00000000..ce2d4ba8 --- /dev/null +++ b/scripts/deploy-guilds-develop.js @@ -0,0 +1,158 @@ +require("@nomiclabs/hardhat-web3"); +const moment = require("moment"); +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; +const ANY_ADDRESS = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa"; +const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; + +task("deploy-guilds-develop", "Deploy dxvote with develop config").setAction( + async () => { + console.log("Entered first script"); + // const PermissionRegistry = await hre.artifacts.require( + // "PermissionRegistry" + // ); + const ERC20Guild = await hre.artifacts.require("ERC20Guild"); + + const deployconfig = { + tokens: [ + { + name: "DXDao on localhost", + symbol: "DXD", + type: "ERC20", + distribution: [ + { + address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + amount: web3.utils.toWei("220"), + }, + { + address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + amount: web3.utils.toWei("50"), + }, + { + address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + amount: web3.utils.toWei("10"), + }, + ], + }, + { + name: "REPGuildToken", + symbol: "RGT", + type: "ERC20SnapshotRep", + distribution: [ + { + address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + amount: 1000, + }, + { + address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + amount: 4000, + }, + { + address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + amount: 10000, + }, + ], + }, + ], + + permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), + + guilds: [ + { + token: "DXD", + contractName: "DXDGuild", + name: "DXDGuild", + proposalTime: moment.duration(10, "minutes").asSeconds(), + timeForExecution: moment.duration(5, "minutes").asSeconds(), + votingPowerForProposalExecution: "30", + votingPowerForProposalCreation: "1", + voteGas: "0", + maxGasPrice: "0", + maxActiveProposals: "2", + lockTime: moment.duration(10, "minutes").asSeconds(), + }, + { + token: "RGT", + contractName: "SnapshotRepERC20Guild", + name: "REPGuild", + proposalTime: moment.duration(5, "minutes").asSeconds(), + timeForExecution: moment.duration(2, "minutes").asSeconds(), + votingPowerForProposalExecution: "50", + votingPowerForProposalCreation: "5", + voteGas: "0", + maxGasPrice: "0", + maxActiveProposals: "5", + lockTime: moment.duration(5, "minutes").asSeconds(), + }, + ], + + startTimestampForActions: moment().subtract(10, "minutes").unix(), + + actions: [ + { + type: "guild-lockTokens", + from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + data: { + guildName: "DXDGuild", + amount: web3.utils.toWei("100"), + }, + }, + { + type: "guild-withdrawTokens", + from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + data: { + guildName: "DXDGuild", + amount: web3.utils.toWei("10"), + }, + time: moment.duration(10, "minutes").asSeconds() + 1, + }, + { + type: "guild-createProposal", + from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + data: { + guildName: "DXDGuild", + to: ["DXDGuild"], + callData: [ + new web3.eth.Contract(ERC20Guild.abi).methods + .setPermission( + [NULL_ADDRESS], + [ANY_ADDRESS], + [ANY_FUNC_SIGNATURE], + [web3.utils.toWei("5").toString()], + [true] + ) + .encodeABI(), + ], + value: ["0"], + totalActions: "1", + title: "Proposal Test #0", + description: + "Allow call any address and function and send a max of 5 ETH per proposal", + }, + }, + { + type: "guild-voteProposal", + from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + data: { + guildName: "DXDGuild", + proposal: 0, + action: "1", + votingPower: web3.utils.toWei("90").toString(), + }, + }, + { + time: moment.duration(10, "minutes").asSeconds(), + type: "guild-endProposal", + from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + data: { + guildName: "DXDGuild", + proposal: 0, + }, + }, + ], + }; + + await hre.run("deploy-guilds", { + deployconfig: JSON.stringify(deployconfig), + }); + } +); diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js new file mode 100644 index 00000000..e0ee82ae --- /dev/null +++ b/scripts/deploy-guilds.js @@ -0,0 +1,109 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); +// const hre = require("hardhat"); + +const deployTokens = require("./utils/deploy-tokens"); +const moment = require("moment"); +const { default: BigNumber } = require("bignumber.js"); +const { deployGuilds } = require("./utils/deploy-guilds"); + +// const ERC20Guild = hre.artifacts.require("ERC20Guild"); + +// const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; +// const ANY_ADDRESS = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa"; +// // const MAX_UINT_256 = +// // "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; +// const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; +// const web3 = hre.web3; + +task("deploy-guilds", "Deploy guilds") + .addParam("deployconfig", "The deploy config json in string format") + .setAction(async ({ deployconfig }) => { + console.log("Entered script"); + function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + let addresses = {}; + + // Parse string json config to json object + const deploymentConfig = JSON.parse(deployconfig); + + // Import contracts + const PermissionRegistry = await hre.artifacts.require( + "PermissionRegistry" + ); + + async function waitBlocks(blocks) { + const toBlock = (await web3.eth.getBlock("latest")).number + blocks; + while ((await web3.eth.getBlock("latest")).number < toBlock) { + await sleep(500); + } + return; + } + + // Get ETH accounts to be used + // const accounts = await web3.eth.getAccounts(); + + // Get fromBlock for network contracts + const fromBlock = (await web3.eth.getBlock("latest")).number; + + // Set networkContracts object that will store the contracts deployed + let networkContracts = { + fromBlock: fromBlock, + avatar: null, + reputation: null, + token: null, + controller: null, + permissionRegistry: null, + schemes: {}, + utils: {}, + votingMachines: {}, + }; + + // Deploy Tokens + const { tokens, addresses: tokenAddresses } = await deployTokens( + deploymentConfig + ); + addresses.concat(tokenAddresses); + + // Deploy PermissionRegistry to be used by WalletSchemes + let permissionRegistry; + console.log("Deploying PermissionRegistry..."); + permissionRegistry = await PermissionRegistry.new(); + await permissionRegistry.initialize(); + addresses["PermissionRegistry"] = permissionRegistry.address; + + console.log("Permission Registry deployed to:", permissionRegistry.address); + networkContracts.permissionRegistry = permissionRegistry.address; + addresses["PermissionRegstry"] = permissionRegistry.address; + await waitBlocks(1); + + // Deploy Guilds + networkContracts.utils.guildRegistry = await deployGuilds( + deploymentConfig, + tokens + ); + + // Increase time to local time + await hre.network.provider.request({ + method: "evm_increaseTime", + params: [moment().unix() - (await web3.eth.getBlock("latest")).timestamp], + }); + + return { networkContracts, addresses }; + }); + +// async function main() { +// console.log(2); +// const { networkContracts, addresses } = await hre.run("deploy-guilds"); +// console.log({ networkContracts, addresses }); +// } +// console.log(1); + +// main() +// .then(() => process.exit(0)) +// .catch(error => { +// console.error(error); +// process.exit(1); +// }); diff --git a/scripts/test.sh b/scripts/test.sh new file mode 100755 index 00000000..7c3c930c --- /dev/null +++ b/scripts/test.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash + +# Exit script as soon as a command fails. +set -o errexit + +# Executes cleanup function at script exit. +trap cleanup EXIT + +cleanup() { + # Kill the hardhat instance that we started (if we started one and if it's still running). + if [ -n "$hardhat_pid" ] && ps -p $hardhat_pid > /dev/null; then + kill -9 $hardhat_pid + fi +} +mnemonic="dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao" + +hardhat_running() { + nc -z localhost 8545 +} + +start-hardhat_node() { + + npx hardhat node > /dev/null & + + # Account #0: 0x79706c8e413cdaee9e63f282507287b9ea9c0928 (10000 ETH) + # Private Key: 0xe408e147b1335674887c1ac7dc3c45de9762aa824cf6255fd8bd61fecf15f021 + # + # Account #1: 0xc73480525e9d1198d448ece4a01daea851f72a9d (10000 ETH) + # Private Key: 0x6c8a6a9a7dbad13d6b41089648ae4b7971116611e4acd8f052c478dd8c62673e + # + # Account #2: 0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351 (10000 ETH) + # Private Key: 0x0054b824c2083e7db09f36edb2ab24eb31f8276fa6cd62e30b42e3a185b37179 + # + # Account #3: 0xaf1a6415202453d79b84d8a9d055b8f9141f696b (10000 ETH) + # Private Key: 0x3688ff0d0a95dd8b90bc68739505b488ff4908291eeb36380a94227d22653ce3 + # + # Account #4: 0x02803e2cdff171d1910d178dac948c711937bd3f (10000 ETH) + # Private Key: 0x530caa05cf058253ed14a2e6ccc5dcb952f09c7bcdcfb4be37e572e85dcafd1e + # + # Account #5: 0x797c62953ef866a1ece855c4033cc5dc3c11290b (10000 ETH) + # Private Key: 0x88ae5259286213d051e99da743d79be5d69dc75ee317bc887f5996ff004b83a6 + # + # Account #6: 0x016f70459e4ba98e0d60a5f5855e117e8ff39cae (10000 ETH) + # Private Key: 0x68f5bc4b52a67b3d800d0d8832ae3b89067a3bbee68c66544147e312d996d994 + # + # Account #7: 0x073f4fdc12f805b8d98e58551fc10d0a71bbc7db (10000 ETH) + # Private Key: 0x9adc9dfdce8383a1634716bf7a2e317a145f37a176a7b42538ace5ac20e223a1 + # + # Account #8: 0x6829556f30899d70403947590ffe8900e8c0d0d7 (10000 ETH) + # Private Key: 0x13436bc37e24487c2f1739d1ce6b8271a8465fee93aa3685ce543e56a50e1692 + # + # Account #9: 0x2b410bcb3b8096164fa8c6a06220a66bfb77058d (10000 ETH) + # Private Key: 0x4fe097bbfe75d9531d253b7f917f89dcee6664d832e40a8d82d717602dfeeb6c + # + # Account #10: 0x309f75c54a57937a7a0c6eb9b36eb1dbca82407e (10000 ETH) + # Private Key: 0xb10da35e4abe181d1143aa28a7da6c5f303660b954cf283accfeba2dfb56ab51 + # + # Account #11: 0xec9d2d34ad6acda19ab8afe71595051b206e3e4d (10000 ETH) + # Private Key: 0xfdf0c66289fafea1803c64522d073d6cc9ec71ba76e945a7c207f1f5ebb8e3b1 + # + # Account #12: 0x40c23c536bad1fe206ce911114f2c70309a7e487 (10000 ETH) + # Private Key: 0x97c63b257e8f86e05ae5a7bbb025b02d179b8d00fb9fbcdbfcdf04dcf9173cf2 + # + # Account #13: 0x28d254f2ddb522c43a21d338e337fd8d2f820db2 (10000 ETH) + # Private Key: 0xcdef57c095755d77bbbb327a187e67039c62fe39425e29b3646d334f54d28808 + # + # Account #14: 0xaf7386ce842cc0cffef91361059b0ca9ae48d6a0 (10000 ETH) + # Private Key: 0x4739bf3390cd5be10d0f58d2c1e887a186b544af563fa62717a6c324b36fed59 + # + # Account #15: 0x46c18451aaead6a2cb888b5bd6193c0f2c402329 (10000 ETH) + # Private Key: 0xc6b5889c8fbd0f3304ddd53b85f056a32b8338f99e5b8877ecb1d1c5543c8d6a + # + # Account #16: 0xc707c8143a6e1274ae7f637946f685870925261f (10000 ETH) + # Private Key: 0x4b00e0c8e17e88d588b204121594f14d20d1abe50e280d599ff39d6b35c44533 + # + # Account #17: 0x5b14a88dbbb04abcb6e5bf6384491be8d939cf57 (10000 ETH) + # Private Key: 0x18eecce45e3211ce6ce967f66c404798e36e8298b4b5222ebf597b841ebd868a + # + # Account #18: 0x92d356240dda25d050aa441690b92b2fa0011b84 (10000 ETH) + # Private Key: 0xe53525f97971b006e14820a8a7b74f8aae375b6635735d89b4db2e4cbdf0e8e0 + # + # Account #19: 0x5a485c203d9537095a6be2acc5a7ad83805d301d (10000 ETH) + # Private Key: 0xb86f3287c11a77c7317c2484be2bd386816876ead8ceaf86971b7b7c1afbb12b + + hardhat_pid=$! + + echo "Waiting for hardhat to launch..." + + while ! hardhat_running; do + sleep 0.1 # wait for 1/10 of the second before check again + done + + echo "Harhat node launched!" +} + +if hardhat_running; then + echo "Killing existent hardhat" + kill $(lsof -t -i:8545) +fi + +echo "Starting our own hardhat node instance" +start-hardhat_node + +# Compile your contracts +yarn compile + +# Disable isolatedModules and use commonjs in tsconfig +# contents="$(jq '.compilerOptions.isolatedModules = false' tsconfig.json)" && \ +# echo "${contents}" > tsconfig.json +# contents="$(jq '.compilerOptions.module = "commonjs"' tsconfig.json)" && \ +# echo "${contents}" > tsconfig.json + +# node scripts/beforeBuild.js + +# Deploy local contracts +npx hardhat run --network localhost scripts/deploy-guilds-develop.js + +# # Enable isolatedModules and use esnext as module in tsconfig +# contents="$(jq '.compilerOptions.isolatedModules = true' tsconfig.json)" && \ +# echo "${contents}" > tsconfig.json +# contents="$(jq '.compilerOptions.module = "esnext"' tsconfig.json)" && \ +# echo "${contents}" > tsconfig.json diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 8dd5d598..15448838 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -2,7 +2,7 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployTokens(deploymentConfig, tokens) { +export async function deployGuilds(deploymentConfig, tokens) { // Deploy Guilds let guilds = {}; let proposals = { @@ -33,9 +33,7 @@ export async function deployTokens(deploymentConfig, tokens) { permissionRegistry.address ); if (guildToDeploy.contractName === "SnapshotRepERC20Guild") - await tokens[guildToDeploy.token].transferOwnership(newGuild.address, { - from: accounts[0], - }); + await tokens[guildToDeploy.token].transferOwnership(newGuild.address); await guildRegistry.addGuild(newGuild.address); guilds[guildToDeploy.name] = newGuild; addresses[guildToDeploy.name] = newGuild.address; @@ -211,4 +209,5 @@ export async function deployTokens(deploymentConfig, tokens) { break; } } + return guildRegistry.address; } diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 8110d23c..8a1d1485 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -23,20 +23,14 @@ export async function deployTokens(deploymentConfig) { case "ERC20": newToken = await ERC20Mock.new(accounts[0], totalSupply.toString()); await tokenToDeploy.distribution.map(async tokenHolder => { - await newToken.transfer(tokenHolder.address, tokenHolder.amount, { - from: accounts[0], - }); + await newToken.transfer(tokenHolder.address, tokenHolder.amount); }); break; case "ERC20SnapshotRep": newToken = await ERC20SnapshotRep.new(); - await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol, { - from: accounts[0], - }); + await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol); await tokenToDeploy.distribution.map(async tokenHolder => { - await newToken.mint(tokenHolder.address, tokenHolder.amount, { - from: accounts[0], - }); + await newToken.mint(tokenHolder.address, tokenHolder.amount); }); break; } From 632d69ca084e96d2de40ee65a658b2da391d7feb Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 26 Apr 2022 17:58:12 +0100 Subject: [PATCH 03/37] feat: Guild deployment working and improved --- hardhat.config.js | 4 +- .../deploy-dxvote-develop.js | 0 .../deploy-guilds-develop.js | 82 +------ scripts/deploy-dxvote.js | 218 +----------------- scripts/deploy-guilds.js | 29 +-- scripts/test.sh | 4 +- scripts/utils/deploy-guilds.js | 15 +- scripts/utils/deploy-tokens.js | 3 +- 8 files changed, 37 insertions(+), 318 deletions(-) rename scripts/{ => DeploymentTemplates}/deploy-dxvote-develop.js (100%) rename scripts/{ => DeploymentTemplates}/deploy-guilds-develop.js (51%) diff --git a/hardhat.config.js b/hardhat.config.js index c856ac90..848b2b12 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -13,7 +13,9 @@ require("hardhat-dependency-compiler"); require("./scripts/create2"); require("./scripts/deploy-dxvote"); -require("./scripts/deploy-dxvote-develop"); +require("./scripts/DeploymentTemplates/deploy-dxvote-develop"); +require("./scripts/deploy-guilds"); +require("./scripts/DeploymentTemplates/deploy-guilds-develop"); const moment = require("moment"); diff --git a/scripts/deploy-dxvote-develop.js b/scripts/DeploymentTemplates/deploy-dxvote-develop.js similarity index 100% rename from scripts/deploy-dxvote-develop.js rename to scripts/DeploymentTemplates/deploy-dxvote-develop.js diff --git a/scripts/deploy-guilds-develop.js b/scripts/DeploymentTemplates/deploy-guilds-develop.js similarity index 51% rename from scripts/deploy-guilds-develop.js rename to scripts/DeploymentTemplates/deploy-guilds-develop.js index ce2d4ba8..ce94fa6b 100644 --- a/scripts/deploy-guilds-develop.js +++ b/scripts/DeploymentTemplates/deploy-guilds-develop.js @@ -1,16 +1,10 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); -const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -const ANY_ADDRESS = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa"; -const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -task("deploy-guilds-develop", "Deploy dxvote with develop config").setAction( - async () => { +task("deploy-guilds-develop", "Deploy dxvote with develop config") + .addParam("registryAddress", "The registry for the given network") + .setAction(async () => { console.log("Entered first script"); - // const PermissionRegistry = await hre.artifacts.require( - // "PermissionRegistry" - // ); - const ERC20Guild = await hre.artifacts.require("ERC20Guild"); const deployconfig = { tokens: [ @@ -55,7 +49,7 @@ task("deploy-guilds-develop", "Deploy dxvote with develop config").setAction( ], permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - + guildRegistry: registryAddress, guilds: [ { token: "DXD", @@ -87,72 +81,12 @@ task("deploy-guilds-develop", "Deploy dxvote with develop config").setAction( startTimestampForActions: moment().subtract(10, "minutes").unix(), - actions: [ - { - type: "guild-lockTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - amount: web3.utils.toWei("100"), - }, - }, - { - type: "guild-withdrawTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - amount: web3.utils.toWei("10"), - }, - time: moment.duration(10, "minutes").asSeconds() + 1, - }, - { - type: "guild-createProposal", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - to: ["DXDGuild"], - callData: [ - new web3.eth.Contract(ERC20Guild.abi).methods - .setPermission( - [NULL_ADDRESS], - [ANY_ADDRESS], - [ANY_FUNC_SIGNATURE], - [web3.utils.toWei("5").toString()], - [true] - ) - .encodeABI(), - ], - value: ["0"], - totalActions: "1", - title: "Proposal Test #0", - description: - "Allow call any address and function and send a max of 5 ETH per proposal", - }, - }, - { - type: "guild-voteProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - data: { - guildName: "DXDGuild", - proposal: 0, - action: "1", - votingPower: web3.utils.toWei("90").toString(), - }, - }, - { - time: moment.duration(10, "minutes").asSeconds(), - type: "guild-endProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - data: { - guildName: "DXDGuild", - proposal: 0, - }, - }, - ], + actions: [], }; await hre.run("deploy-guilds", { deployconfig: JSON.stringify(deployconfig), }); - } -); + }); + +module.exports = {}; diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index c18a5909..f8519f8f 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -13,6 +13,7 @@ const { encodePermission } = require("../test/helpers/permissions"); const deployTokens = require("./utils/deploy-tokens"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); +const { deployGuilds } = require("./utils/deploy-guilds"); task("deploy-dxvote", "Deploy dxvote in localhost network") .addParam("deployconfig", "The deploy config json in string format") @@ -107,7 +108,7 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") const { tokens, addresses: tokenAddresses } = await deployTokens( deploymentConfig ); - addresses.concat(tokenAddresses); + addresses = Object.assign(addresses, tokenAddresses); // Deploy Avatar let avatar; @@ -485,220 +486,9 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") await controller.unregisterScheme(accounts[0], avatar.address); // Deploy Guilds - let guilds = {}; - let proposals = { - dxvote: [], - }; - const guildRegistry = await GuildRegistry.new(); - - // Each guild is created and initialized and use a previously deployed token or specific token address - await Promise.all( - deploymentConfig.guilds.map(async guildToDeploy => { - console.log("Deploying guild", guildToDeploy.name); - const GuildContract = await hre.artifacts.require( - guildToDeploy.contractName - ); - const newGuild = await GuildContract.new(); - await newGuild.initialize( - tokens[guildToDeploy.token].address, - guildToDeploy.proposalTime, - guildToDeploy.timeForExecution, - guildToDeploy.votingPowerForProposalExecution, - guildToDeploy.votingPowerForProposalCreation, - guildToDeploy.name, - guildToDeploy.voteGas, - guildToDeploy.maxGasPrice, - guildToDeploy.maxActiveProposals, - guildToDeploy.lockTime, - permissionRegistry.address - ); - if (guildToDeploy.contractName === "SnapshotRepERC20Guild") - await tokens[guildToDeploy.token].transferOwnership( - newGuild.address, - { - from: accounts[0], - } - ); - await guildRegistry.addGuild(newGuild.address); - guilds[guildToDeploy.name] = newGuild; - addresses[guildToDeploy.name] = newGuild.address; - proposals[guildToDeploy.name] = []; - addresses[guildToDeploy.name + "-vault"] = - await newGuild.getTokenVault(); - }) - ); - - await guildRegistry.transferOwnership(avatar.address); - networkContracts.utils.guildRegistry = guildRegistry.address; - - console.log("Contracts deployed:", networkContracts); - const startTime = deploymentConfig.startTimestampForActions; - - // Increase time to start time for actions - await hre.network.provider.request({ - method: "evm_increaseTime", - params: [startTime - (await web3.eth.getBlock("latest")).timestamp], - }); - - const ipfs = await IPFS.create(); - - // Execute a set of actions once all contracts are deployed - for (let i = 0; i < deploymentConfig.actions.length; i++) { - const action = deploymentConfig.actions[i]; - - if (action.time) - await network.provider.send("evm_increaseTime", [action.time]); - console.log("Executing action:", action); - - switch (action.type) { - case "approve": - await tokens[action.data.asset].approve( - addresses[action.data.address] || action.data.address, - action.data.amount, - { from: action.from } - ); - break; - - case "transfer": - action.data.asset === NULL_ADDRESS - ? await web3.eth.sendTransaction({ - to: addresses[action.data.address] || action.data.address, - value: action.data.amount, - from: action.from, - }) - : await tokens[action.data.asset].transfer( - addresses[action.data.address] || action.data.address, - action.data.amount, - { from: action.from } - ); - break; - - case "proposal": - const proposalDescriptionHash = ( - await ipfs.add( - JSON.stringify({ - description: action.data.description, - title: action.data.title, - tags: action.data.tags, - url: "", - }) - ) - ).cid.toString(); - const proposalCreationTx = - action.data.scheme === "ContributionReward" - ? await ( - await ContributionReward.at(contributionReward.address) - ).proposeContributionReward( - avatar.address, - contentHash.fromIpfs(proposalDescriptionHash), - action.data.reputationChange, - action.data.rewards, - action.data.externalToken, - action.data.beneficiary, - { from: action.from } - ) - : await ( - await WalletScheme.at(addresses[action.data.scheme]) - ).proposeCalls( - action.data.to.map(_to => addresses[_to] || _to), - action.data.callData, - action.data.value, - action.data.title, - contentHash.fromIpfs(proposalDescriptionHash), - { from: action.from } - ); - proposals.dxvote.push( - proposalCreationTx.receipt.logs[0].args._proposalId - ); - break; - case "vote": - await votingMachine.vote( - proposals.dxvote[action.data.proposal], - action.data.decision, - action.data.amount, - action.from, - { from: action.from } - ); - break; - case "stake": - await votingMachine.stake( - proposals.dxvote[action.data.proposal], - action.data.decision, - action.data.amount, - { from: action.from } - ); - break; - case "execute": - try { - await votingMachine.execute( - proposals.dxvote[action.data.proposal], - { - from: action.from, - gas: 9000000, - } - ); - } catch (error) { - console.log("Execution of proposal failed", error); - } - break; - case "redeem": - await votingMachine.redeem( - proposals.dxvote[action.data.proposal], - action.from, - { from: action.from } - ); - break; - case "guild-createProposal": - const guildProposalDescriptionHash = ( - await ipfs.add( - JSON.stringify({ description: action.data.proposalBody, url: "" }) - ) - ).cid.toString(); - const guildProposalCreationTx = await guilds[ - action.data.guildName - ].createProposal( - action.data.to.map(_to => addresses[_to] || _to), - action.data.callData, - action.data.value, - action.data.totalActions, - action.data.title, - contentHash.fromIpfs(guildProposalDescriptionHash).toString(), - { from: action.from } - ); - proposals[action.data.guildName].push( - guildProposalCreationTx.receipt.logs[0].args.proposalId - ); - break; - case "guild-lockTokens": - await guilds[action.data.guildName].lockTokens(action.data.amount, { - from: action.from, - }); - break; - case "guild-withdrawTokens": - await guilds[action.data.guildName].withdrawTokens( - action.data.amount, - { from: action.from } - ); - break; - case "guild-voteProposal": - console.log(proposals); - await guilds[action.data.guildName].setVote( - proposals[action.data.guildName][action.data.proposal], - action.data.action, - action.data.votingPower - ); - break; - case "guild-endProposal": - await guilds[action.data.guildName].endProposal( - proposals[action.data.guildName][action.data.proposal], - { from: action.from } - ); - break; - default: - break; - } - } + const guildRegistry = await GuildRegistry.new(); + await deployGuilds(deploymentTokens, tokens, guildRegistry); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index e0ee82ae..2083591c 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -2,7 +2,7 @@ require("@nomiclabs/hardhat-web3"); // const hre = require("hardhat"); -const deployTokens = require("./utils/deploy-tokens"); +const { deployTokens } = require("./utils/deploy-tokens"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); const { deployGuilds } = require("./utils/deploy-guilds"); @@ -43,7 +43,7 @@ task("deploy-guilds", "Deploy guilds") } // Get ETH accounts to be used - // const accounts = await web3.eth.getAccounts(); + const accounts = await web3.eth.getAccounts(); // Get fromBlock for network contracts const fromBlock = (await web3.eth.getBlock("latest")).number; @@ -63,9 +63,11 @@ task("deploy-guilds", "Deploy guilds") // Deploy Tokens const { tokens, addresses: tokenAddresses } = await deployTokens( - deploymentConfig + deploymentConfig, + accounts ); - addresses.concat(tokenAddresses); + + addresses = Object.assign(addresses, tokenAddresses); // Deploy PermissionRegistry to be used by WalletSchemes let permissionRegistry; @@ -80,9 +82,10 @@ task("deploy-guilds", "Deploy guilds") await waitBlocks(1); // Deploy Guilds - networkContracts.utils.guildRegistry = await deployGuilds( + await deployGuilds( deploymentConfig, - tokens + tokens, + deploymentConfig.guildRegistry ); // Increase time to local time @@ -94,16 +97,4 @@ task("deploy-guilds", "Deploy guilds") return { networkContracts, addresses }; }); -// async function main() { -// console.log(2); -// const { networkContracts, addresses } = await hre.run("deploy-guilds"); -// console.log({ networkContracts, addresses }); -// } -// console.log(1); - -// main() -// .then(() => process.exit(0)) -// .catch(error => { -// console.error(error); -// process.exit(1); -// }); +module.exports = {}; diff --git a/scripts/test.sh b/scripts/test.sh index 7c3c930c..b9b0d37f 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -102,7 +102,7 @@ echo "Starting our own hardhat node instance" start-hardhat_node # Compile your contracts -yarn compile +# yarn compile # Disable isolatedModules and use commonjs in tsconfig # contents="$(jq '.compilerOptions.isolatedModules = false' tsconfig.json)" && \ @@ -113,7 +113,7 @@ yarn compile # node scripts/beforeBuild.js # Deploy local contracts -npx hardhat run --network localhost scripts/deploy-guilds-develop.js +yarn hardhat --network localhost deploy-guilds-develop # # Enable isolatedModules and use esnext as module in tsconfig # contents="$(jq '.compilerOptions.isolatedModules = true' tsconfig.json)" && \ diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 15448838..077468cf 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -2,14 +2,19 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployGuilds(deploymentConfig, tokens) { +const contentHash = require("content-hash"); +const IPFS = require("ipfs-core"); + +export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // Deploy Guilds let guilds = {}; let proposals = { dxvote: [], }; const networkContracts = {}; - const guildRegistry = await GuildRegistry.new(); + const addresses = {}; + const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); + const permissionRegistry = await PermissionRegistry.new(); // Each guild is created and initialized and use a previously deployed token or specific token address await Promise.all( @@ -34,7 +39,7 @@ export async function deployGuilds(deploymentConfig, tokens) { ); if (guildToDeploy.contractName === "SnapshotRepERC20Guild") await tokens[guildToDeploy.token].transferOwnership(newGuild.address); - await guildRegistry.addGuild(newGuild.address); + await guildRegistry.addGuild(guildRegistry); guilds[guildToDeploy.name] = newGuild; addresses[guildToDeploy.name] = newGuild.address; proposals[guildToDeploy.name] = []; @@ -42,9 +47,6 @@ export async function deployGuilds(deploymentConfig, tokens) { }) ); - await guildRegistry.transferOwnership(avatar.address); - networkContracts.utils.guildRegistry = guildRegistry.address; - console.log("Contracts deployed:", networkContracts); // const startTime = deploymentConfig.startTimestampForActions; @@ -209,5 +211,4 @@ export async function deployGuilds(deploymentConfig, tokens) { break; } } - return guildRegistry.address; } diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 8a1d1485..1c14b43b 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -2,11 +2,12 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployTokens(deploymentConfig) { +export async function deployTokens(deploymentConfig, accounts) { const ERC20Mock = await hre.artifacts.require("ERC20Mock"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); let tokens = {}; + let addresses = {}; await Promise.all( deploymentConfig.tokens.map(async tokenToDeploy => { console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); From f55e14cd81d4c5ceba204d8e2cd79cd3ca5c543a Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 11:27:59 +0100 Subject: [PATCH 04/37] fix: Working guilds script with registry input --- .../DeploymentTemplates/deploy-guilds-larp.js | 56 +++++++++---------- scripts/deploy-guilds.js | 7 ++- scripts/utils/deploy-guilds.js | 2 +- 3 files changed, 33 insertions(+), 32 deletions(-) diff --git a/scripts/DeploymentTemplates/deploy-guilds-larp.js b/scripts/DeploymentTemplates/deploy-guilds-larp.js index f9fc3006..d033d96c 100644 --- a/scripts/DeploymentTemplates/deploy-guilds-larp.js +++ b/scripts/DeploymentTemplates/deploy-guilds-larp.js @@ -2,10 +2,9 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); task("deploy-guilds-develop", "Deploy dxvote with develop config") - .addParam("registryAddress", "The registry for the given network") - .setAction(async () => { - console.log("Entered first script"); - + .addParam("registry", "The registry for the given network") + .setAction(async ({ registry }) => { + const GuildRegistry = await hre.artifacts.require("GuildRegistry"); const deployconfig = { tokens: [ { @@ -15,47 +14,47 @@ task("deploy-guilds-develop", "Deploy dxvote with develop config") distribution: [ { address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("9999"), + amount: web3.utils.toWei("90"), }, ], }, @@ -66,58 +65,59 @@ task("deploy-guilds-develop", "Deploy dxvote with develop config") distribution: [ { address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("100"), + amount: web3.utils.toWei("10"), }, { address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("400"), + amount: web3.utils.toWei("40"), }, ], }, ], permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - guildRegistry: registryAddress, + guildRegistry: + registry === "0x0" ? (await GuildRegistry.new()).address : registry, guilds: [ { token: "SWPR", - contractName: "EnforcedBinaryGuild", + contractName: "EnforcedBinarySnapshotERC20Guild", name: "SWPRGuild", proposalTime: moment.duration(10, "minutes").asSeconds(), timeForExecution: moment.duration(5, "minutes").asSeconds(), diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index 2083591c..8c605390 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -19,7 +19,8 @@ const { deployGuilds } = require("./utils/deploy-guilds"); task("deploy-guilds", "Deploy guilds") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { - console.log("Entered script"); + const GuildRegistry = await hre.artifacts.require("GuildRegistry"); + function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } @@ -80,12 +81,12 @@ task("deploy-guilds", "Deploy guilds") networkContracts.permissionRegistry = permissionRegistry.address; addresses["PermissionRegstry"] = permissionRegistry.address; await waitBlocks(1); - + console.log(deploymentConfig.guildRegistry); // Deploy Guilds await deployGuilds( deploymentConfig, tokens, - deploymentConfig.guildRegistry + await GuildRegistry.at(deploymentConfig.guildRegistry) ); // Increase time to local time diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 077468cf..56d30b53 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -39,7 +39,7 @@ export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { ); if (guildToDeploy.contractName === "SnapshotRepERC20Guild") await tokens[guildToDeploy.token].transferOwnership(newGuild.address); - await guildRegistry.addGuild(guildRegistry); + await guildRegistry.addGuild(newGuild.address); guilds[guildToDeploy.name] = newGuild; addresses[guildToDeploy.name] = newGuild.address; proposals[guildToDeploy.name] = []; From 3059740bfe4db35fdf46ea6b8d8b320dc0f599d1 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 12:08:24 +0100 Subject: [PATCH 05/37] fix: Updating dxvote script for renamed contracts --- scripts/deploy-dxvote.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index f8519f8f..33e23dc2 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -41,11 +41,11 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") "PermissionRegistry" ); const DXDVotingMachine = await hre.artifacts.require("DXDVotingMachine"); - const ERC20Mock = await hre.artifacts.require("ERC20Mock"); - const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); const Multicall = await hre.artifacts.require("Multicall"); - const DXdaoNFT = await hre.artifacts.require("DXdaoNFT"); - const DXDVestingFactory = await hre.artifacts.require("DXDVestingFactory"); + const ERC721Factory = await hre.artifacts.require("ERC721Factory"); + const ERC20VestingFactory = await hre.artifacts.require( + "ERC20VestingFactory" + ); const GuildRegistry = await hre.artifacts.require("GuildRegistry"); async function waitBlocks(blocks) { @@ -462,21 +462,21 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") } // Deploy dxDaoNFT - let dxDaoNFT; + let erc721Factory; console.log("Deploying DXdaoNFT..."); - dxDaoNFT = await DXdaoNFT.new(); - networkContracts.utils.dxDaoNFT = dxDaoNFT.address; - addresses["DXdaoNFT"] = dxDaoNFT.address; - - // Deploy DXDVestingFactory - let dxdVestingFactory; - console.log("Deploying DXDVestingFactory..."); - dxdVestingFactory = await DXDVestingFactory.new( + erc721Factory = await ERC721Factory.new(); + networkContracts.utils.erc721Factory = erc721Factory.address; + addresses["erc721Factory"] = erc721Factory.address; + + // Deploy ERC20VestingFactory + let erc20VestingFactory; + console.log("Deploying erc20VestingFactory..."); + erc20VestingFactory = await ERC20VestingFactory.new( networkContracts.votingMachines[votingMachine.address].token, avatar.address ); - networkContracts.utils.dxdVestingFactory = dxdVestingFactory.address; - addresses["DXDVestingFactory"] = dxdVestingFactory.address; + networkContracts.utils.erc20VestingFactory = erc20VestingFactory.address; + addresses["ERC20VestingFactory"] = erc20VestingFactory.address; // Transfer all ownership and power to the dao console.log("Transfering ownership..."); From 76afd8cd60af5f7c5e91ffac8e13a21e60b01188 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 13:22:41 +0100 Subject: [PATCH 06/37] feat: Working with actions split --- .../deploy-dxvote-develop.js | 2 + scripts/deploy-dxvote.js | 29 +-- scripts/utils/deploy-guilds.js | 165 ++--------------- scripts/utils/do-actions.js | 168 ++++++++++++++++++ 4 files changed, 197 insertions(+), 167 deletions(-) create mode 100644 scripts/utils/do-actions.js diff --git a/scripts/DeploymentTemplates/deploy-dxvote-develop.js b/scripts/DeploymentTemplates/deploy-dxvote-develop.js index 3071edd7..02d87676 100644 --- a/scripts/DeploymentTemplates/deploy-dxvote-develop.js +++ b/scripts/DeploymentTemplates/deploy-dxvote-develop.js @@ -381,7 +381,9 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( amount: "0", }, }, + ], + guildActions: [ { type: "approve", from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 33e23dc2..09502b61 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -3,6 +3,8 @@ require("@nomiclabs/hardhat-web3"); const contentHash = require("content-hash"); const IPFS = require("ipfs-core"); +const moment = require("moment"); +const { default: BigNumber } = require("bignumber.js"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; const MAX_UINT_256 = @@ -10,11 +12,9 @@ const MAX_UINT_256 = const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; const { encodePermission } = require("../test/helpers/permissions"); -const deployTokens = require("./utils/deploy-tokens"); -const moment = require("moment"); -const { default: BigNumber } = require("bignumber.js"); +const { deployTokens } = require("./utils/deploy-tokens"); const { deployGuilds } = require("./utils/deploy-guilds"); - +const { doActions } = require("./utils/do-actions"); task("deploy-dxvote", "Deploy dxvote in localhost network") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { @@ -22,7 +22,6 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") return new Promise(resolve => setTimeout(resolve, ms)); } - console.log("yo"); let addresses = {}; // Parse string json config to json object @@ -106,7 +105,8 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Deploy Tokens const { tokens, addresses: tokenAddresses } = await deployTokens( - deploymentConfig + deploymentConfig, + accounts ); addresses = Object.assign(addresses, tokenAddresses); @@ -461,12 +461,12 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") addresses[schemeConfiguration.name] = newScheme.address; } - // Deploy dxDaoNFT + // Deploy ERC721Factory let erc721Factory; - console.log("Deploying DXdaoNFT..."); - erc721Factory = await ERC721Factory.new(); + console.log("Deploying ERC721Factory..."); + erc721Factory = await ERC721Factory.new("DXdao NFT", "DXNFT"); networkContracts.utils.erc721Factory = erc721Factory.address; - addresses["erc721Factory"] = erc721Factory.address; + addresses["ERC721Factory"] = erc721Factory.address; // Deploy ERC20VestingFactory let erc20VestingFactory; @@ -482,13 +482,16 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") console.log("Transfering ownership..."); // Set the in the permission registry await permissionRegistry.transferOwnership(avatar.address); - await dxDaoNFT.transferOwnership(avatar.address); + await erc721Factory.transferOwnership(avatar.address); await controller.unregisterScheme(accounts[0], avatar.address); // Deploy Guilds - const guildRegistry = await GuildRegistry.new(); - await deployGuilds(deploymentTokens, tokens, guildRegistry); + await deployGuilds(deploymentConfig, tokens, guildRegistry); + + // Do actions + console.log("Doing actions"); + doActions(deploymentConfig.actions, tokens, addresses, avatar); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 56d30b53..525fb037 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -1,3 +1,5 @@ +import { doActions } from "./do-actions"; + /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); @@ -5,6 +7,11 @@ const { default: BigNumber } = require("bignumber.js"); const contentHash = require("content-hash"); const IPFS = require("ipfs-core"); +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; +const MAX_UINT_256 = + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; +const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; + export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // Deploy Guilds let guilds = {}; @@ -56,159 +63,9 @@ export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // method: "evm_increaseTime", // params: [startTime - (await web3.eth.getBlock("latest")).timestamp], // }); - - const ipfs = await IPFS.create(); - + console.log("Doing guild actions"); // Execute a set of actions once all contracts are deployed - for (let i = 0; i < deploymentConfig.actions.length; i++) { - const action = deploymentConfig.actions[i]; - - // if (action.time) - // await network.provider.send("evm_increaseTime", [action.time]); - console.log("Executing action:", action); - - switch (action.type) { - case "approve": - await tokens[action.data.asset].approve( - addresses[action.data.address] || action.data.address, - action.data.amount, - { from: action.from } - ); - break; - - case "transfer": - action.data.asset === NULL_ADDRESS - ? await web3.eth.sendTransaction({ - to: addresses[action.data.address] || action.data.address, - value: action.data.amount, - from: action.from, - }) - : await tokens[action.data.asset].transfer( - addresses[action.data.address] || action.data.address, - action.data.amount, - { from: action.from } - ); - break; - - case "proposal": - const proposalDescriptionHash = ( - await ipfs.add( - JSON.stringify({ - description: action.data.description, - title: action.data.title, - tags: action.data.tags, - url: "", - }) - ) - ).cid.toString(); - const proposalCreationTx = - action.data.scheme === "ContributionReward" - ? await ( - await ContributionReward.at(contributionReward.address) - ).proposeContributionReward( - avatar.address, - contentHash.fromIpfs(proposalDescriptionHash), - action.data.reputationChange, - action.data.rewards, - action.data.externalToken, - action.data.beneficiary, - { from: action.from } - ) - : await ( - await WalletScheme.at(addresses[action.data.scheme]) - ).proposeCalls( - action.data.to.map(_to => addresses[_to] || _to), - action.data.callData, - action.data.value, - action.data.title, - contentHash.fromIpfs(proposalDescriptionHash), - { from: action.from } - ); - proposals.dxvote.push( - proposalCreationTx.receipt.logs[0].args._proposalId - ); - break; - case "vote": - await votingMachine.vote( - proposals.dxvote[action.data.proposal], - action.data.decision, - action.data.amount, - action.from, - { from: action.from } - ); - break; - case "stake": - await votingMachine.stake( - proposals.dxvote[action.data.proposal], - action.data.decision, - action.data.amount, - { from: action.from } - ); - break; - case "execute": - try { - await votingMachine.execute(proposals.dxvote[action.data.proposal], { - from: action.from, - gas: 9000000, - }); - } catch (error) { - console.log("Execution of proposal failed", error); - } - break; - case "redeem": - await votingMachine.redeem( - proposals.dxvote[action.data.proposal], - action.from, - { from: action.from } - ); - break; - case "guild-createProposal": - const guildProposalDescriptionHash = ( - await ipfs.add( - JSON.stringify({ description: action.data.proposalBody, url: "" }) - ) - ).cid.toString(); - const guildProposalCreationTx = await guilds[ - action.data.guildName - ].createProposal( - action.data.to.map(_to => addresses[_to] || _to), - action.data.callData, - action.data.value, - action.data.totalActions, - action.data.title, - contentHash.fromIpfs(guildProposalDescriptionHash).toString(), - { from: action.from } - ); - proposals[action.data.guildName].push( - guildProposalCreationTx.receipt.logs[0].args.proposalId - ); - break; - case "guild-lockTokens": - await guilds[action.data.guildName].lockTokens(action.data.amount, { - from: action.from, - }); - break; - case "guild-withdrawTokens": - await guilds[action.data.guildName].withdrawTokens(action.data.amount, { - from: action.from, - }); - break; - case "guild-voteProposal": - console.log(proposals); - await guilds[action.data.guildName].setVote( - proposals[action.data.guildName][action.data.proposal], - action.data.action, - action.data.votingPower - ); - break; - case "guild-endProposal": - await guilds[action.data.guildName].endProposal( - proposals[action.data.guildName][action.data.proposal], - { from: action.from } - ); - break; - default: - break; - } - } + doActions(deploymentConfig.guildActions, tokens, addresses, { + address: "0x0", + }); } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js new file mode 100644 index 00000000..ae2335e6 --- /dev/null +++ b/scripts/utils/do-actions.js @@ -0,0 +1,168 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); +const { default: BigNumber } = require("bignumber.js"); + +const contentHash = require("content-hash"); +const IPFS = require("ipfs-core"); + +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; +const MAX_UINT_256 = + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; +const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; + +export async function doActions(actions, tokens, addresses, avatar) { + // Execute a set of actions once all contracts are deployed + console.log({ actions }); + console.log(actions.length); + for (let i = 0; i < actions.length; i++) { + const action = actions[i]; + console.log(i); + if (action.time) + await network.provider.send("evm_increaseTime", [action.time]); + console.log("Executing action:", action); + + switch (action.type) { + case "approve": + await tokens[action.data.asset].approve( + addresses[action.data.address] || action.data.address, + action.data.amount, + { from: action.from } + ); + break; + + case "transfer": + action.data.asset === NULL_ADDRESS + ? await web3.eth.sendTransaction({ + to: addresses[action.data.address] || action.data.address, + value: action.data.amount, + from: action.from, + }) + : await tokens[action.data.asset].transfer( + addresses[action.data.address] || action.data.address, + action.data.amount, + { from: action.from } + ); + break; + + case "proposal": + const proposalDescriptionHash = ( + await ipfs.add( + JSON.stringify({ + description: action.data.description, + title: action.data.title, + tags: action.data.tags, + url: "", + }) + ) + ).cid.toString(); + const proposalCreationTx = + action.data.scheme === "ContributionReward" + ? await ( + await ContributionReward.at(contributionReward.address) + ).proposeContributionReward( + avatar.address, + contentHash.fromIpfs(proposalDescriptionHash), + action.data.reputationChange, + action.data.rewards, + action.data.externalToken, + action.data.beneficiary, + { from: action.from } + ) + : await ( + await WalletScheme.at(addresses[action.data.scheme]) + ).proposeCalls( + action.data.to.map(_to => addresses[_to] || _to), + action.data.callData, + action.data.value, + action.data.title, + contentHash.fromIpfs(proposalDescriptionHash), + { from: action.from } + ); + proposals.dxvote.push( + proposalCreationTx.receipt.logs[0].args._proposalId + ); + break; + case "vote": + await votingMachine.vote( + proposals.dxvote[action.data.proposal], + action.data.decision, + action.data.amount, + action.from, + { from: action.from } + ); + break; + case "stake": + await votingMachine.stake( + proposals.dxvote[action.data.proposal], + action.data.decision, + action.data.amount, + { from: action.from } + ); + break; + case "execute": + try { + await votingMachine.execute(proposals.dxvote[action.data.proposal], { + from: action.from, + gas: 9000000, + }); + } catch (error) { + console.log("Execution of proposal failed", error); + } + break; + case "redeem": + await votingMachine.redeem( + proposals.dxvote[action.data.proposal], + action.from, + { from: action.from } + ); + break; + case "guild-createProposal": + const guildProposalDescriptionHash = ( + await ipfs.add( + JSON.stringify({ description: action.data.proposalBody, url: "" }) + ) + ).cid.toString(); + const guildProposalCreationTx = await guilds[ + action.data.guildName + ].createProposal( + action.data.to.map(_to => addresses[_to] || _to), + action.data.callData, + action.data.value, + action.data.totalActions, + action.data.title, + contentHash.fromIpfs(guildProposalDescriptionHash).toString(), + { from: action.from } + ); + proposals[action.data.guildName].push( + guildProposalCreationTx.receipt.logs[0].args.proposalId + ); + break; + case "guild-lockTokens": + await guilds[action.data.guildName].lockTokens(action.data.amount, { + from: action.from, + }); + break; + case "guild-withdrawTokens": + await guilds[action.data.guildName].withdrawTokens(action.data.amount, { + from: action.from, + }); + break; + case "guild-voteProposal": + console.log(proposals); + await guilds[action.data.guildName].setVote( + proposals[action.data.guildName][action.data.proposal], + action.data.action, + action.data.votingPower + ); + break; + case "guild-endProposal": + await guilds[action.data.guildName].endProposal( + proposals[action.data.guildName][action.data.proposal], + { from: action.from } + ); + break; + default: + break; + } + } +} From f55a610952d577cf2f53b41b7d231501a1a8e8f3 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 14:52:14 +0100 Subject: [PATCH 07/37] fix: dxvote script working with new script structure --- ok0.00564256696767762/.53149.1 | 86 ++++++++++++++++++++++++++++++++++ ok0.9143056310937827/.53149.0 | 86 ++++++++++++++++++++++++++++++++++ scripts/deploy-dxvote.js | 4 +- scripts/utils/deploy-guilds.js | 12 +++-- scripts/utils/do-actions.js | 11 ++--- 5 files changed, 186 insertions(+), 13 deletions(-) create mode 100644 ok0.00564256696767762/.53149.1 create mode 100644 ok0.9143056310937827/.53149.0 diff --git a/ok0.00564256696767762/.53149.1 b/ok0.00564256696767762/.53149.1 new file mode 100644 index 00000000..2e1c1e09 --- /dev/null +++ b/ok0.00564256696767762/.53149.1 @@ -0,0 +1,86 @@ +{ + "Addresses": { + "Swarm": [ + "/ip4/0.0.0.0/tcp/4002", + "/ip4/127.0.0.1/tcp/4003/ws" + ], + "Announce": [], + "NoAnnounce": [], + "API": "/ip4/127.0.0.1/tcp/5002", + "Gateway": "/ip4/127.0.0.1/tcp/9090", + "RPC": "/ip4/127.0.0.1/tcp/5003", + "Delegates": [ + "/dns4/node0.delegate.ipfs.io/tcp/443/https", + "/dns4/node1.delegate.ipfs.io/tcp/443/https", + "/dns4/node2.delegate.ipfs.io/tcp/443/https", + "/dns4/node3.delegate.ipfs.io/tcp/443/https" + ] + }, + "Discovery": { + "MDNS": { + "Enabled": true, + "Interval": 10 + }, + "webRTCStar": { + "Enabled": true + } + }, + "Bootstrap": [ + "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt", + "/dns4/node0.preload.ipfs.io/tcp/443/wss/p2p/QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic", + "/dns4/node1.preload.ipfs.io/tcp/443/wss/p2p/Qmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6", + "/dns4/node2.preload.ipfs.io/tcp/443/wss/p2p/QmV7gnbW5VTcJ3oyM2Xk1rdFBJ3kTkvxc87UFGsun29STS", + "/dns4/node3.preload.ipfs.io/tcp/443/wss/p2p/QmY7JB6MQXhxHvq7dBDh4HpbH29v4yE9JRadAVpndvzySN" + ], + "Pubsub": { + "Router": "gossipsub", + "Enabled": true + }, + "Swarm": { + "ConnMgr": { + "LowWater": 50, + "HighWater": 200 + }, + "DisableNatPortMap": false + }, + "Routing": { + "Type": "dhtclient" + }, + "Identity": { + "PeerID": "12D3KooW9yDfXFFjfsGHDcCwQhyPQmgaD5Gq2j7dakTr8rytP1jc", + "PrivKey": "CAESQIoCasLxiq+D2FzHhFiNkdgiXsFroDl3BRg80H0waHr5AkScqhOTrICNPgAEyNigYYQT8q4HyXP0e1cJNrAyowc=" + }, + "Datastore": { + "Spec": { + "type": "mount", + "mounts": [ + { + "mountpoint": "/blocks", + "type": "measure", + "prefix": "flatfs.datastore", + "child": { + "type": "flatfs", + "path": "blocks", + "sync": true, + "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2" + } + }, + { + "mountpoint": "/", + "type": "measure", + "prefix": "leveldb.datastore", + "child": { + "type": "levelds", + "path": "datastore", + "compression": "none" + } + } + ] + } + } +} \ No newline at end of file diff --git a/ok0.9143056310937827/.53149.0 b/ok0.9143056310937827/.53149.0 new file mode 100644 index 00000000..30b0fa41 --- /dev/null +++ b/ok0.9143056310937827/.53149.0 @@ -0,0 +1,86 @@ +{ + "Addresses": { + "Swarm": [ + "/ip4/0.0.0.0/tcp/4002", + "/ip4/127.0.0.1/tcp/4003/ws" + ], + "Announce": [], + "NoAnnounce": [], + "API": "/ip4/127.0.0.1/tcp/5002", + "Gateway": "/ip4/127.0.0.1/tcp/9090", + "RPC": "/ip4/127.0.0.1/tcp/5003", + "Delegates": [ + "/dns4/node0.delegate.ipfs.io/tcp/443/https", + "/dns4/node1.delegate.ipfs.io/tcp/443/https", + "/dns4/node2.delegate.ipfs.io/tcp/443/https", + "/dns4/node3.delegate.ipfs.io/tcp/443/https" + ] + }, + "Discovery": { + "MDNS": { + "Enabled": true, + "Interval": 10 + }, + "webRTCStar": { + "Enabled": true + } + }, + "Bootstrap": [ + "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", + "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt", + "/dns4/node0.preload.ipfs.io/tcp/443/wss/p2p/QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic", + "/dns4/node1.preload.ipfs.io/tcp/443/wss/p2p/Qmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6", + "/dns4/node2.preload.ipfs.io/tcp/443/wss/p2p/QmV7gnbW5VTcJ3oyM2Xk1rdFBJ3kTkvxc87UFGsun29STS", + "/dns4/node3.preload.ipfs.io/tcp/443/wss/p2p/QmY7JB6MQXhxHvq7dBDh4HpbH29v4yE9JRadAVpndvzySN" + ], + "Pubsub": { + "Router": "gossipsub", + "Enabled": true + }, + "Swarm": { + "ConnMgr": { + "LowWater": 50, + "HighWater": 200 + }, + "DisableNatPortMap": false + }, + "Routing": { + "Type": "dhtclient" + }, + "Identity": { + "PeerID": "12D3KooWR3wAysHHEyd6hBWDb2xcr7wgqgsWBYgbNFkf2LGiLHjk", + "PrivKey": "CAESQC6CA7SwiDjcObcVX8V/Bch7gQalxCcUG9v85ExBBuQa4lksGIY7wQlm7i55cFb15GbiYAuQiwJ0JAPL87rXrhc=" + }, + "Datastore": { + "Spec": { + "type": "mount", + "mounts": [ + { + "mountpoint": "/blocks", + "type": "measure", + "prefix": "flatfs.datastore", + "child": { + "type": "flatfs", + "path": "blocks", + "sync": true, + "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2" + } + }, + { + "mountpoint": "/", + "type": "measure", + "prefix": "leveldb.datastore", + "child": { + "type": "levelds", + "path": "datastore", + "compression": "none" + } + } + ] + } + } +} \ No newline at end of file diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 09502b61..31ccf2ce 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -1,8 +1,6 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -const contentHash = require("content-hash"); -const IPFS = require("ipfs-core"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); @@ -491,7 +489,7 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Do actions console.log("Doing actions"); - doActions(deploymentConfig.actions, tokens, addresses, avatar); + doActions(deploymentConfig.actions, tokens, addresses, avatar, []); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 525fb037..4fa60aaf 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -65,7 +65,13 @@ export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // }); console.log("Doing guild actions"); // Execute a set of actions once all contracts are deployed - doActions(deploymentConfig.guildActions, tokens, addresses, { - address: "0x0", - }); + doActions( + deploymentConfig.guildActions, + tokens, + addresses, + { + address: "0x0", + }, + guilds + ); } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index ae2335e6..d6c494dd 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -10,13 +10,10 @@ const MAX_UINT_256 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -export async function doActions(actions, tokens, addresses, avatar) { +export async function doActions(actions, tokens, addresses, avatar, guilds) { // Execute a set of actions once all contracts are deployed - console.log({ actions }); - console.log(actions.length); - for (let i = 0; i < actions.length; i++) { - const action = actions[i]; - console.log(i); + const ipfs = await IPFS.create({ repo: "ok" + Math.random() }); + actions.forEach(async action => { if (action.time) await network.provider.send("evm_increaseTime", [action.time]); console.log("Executing action:", action); @@ -164,5 +161,5 @@ export async function doActions(actions, tokens, addresses, avatar) { default: break; } - } + }); } From d0e2267ef5a0094dedda0767df7ba3bc3f3a1910 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 14:53:47 +0100 Subject: [PATCH 08/37] fix: Rmeoving hardhat-dependency-compiler --- .../hardhat-dependency-compiler/.hardhat-dependency-compiler | 1 - .../@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol | 3 --- .../proxy/transparent/TransparentUpgradeableProxy.sol | 3 --- .../realitio-contracts/truffle/contracts/Realitio.sol | 3 --- 4 files changed, 10 deletions(-) delete mode 100644 contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler delete mode 100644 contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol delete mode 100644 contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol delete mode 100644 contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol diff --git a/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler b/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler deleted file mode 100644 index 8d6654c4..00000000 --- a/contracts/hardhat-dependency-compiler/.hardhat-dependency-compiler +++ /dev/null @@ -1 +0,0 @@ -directory approved for write access by hardhat-dependency-compiler diff --git a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol deleted file mode 100644 index 4dc8a2f1..00000000 --- a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; diff --git a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol b/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol deleted file mode 100644 index bb639533..00000000 --- a/contracts/hardhat-dependency-compiler/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; diff --git a/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol b/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol deleted file mode 100644 index 62394192..00000000 --- a/contracts/hardhat-dependency-compiler/@realitio/realitio-contracts/truffle/contracts/Realitio.sol +++ /dev/null @@ -1,3 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity >0.0.0; -import "@realitio/realitio-contracts/truffle/contracts/Realitio.sol"; From 1a1aed9f3c35f3e0a0a30eff3287bf5f4c245715 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 16:44:13 +0100 Subject: [PATCH 09/37] fix: ipfs working in script --- ok0.00564256696767762/.53149.1 | 86 ---------------------------------- ok0.9143056310937827/.53149.0 | 86 ---------------------------------- scripts/deploy-dxvote.js | 6 ++- scripts/deploy-guilds.js | 5 +- scripts/utils/deploy-guilds.js | 10 +++- scripts/utils/do-actions.js | 15 ++++-- 6 files changed, 27 insertions(+), 181 deletions(-) delete mode 100644 ok0.00564256696767762/.53149.1 delete mode 100644 ok0.9143056310937827/.53149.0 diff --git a/ok0.00564256696767762/.53149.1 b/ok0.00564256696767762/.53149.1 deleted file mode 100644 index 2e1c1e09..00000000 --- a/ok0.00564256696767762/.53149.1 +++ /dev/null @@ -1,86 +0,0 @@ -{ - "Addresses": { - "Swarm": [ - "/ip4/0.0.0.0/tcp/4002", - "/ip4/127.0.0.1/tcp/4003/ws" - ], - "Announce": [], - "NoAnnounce": [], - "API": "/ip4/127.0.0.1/tcp/5002", - "Gateway": "/ip4/127.0.0.1/tcp/9090", - "RPC": "/ip4/127.0.0.1/tcp/5003", - "Delegates": [ - "/dns4/node0.delegate.ipfs.io/tcp/443/https", - "/dns4/node1.delegate.ipfs.io/tcp/443/https", - "/dns4/node2.delegate.ipfs.io/tcp/443/https", - "/dns4/node3.delegate.ipfs.io/tcp/443/https" - ] - }, - "Discovery": { - "MDNS": { - "Enabled": true, - "Interval": 10 - }, - "webRTCStar": { - "Enabled": true - } - }, - "Bootstrap": [ - "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt", - "/dns4/node0.preload.ipfs.io/tcp/443/wss/p2p/QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic", - "/dns4/node1.preload.ipfs.io/tcp/443/wss/p2p/Qmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6", - "/dns4/node2.preload.ipfs.io/tcp/443/wss/p2p/QmV7gnbW5VTcJ3oyM2Xk1rdFBJ3kTkvxc87UFGsun29STS", - "/dns4/node3.preload.ipfs.io/tcp/443/wss/p2p/QmY7JB6MQXhxHvq7dBDh4HpbH29v4yE9JRadAVpndvzySN" - ], - "Pubsub": { - "Router": "gossipsub", - "Enabled": true - }, - "Swarm": { - "ConnMgr": { - "LowWater": 50, - "HighWater": 200 - }, - "DisableNatPortMap": false - }, - "Routing": { - "Type": "dhtclient" - }, - "Identity": { - "PeerID": "12D3KooW9yDfXFFjfsGHDcCwQhyPQmgaD5Gq2j7dakTr8rytP1jc", - "PrivKey": "CAESQIoCasLxiq+D2FzHhFiNkdgiXsFroDl3BRg80H0waHr5AkScqhOTrICNPgAEyNigYYQT8q4HyXP0e1cJNrAyowc=" - }, - "Datastore": { - "Spec": { - "type": "mount", - "mounts": [ - { - "mountpoint": "/blocks", - "type": "measure", - "prefix": "flatfs.datastore", - "child": { - "type": "flatfs", - "path": "blocks", - "sync": true, - "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2" - } - }, - { - "mountpoint": "/", - "type": "measure", - "prefix": "leveldb.datastore", - "child": { - "type": "levelds", - "path": "datastore", - "compression": "none" - } - } - ] - } - } -} \ No newline at end of file diff --git a/ok0.9143056310937827/.53149.0 b/ok0.9143056310937827/.53149.0 deleted file mode 100644 index 30b0fa41..00000000 --- a/ok0.9143056310937827/.53149.0 +++ /dev/null @@ -1,86 +0,0 @@ -{ - "Addresses": { - "Swarm": [ - "/ip4/0.0.0.0/tcp/4002", - "/ip4/127.0.0.1/tcp/4003/ws" - ], - "Announce": [], - "NoAnnounce": [], - "API": "/ip4/127.0.0.1/tcp/5002", - "Gateway": "/ip4/127.0.0.1/tcp/9090", - "RPC": "/ip4/127.0.0.1/tcp/5003", - "Delegates": [ - "/dns4/node0.delegate.ipfs.io/tcp/443/https", - "/dns4/node1.delegate.ipfs.io/tcp/443/https", - "/dns4/node2.delegate.ipfs.io/tcp/443/https", - "/dns4/node3.delegate.ipfs.io/tcp/443/https" - ] - }, - "Discovery": { - "MDNS": { - "Enabled": true, - "Interval": 10 - }, - "webRTCStar": { - "Enabled": true - } - }, - "Bootstrap": [ - "/ip4/104.131.131.82/tcp/4001/p2p/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmZa1sAxajnQjVM8WjWXoMbmPd7NsWhfKsPkErzpm9wGkp", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmQCU2EcMqAqQPR2i9bChDtGNJchTbq5TbXJJ16u19uLTa", - "/dnsaddr/bootstrap.libp2p.io/p2p/QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt", - "/dns4/node0.preload.ipfs.io/tcp/443/wss/p2p/QmZMxNdpMkewiVZLMRxaNxUeZpDUb34pWjZ1kZvsd16Zic", - "/dns4/node1.preload.ipfs.io/tcp/443/wss/p2p/Qmbut9Ywz9YEDrz8ySBSgWyJk41Uvm2QJPhwDJzJyGFsD6", - "/dns4/node2.preload.ipfs.io/tcp/443/wss/p2p/QmV7gnbW5VTcJ3oyM2Xk1rdFBJ3kTkvxc87UFGsun29STS", - "/dns4/node3.preload.ipfs.io/tcp/443/wss/p2p/QmY7JB6MQXhxHvq7dBDh4HpbH29v4yE9JRadAVpndvzySN" - ], - "Pubsub": { - "Router": "gossipsub", - "Enabled": true - }, - "Swarm": { - "ConnMgr": { - "LowWater": 50, - "HighWater": 200 - }, - "DisableNatPortMap": false - }, - "Routing": { - "Type": "dhtclient" - }, - "Identity": { - "PeerID": "12D3KooWR3wAysHHEyd6hBWDb2xcr7wgqgsWBYgbNFkf2LGiLHjk", - "PrivKey": "CAESQC6CA7SwiDjcObcVX8V/Bch7gQalxCcUG9v85ExBBuQa4lksGIY7wQlm7i55cFb15GbiYAuQiwJ0JAPL87rXrhc=" - }, - "Datastore": { - "Spec": { - "type": "mount", - "mounts": [ - { - "mountpoint": "/blocks", - "type": "measure", - "prefix": "flatfs.datastore", - "child": { - "type": "flatfs", - "path": "blocks", - "sync": true, - "shardFunc": "/repo/flatfs/shard/v1/next-to-last/2" - } - }, - { - "mountpoint": "/", - "type": "measure", - "prefix": "leveldb.datastore", - "child": { - "type": "levelds", - "path": "datastore", - "compression": "none" - } - } - ] - } - } -} \ No newline at end of file diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 31ccf2ce..273156a9 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -1,6 +1,7 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); +const IPFS = require("ipfs-core"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); @@ -19,6 +20,7 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } + const ipfs = await IPFS.create(); let addresses = {}; @@ -485,11 +487,11 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Deploy Guilds const guildRegistry = await GuildRegistry.new(); - await deployGuilds(deploymentConfig, tokens, guildRegistry); + await deployGuilds(deploymentConfig, tokens, guildRegistry, ipfs); // Do actions console.log("Doing actions"); - doActions(deploymentConfig.actions, tokens, addresses, avatar, []); + doActions(deploymentConfig.actions, tokens, addresses, avatar, [], ipfs); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index 8c605390..4cc76c1c 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -24,6 +24,7 @@ task("deploy-guilds", "Deploy guilds") function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } + const ipfs = await IPFS.create(); let addresses = {}; @@ -81,12 +82,12 @@ task("deploy-guilds", "Deploy guilds") networkContracts.permissionRegistry = permissionRegistry.address; addresses["PermissionRegstry"] = permissionRegistry.address; await waitBlocks(1); - console.log(deploymentConfig.guildRegistry); // Deploy Guilds await deployGuilds( deploymentConfig, tokens, - await GuildRegistry.at(deploymentConfig.guildRegistry) + await GuildRegistry.at(deploymentConfig.guildRegistry), + ipfs ); // Increase time to local time diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 4fa60aaf..ce3ad250 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -12,7 +12,12 @@ const MAX_UINT_256 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { +export async function deployGuilds( + deploymentConfig, + tokens, + guildRegistry, + ipfs +) { // Deploy Guilds let guilds = {}; let proposals = { @@ -72,6 +77,7 @@ export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { { address: "0x0", }, - guilds + guilds, + ipfs ); } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index d6c494dd..0722b954 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -3,17 +3,26 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); const contentHash = require("content-hash"); -const IPFS = require("ipfs-core"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; const MAX_UINT_256 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -export async function doActions(actions, tokens, addresses, avatar, guilds) { +export async function doActions( + actions, + tokens, + addresses, + avatar, + guilds, + ipfs +) { // Execute a set of actions once all contracts are deployed - const ipfs = await IPFS.create({ repo: "ok" + Math.random() }); + let proposals = { + dxvote: [], + }; actions.forEach(async action => { + console.log({ proposals }); if (action.time) await network.provider.send("evm_increaseTime", [action.time]); console.log("Executing action:", action); From 247570c7cd4883a6f16487b46f41a5e9e625d667 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 20:08:26 +0100 Subject: [PATCH 10/37] fix: Fixed actions loop --- scripts/deploy-dxvote.js | 11 +++++++++-- scripts/utils/deploy-guilds.js | 2 +- scripts/utils/do-actions.js | 7 ++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 54daade4..786fe96d 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -482,7 +482,7 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") console.log("Transfering ownership..."); // Set the in the permission registry await permissionRegistry.transferOwnership(avatar.address); - await erc721Factory.transferOwnership(avatar.address); + await dxDaoNFT.transferOwnership(avatar.address); await controller.unregisterScheme(accounts[0], avatar.address); // Deploy Guilds @@ -491,7 +491,14 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Do actions console.log("Doing actions"); - doActions(deploymentConfig.actions, tokens, addresses, avatar, [], ipfs); + await doActions( + deploymentConfig.actions, + tokens, + addresses, + avatar, + [], + ipfs + ); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index ce3ad250..2d51ab9f 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -70,7 +70,7 @@ export async function deployGuilds( // }); console.log("Doing guild actions"); // Execute a set of actions once all contracts are deployed - doActions( + await doActions( deploymentConfig.guildActions, tokens, addresses, diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index 0722b954..f0015fac 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -21,7 +21,8 @@ export async function doActions( let proposals = { dxvote: [], }; - actions.forEach(async action => { + for (const i in actions) { + const action = actions[i]; console.log({ proposals }); if (action.time) await network.provider.send("evm_increaseTime", [action.time]); @@ -139,6 +140,7 @@ export async function doActions( contentHash.fromIpfs(guildProposalDescriptionHash).toString(), { from: action.from } ); + console.log(guildProposalCreationTx.receipt.logs[0].args.proposalId); proposals[action.data.guildName].push( guildProposalCreationTx.receipt.logs[0].args.proposalId ); @@ -154,7 +156,6 @@ export async function doActions( }); break; case "guild-voteProposal": - console.log(proposals); await guilds[action.data.guildName].setVote( proposals[action.data.guildName][action.data.proposal], action.data.action, @@ -170,5 +171,5 @@ export async function doActions( default: break; } - }); + } } From f6355e31f3138cd5ba28aee50ebcd23392b67f49 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 27 Apr 2022 20:11:31 +0100 Subject: [PATCH 11/37] fix: Removing script and console logs --- scripts/test.sh | 122 ------------------------------------ scripts/utils/do-actions.js | 2 - 2 files changed, 124 deletions(-) delete mode 100755 scripts/test.sh diff --git a/scripts/test.sh b/scripts/test.sh deleted file mode 100755 index b9b0d37f..00000000 --- a/scripts/test.sh +++ /dev/null @@ -1,122 +0,0 @@ -#!/usr/bin/env bash - -# Exit script as soon as a command fails. -set -o errexit - -# Executes cleanup function at script exit. -trap cleanup EXIT - -cleanup() { - # Kill the hardhat instance that we started (if we started one and if it's still running). - if [ -n "$hardhat_pid" ] && ps -p $hardhat_pid > /dev/null; then - kill -9 $hardhat_pid - fi -} -mnemonic="dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao" - -hardhat_running() { - nc -z localhost 8545 -} - -start-hardhat_node() { - - npx hardhat node > /dev/null & - - # Account #0: 0x79706c8e413cdaee9e63f282507287b9ea9c0928 (10000 ETH) - # Private Key: 0xe408e147b1335674887c1ac7dc3c45de9762aa824cf6255fd8bd61fecf15f021 - # - # Account #1: 0xc73480525e9d1198d448ece4a01daea851f72a9d (10000 ETH) - # Private Key: 0x6c8a6a9a7dbad13d6b41089648ae4b7971116611e4acd8f052c478dd8c62673e - # - # Account #2: 0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351 (10000 ETH) - # Private Key: 0x0054b824c2083e7db09f36edb2ab24eb31f8276fa6cd62e30b42e3a185b37179 - # - # Account #3: 0xaf1a6415202453d79b84d8a9d055b8f9141f696b (10000 ETH) - # Private Key: 0x3688ff0d0a95dd8b90bc68739505b488ff4908291eeb36380a94227d22653ce3 - # - # Account #4: 0x02803e2cdff171d1910d178dac948c711937bd3f (10000 ETH) - # Private Key: 0x530caa05cf058253ed14a2e6ccc5dcb952f09c7bcdcfb4be37e572e85dcafd1e - # - # Account #5: 0x797c62953ef866a1ece855c4033cc5dc3c11290b (10000 ETH) - # Private Key: 0x88ae5259286213d051e99da743d79be5d69dc75ee317bc887f5996ff004b83a6 - # - # Account #6: 0x016f70459e4ba98e0d60a5f5855e117e8ff39cae (10000 ETH) - # Private Key: 0x68f5bc4b52a67b3d800d0d8832ae3b89067a3bbee68c66544147e312d996d994 - # - # Account #7: 0x073f4fdc12f805b8d98e58551fc10d0a71bbc7db (10000 ETH) - # Private Key: 0x9adc9dfdce8383a1634716bf7a2e317a145f37a176a7b42538ace5ac20e223a1 - # - # Account #8: 0x6829556f30899d70403947590ffe8900e8c0d0d7 (10000 ETH) - # Private Key: 0x13436bc37e24487c2f1739d1ce6b8271a8465fee93aa3685ce543e56a50e1692 - # - # Account #9: 0x2b410bcb3b8096164fa8c6a06220a66bfb77058d (10000 ETH) - # Private Key: 0x4fe097bbfe75d9531d253b7f917f89dcee6664d832e40a8d82d717602dfeeb6c - # - # Account #10: 0x309f75c54a57937a7a0c6eb9b36eb1dbca82407e (10000 ETH) - # Private Key: 0xb10da35e4abe181d1143aa28a7da6c5f303660b954cf283accfeba2dfb56ab51 - # - # Account #11: 0xec9d2d34ad6acda19ab8afe71595051b206e3e4d (10000 ETH) - # Private Key: 0xfdf0c66289fafea1803c64522d073d6cc9ec71ba76e945a7c207f1f5ebb8e3b1 - # - # Account #12: 0x40c23c536bad1fe206ce911114f2c70309a7e487 (10000 ETH) - # Private Key: 0x97c63b257e8f86e05ae5a7bbb025b02d179b8d00fb9fbcdbfcdf04dcf9173cf2 - # - # Account #13: 0x28d254f2ddb522c43a21d338e337fd8d2f820db2 (10000 ETH) - # Private Key: 0xcdef57c095755d77bbbb327a187e67039c62fe39425e29b3646d334f54d28808 - # - # Account #14: 0xaf7386ce842cc0cffef91361059b0ca9ae48d6a0 (10000 ETH) - # Private Key: 0x4739bf3390cd5be10d0f58d2c1e887a186b544af563fa62717a6c324b36fed59 - # - # Account #15: 0x46c18451aaead6a2cb888b5bd6193c0f2c402329 (10000 ETH) - # Private Key: 0xc6b5889c8fbd0f3304ddd53b85f056a32b8338f99e5b8877ecb1d1c5543c8d6a - # - # Account #16: 0xc707c8143a6e1274ae7f637946f685870925261f (10000 ETH) - # Private Key: 0x4b00e0c8e17e88d588b204121594f14d20d1abe50e280d599ff39d6b35c44533 - # - # Account #17: 0x5b14a88dbbb04abcb6e5bf6384491be8d939cf57 (10000 ETH) - # Private Key: 0x18eecce45e3211ce6ce967f66c404798e36e8298b4b5222ebf597b841ebd868a - # - # Account #18: 0x92d356240dda25d050aa441690b92b2fa0011b84 (10000 ETH) - # Private Key: 0xe53525f97971b006e14820a8a7b74f8aae375b6635735d89b4db2e4cbdf0e8e0 - # - # Account #19: 0x5a485c203d9537095a6be2acc5a7ad83805d301d (10000 ETH) - # Private Key: 0xb86f3287c11a77c7317c2484be2bd386816876ead8ceaf86971b7b7c1afbb12b - - hardhat_pid=$! - - echo "Waiting for hardhat to launch..." - - while ! hardhat_running; do - sleep 0.1 # wait for 1/10 of the second before check again - done - - echo "Harhat node launched!" -} - -if hardhat_running; then - echo "Killing existent hardhat" - kill $(lsof -t -i:8545) -fi - -echo "Starting our own hardhat node instance" -start-hardhat_node - -# Compile your contracts -# yarn compile - -# Disable isolatedModules and use commonjs in tsconfig -# contents="$(jq '.compilerOptions.isolatedModules = false' tsconfig.json)" && \ -# echo "${contents}" > tsconfig.json -# contents="$(jq '.compilerOptions.module = "commonjs"' tsconfig.json)" && \ -# echo "${contents}" > tsconfig.json - -# node scripts/beforeBuild.js - -# Deploy local contracts -yarn hardhat --network localhost deploy-guilds-develop - -# # Enable isolatedModules and use esnext as module in tsconfig -# contents="$(jq '.compilerOptions.isolatedModules = true' tsconfig.json)" && \ -# echo "${contents}" > tsconfig.json -# contents="$(jq '.compilerOptions.module = "esnext"' tsconfig.json)" && \ -# echo "${contents}" > tsconfig.json diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index f0015fac..381faa18 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -23,7 +23,6 @@ export async function doActions( }; for (const i in actions) { const action = actions[i]; - console.log({ proposals }); if (action.time) await network.provider.send("evm_increaseTime", [action.time]); console.log("Executing action:", action); @@ -140,7 +139,6 @@ export async function doActions( contentHash.fromIpfs(guildProposalDescriptionHash).toString(), { from: action.from } ); - console.log(guildProposalCreationTx.receipt.logs[0].args.proposalId); proposals[action.data.guildName].push( guildProposalCreationTx.receipt.logs[0].args.proposalId ); From c8e9dd1511d6f1a91d46c0b9eb04cb73d71e2d97 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Thu, 28 Apr 2022 14:46:47 +0100 Subject: [PATCH 12/37] fix: Testing rinkeby deploy --- hardhat.config.js | 6 +++--- scripts/deploy-guilds.js | 12 ++---------- scripts/utils/deploy-guilds.js | 7 ++++++- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/hardhat.config.js b/hardhat.config.js index 759b6f5f..81af8518 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -80,12 +80,12 @@ const moment = require("moment"); // # Account #19: 0x5a485c203d9537095a6be2acc5a7ad83805d301d (10000 ETH) // # Private Key: 0xb86f3287c11a77c7317c2484be2bd386816876ead8ceaf86971b7b7c1afbb12b -const INFURA_PROJECT_ID = process.env.KEY_INFURA_API_KEY; +const INFURA_PROJECT_ID = "5730f284ad6741b183c921ebb0509880"; const MNEMONIC = process.env.KEY_MNEMONIC || "dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao"; const ETHERSCAN_API_KEY = process.env.KEY_ETHERSCAN; - +console.log({ MNEMONIC }); const hardharNetworks = process.env.CI ? { hardhat: { @@ -124,7 +124,7 @@ const hardharNetworks = process.env.CI url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, gasLimit: 10000000, - gasPrice: 1000000000, // 1 gwei + gasPrice: 200000000000, // 50 gwei timeout: 60000, }, xdai: { diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index 4cc76c1c..fcebe963 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -1,21 +1,12 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -// const hre = require("hardhat"); +const IPFS = require("ipfs-core"); const { deployTokens } = require("./utils/deploy-tokens"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); const { deployGuilds } = require("./utils/deploy-guilds"); -// const ERC20Guild = hre.artifacts.require("ERC20Guild"); - -// const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -// const ANY_ADDRESS = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa"; -// // const MAX_UINT_256 = -// // "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -// const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -// const web3 = hre.web3; - task("deploy-guilds", "Deploy guilds") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { @@ -82,6 +73,7 @@ task("deploy-guilds", "Deploy guilds") networkContracts.permissionRegistry = permissionRegistry.address; addresses["PermissionRegstry"] = permissionRegistry.address; await waitBlocks(1); + // Deploy Guilds await deployGuilds( deploymentConfig, diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 2d51ab9f..1713c4d2 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -51,7 +51,12 @@ export async function deployGuilds( ); if (guildToDeploy.contractName === "SnapshotRepERC20Guild") await tokens[guildToDeploy.token].transferOwnership(newGuild.address); - await guildRegistry.addGuild(newGuild.address); + try { + await guildRegistry.addGuild(newGuild.address); + } catch (e) { + // Likely not owner of registry + console.log("Failed to add guild to registry", e); + } guilds[guildToDeploy.name] = newGuild; addresses[guildToDeploy.name] = newGuild.address; proposals[guildToDeploy.name] = []; From 3cf5630f40a313554d5019e65d757c2274469a9c Mon Sep 17 00:00:00 2001 From: rossneilson Date: Fri, 29 Apr 2022 11:38:31 +0100 Subject: [PATCH 13/37] fix: Adding waits for rinkeby --- hardhat.config.js | 3 --- scripts/deploy-dxvote.js | 9 +-------- scripts/deploy-guilds.js | 9 +-------- scripts/utils/deploy-guilds.js | 2 ++ scripts/utils/deploy-tokens.js | 8 ++++++-- scripts/utils/wait.js | 7 +++++++ 6 files changed, 17 insertions(+), 21 deletions(-) create mode 100644 scripts/utils/wait.js diff --git a/hardhat.config.js b/hardhat.config.js index 81af8518..12e2c001 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -123,9 +123,6 @@ const hardharNetworks = process.env.CI rinkeby: { url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, - gasLimit: 10000000, - gasPrice: 200000000000, // 50 gwei - timeout: 60000, }, xdai: { url: "https://rpc.xdaichain.com/", diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 786fe96d..eb3e7271 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -14,6 +14,7 @@ const { encodePermission } = require("../test/helpers/permissions"); const { deployTokens } = require("./utils/deploy-tokens"); const { deployGuilds } = require("./utils/deploy-guilds"); const { doActions } = require("./utils/do-actions"); +const { waitBlocks } = require("./utils/wait"); task("deploy-dxvote", "Deploy dxvote in localhost network") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { @@ -47,14 +48,6 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") ); const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - async function waitBlocks(blocks) { - const toBlock = (await web3.eth.getBlock("latest")).number + blocks; - while ((await web3.eth.getBlock("latest")).number < toBlock) { - await sleep(500); - } - return; - } - // Get ETH accounts to be used const accounts = await web3.eth.getAccounts(); diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index fcebe963..3a00e756 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -6,6 +6,7 @@ const { deployTokens } = require("./utils/deploy-tokens"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); const { deployGuilds } = require("./utils/deploy-guilds"); +const { waitBlocks } = require("./utils/wait"); task("deploy-guilds", "Deploy guilds") .addParam("deployconfig", "The deploy config json in string format") @@ -27,14 +28,6 @@ task("deploy-guilds", "Deploy guilds") "PermissionRegistry" ); - async function waitBlocks(blocks) { - const toBlock = (await web3.eth.getBlock("latest")).number + blocks; - while ((await web3.eth.getBlock("latest")).number < toBlock) { - await sleep(500); - } - return; - } - // Get ETH accounts to be used const accounts = await web3.eth.getAccounts(); diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 1713c4d2..feddcc7d 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -49,10 +49,12 @@ export async function deployGuilds( guildToDeploy.lockTime, permissionRegistry.address ); + await waitBlocks(1); if (guildToDeploy.contractName === "SnapshotRepERC20Guild") await tokens[guildToDeploy.token].transferOwnership(newGuild.address); try { await guildRegistry.addGuild(newGuild.address); + await waitBlocks(1); } catch (e) { // Likely not owner of registry console.log("Failed to add guild to registry", e); diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 1c14b43b..cce5404c 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -3,7 +3,7 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); export async function deployTokens(deploymentConfig, accounts) { - const ERC20Mock = await hre.artifacts.require("ERC20Mock"); + const ERC20 = await hre.artifacts.require("ERC20"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); let tokens = {}; @@ -22,16 +22,20 @@ export async function deployTokens(deploymentConfig, accounts) { let newToken; switch (tokenToDeploy.type) { case "ERC20": - newToken = await ERC20Mock.new(accounts[0], totalSupply.toString()); + newToken = await ERC20.new(accounts[0], totalSupply.toString()); + await waitBlocks(1); await tokenToDeploy.distribution.map(async tokenHolder => { await newToken.transfer(tokenHolder.address, tokenHolder.amount); + await waitBlocks(1); }); break; case "ERC20SnapshotRep": newToken = await ERC20SnapshotRep.new(); await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol); + await waitBlocks(1); await tokenToDeploy.distribution.map(async tokenHolder => { await newToken.mint(tokenHolder.address, tokenHolder.amount); + await waitBlocks(1); }); break; } diff --git a/scripts/utils/wait.js b/scripts/utils/wait.js new file mode 100644 index 00000000..f1de612e --- /dev/null +++ b/scripts/utils/wait.js @@ -0,0 +1,7 @@ +export async function waitBlocks(blocks) { + const toBlock = (await web3.eth.getBlock("latest")).number + blocks; + while ((await web3.eth.getBlock("latest")).number < toBlock) { + await sleep(500); + } + return; +} From 9286f5abbf4a1e7f21dde213d0d793a282bbc0ac Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 3 May 2022 15:23:26 +0100 Subject: [PATCH 14/37] fix: Rename template files --- hardhat.config.js | 4 +- .../deploy-dxvote-develop.js | 463 ------------------ .../DeploymentTemplates/deploy-guilds-larp.js | 156 ------ scripts/DeploymentTemplates/guilds-larp.js | 11 +- 4 files changed, 6 insertions(+), 628 deletions(-) delete mode 100644 scripts/DeploymentTemplates/deploy-dxvote-develop.js delete mode 100644 scripts/DeploymentTemplates/deploy-guilds-larp.js diff --git a/hardhat.config.js b/hardhat.config.js index 12e2c001..74eb3526 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -13,9 +13,9 @@ require("hardhat-dependency-compiler"); require("./scripts/create2"); require("./scripts/deploy-dxvote"); -require("./scripts/DeploymentTemplates/deploy-dxvote-develop"); +require("./scripts/DeploymentTemplates/dxvote-develop"); require("./scripts/deploy-guilds"); -require("./scripts/DeploymentTemplates/deploy-guilds-larp"); +require("./scripts/DeploymentTemplates/guilds-larp"); const moment = require("moment"); diff --git a/scripts/DeploymentTemplates/deploy-dxvote-develop.js b/scripts/DeploymentTemplates/deploy-dxvote-develop.js deleted file mode 100644 index 9488b2f0..00000000 --- a/scripts/DeploymentTemplates/deploy-dxvote-develop.js +++ /dev/null @@ -1,463 +0,0 @@ -require("@nomiclabs/hardhat-web3"); -const moment = require("moment"); -const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -const ANY_ADDRESS = "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa"; -const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; - -task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( - async () => { - const PermissionRegistry = await hre.artifacts.require( - "PermissionRegistry" - ); - const ERC20Guild = await hre.artifacts.require("ERC20Guild"); - - const deployconfig = { - reputation: [ - { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - amount: 6000, - }, - { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - amount: 4000, - }, - { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - amount: 1000, - }, - ], - - tokens: [ - { - name: "DXDao on localhost", - symbol: "DXD", - type: "ERC20", - distribution: [ - { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - amount: web3.utils.toWei("220"), - }, - { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - amount: web3.utils.toWei("50"), - }, - { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - amount: web3.utils.toWei("10"), - }, - ], - }, - { - name: "REPGuildToken", - symbol: "RGT", - type: "ERC20SnapshotRep", - distribution: [ - { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - amount: web3.utils.toWei("220"), - }, - { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - amount: web3.utils.toWei("50"), - }, - { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - amount: web3.utils.toWei("10"), - }, - ], - }, - ], - - permissionRegistryDelay: moment.duration(10, "seconds").asSeconds(), - - contributionReward: { - queuedVoteRequiredPercentage: 50, - queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - thresholdConst: 2000, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 10, - votersReputationLossRatio: 100, - minimumDaoBounty: web3.utils.toWei("1"), - daoBountyConst: 100, - }, - - walletSchemes: [ - { - name: "RegistrarWalletScheme", - doAvatarGenericCalls: true, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 0, - controllerPermissions: { - canGenericCall: true, - canUpgrade: true, - canRegisterSchemes: true, - }, - permissions: [], - queuedVoteRequiredPercentage: 75, - boostedVoteRequiredPercentage: 5 * 100, - queuedVotePeriodLimit: moment.duration(15, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(2, "minutes").asSeconds(), - thresholdConst: 2000, - quietEndingPeriod: moment.duration(1, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 100, - minimumDaoBounty: web3.utils.toWei("10"), - daoBountyConst: 100, - }, - { - name: "MasterWalletScheme", - doAvatarGenericCalls: true, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 40, - controllerPermissions: { - canGenericCall: true, - canUpgrade: false, - canChangeConstraints: false, - canRegisterSchemes: false, - }, - permissions: [ - { - asset: "0x0000000000000000000000000000000000000000", - to: "DXDVotingMachine", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "0x0000000000000000000000000000000000000000", - to: "RegistrarWalletScheme", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "0x0000000000000000000000000000000000000000", - to: "ITSELF", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - ], - queuedVoteRequiredPercentage: 50, - boostedVoteRequiredPercentage: 2 * 100, - queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - thresholdConst: 1500, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 5, - minimumDaoBounty: web3.utils.toWei("1"), - daoBountyConst: 10, - }, - { - name: "QuickWalletScheme", - doAvatarGenericCalls: false, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 1, - controllerPermissions: { - canGenericCall: false, - canUpgrade: false, - canChangeConstraints: false, - canRegisterSchemes: false, - }, - permissions: [ - { - asset: "0x0000000000000000000000000000000000000000", - to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "DXD", - to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - ], - queuedVoteRequiredPercentage: 50, - boostedVoteRequiredPercentage: 10 * 100, - queuedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment - .duration(0.5, "minutes") - .asSeconds(), - thresholdConst: 1300, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 10, - minimumDaoBounty: web3.utils.toWei("0.1"), - daoBountyConst: 10, - }, - ], - - guilds: [ - { - token: "DXD", - contractName: "DXDGuild", - name: "DXDGuild", - proposalTime: moment.duration(10, "minutes").asSeconds(), - timeForExecution: moment.duration(5, "minutes").asSeconds(), - votingPowerForProposalExecution: "30", - votingPowerForProposalCreation: "1", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "2", - lockTime: moment.duration(10, "minutes").asSeconds(), - }, - { - token: "RGT", - contractName: "SnapshotRepERC20Guild", - name: "REPGuild", - proposalTime: moment.duration(5, "minutes").asSeconds(), - timeForExecution: moment.duration(2, "minutes").asSeconds(), - votingPowerForProposalExecution: "50", - votingPowerForProposalCreation: "5", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "5", - lockTime: moment.duration(5, "minutes").asSeconds(), - }, - ], - - startTimestampForActions: moment().subtract(10, "minutes").unix(), - - actions: [ - { - type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: NULL_ADDRESS, - address: "Avatar", - amount: web3.utils.toWei("50"), - }, - }, - { - type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: "DXD", - address: "Avatar", - amount: web3.utils.toWei("20"), - }, - }, - - { - type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: NULL_ADDRESS, - address: "DXDGuild", - amount: web3.utils.toWei("10"), - }, - }, - { - type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: "DXD", - address: "DXDGuild", - amount: web3.utils.toWei("100"), - }, - }, - - { - type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: NULL_ADDRESS, - address: "REPGuild", - amount: web3.utils.toWei("12"), - }, - }, - - { - type: "proposal", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - to: ["PermissionRegistry"], - callData: [ - new web3.eth.Contract(PermissionRegistry.abi).methods - .setPermission( - NULL_ADDRESS, - "0xE0FC07f3aC4F6AF1463De20eb60Cf1A764E259db", - "0x1A0370A6f5b6cE96B1386B208a8519552eb714D9", - ANY_FUNC_SIGNATURE, - web3.utils.toWei("10"), - true - ) - .encodeABI(), - ], - value: ["0"], - title: "Proposal Test #0", - description: "Allow sending up to 10 ETH to QuickWalletScheme", - tags: ["dxvote"], - scheme: "MasterWalletScheme", - }, - }, - { - type: "stake", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "0", - decision: "1", - amount: web3.utils.toWei("1.01"), - }, - }, - { - type: "vote", - time: moment.duration(1, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "0", - decision: "1", - amount: "0", - }, - }, - { - type: "execute", - time: moment.duration(3, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "0", - }, - }, - { - type: "redeem", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "0", - }, - }, - - { - type: "proposal", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - to: ["0xdE0A2DFE54721526Aa05BE76F825Ef94CD8F585a"], - callData: ["0x0"], - value: [web3.utils.toWei("10")], - title: "Proposal Test #1", - description: "Send 10 ETH to QuickWalletScheme", - tags: ["dxvote"], - scheme: "MasterWalletScheme", - }, - }, - { - type: "stake", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "1", - decision: "1", - amount: web3.utils.toWei("1.01"), - }, - }, - { - type: "vote", - time: moment.duration(1, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - data: { - proposal: "1", - decision: "1", - amount: "0", - }, - }, - { - type: "vote", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - data: { - proposal: "1", - decision: "2", - amount: "0", - }, - }, - ], - - guildActions: [ - { - type: "approve", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - asset: "DXD", - address: "DXDGuild-vault", - amount: web3.utils.toWei("101"), - }, - }, - { - type: "guild-lockTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - amount: web3.utils.toWei("100"), - }, - }, - { - type: "guild-withdrawTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - amount: web3.utils.toWei("10"), - }, - time: moment.duration(10, "minutes").asSeconds() + 1, - }, - { - type: "guild-createProposal", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - data: { - guildName: "DXDGuild", - to: ["DXDGuild"], - callData: [ - new web3.eth.Contract(ERC20Guild.abi).methods - .setPermission( - [NULL_ADDRESS], - [ANY_ADDRESS], - [ANY_FUNC_SIGNATURE], - [web3.utils.toWei("5").toString()], - [true] - ) - .encodeABI(), - ], - value: ["0"], - totalActions: "1", - title: "Proposal Test #0", - description: - "Allow call any address and function and send a max of 5 ETH per proposal", - }, - }, - { - type: "guild-voteProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - data: { - guildName: "DXDGuild", - proposal: 0, - action: "1", - votingPower: web3.utils.toWei("90").toString(), - }, - }, - { - time: moment.duration(10, "minutes").asSeconds(), - type: "guild-endProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - data: { - guildName: "DXDGuild", - proposal: 0, - }, - }, - ], - }; - - await hre.run("deploy-dxvote", { - deployconfig: JSON.stringify(deployconfig), - }); - } -); diff --git a/scripts/DeploymentTemplates/deploy-guilds-larp.js b/scripts/DeploymentTemplates/deploy-guilds-larp.js deleted file mode 100644 index d033d96c..00000000 --- a/scripts/DeploymentTemplates/deploy-guilds-larp.js +++ /dev/null @@ -1,156 +0,0 @@ -require("@nomiclabs/hardhat-web3"); -const moment = require("moment"); - -task("deploy-guilds-develop", "Deploy dxvote with develop config") - .addParam("registry", "The registry for the given network") - .setAction(async ({ registry }) => { - const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - const deployconfig = { - tokens: [ - { - name: "SWPR on rinkeby", - symbol: "SWPR", - type: "ERC20", - distribution: [ - { - address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("10"), - }, - { - address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("10"), - }, - { - address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("10"), - }, - { - address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("10"), - }, - { - address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("10"), - }, - { - address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("10"), - }, - { - address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("10"), - }, - { - address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("10"), - }, - { - address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("90"), - }, - ], - }, - { - name: "Multisig1", - symbol: "REP", - type: "ERC20SnapshotRep", - distribution: [ - { - address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("10"), - }, - { - address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("10"), - }, - { - address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("10"), - }, - { - address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("10"), - }, - { - address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("10"), - }, - { - address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("10"), - }, - { - address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("10"), - }, - { - address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("10"), - }, - { - address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("40"), - }, - ], - }, - ], - - permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - guildRegistry: - registry === "0x0" ? (await GuildRegistry.new()).address : registry, - guilds: [ - { - token: "SWPR", - contractName: "EnforcedBinarySnapshotERC20Guild", - name: "SWPRGuild", - proposalTime: moment.duration(10, "minutes").asSeconds(), - timeForExecution: moment.duration(5, "minutes").asSeconds(), - votingPowerForProposalExecution: "30", - votingPowerForProposalCreation: "1", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "0", - lockTime: moment.duration(10, "minutes").asSeconds(), - }, - { - token: "REP", - contractName: "SnapshotRepERC20Guild", - name: "Multisig1", - proposalTime: moment.duration(5, "minutes").asSeconds(), - timeForExecution: moment.duration(2, "minutes").asSeconds(), - votingPowerForProposalExecution: "50", - votingPowerForProposalCreation: "5", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "5", - lockTime: moment.duration(5, "minutes").asSeconds(), - }, - ], - - startTimestampForActions: moment().subtract(10, "minutes").unix(), - - actions: [], - }; - - await hre.run("deploy-guilds", { - deployconfig: JSON.stringify(deployconfig), - }); - }); - -module.exports = {}; diff --git a/scripts/DeploymentTemplates/guilds-larp.js b/scripts/DeploymentTemplates/guilds-larp.js index 58c254d9..cbf1bc9a 100644 --- a/scripts/DeploymentTemplates/guilds-larp.js +++ b/scripts/DeploymentTemplates/guilds-larp.js @@ -1,14 +1,10 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); -task("guilds-larp", "Deploy dxvote with develop config") +task("deploy-guilds-larp", "Deploy dxvote with develop config") .addParam("registry", "The registry for the given network") .setAction(async ({ registry }) => { - console.log("larp"); const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - console.log("do deploy"); - const guildReg = await GuildRegistry.new(); - console.log({ guildReg }); const deployconfig = { tokens: [ { @@ -116,7 +112,8 @@ task("guilds-larp", "Deploy dxvote with develop config") ], permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - guildRegistry: registry === "0x0" ? guildReg.address : registry, + guildRegistry: + registry === "0x0" ? (await GuildRegistry.new()).address : registry, guilds: [ { token: "SWPR", @@ -150,7 +147,7 @@ task("guilds-larp", "Deploy dxvote with develop config") actions: [], }; - console.log("do thing"); + await hre.run("deploy-guilds", { deployconfig: JSON.stringify(deployconfig), }); From d264f35eba1f2bd76d3fb6c1d99803f4d978b1b0 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 3 May 2022 18:47:38 +0100 Subject: [PATCH 15/37] fix: Add sleep to wait --- scripts/deploy-guilds.js | 3 --- scripts/utils/wait.js | 4 ++++ 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index 3a00e756..225a9a01 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -13,9 +13,6 @@ task("deploy-guilds", "Deploy guilds") .setAction(async ({ deployconfig }) => { const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } const ipfs = await IPFS.create(); let addresses = {}; diff --git a/scripts/utils/wait.js b/scripts/utils/wait.js index f1de612e..8d8c1098 100644 --- a/scripts/utils/wait.js +++ b/scripts/utils/wait.js @@ -1,3 +1,7 @@ +function sleep(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); +} + export async function waitBlocks(blocks) { const toBlock = (await web3.eth.getBlock("latest")).number + blocks; while ((await web3.eth.getBlock("latest")).number < toBlock) { From e7a1a46533f0c8c79b2b0dbab521a6cf5b58ea60 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Thu, 5 May 2022 12:20:10 +0100 Subject: [PATCH 16/37] fix: Fixing token loops --- scripts/utils/deploy-tokens.js | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 8c89aef1..d4db8339 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -13,8 +13,10 @@ export async function deployTokens(deploymentConfig, accounts) { // await Promise.all( // deploymentConfig.tokens.map(async tokenToDeploy => { - for (i in deploymentConfig.token) { - const tokenToDeploy = deploymentConfig.token[i]; + // for (i in deploymentConfig.token) { + console.log({ deploymentConfig }); + for (const tokenToDeploy of deploymentConfig.tokens) { + console.log({ tokenToDeploy }); console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); const totalSupply = tokenToDeploy.distribution.reduce(function ( previous, @@ -23,28 +25,28 @@ export async function deployTokens(deploymentConfig, accounts) { return new BigNumber(previous).plus(current.amount.toString()); }, 0); + console.log({ totalSupply }); + console.log(totalSupply.toString()); let newToken; switch (tokenToDeploy.type) { case "ERC20": newToken = await ERC20.new(accounts[0], totalSupply.toString()); - await waitBlocks(1); - for (i in tokenToDeploy.distribution) { - const tokenHolder = tokenToDeploy.distribution[i]; + // await waitBlocks(1); + for (const tokenHolder of tokenToDeploy.distribution) { // await tokenToDeploy.distribution.map(async tokenHolder => { await newToken.transfer(tokenHolder.address, tokenHolder.amount); - await waitBlocks(1); + // await waitBlocks(1); } break; case "ERC20SnapshotRep": newToken = await ERC20SnapshotRep.new(); await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol); - await waitBlocks(1); + // await waitBlocks(1); - for (i in tokenToDeploy.distribution) { - const tokenHolder = tokenToDeploy.distribution[i]; + for (const tokenHolder of tokenToDeploy.distribution) { await newToken.mint(tokenHolder.address, tokenHolder.amount); - await waitBlocks(1); + // await waitBlocks(1); } break; } From fec9a937c3a76ae511125313b38e0785020c1e73 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Mon, 9 May 2022 15:55:13 +0100 Subject: [PATCH 17/37] fix: Use erc20 mock --- scripts/utils/deploy-tokens.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index d4db8339..b68e120d 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -5,7 +5,7 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); export async function deployTokens(deploymentConfig, accounts) { - const ERC20 = await hre.artifacts.require("ERC20"); + const ERC20Mock = await hre.artifacts.require("ERC20Mock"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); let tokens = {}; @@ -31,7 +31,10 @@ export async function deployTokens(deploymentConfig, accounts) { let newToken; switch (tokenToDeploy.type) { case "ERC20": - newToken = await ERC20.new(accounts[0], totalSupply.toString()); + newToken = await ERC20Mock.new( + tokenToDeploy.name, + tokenToDeploy.symbol + ); // await waitBlocks(1); for (const tokenHolder of tokenToDeploy.distribution) { // await tokenToDeploy.distribution.map(async tokenHolder => { From 11fedf5945bd11b2106ab9c03176e564a00c1261 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Mon, 9 May 2022 22:35:29 -0300 Subject: [PATCH 18/37] fix(contracts/erc20mock): specify token name, symbol and decimals in construc --- contracts/test/ERC20Mock.sol | 8 +++- test/daostack/ContributionRewards.js | 42 ++++++++++++++++++--- test/daostack/Controller.js | 8 ++-- test/daostack/Schemeregistrar.js | 2 +- test/dxdao/dxdao.js | 8 +++- test/dxvote/DXDVotingMachine.js | 5 ++- test/dxvote/PermissionRegistry.js | 8 +++- test/dxvote/Utils.js | 5 ++- test/dxvote/WalletScheme.js | 4 +- test/dxvote/utils/ERC20VestingFactory.js | 2 +- test/erc20guild/ERC20Guild.js | 8 +++- test/erc20guild/implementations/DXDGuild.js | 8 +++- test/helpers/guild.js | 8 +++- 13 files changed, 94 insertions(+), 22 deletions(-) diff --git a/contracts/test/ERC20Mock.sol b/contracts/test/ERC20Mock.sol index 983b3501..0bf15304 100644 --- a/contracts/test/ERC20Mock.sol +++ b/contracts/test/ERC20Mock.sol @@ -5,7 +5,13 @@ import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; // mock class using ERC20 contract ERC20Mock is ERC20, ERC20Detailed { - constructor(address initialAccount, uint256 initialBalance) public ERC20Detailed("DXD", "DXdao", 18) { + constructor( + address initialAccount, + uint256 initialBalance, + string memory symbol, + string memory name, + uint8 decimals + ) public ERC20Detailed(symbol, name, decimals) { _mint(initialAccount, initialBalance); } } diff --git a/test/daostack/ContributionRewards.js b/test/daostack/ContributionRewards.js index f8cf6c1e..b19df1d6 100644 --- a/test/daostack/ContributionRewards.js +++ b/test/daostack/ContributionRewards.js @@ -135,7 +135,7 @@ const setup = async function ( votingMachineType = "none", tokenAddress = "0x0000000000000000000000000000000000000000" ) { - const standardTokenMock = await ERC20Mock.new(accounts[1], 100); + const standardTokenMock = await ERC20Mock.new(accounts[1], 100, "", "", "18"); const contributionReward = await ContributionReward.new(); const reputationArray = votingMachineType !== "none" ? [1000, 100, 0] : [2000, 4000, 7000]; @@ -832,7 +832,13 @@ contract("ContributionReward", accounts => { }); it("execute proposeContributionReward via genesisProtocol voting machine and redeem using Redeemer", async function () { - var standardTokenMock = await ERC20Mock.new(accounts[0], 1000); + var standardTokenMock = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); var testSetup = await setup(accounts, "gen", standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -916,7 +922,13 @@ contract("ContributionReward", accounts => { }); it("execute proposeContributionReward via genesisProtocol voting machine and redeem using Redeemer for un executed boosted proposal", async function () { - var standardTokenMock = await ERC20Mock.new(accounts[0], 1000); + var standardTokenMock = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); var testSetup = await setup(accounts, "gen", standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -1029,7 +1041,13 @@ contract("ContributionReward", accounts => { }); it("execute proposeContributionReward via dxd voting machine and redeem using Redeemer for un executed boosted proposal", async function () { - var standardTokenMock = await ERC20Mock.new(accounts[0], 1000); + var standardTokenMock = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); var testSetup = await setup(accounts, "dxd", standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -1148,7 +1166,13 @@ contract("ContributionReward", accounts => { }); it("execute proposeContributionReward via genesisProtocol voting machine and redeem using Redeemer for negative proposal", async function () { - var standardTokenMock = await ERC20Mock.new(accounts[0], 1000); + var standardTokenMock = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); var testSetup = await setup(accounts, "gen", standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; @@ -1206,7 +1230,13 @@ contract("ContributionReward", accounts => { }); it("execute proposeContributionReward via genesisProtocol voting machine and redeem using Redeemer ExpiredInQueue", async function () { - var standardTokenMock = await ERC20Mock.new(accounts[0], 1000); + var standardTokenMock = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); var testSetup = await setup(accounts, "gen", standardTokenMock.address); var reputationReward = 12; var nativeTokenReward = 12; diff --git a/test/daostack/Controller.js b/test/daostack/Controller.js index f5629395..da507f5a 100644 --- a/test/daostack/Controller.js +++ b/test/daostack/Controller.js @@ -644,7 +644,7 @@ contract("Controller", accounts => { it("externalTokenTransfer", async () => { //External transfer token from avatar contract to other address controller = await setup(accounts); - var standardToken = await ERC20Mock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100, "", "", "18"); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); await avatar.transferOwnership(controller.address); @@ -673,7 +673,7 @@ contract("Controller", accounts => { var tx; var to = accounts[1]; controller = await setup(accounts); - var standardToken = await ERC20Mock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100, "", "", "18"); await avatar.transferOwnership(controller.address); tx = await controller.externalTokenApproval( standardToken.address, @@ -914,7 +914,7 @@ contract("Controller", accounts => { it("globalConstraints externalTokenTransfer add & remove", async () => { controller = await setup(accounts); var globalConstraints = await constraint("externalTokenTransfer"); - var standardToken = await ERC20Mock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100, "", "", "18"); let balanceAvatar = await standardToken.balanceOf(avatar.address); assert.equal(balanceAvatar, 100); await avatar.transferOwnership(controller.address); @@ -973,7 +973,7 @@ contract("Controller", accounts => { var to = accounts[1]; controller = await setup(accounts); var globalConstraints = await constraint("externalTokenApproval"); - var standardToken = await ERC20Mock.new(avatar.address, 100); + var standardToken = await ERC20Mock.new(avatar.address, 100, "", "", "18"); await avatar.transferOwnership(controller.address); try { diff --git a/test/daostack/Schemeregistrar.js b/test/daostack/Schemeregistrar.js index a86bda14..81b77bca 100644 --- a/test/daostack/Schemeregistrar.js +++ b/test/daostack/Schemeregistrar.js @@ -29,7 +29,7 @@ const setupSchemeRegistrarParams = async function (schemeRegistrar) { const setup = async function (accounts) { const fee = 10; - const standardTokenMock = await ERC20Mock.new(accounts[1], 100); + const standardTokenMock = await ERC20Mock.new(accounts[1], 100, "", "", "18"); const schemeRegistrar = await SchemeRegistrar.new(); const reputationArray = [20, 40, 70]; const org = await helpers.setupOrganization( diff --git a/test/dxdao/dxdao.js b/test/dxdao/dxdao.js index 7bf797e2..6e253fd8 100644 --- a/test/dxdao/dxdao.js +++ b/test/dxdao/dxdao.js @@ -14,7 +14,13 @@ contract("DXdao", function (accounts) { const constants = helpers.constants; it("Wallet - execute proposeVote -positive decision - check action - with DXDVotingMachine", async function () { - const votingMachineToken = await ERC20Mock.new(accounts[0], 1000); + const votingMachineToken = await ERC20Mock.new( + accounts[0], + 1000, + "", + "", + "18" + ); const masterWalletScheme = await WalletScheme.new(); const controllerCreator = await DxControllerCreator.new({ gas: constants.GAS_LIMIT, diff --git a/test/dxvote/DXDVotingMachine.js b/test/dxvote/DXDVotingMachine.js index 501c33b0..38b76311 100644 --- a/test/dxvote/DXDVotingMachine.js +++ b/test/dxvote/DXDVotingMachine.js @@ -40,7 +40,10 @@ contract("DXDVotingMachine", function (accounts) { actionMock = await ActionMock.new(); const standardTokenMock = await ERC20Mock.new( accounts[1], - constants.MAX_UINT_256 + constants.MAX_UINT_256, + "", + "", + "18" ); await standardTokenMock.transfer(accounts[0], 2000, { from: accounts[1] }); org = await helpers.setupOrganization( diff --git a/test/dxvote/PermissionRegistry.js b/test/dxvote/PermissionRegistry.js index 3e949531..1d6ceeab 100644 --- a/test/dxvote/PermissionRegistry.js +++ b/test/dxvote/PermissionRegistry.js @@ -20,7 +20,13 @@ contract("PermissionRegistry", function (accounts) { beforeEach(async function () { actionMock = await ActionMock.new(); - const standardTokenMock = await ERC20Mock.new(accounts[1], 1000); + const standardTokenMock = await ERC20Mock.new( + accounts[1], + 1000, + "", + "", + "18" + ); org = await helpers.setupOrganization( [accounts[0], accounts[1], accounts[2]], [1000, 1000, 1000], diff --git a/test/dxvote/Utils.js b/test/dxvote/Utils.js index 8c1eac99..011a3257 100644 --- a/test/dxvote/Utils.js +++ b/test/dxvote/Utils.js @@ -26,7 +26,10 @@ contract("Dxvote Utils", function (accounts) { beforeEach(async function () { standardTokenMock = await ERC20Mock.new( accounts[1], - web3.utils.toWei("100") + web3.utils.toWei("100"), + "", + "", + "18" ); org = await helpers.setupOrganization( [accounts[0], accounts[1], accounts[2]], diff --git a/test/dxvote/WalletScheme.js b/test/dxvote/WalletScheme.js index fa5b62f3..ad695b8a 100644 --- a/test/dxvote/WalletScheme.js +++ b/test/dxvote/WalletScheme.js @@ -26,8 +26,8 @@ contract("WalletScheme", function (accounts) { beforeEach(async function () { actionMock = await ActionMock.new(); - testToken = await ERC20Mock.new(accounts[1], 1000); - standardTokenMock = await ERC20Mock.new(accounts[1], 1000); + testToken = await ERC20Mock.new(accounts[1], 1000, "", "", "18"); + standardTokenMock = await ERC20Mock.new(accounts[1], 1000, "", "", "18"); org = await helpers.setupOrganization( [accounts[0], accounts[1], accounts[2]], [1000, 1000, 1000], diff --git a/test/dxvote/utils/ERC20VestingFactory.js b/test/dxvote/utils/ERC20VestingFactory.js index c4063899..31fcf9ff 100644 --- a/test/dxvote/utils/ERC20VestingFactory.js +++ b/test/dxvote/utils/ERC20VestingFactory.js @@ -16,7 +16,7 @@ contract("ERC20VestingFactory", function (accounts) { describe("Create Vesting Contracts", function () { beforeEach(async function () { - dxdTokenMock = await ERC20Mock.new(dao, 1000); + dxdTokenMock = await ERC20Mock.new(dao, 1000, "", "", "18"); vestingFactory = await ERC20VestingFactory.new(dxdTokenMock.address, dao); }); diff --git a/test/erc20guild/ERC20Guild.js b/test/erc20guild/ERC20Guild.js index 8b24052a..88c03a89 100644 --- a/test/erc20guild/ERC20Guild.js +++ b/test/erc20guild/ERC20Guild.js @@ -1003,7 +1003,13 @@ contract("ERC20Guild", function (accounts) { await lockTokens(); await allowActionMockA(); - testToken = await ERC20Mock.new(accounts[1], 1000); + testToken = await ERC20Mock.new( + accounts[1], + 1000, + "TestToken", + "TTT", + "18" + ); await testToken.transfer(erc20Guild.address, 300, { from: accounts[1] }); const setTestPermissions = await createProposal({ diff --git a/test/erc20guild/implementations/DXDGuild.js b/test/erc20guild/implementations/DXDGuild.js index efa0e3ef..eadcec0b 100644 --- a/test/erc20guild/implementations/DXDGuild.js +++ b/test/erc20guild/implementations/DXDGuild.js @@ -41,7 +41,13 @@ contract("DXDGuild", function (accounts) { ); dxdGuild = await DXDGuild.new(); - const votingMachineToken = await ERC20Mock.new(accounts[0], 0); + const votingMachineToken = await ERC20Mock.new( + accounts[0], + 0, + "Test Token", + "TT", + "18" + ); votingMachine = await helpers.setUpVotingMachine( votingMachineToken.address, diff --git a/test/helpers/guild.js b/test/helpers/guild.js index 3c5cc979..e44acb73 100644 --- a/test/helpers/guild.js +++ b/test/helpers/guild.js @@ -6,7 +6,13 @@ export async function createAndSetupGuildToken(accounts, balances) { const [firstAccount, ...restOfAccounts] = accounts; const [, ...restOfBalances] = balances; const totalSupply = balances.reduce((a, b) => a + b, 0); - const guildToken = await ERC20Mock.new(firstAccount, totalSupply); + const guildToken = await ERC20Mock.new( + firstAccount, + totalSupply, + "Test Token", + "TT", + "18" + ); await Promise.all( restOfAccounts.map((account, idx) => { From 345e3f9d1dbd697bdc81604f8442a06a12563b8f Mon Sep 17 00:00:00 2001 From: AugustoL Date: Mon, 9 May 2022 22:39:33 -0300 Subject: [PATCH 19/37] fix(scripts): fix and improve broken scripts Use timetsamp and increaseTime for script actions, remove duplicated execution of do-actions, remove unnecessary variables in functions like ipfs, remove console logs, instantiate smart contracts for actions based on their name from the addresses object, and maybe something else im forgetting but that should me most of it. --- scripts/DeploymentTemplates/dxvote-develop.js | 15 ++-- scripts/DeploymentTemplates/guilds-larp.js | 4 +- scripts/deploy-dxvote.js | 19 ++--- scripts/deploy-guilds.js | 13 ++- scripts/utils/deploy-guilds.js | 28 +----- scripts/utils/deploy-tokens.js | 14 +-- scripts/utils/do-actions.js | 85 +++++++++++-------- 7 files changed, 86 insertions(+), 92 deletions(-) diff --git a/scripts/DeploymentTemplates/dxvote-develop.js b/scripts/DeploymentTemplates/dxvote-develop.js index 02d87676..a7854f30 100644 --- a/scripts/DeploymentTemplates/dxvote-develop.js +++ b/scripts/DeploymentTemplates/dxvote-develop.js @@ -32,6 +32,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( name: "DXDao on localhost", symbol: "DXD", type: "ERC20", + decimals: 18, distribution: [ { address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", @@ -51,6 +52,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( name: "REPGuildToken", symbol: "RGT", type: "ERC20SnapshotRep", + decimals: 18, distribution: [ { address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", @@ -230,10 +232,9 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, ], - startTimestampForActions: moment().subtract(10, "minutes").unix(), - actions: [ { + timestamp: moment().subtract(30, "minutes").unix(), type: "transfer", from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", data: { @@ -316,7 +317,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "vote", - time: moment.duration(1, "minutes").asSeconds(), + increaseTime: moment.duration(1, "minutes").asSeconds(), from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", data: { proposal: "0", @@ -326,7 +327,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "execute", - time: moment.duration(3, "minutes").asSeconds(), + increaseTime: moment.duration(3, "minutes").asSeconds(), from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", data: { proposal: "0", @@ -364,7 +365,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "vote", - time: moment.duration(1, "minutes").asSeconds(), + increaseTime: moment.duration(1, "minutes").asSeconds(), from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", data: { proposal: "1", @@ -408,7 +409,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( guildName: "DXDGuild", amount: web3.utils.toWei("10"), }, - time: moment.duration(10, "minutes").asSeconds() + 1, + increaseTime: moment.duration(10, "minutes").asSeconds() + 1, }, { type: "guild-createProposal", @@ -445,7 +446,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, }, { - time: moment.duration(10, "minutes").asSeconds(), + increaseTime: moment.duration(10, "minutes").asSeconds(), type: "guild-endProposal", from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", data: { diff --git a/scripts/DeploymentTemplates/guilds-larp.js b/scripts/DeploymentTemplates/guilds-larp.js index cbf1bc9a..83ee6ca6 100644 --- a/scripts/DeploymentTemplates/guilds-larp.js +++ b/scripts/DeploymentTemplates/guilds-larp.js @@ -11,6 +11,7 @@ task("deploy-guilds-larp", "Deploy dxvote with develop config") name: "SWPR on rinkeby", symbol: "SWPR", type: "ERC20", + decimals: "18", distribution: [ { address: "0xA678B50F66d212d127491F5ee82776bdeF763841", @@ -62,6 +63,7 @@ task("deploy-guilds-larp", "Deploy dxvote with develop config") name: "Multisig1", symbol: "REP", type: "ERC20SnapshotRep", + decimals: "18", distribution: [ { address: "0xA678B50F66d212d127491F5ee82776bdeF763841", @@ -152,5 +154,3 @@ task("deploy-guilds-larp", "Deploy dxvote with develop config") deployconfig: JSON.stringify(deployconfig), }); }); - -module.exports = {}; diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index eb3e7271..cf2c2fc7 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -1,7 +1,6 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -const IPFS = require("ipfs-core"); const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); @@ -21,7 +20,6 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } - const ipfs = await IPFS.create(); let addresses = {}; @@ -480,18 +478,17 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Deploy Guilds const guildRegistry = await GuildRegistry.new(); - await deployGuilds(deploymentConfig, tokens, guildRegistry, ipfs); + const guildsDeployment = await deployGuilds( + deploymentConfig, + tokens, + guildRegistry + ); + + addresses = Object.assign(guildsDeployment.addresses, addresses); // Do actions console.log("Doing actions"); - await doActions( - deploymentConfig.actions, - tokens, - addresses, - avatar, - [], - ipfs - ); + await doActions(deploymentConfig.actions, tokens, addresses); // Increase time to local time await hre.network.provider.request({ diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index 225a9a01..b2dc859d 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -7,6 +7,7 @@ const moment = require("moment"); const { default: BigNumber } = require("bignumber.js"); const { deployGuilds } = require("./utils/deploy-guilds"); const { waitBlocks } = require("./utils/wait"); +const { doActions } = require("./utils/do-actions"); task("deploy-guilds", "Deploy guilds") .addParam("deployconfig", "The deploy config json in string format") @@ -65,13 +66,21 @@ task("deploy-guilds", "Deploy guilds") await waitBlocks(1); // Deploy Guilds - await deployGuilds( + const guildsDeployment = await deployGuilds( deploymentConfig, tokens, await GuildRegistry.at(deploymentConfig.guildRegistry), ipfs ); + // Do actions + console.log("Doing actions"); + await doActions( + deploymentConfig.actions, + tokens, + guildsDeployment.addresses + ); + // Increase time to local time await hre.network.provider.request({ method: "evm_increaseTime", @@ -80,5 +89,3 @@ task("deploy-guilds", "Deploy guilds") return { networkContracts, addresses }; }); - -module.exports = {}; diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index feddcc7d..b460f989 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -1,3 +1,4 @@ +import { waitBlocks } from "./wait"; import { doActions } from "./do-actions"; /* eslint-disable no-case-declarations */ @@ -12,12 +13,7 @@ const MAX_UINT_256 = "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -export async function deployGuilds( - deploymentConfig, - tokens, - guildRegistry, - ipfs -) { +export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // Deploy Guilds let guilds = {}; let proposals = { @@ -68,23 +64,5 @@ export async function deployGuilds( console.log("Contracts deployed:", networkContracts); - // const startTime = deploymentConfig.startTimestampForActions; - - // Increase time to start time for actions - // await hre.network.provider.request({ - // method: "evm_increaseTime", - // params: [startTime - (await web3.eth.getBlock("latest")).timestamp], - // }); - console.log("Doing guild actions"); - // Execute a set of actions once all contracts are deployed - await doActions( - deploymentConfig.guildActions, - tokens, - addresses, - { - address: "0x0", - }, - guilds, - ipfs - ); + return { networkContracts, addresses }; } diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index b68e120d..00910c09 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -1,6 +1,5 @@ import { waitBlocks } from "./wait"; -/* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); @@ -10,13 +9,8 @@ export async function deployTokens(deploymentConfig, accounts) { let tokens = {}; let addresses = {}; - // await Promise.all( - // deploymentConfig.tokens.map(async tokenToDeploy => { - // for (i in deploymentConfig.token) { - console.log({ deploymentConfig }); for (const tokenToDeploy of deploymentConfig.tokens) { - console.log({ tokenToDeploy }); console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); const totalSupply = tokenToDeploy.distribution.reduce(function ( previous, @@ -25,15 +19,16 @@ export async function deployTokens(deploymentConfig, accounts) { return new BigNumber(previous).plus(current.amount.toString()); }, 0); - console.log({ totalSupply }); - console.log(totalSupply.toString()); let newToken; switch (tokenToDeploy.type) { case "ERC20": newToken = await ERC20Mock.new( + accounts[0], + totalSupply, tokenToDeploy.name, - tokenToDeploy.symbol + tokenToDeploy.symbol, + tokenToDeploy.decimals ); // await waitBlocks(1); for (const tokenHolder of tokenToDeploy.distribution) { @@ -56,7 +51,6 @@ export async function deployTokens(deploymentConfig, accounts) { tokens[tokenToDeploy.symbol] = newToken; addresses[tokenToDeploy.symbol] = newToken.address; } - // ); return { tokens, addresses }; } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index 381faa18..0096c4a2 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -1,30 +1,33 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -const { default: BigNumber } = require("bignumber.js"); +const IPFS = require("ipfs-core"); const contentHash = require("content-hash"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -const MAX_UINT_256 = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; -export async function doActions( - actions, - tokens, - addresses, - avatar, - guilds, - ipfs -) { +export async function doActions(actions, tokens, addresses) { + const ipfs = await IPFS.create(); + + const ContributionReward = await hre.artifacts.require("ContributionReward"); + const WalletScheme = await hre.artifacts.require("WalletScheme"); + const DXDVotingMachine = await hre.artifacts.require("DXDVotingMachine"); + const ERC20Guild = await hre.artifacts.require("ERC20Guild"); + // Execute a set of actions once all contracts are deployed let proposals = { dxvote: [], }; for (const i in actions) { const action = actions[i]; - if (action.time) - await network.provider.send("evm_increaseTime", [action.time]); + if (action.timestamp) + await hre.network.provider.request({ + method: "evm_increaseTime", + params: [action.time - (await web3.eth.getBlock("latest")).timestamp], + }); + else if (action.increaseTime) + await network.provider.send("evm_increaseTime", [action.increaseTime]); + console.log("Executing action:", action); switch (action.type) { @@ -66,7 +69,7 @@ export async function doActions( ? await ( await ContributionReward.at(contributionReward.address) ).proposeContributionReward( - avatar.address, + addresses["AVATAR"], contentHash.fromIpfs(proposalDescriptionHash), action.data.reputationChange, action.data.rewards, @@ -89,7 +92,9 @@ export async function doActions( ); break; case "vote": - await votingMachine.vote( + await ( + await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + ).vote( proposals.dxvote[action.data.proposal], action.data.decision, action.data.amount, @@ -98,7 +103,9 @@ export async function doActions( ); break; case "stake": - await votingMachine.stake( + await ( + await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + ).stake( proposals.dxvote[action.data.proposal], action.data.decision, action.data.amount, @@ -107,7 +114,9 @@ export async function doActions( break; case "execute": try { - await votingMachine.execute(proposals.dxvote[action.data.proposal], { + await ( + await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + ).execute(proposals.dxvote[action.data.proposal], { from: action.from, gas: 9000000, }); @@ -116,11 +125,11 @@ export async function doActions( } break; case "redeem": - await votingMachine.redeem( - proposals.dxvote[action.data.proposal], - action.from, - { from: action.from } - ); + await ( + await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + ).redeem(proposals.dxvote[action.data.proposal], action.from, { + from: action.from, + }); break; case "guild-createProposal": const guildProposalDescriptionHash = ( @@ -128,9 +137,9 @@ export async function doActions( JSON.stringify({ description: action.data.proposalBody, url: "" }) ) ).cid.toString(); - const guildProposalCreationTx = await guilds[ - action.data.guildName - ].createProposal( + const guildProposalCreationTx = await ERC20Guild.at( + addresses[action.data.guildName] + ).createProposal( action.data.to.map(_to => addresses[_to] || _to), action.data.callData, action.data.value, @@ -139,29 +148,37 @@ export async function doActions( contentHash.fromIpfs(guildProposalDescriptionHash).toString(), { from: action.from } ); + if (!proposals[action.data.guildName]) + proposals[action.data.guildName] = []; proposals[action.data.guildName].push( guildProposalCreationTx.receipt.logs[0].args.proposalId ); break; case "guild-lockTokens": - await guilds[action.data.guildName].lockTokens(action.data.amount, { - from: action.from, - }); + await ERC20Guild.at(addresses[action.data.guildName]).lockTokens( + action.data.amount, + { + from: action.from, + } + ); break; case "guild-withdrawTokens": - await guilds[action.data.guildName].withdrawTokens(action.data.amount, { - from: action.from, - }); + await ERC20Guild.at(addresses[action.data.guildName]).withdrawTokens( + action.data.amount, + { + from: action.from, + } + ); break; case "guild-voteProposal": - await guilds[action.data.guildName].setVote( + await ERC20Guild.at(addresses[action.data.guildName]).setVote( proposals[action.data.guildName][action.data.proposal], action.data.action, action.data.votingPower ); break; case "guild-endProposal": - await guilds[action.data.guildName].endProposal( + await ERC20Guild.at(addresses[action.data.guildName]).endProposal( proposals[action.data.guildName][action.data.proposal], { from: action.from } ); From b5e13bba66011283bdd0a25d2f114e1b4d42f8b9 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Tue, 10 May 2022 10:09:16 -0300 Subject: [PATCH 20/37] fix(scripts): remove unused variables, duplicated ipfs and exit ipfs --- scripts/deploy-dxvote.js | 6 +----- scripts/deploy-guilds.js | 7 +------ scripts/utils/deploy-guilds.js | 10 ---------- scripts/utils/deploy-tokens.js | 2 -- scripts/utils/do-actions.js | 14 ++++++++++++++ 5 files changed, 16 insertions(+), 23 deletions(-) diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index cf2c2fc7..7dab8a03 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -2,7 +2,6 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); -const { default: BigNumber } = require("bignumber.js"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; const MAX_UINT_256 = @@ -14,13 +13,10 @@ const { deployTokens } = require("./utils/deploy-tokens"); const { deployGuilds } = require("./utils/deploy-guilds"); const { doActions } = require("./utils/do-actions"); const { waitBlocks } = require("./utils/wait"); + task("deploy-dxvote", "Deploy dxvote in localhost network") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { - function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); - } - let addresses = {}; // Parse string json config to json object diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js index b2dc859d..54435788 100644 --- a/scripts/deploy-guilds.js +++ b/scripts/deploy-guilds.js @@ -1,10 +1,8 @@ /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -const IPFS = require("ipfs-core"); const { deployTokens } = require("./utils/deploy-tokens"); const moment = require("moment"); -const { default: BigNumber } = require("bignumber.js"); const { deployGuilds } = require("./utils/deploy-guilds"); const { waitBlocks } = require("./utils/wait"); const { doActions } = require("./utils/do-actions"); @@ -14,8 +12,6 @@ task("deploy-guilds", "Deploy guilds") .setAction(async ({ deployconfig }) => { const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - const ipfs = await IPFS.create(); - let addresses = {}; // Parse string json config to json object @@ -69,8 +65,7 @@ task("deploy-guilds", "Deploy guilds") const guildsDeployment = await deployGuilds( deploymentConfig, tokens, - await GuildRegistry.at(deploymentConfig.guildRegistry), - ipfs + await GuildRegistry.at(deploymentConfig.guildRegistry) ); // Do actions diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index b460f989..36bedefe 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -1,17 +1,7 @@ import { waitBlocks } from "./wait"; -import { doActions } from "./do-actions"; /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -const { default: BigNumber } = require("bignumber.js"); - -const contentHash = require("content-hash"); -const IPFS = require("ipfs-core"); - -const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -const MAX_UINT_256 = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { // Deploy Guilds diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 00910c09..7746be14 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -1,5 +1,3 @@ -import { waitBlocks } from "./wait"; - require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index 0096c4a2..df866be9 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -187,4 +187,18 @@ export async function doActions(actions, tokens, addresses) { break; } } + + const stop = async () => { + try { + await ipfs.stop(); + } catch (e) { + console.log(e.message); + } + process.exit(); + }; + + process.on("SIGTERM", stop); + process.on("SIGINT", stop); + process.on("SIGHUP", stop); + process.on("uncaughtException", stop); } From 109a58261caa45e87d3097d6f40d776c513aa1cd Mon Sep 17 00:00:00 2001 From: AugustoL Date: Tue, 10 May 2022 10:18:49 -0300 Subject: [PATCH 21/37] fix(scritps): fix indentation warnings for eslint --- .eslintrc.json | 2 +- hardhat.config.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/.eslintrc.json b/.eslintrc.json index 11e2bb6b..a3016744 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -15,7 +15,7 @@ "no-undef": "off", "eol-last": 2, "eqeqeq": "error", - "indent": ["error", 2], + "indent": ["error", 2, { "SwitchCase": 1 }], "block-spacing": ["error", "always"], "comma-spacing": "error", "brace-style": "error", diff --git a/hardhat.config.js b/hardhat.config.js index 74eb3526..f1dbbc12 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -123,6 +123,7 @@ const hardharNetworks = process.env.CI rinkeby: { url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, + gasPrice: 50000000000, // 50 gwei }, xdai: { url: "https://rpc.xdaichain.com/", From 0ec4eeac79f121f3bb4585b5294904ba9f4568d5 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Tue, 10 May 2022 11:16:46 -0300 Subject: [PATCH 22/37] fix(hardhat): change gasPrice for gasMultiplier in rinkeby --- hardhat.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hardhat.config.js b/hardhat.config.js index f1dbbc12..b665393b 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -123,7 +123,7 @@ const hardharNetworks = process.env.CI rinkeby: { url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, - gasPrice: 50000000000, // 50 gwei + gasMultiplier: 2, }, xdai: { url: "https://rpc.xdaichain.com/", From 57f6130e51750dc8a782c16e5b16bafb27da1c56 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 12:35:58 -0300 Subject: [PATCH 23/37] fix(erc20guild/implementations): add missing ownable initializers --- contracts/erc20guild/implementations/GuardedERC20Guild.sol | 1 + contracts/erc20guild/implementations/SnapshotRepERC20Guild.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/erc20guild/implementations/GuardedERC20Guild.sol b/contracts/erc20guild/implementations/GuardedERC20Guild.sol index 12d64bfd..be07b01c 100644 --- a/contracts/erc20guild/implementations/GuardedERC20Guild.sol +++ b/contracts/erc20guild/implementations/GuardedERC20Guild.sol @@ -43,6 +43,7 @@ contract GuardedERC20Guild is ERC20GuildUpgradeable, OwnableUpgradeable { uint256 _lockTime, address _permissionRegistry ) public virtual override initializer { + __Ownable_init(); super.initialize( _token, _proposalTime, diff --git a/contracts/erc20guild/implementations/SnapshotRepERC20Guild.sol b/contracts/erc20guild/implementations/SnapshotRepERC20Guild.sol index 44991557..02d32655 100644 --- a/contracts/erc20guild/implementations/SnapshotRepERC20Guild.sol +++ b/contracts/erc20guild/implementations/SnapshotRepERC20Guild.sol @@ -48,6 +48,7 @@ contract SnapshotRepERC20Guild is ERC20GuildUpgradeable, OwnableUpgradeable { uint256 _lockTime, address _permissionRegistry ) public override initializer { + __Ownable_init(); super.initialize( _token, _proposalTime, From 4dcd153e4e5be459fe663bc9d9e2902dd017bfd0 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 12:37:06 -0300 Subject: [PATCH 24/37] refactor(scripts): add more utils for deployment and simplify code and config --- hardhat.config.js | 4 +- scripts/DeploymentTemplates/dxvote-develop.js | 307 +++++------ scripts/DeploymentTemplates/guilds-larp.js | 18 +- scripts/deploy-dxvote.js | 480 +----------------- scripts/deploy-guilds.js | 86 ---- scripts/utils/deploy-dao.js | 436 ++++++++++++++++ scripts/utils/deploy-guilds.js | 25 +- scripts/utils/deploy-tokens.js | 15 +- scripts/utils/do-actions.js | 52 +- 9 files changed, 661 insertions(+), 762 deletions(-) delete mode 100644 scripts/deploy-guilds.js create mode 100644 scripts/utils/deploy-dao.js diff --git a/hardhat.config.js b/hardhat.config.js index cfc68eed..881752c3 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -15,7 +15,6 @@ require("hardhat-contract-sizer"); require("./scripts/create2"); require("./scripts/deploy-dxvote"); require("./scripts/DeploymentTemplates/dxvote-develop"); -require("./scripts/deploy-guilds"); require("./scripts/DeploymentTemplates/guilds-larp"); const moment = require("moment"); @@ -124,7 +123,8 @@ const hardharNetworks = process.env.CI rinkeby: { url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, - gasMultiplier: 2, + gasMultiplier: 5, + timeout: 600000, // 10 minutes }, xdai: { url: "https://rpc.xdaichain.com/", diff --git a/scripts/DeploymentTemplates/dxvote-develop.js b/scripts/DeploymentTemplates/dxvote-develop.js index a7854f30..ed9040a5 100644 --- a/scripts/DeploymentTemplates/dxvote-develop.js +++ b/scripts/DeploymentTemplates/dxvote-develop.js @@ -12,20 +12,156 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( const ERC20Guild = await hre.artifacts.require("ERC20Guild"); const deployconfig = { - reputation: [ - { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", - amount: 6000, - }, - { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", - amount: 4000, - }, - { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", - amount: 1000, + dao: { + reputation: [ + { + address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + amount: 6000, + }, + { + address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + amount: 4000, + }, + { + address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + amount: 1000, + }, + ], + contributionReward: { + queuedVoteRequiredPercentage: 50, + queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), + boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), + preBoostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), + thresholdConst: 2000, + quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), + proposingRepReward: 10, + votersReputationLossRatio: 100, + minimumDaoBounty: web3.utils.toWei("1"), + daoBountyConst: 100, }, - ], + + walletSchemes: [ + { + name: "RegistrarWalletScheme", + doAvatarGenericCalls: true, + maxSecondsForExecution: moment.duration(31, "days").asSeconds(), + maxRepPercentageChange: 0, + controllerPermissions: { + canGenericCall: true, + canUpgrade: true, + canRegisterSchemes: true, + }, + permissions: [], + queuedVoteRequiredPercentage: 75, + boostedVoteRequiredPercentage: 5 * 100, + queuedVotePeriodLimit: moment.duration(15, "minutes").asSeconds(), + boostedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), + preBoostedVotePeriodLimit: moment + .duration(2, "minutes") + .asSeconds(), + thresholdConst: 2000, + quietEndingPeriod: moment.duration(1, "minutes").asSeconds(), + proposingRepReward: 0, + votersReputationLossRatio: 100, + minimumDaoBounty: web3.utils.toWei("10"), + daoBountyConst: 100, + }, + { + name: "MasterWalletScheme", + doAvatarGenericCalls: true, + maxSecondsForExecution: moment.duration(31, "days").asSeconds(), + maxRepPercentageChange: 40, + controllerPermissions: { + canGenericCall: true, + canUpgrade: false, + canChangeConstraints: false, + canRegisterSchemes: false, + }, + permissions: [ + { + asset: "0x0000000000000000000000000000000000000000", + to: "DXDVotingMachine", + functionSignature: "0xaaaaaaaa", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + allowed: true, + }, + { + asset: "0x0000000000000000000000000000000000000000", + to: "RegistrarWalletScheme", + functionSignature: "0xaaaaaaaa", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + allowed: true, + }, + { + asset: "0x0000000000000000000000000000000000000000", + to: "ITSELF", + functionSignature: "0xaaaaaaaa", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + allowed: true, + }, + ], + queuedVoteRequiredPercentage: 50, + boostedVoteRequiredPercentage: 2 * 100, + queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), + boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), + preBoostedVotePeriodLimit: moment + .duration(1, "minutes") + .asSeconds(), + thresholdConst: 1500, + quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), + proposingRepReward: 0, + votersReputationLossRatio: 5, + minimumDaoBounty: web3.utils.toWei("1"), + daoBountyConst: 10, + }, + { + name: "QuickWalletScheme", + doAvatarGenericCalls: false, + maxSecondsForExecution: moment.duration(31, "days").asSeconds(), + maxRepPercentageChange: 1, + controllerPermissions: { + canGenericCall: false, + canUpgrade: false, + canChangeConstraints: false, + canRegisterSchemes: false, + }, + permissions: [ + { + asset: "0x0000000000000000000000000000000000000000", + to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", + functionSignature: "0xaaaaaaaa", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + allowed: true, + }, + { + asset: "DXD", + to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", + functionSignature: "0xaaaaaaaa", + value: + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", + allowed: true, + }, + ], + queuedVoteRequiredPercentage: 50, + boostedVoteRequiredPercentage: 10 * 100, + queuedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), + boostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), + preBoostedVotePeriodLimit: moment + .duration(0.5, "minutes") + .asSeconds(), + thresholdConst: 1300, + quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), + proposingRepReward: 0, + votersReputationLossRatio: 10, + minimumDaoBounty: web3.utils.toWei("0.1"), + daoBountyConst: 10, + }, + ], + }, tokens: [ { @@ -70,139 +206,6 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, ], - permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - - contributionReward: { - queuedVoteRequiredPercentage: 50, - queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - thresholdConst: 2000, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 10, - votersReputationLossRatio: 100, - minimumDaoBounty: web3.utils.toWei("1"), - daoBountyConst: 100, - }, - - walletSchemes: [ - { - name: "RegistrarWalletScheme", - doAvatarGenericCalls: true, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 0, - controllerPermissions: { - canGenericCall: true, - canUpgrade: true, - canRegisterSchemes: true, - }, - permissions: [], - queuedVoteRequiredPercentage: 75, - boostedVoteRequiredPercentage: 5 * 100, - queuedVotePeriodLimit: moment.duration(15, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(2, "minutes").asSeconds(), - thresholdConst: 2000, - quietEndingPeriod: moment.duration(1, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 100, - minimumDaoBounty: web3.utils.toWei("10"), - daoBountyConst: 100, - }, - { - name: "MasterWalletScheme", - doAvatarGenericCalls: true, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 40, - controllerPermissions: { - canGenericCall: true, - canUpgrade: false, - canChangeConstraints: false, - canRegisterSchemes: false, - }, - permissions: [ - { - asset: "0x0000000000000000000000000000000000000000", - to: "DXDVotingMachine", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "0x0000000000000000000000000000000000000000", - to: "RegistrarWalletScheme", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "0x0000000000000000000000000000000000000000", - to: "ITSELF", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - ], - queuedVoteRequiredPercentage: 50, - boostedVoteRequiredPercentage: 2 * 100, - queuedVotePeriodLimit: moment.duration(10, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(3, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - thresholdConst: 1500, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 5, - minimumDaoBounty: web3.utils.toWei("1"), - daoBountyConst: 10, - }, - { - name: "QuickWalletScheme", - doAvatarGenericCalls: false, - maxSecondsForExecution: moment.duration(31, "days").asSeconds(), - maxRepPercentageChange: 1, - controllerPermissions: { - canGenericCall: false, - canUpgrade: false, - canChangeConstraints: false, - canRegisterSchemes: false, - }, - permissions: [ - { - asset: "0x0000000000000000000000000000000000000000", - to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - { - asset: "DXD", - to: "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - functionSignature: "0xaaaaaaaa", - value: - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", - allowed: true, - }, - ], - queuedVoteRequiredPercentage: 50, - boostedVoteRequiredPercentage: 10 * 100, - queuedVotePeriodLimit: moment.duration(5, "minutes").asSeconds(), - boostedVotePeriodLimit: moment.duration(1, "minutes").asSeconds(), - preBoostedVotePeriodLimit: moment - .duration(0.5, "minutes") - .asSeconds(), - thresholdConst: 1300, - quietEndingPeriod: moment.duration(0.5, "minutes").asSeconds(), - proposingRepReward: 0, - votersReputationLossRatio: 10, - minimumDaoBounty: web3.utils.toWei("0.1"), - daoBountyConst: 10, - }, - ], - guilds: [ { token: "DXD", @@ -306,6 +309,15 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( scheme: "MasterWalletScheme", }, }, + { + type: "approve", + from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + data: { + asset: "DXD", + address: "DXDVotingMachine", + amount: web3.utils.toWei("100"), + }, + }, { type: "stake", from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", @@ -382,9 +394,6 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( amount: "0", }, }, - ], - - guildActions: [ { type: "approve", from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", diff --git a/scripts/DeploymentTemplates/guilds-larp.js b/scripts/DeploymentTemplates/guilds-larp.js index 83ee6ca6..7943ba66 100644 --- a/scripts/DeploymentTemplates/guilds-larp.js +++ b/scripts/DeploymentTemplates/guilds-larp.js @@ -1,11 +1,11 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); -task("deploy-guilds-larp", "Deploy dxvote with develop config") - .addParam("registry", "The registry for the given network") - .setAction(async ({ registry }) => { - const GuildRegistry = await hre.artifacts.require("GuildRegistry"); +task("deploy-guilds-larp", "Deploy dxvote with develop config").setAction( + async () => { const deployconfig = { + permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), + tokens: [ { name: "SWPR on rinkeby", @@ -113,9 +113,6 @@ task("deploy-guilds-larp", "Deploy dxvote with develop config") }, ], - permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - guildRegistry: - registry === "0x0" ? (await GuildRegistry.new()).address : registry, guilds: [ { token: "SWPR", @@ -145,12 +142,11 @@ task("deploy-guilds-larp", "Deploy dxvote with develop config") }, ], - startTimestampForActions: moment().subtract(10, "minutes").unix(), - actions: [], }; - await hre.run("deploy-guilds", { + await hre.run("deploy-dxvote", { deployconfig: JSON.stringify(deployconfig), }); - }); + } +); diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxvote.js index 7dab8a03..bb7b447c 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxvote.js @@ -3,16 +3,10 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); -const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -const MAX_UINT_256 = - "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; -const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; - -const { encodePermission } = require("../test/helpers/permissions"); const { deployTokens } = require("./utils/deploy-tokens"); +const { deployDao } = require("./utils/deploy-dao"); const { deployGuilds } = require("./utils/deploy-guilds"); const { doActions } = require("./utils/do-actions"); -const { waitBlocks } = require("./utils/wait"); task("deploy-dxvote", "Deploy dxvote in localhost network") .addParam("deployconfig", "The deploy config json in string format") @@ -22,469 +16,29 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") // Parse string json config to json object const deploymentConfig = JSON.parse(deployconfig); - // Import contracts - const DxAvatar = await hre.artifacts.require("DxAvatar"); - const DxReputation = await hre.artifacts.require("DxReputation"); - const DxController = await hre.artifacts.require("DxController"); - const ContributionReward = await hre.artifacts.require( - "ContributionReward" - ); - const Redeemer = await hre.artifacts.require("Redeemer"); - const WalletScheme = await hre.artifacts.require("WalletScheme"); - const PermissionRegistry = await hre.artifacts.require( - "PermissionRegistry" - ); - const DXDVotingMachine = await hre.artifacts.require("DXDVotingMachine"); - const Multicall = await hre.artifacts.require("Multicall"); - const ERC721Factory = await hre.artifacts.require("ERC721Factory"); - const ERC20VestingFactory = await hre.artifacts.require( - "ERC20VestingFactory" - ); - const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - - // Get ETH accounts to be used - const accounts = await web3.eth.getAccounts(); - - // Get fromBlock for network contracts - const fromBlock = (await web3.eth.getBlock("latest")).number; - - // Set networkContracts object that will store the contracts deployed - let networkContracts = { - fromBlock: fromBlock, - avatar: null, - reputation: null, - token: null, - controller: null, - permissionRegistry: null, - schemes: {}, - utils: {}, - votingMachines: {}, - }; - - // Get initial REP holders - let founders = [], - initialRep = []; - deploymentConfig.reputation.map(initialRepHolder => { - founders.push(initialRepHolder.address); - initialRep.push(initialRepHolder.amount.toString()); - }); - - // Deploy Multicall - let multicall; - console.log("Deploying Multicall..."); - multicall = await Multicall.new(); - console.log("Multicall deployed to:", multicall.address); - await waitBlocks(1); - networkContracts.utils.multicall = multicall.address; - - // Deploy Reputation - let reputation; - console.log("Deploying DxReputation..."); - reputation = await DxReputation.new(); - console.log("DX Reputation deployed to:", reputation.address); - networkContracts.reputation = reputation.address; - addresses["Reputation"] = reputation.address; - await waitBlocks(1); - - // Mint DXvote REP - await reputation.mintMultiple(founders, initialRep); - await waitBlocks(1); - - // Deploy Tokens - const { tokens, addresses: tokenAddresses } = await deployTokens( - deploymentConfig, - accounts - ); - addresses = Object.assign(addresses, tokenAddresses); - - // Deploy Avatar - let avatar; - console.log( - "Deploying DxAvatar...", - tokens.DXD.address, - reputation.address - ); - avatar = await DxAvatar.new( - "DXdao", - tokens.DXD.address, - reputation.address - ); - console.log("DXdao Avatar deployed to:", avatar.address); - networkContracts.avatar = avatar.address; - networkContracts.token = addresses["DXD"]; - addresses["Avatar"] = avatar.address; - await waitBlocks(1); - - // Deploy Controller and transfer avatar to controller - let controller; - console.log("Deploying DxController..."); - controller = await DxController.new(avatar.address); - console.log("DXdao Controller deployed to:", controller.address); - await avatar.transferOwnership(controller.address); - await reputation.transferOwnership(controller.address); - networkContracts.controller = controller.address; - addresses["Controller"] = controller.address; - await waitBlocks(1); - - // Deploy DXDVotingMachine - let votingMachine; - console.log("Deploying DXDVotingMachine..."); - votingMachine = await DXDVotingMachine.new(tokens.DXD.address); - console.log("DXDVotingMachine deployed to:", votingMachine.address); - networkContracts.votingMachines[votingMachine.address] = { - type: "DXDVotingMachine", - token: tokens.DXD.address, - }; - await waitBlocks(1); - await tokens.DXD.approve(votingMachine.address, MAX_UINT_256, { - from: accounts[0], - }); - await tokens.DXD.approve(votingMachine.address, MAX_UINT_256, { - from: accounts[1], - }); - await tokens.DXD.approve(votingMachine.address, MAX_UINT_256, { - from: accounts[2], - }); - addresses["DXDVotingMachine"] = votingMachine.address; - - // Deploy PermissionRegistry to be used by WalletSchemes - let permissionRegistry; - console.log("Deploying PermissionRegistry..."); - permissionRegistry = await PermissionRegistry.new(); - await permissionRegistry.initialize(); - addresses["PermissionRegistry"] = permissionRegistry.address; - - // Only allow the functions mintReputation, burnReputation, genericCall, registerScheme and unregisterScheme to be - // called to in the controller contract from a scheme that calls the controller. - // This permissions makes the other functions inaccessible - const notAllowedControllerFunctions = [ - controller.contract._jsonInterface.find( - method => method.name === "mintTokens" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "unregisterSelf" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "addGlobalConstraint" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "removeGlobalConstraint" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "upgradeController" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "sendEther" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "externalTokenTransfer" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "externalTokenTransferFrom" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "externalTokenApproval" - ).signature, - controller.contract._jsonInterface.find( - method => method.name === "metaData" - ).signature, - ]; - for (var i = 0; i < notAllowedControllerFunctions.length; i++) { - await permissionRegistry.setPermission( - NULL_ADDRESS, - avatar.address, - controller.address, - notAllowedControllerFunctions[i], - MAX_UINT_256, - false + if (deploymentConfig.tokens) { + const tokensDeployment = await deployTokens( + deploymentConfig.tokens, + addresses ); + addresses = Object.assign(tokensDeployment.addresses, addresses); } - await permissionRegistry.setPermission( - NULL_ADDRESS, - avatar.address, - controller.address, - ANY_FUNC_SIGNATURE, - 0, - true - ); - - console.log("Permission Registry deployed to:", permissionRegistry.address); - networkContracts.permissionRegistry = permissionRegistry.address; - addresses["PermissionRegstry"] = permissionRegistry.address; - await waitBlocks(1); - - // Deploy ContributionReward Scheme - console.log("Deploying ContributionReward scheme"); - const contributionReward = await ContributionReward.new(); - const redeemer = await Redeemer.new(); - - // The ContributionReward scheme was designed by DAOstack to be used as an universal scheme, - // which means that index the voting params used in the voting machine hash by voting machine - // So the voting parameters are set in the voting machine, and that voting parameters hash is registered in the ContributionReward - // And then other voting parameter hash is calculated for that voting machine and contribution reward, and that is the one used in the controller - const contributionRewardParamsHash = await votingMachine.getParametersHash( - [ - deploymentConfig.contributionReward.queuedVoteRequiredPercentage.toString(), - deploymentConfig.contributionReward.queuedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.boostedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.preBoostedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.thresholdConst.toString(), - deploymentConfig.contributionReward.quietEndingPeriod.toString(), - deploymentConfig.contributionReward.proposingRepReward.toString(), - deploymentConfig.contributionReward.votersReputationLossRatio.toString(), - deploymentConfig.contributionReward.minimumDaoBounty.toString(), - deploymentConfig.contributionReward.daoBountyConst.toString(), - 0, - ], - NULL_ADDRESS, - { from: accounts[0], gasPrice: 0 } - ); - await votingMachine.setParameters( - [ - deploymentConfig.contributionReward.queuedVoteRequiredPercentage.toString(), - deploymentConfig.contributionReward.queuedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.boostedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.preBoostedVotePeriodLimit.toString(), - deploymentConfig.contributionReward.thresholdConst.toString(), - deploymentConfig.contributionReward.quietEndingPeriod.toString(), - deploymentConfig.contributionReward.proposingRepReward.toString(), - deploymentConfig.contributionReward.votersReputationLossRatio.toString(), - deploymentConfig.contributionReward.minimumDaoBounty.toString(), - deploymentConfig.contributionReward.daoBountyConst.toString(), - 0, - ], - NULL_ADDRESS - ); - await contributionReward.setParameters( - contributionRewardParamsHash, - votingMachine.address - ); - const contributionRewardVotingmachineParamsHash = - await contributionReward.getParametersHash( - contributionRewardParamsHash, - votingMachine.address - ); - await controller.registerScheme( - contributionReward.address, - contributionRewardVotingmachineParamsHash, - encodePermission({ - canGenericCall: true, - canUpgrade: false, - canRegisterSchemes: false, - }), - avatar.address - ); - - networkContracts.daostack = { - [contributionReward.address]: { - contractToCall: controller.address, - creationLogEncoding: [ - [ - { - name: "_descriptionHash", - type: "string", - }, - { - name: "_reputationChange", - type: "int256", - }, - { - name: "_rewards", - type: "uint256[5]", - }, - { - name: "_externalToken", - type: "address", - }, - { - name: "_beneficiary", - type: "address", - }, - ], - ], - name: "ContributionReward", - newProposalTopics: [ - [ - "0xcbdcbf9aaeb1e9eff0f75d74e1c1e044bc87110164baec7d18d825b0450d97df", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a", - ], - ], - redeemer: redeemer.address, - supported: true, - type: "ContributionReward", - voteParams: contributionRewardVotingmachineParamsHash, - votingMachine: votingMachine.address, - }, - }; - addresses["ContributionReward"] = contributionReward.address; - - // Deploy Wallet Schemes - for (var s = 0; s < deploymentConfig.walletSchemes.length; s++) { - const schemeConfiguration = deploymentConfig.walletSchemes[s]; - - console.log(`Deploying ${schemeConfiguration.name}...`); - const newScheme = await WalletScheme.new(); - console.log( - `${schemeConfiguration.name} deployed to: ${newScheme.address}` - ); - - // This is simpler than the ContributionReward, just register the params in the VotingMachine and use that ones for the schem registration - let schemeParamsHash = await votingMachine.getParametersHash( - [ - schemeConfiguration.queuedVoteRequiredPercentage.toString(), - schemeConfiguration.queuedVotePeriodLimit.toString(), - schemeConfiguration.boostedVotePeriodLimit.toString(), - schemeConfiguration.preBoostedVotePeriodLimit.toString(), - schemeConfiguration.thresholdConst.toString(), - schemeConfiguration.quietEndingPeriod.toString(), - schemeConfiguration.proposingRepReward.toString(), - schemeConfiguration.votersReputationLossRatio.toString(), - schemeConfiguration.minimumDaoBounty.toString(), - schemeConfiguration.daoBountyConst.toString(), - 0, - ], - NULL_ADDRESS, - { from: accounts[0], gasPrice: 0 } - ); - - await votingMachine.setParameters( - [ - schemeConfiguration.queuedVoteRequiredPercentage.toString(), - schemeConfiguration.queuedVotePeriodLimit.toString(), - schemeConfiguration.boostedVotePeriodLimit.toString(), - schemeConfiguration.preBoostedVotePeriodLimit.toString(), - schemeConfiguration.thresholdConst.toString(), - schemeConfiguration.quietEndingPeriod.toString(), - schemeConfiguration.proposingRepReward.toString(), - schemeConfiguration.votersReputationLossRatio.toString(), - schemeConfiguration.minimumDaoBounty.toString(), - schemeConfiguration.daoBountyConst.toString(), - 0, - ], - NULL_ADDRESS - ); - - // The Wallet scheme has to be initialized right after being created - console.log("Initializing scheme..."); - await newScheme.initialize( - avatar.address, - votingMachine.address, - schemeConfiguration.doAvatarGenericCalls, - controller.address, - permissionRegistry.address, - schemeConfiguration.name, - schemeConfiguration.maxSecondsForExecution, - schemeConfiguration.maxRepPercentageChange - ); - - // Set the initial permissions in the WalletScheme - console.log("Setting scheme permissions..."); - for (var p = 0; p < schemeConfiguration.permissions.length; p++) { - const permission = schemeConfiguration.permissions[p]; - if (permission.to === "ITSELF") permission.to = newScheme.address; - else if (addresses[permission.to]) - permission.to = addresses[permission.to]; - - await permissionRegistry.setPermission( - addresses[permission.asset] || permission.asset, - schemeConfiguration.doAvatarGenericCalls - ? avatar.address - : newScheme.address, - addresses[permission.to] || permission.to, - permission.functionSignature, - permission.value.toString(), - permission.allowed - ); - } - - // Set the boostedVoteRequiredPercentage - if (schemeConfiguration.boostedVoteRequiredPercentage > 0) { - console.log( - "Setting boosted vote required percentage in voting machine..." - ); - await controller.genericCall( - votingMachine.address, - web3.eth.abi.encodeFunctionCall( - { - name: "setBoostedVoteRequiredPercentage", - type: "function", - inputs: [ - { - type: "address", - name: "_scheme", - }, - { - type: "bytes32", - name: "_paramsHash", - }, - { - type: "uint256", - name: "_boostedVotePeriodLimit", - }, - ], - }, - [ - newScheme.address, - schemeParamsHash, - schemeConfiguration.boostedVoteRequiredPercentage, - ] - ), - avatar.address, - 0 - ); - } + if (deploymentConfig.dao) { + const daoDeployment = await deployDao(deploymentConfig.dao, addresses); + addresses = Object.assign(daoDeployment.addresses, addresses); + } - // Finally the scheme is configured and ready to be registered - console.log("Registering scheme in controller..."); - await controller.registerScheme( - newScheme.address, - schemeParamsHash, - encodePermission(schemeConfiguration.controllerPermissions), - avatar.address + if (deploymentConfig.guilds) { + const guildsDeployment = await deployGuilds( + deploymentConfig.guilds, + addresses ); - - networkContracts.schemes[schemeConfiguration.name] = newScheme.address; - addresses[schemeConfiguration.name] = newScheme.address; + addresses = Object.assign(guildsDeployment.addresses, addresses); } - // Deploy dxDaoNFT - let dxDaoNFT; - console.log("Deploying ERC721Factory..."); - dxDaoNFT = await ERC721Factory.new("DX DAO NFT", "DXDNFT"); - networkContracts.utils.dxDaoNFT = dxDaoNFT.address; - addresses["ERC721Factory"] = dxDaoNFT.address; - - // Deploy ERC20VestingFactory - let dxdVestingFactory; - console.log("Deploying ERC20VestingFactory..."); - dxdVestingFactory = await ERC20VestingFactory.new( - networkContracts.votingMachines[votingMachine.address].token, - avatar.address - ); - networkContracts.utils.dxdVestingFactory = dxdVestingFactory.address; - addresses["ERC20VestingFactory"] = dxdVestingFactory.address; - - // Transfer all ownership and power to the dao - console.log("Transfering ownership..."); - // Set the in the permission registry - await permissionRegistry.transferOwnership(avatar.address); - await dxDaoNFT.transferOwnership(avatar.address); - await controller.unregisterScheme(accounts[0], avatar.address); - - // Deploy Guilds - const guildRegistry = await GuildRegistry.new(); - const guildsDeployment = await deployGuilds( - deploymentConfig, - tokens, - guildRegistry - ); - - addresses = Object.assign(guildsDeployment.addresses, addresses); - // Do actions - console.log("Doing actions"); - await doActions(deploymentConfig.actions, tokens, addresses); + await doActions(deploymentConfig.actions, addresses); // Increase time to local time await hre.network.provider.request({ @@ -492,5 +46,5 @@ task("deploy-dxvote", "Deploy dxvote in localhost network") params: [moment().unix() - (await web3.eth.getBlock("latest")).timestamp], }); - return { networkContracts, addresses }; + return { addresses }; }); diff --git a/scripts/deploy-guilds.js b/scripts/deploy-guilds.js deleted file mode 100644 index 54435788..00000000 --- a/scripts/deploy-guilds.js +++ /dev/null @@ -1,86 +0,0 @@ -/* eslint-disable no-case-declarations */ -require("@nomiclabs/hardhat-web3"); - -const { deployTokens } = require("./utils/deploy-tokens"); -const moment = require("moment"); -const { deployGuilds } = require("./utils/deploy-guilds"); -const { waitBlocks } = require("./utils/wait"); -const { doActions } = require("./utils/do-actions"); - -task("deploy-guilds", "Deploy guilds") - .addParam("deployconfig", "The deploy config json in string format") - .setAction(async ({ deployconfig }) => { - const GuildRegistry = await hre.artifacts.require("GuildRegistry"); - - let addresses = {}; - - // Parse string json config to json object - const deploymentConfig = JSON.parse(deployconfig); - - // Import contracts - const PermissionRegistry = await hre.artifacts.require( - "PermissionRegistry" - ); - - // Get ETH accounts to be used - const accounts = await web3.eth.getAccounts(); - - // Get fromBlock for network contracts - const fromBlock = (await web3.eth.getBlock("latest")).number; - - // Set networkContracts object that will store the contracts deployed - let networkContracts = { - fromBlock: fromBlock, - avatar: null, - reputation: null, - token: null, - controller: null, - permissionRegistry: null, - schemes: {}, - utils: {}, - votingMachines: {}, - }; - - // Deploy Tokens - const { tokens, addresses: tokenAddresses } = await deployTokens( - deploymentConfig, - accounts - ); - - addresses = Object.assign(addresses, tokenAddresses); - - // Deploy PermissionRegistry to be used by WalletSchemes - let permissionRegistry; - console.log("Deploying PermissionRegistry..."); - permissionRegistry = await PermissionRegistry.new(); - await permissionRegistry.initialize(); - addresses["PermissionRegistry"] = permissionRegistry.address; - - console.log("Permission Registry deployed to:", permissionRegistry.address); - networkContracts.permissionRegistry = permissionRegistry.address; - addresses["PermissionRegstry"] = permissionRegistry.address; - await waitBlocks(1); - - // Deploy Guilds - const guildsDeployment = await deployGuilds( - deploymentConfig, - tokens, - await GuildRegistry.at(deploymentConfig.guildRegistry) - ); - - // Do actions - console.log("Doing actions"); - await doActions( - deploymentConfig.actions, - tokens, - guildsDeployment.addresses - ); - - // Increase time to local time - await hre.network.provider.request({ - method: "evm_increaseTime", - params: [moment().unix() - (await web3.eth.getBlock("latest")).timestamp], - }); - - return { networkContracts, addresses }; - }); diff --git a/scripts/utils/deploy-dao.js b/scripts/utils/deploy-dao.js new file mode 100644 index 00000000..54eb236f --- /dev/null +++ b/scripts/utils/deploy-dao.js @@ -0,0 +1,436 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); + +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; +const MAX_UINT_256 = + "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"; +const ANY_FUNC_SIGNATURE = "0xaaaaaaaa"; + +const { encodePermission } = require("../../test/helpers/permissions"); + +const { waitBlocks } = require("../utils/wait"); + +export async function deployDao(daoConfig, addresses) { + // Import contracts + const DxAvatar = await hre.artifacts.require("DxAvatar"); + const DxReputation = await hre.artifacts.require("DxReputation"); + const DxController = await hre.artifacts.require("DxController"); + const ContributionReward = await hre.artifacts.require("ContributionReward"); + const Redeemer = await hre.artifacts.require("Redeemer"); + const WalletScheme = await hre.artifacts.require("WalletScheme"); + const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); + const DXDVotingMachine = await hre.artifacts.require("DXDVotingMachine"); + const Multicall = await hre.artifacts.require("Multicall"); + const ERC721Factory = await hre.artifacts.require("ERC721Factory"); + const ERC20VestingFactory = await hre.artifacts.require( + "ERC20VestingFactory" + ); + + // Get ETH accounts to be used + const accounts = await web3.eth.getAccounts(); + + // Get fromBlock for network contracts + const fromBlock = (await web3.eth.getBlock("latest")).number; + + // Set networkContracts object that will store the contracts deployed + let networkContracts = { + fromBlock: fromBlock, + avatar: null, + reputation: null, + token: null, + controller: null, + permissionRegistry: null, + schemes: {}, + utils: {}, + votingMachines: {}, + }; + + // Get initial REP holders + let founders = [], + initialRep = []; + daoConfig.reputation.map(initialRepHolder => { + founders.push(initialRepHolder.address); + initialRep.push(initialRepHolder.amount.toString()); + }); + + // Deploy Multicall + let multicall; + console.log("Deploying Multicall..."); + multicall = await Multicall.new(); + console.log("Multicall deployed to:", multicall.address); + await waitBlocks(1); + networkContracts.utils.multicall = multicall.address; + + // Deploy Reputation + let reputation; + console.log("Deploying DxReputation..."); + reputation = await DxReputation.new(); + console.log("DX Reputation deployed to:", reputation.address); + networkContracts.reputation = reputation.address; + addresses["Reputation"] = reputation.address; + await waitBlocks(1); + + // Mint DXvote REP + await reputation.mintMultiple(founders, initialRep); + await waitBlocks(1); + + // Deploy Avatar + let avatar; + console.log("Deploying DxAvatar...", addresses["DXD"], reputation.address); + avatar = await DxAvatar.new("DXdao", addresses["DXD"], reputation.address); + console.log("DXdao Avatar deployed to:", avatar.address); + networkContracts.avatar = avatar.address; + networkContracts.token = addresses["DXD"]; + addresses["Avatar"] = avatar.address; + await waitBlocks(1); + + // Deploy Controller and transfer avatar to controller + let controller; + console.log("Deploying DxController..."); + controller = await DxController.new(avatar.address); + console.log("DXdao Controller deployed to:", controller.address); + await avatar.transferOwnership(controller.address); + await reputation.transferOwnership(controller.address); + networkContracts.controller = controller.address; + addresses["Controller"] = controller.address; + await waitBlocks(1); + + // Deploy DXDVotingMachine + let votingMachine; + console.log("Deploying DXDVotingMachine..."); + votingMachine = await DXDVotingMachine.new(addresses["DXD"]); + console.log("DXDVotingMachine deployed to:", votingMachine.address); + networkContracts.votingMachines[votingMachine.address] = { + type: "DXDVotingMachine", + token: addresses["DXD"], + }; + await waitBlocks(1); + addresses["DXDVotingMachine"] = votingMachine.address; + + // Deploy PermissionRegistry to be used by WalletSchemes + let permissionRegistry; + console.log("Deploying PermissionRegistry..."); + permissionRegistry = await PermissionRegistry.new(); + await permissionRegistry.initialize(); + addresses["PermissionRegistry"] = permissionRegistry.address; + + // Only allow the functions mintReputation, burnReputation, genericCall, registerScheme and unregisterScheme to be + // called to in the controller contract from a scheme that calls the controller. + // This permissions makes the other functions inaccessible + const notAllowedControllerFunctions = [ + controller.contract._jsonInterface.find( + method => method.name === "mintTokens" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "unregisterSelf" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "addGlobalConstraint" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "removeGlobalConstraint" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "upgradeController" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "sendEther" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "externalTokenTransfer" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "externalTokenTransferFrom" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "externalTokenApproval" + ).signature, + controller.contract._jsonInterface.find( + method => method.name === "metaData" + ).signature, + ]; + for (var i = 0; i < notAllowedControllerFunctions.length; i++) { + await permissionRegistry.setPermission( + NULL_ADDRESS, + avatar.address, + controller.address, + notAllowedControllerFunctions[i], + MAX_UINT_256, + false + ); + } + + await permissionRegistry.setPermission( + NULL_ADDRESS, + avatar.address, + controller.address, + ANY_FUNC_SIGNATURE, + 0, + true + ); + + console.log("Permission Registry deployed to:", permissionRegistry.address); + networkContracts.permissionRegistry = permissionRegistry.address; + addresses["PermissionRegstry"] = permissionRegistry.address; + await waitBlocks(1); + + // Deploy ContributionReward Scheme + console.log("Deploying ContributionReward scheme"); + const contributionReward = await ContributionReward.new(); + const redeemer = await Redeemer.new(); + + // The ContributionReward scheme was designed by DAOstack to be used as an universal scheme, + // which means that index the voting params used in the voting machine hash by voting machine + // So the voting parameters are set in the voting machine, and that voting parameters hash is registered in the ContributionReward + // And then other voting parameter hash is calculated for that voting machine and contribution reward, and that is the one used in the controller + const contributionRewardParamsHash = await votingMachine.getParametersHash( + [ + daoConfig.contributionReward.queuedVoteRequiredPercentage.toString(), + daoConfig.contributionReward.queuedVotePeriodLimit.toString(), + daoConfig.contributionReward.boostedVotePeriodLimit.toString(), + daoConfig.contributionReward.preBoostedVotePeriodLimit.toString(), + daoConfig.contributionReward.thresholdConst.toString(), + daoConfig.contributionReward.quietEndingPeriod.toString(), + daoConfig.contributionReward.proposingRepReward.toString(), + daoConfig.contributionReward.votersReputationLossRatio.toString(), + daoConfig.contributionReward.minimumDaoBounty.toString(), + daoConfig.contributionReward.daoBountyConst.toString(), + 0, + ], + NULL_ADDRESS, + { from: accounts[0], gasPrice: 0 } + ); + await votingMachine.setParameters( + [ + daoConfig.contributionReward.queuedVoteRequiredPercentage.toString(), + daoConfig.contributionReward.queuedVotePeriodLimit.toString(), + daoConfig.contributionReward.boostedVotePeriodLimit.toString(), + daoConfig.contributionReward.preBoostedVotePeriodLimit.toString(), + daoConfig.contributionReward.thresholdConst.toString(), + daoConfig.contributionReward.quietEndingPeriod.toString(), + daoConfig.contributionReward.proposingRepReward.toString(), + daoConfig.contributionReward.votersReputationLossRatio.toString(), + daoConfig.contributionReward.minimumDaoBounty.toString(), + daoConfig.contributionReward.daoBountyConst.toString(), + 0, + ], + NULL_ADDRESS + ); + await contributionReward.setParameters( + contributionRewardParamsHash, + votingMachine.address + ); + const contributionRewardVotingmachineParamsHash = + await contributionReward.getParametersHash( + contributionRewardParamsHash, + votingMachine.address + ); + await controller.registerScheme( + contributionReward.address, + contributionRewardVotingmachineParamsHash, + encodePermission({ + canGenericCall: true, + canUpgrade: false, + canRegisterSchemes: false, + }), + avatar.address + ); + + networkContracts.daostack = { + [contributionReward.address]: { + contractToCall: controller.address, + creationLogEncoding: [ + [ + { + name: "_descriptionHash", + type: "string", + }, + { + name: "_reputationChange", + type: "int256", + }, + { + name: "_rewards", + type: "uint256[5]", + }, + { + name: "_externalToken", + type: "address", + }, + { + name: "_beneficiary", + type: "address", + }, + ], + ], + name: "ContributionReward", + newProposalTopics: [ + [ + "0xcbdcbf9aaeb1e9eff0f75d74e1c1e044bc87110164baec7d18d825b0450d97df", + "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a", + ], + ], + redeemer: redeemer.address, + supported: true, + type: "ContributionReward", + voteParams: contributionRewardVotingmachineParamsHash, + votingMachine: votingMachine.address, + }, + }; + addresses["ContributionReward"] = contributionReward.address; + + // Deploy Wallet Schemes + for (var s = 0; s < daoConfig.walletSchemes.length; s++) { + const schemeConfiguration = daoConfig.walletSchemes[s]; + + console.log(`Deploying ${schemeConfiguration.name}...`); + const newScheme = await WalletScheme.new(); + console.log( + `${schemeConfiguration.name} deployed to: ${newScheme.address}` + ); + + // This is simpler than the ContributionReward, just register the params in the VotingMachine and use that ones for the schem registration + let schemeParamsHash = await votingMachine.getParametersHash( + [ + schemeConfiguration.queuedVoteRequiredPercentage.toString(), + schemeConfiguration.queuedVotePeriodLimit.toString(), + schemeConfiguration.boostedVotePeriodLimit.toString(), + schemeConfiguration.preBoostedVotePeriodLimit.toString(), + schemeConfiguration.thresholdConst.toString(), + schemeConfiguration.quietEndingPeriod.toString(), + schemeConfiguration.proposingRepReward.toString(), + schemeConfiguration.votersReputationLossRatio.toString(), + schemeConfiguration.minimumDaoBounty.toString(), + schemeConfiguration.daoBountyConst.toString(), + 0, + ], + NULL_ADDRESS, + { from: accounts[0], gasPrice: 0 } + ); + + await votingMachine.setParameters( + [ + schemeConfiguration.queuedVoteRequiredPercentage.toString(), + schemeConfiguration.queuedVotePeriodLimit.toString(), + schemeConfiguration.boostedVotePeriodLimit.toString(), + schemeConfiguration.preBoostedVotePeriodLimit.toString(), + schemeConfiguration.thresholdConst.toString(), + schemeConfiguration.quietEndingPeriod.toString(), + schemeConfiguration.proposingRepReward.toString(), + schemeConfiguration.votersReputationLossRatio.toString(), + schemeConfiguration.minimumDaoBounty.toString(), + schemeConfiguration.daoBountyConst.toString(), + 0, + ], + NULL_ADDRESS + ); + + // The Wallet scheme has to be initialized right after being created + console.log("Initializing scheme..."); + await newScheme.initialize( + avatar.address, + votingMachine.address, + schemeConfiguration.doAvatarGenericCalls, + controller.address, + permissionRegistry.address, + schemeConfiguration.name, + schemeConfiguration.maxSecondsForExecution, + schemeConfiguration.maxRepPercentageChange + ); + + // Set the initial permissions in the WalletScheme + console.log("Setting scheme permissions..."); + for (var p = 0; p < schemeConfiguration.permissions.length; p++) { + const permission = schemeConfiguration.permissions[p]; + if (permission.to === "ITSELF") permission.to = newScheme.address; + else if (addresses[permission.to]) + permission.to = addresses[permission.to]; + + await permissionRegistry.setPermission( + addresses[permission.asset] || permission.asset, + schemeConfiguration.doAvatarGenericCalls + ? avatar.address + : newScheme.address, + addresses[permission.to] || permission.to, + permission.functionSignature, + permission.value.toString(), + permission.allowed + ); + } + + // Set the boostedVoteRequiredPercentage + if (schemeConfiguration.boostedVoteRequiredPercentage > 0) { + console.log( + "Setting boosted vote required percentage in voting machine..." + ); + await controller.genericCall( + votingMachine.address, + web3.eth.abi.encodeFunctionCall( + { + name: "setBoostedVoteRequiredPercentage", + type: "function", + inputs: [ + { + type: "address", + name: "_scheme", + }, + { + type: "bytes32", + name: "_paramsHash", + }, + { + type: "uint256", + name: "_boostedVotePeriodLimit", + }, + ], + }, + [ + newScheme.address, + schemeParamsHash, + schemeConfiguration.boostedVoteRequiredPercentage, + ] + ), + avatar.address, + 0 + ); + } + + // Finally the scheme is configured and ready to be registered + console.log("Registering scheme in controller..."); + await controller.registerScheme( + newScheme.address, + schemeParamsHash, + encodePermission(schemeConfiguration.controllerPermissions), + avatar.address + ); + + networkContracts.schemes[schemeConfiguration.name] = newScheme.address; + addresses[schemeConfiguration.name] = newScheme.address; + } + + // Deploy dxDaoNFT + let dxDaoNFT; + console.log("Deploying ERC721Factory..."); + dxDaoNFT = await ERC721Factory.new("DX DAO NFT", "DXDNFT"); + networkContracts.utils.dxDaoNFT = dxDaoNFT.address; + addresses["ERC721Factory"] = dxDaoNFT.address; + + // Deploy ERC20VestingFactory + let dxdVestingFactory; + console.log("Deploying ERC20VestingFactory..."); + dxdVestingFactory = await ERC20VestingFactory.new( + networkContracts.votingMachines[votingMachine.address].token, + avatar.address + ); + networkContracts.utils.dxdVestingFactory = dxdVestingFactory.address; + addresses["ERC20VestingFactory"] = dxdVestingFactory.address; + + // Transfer all ownership and power to the dao + console.log("Transfering ownership..."); + // Set the in the permission registry + await permissionRegistry.transferOwnership(avatar.address); + await dxDaoNFT.transferOwnership(avatar.address); + await controller.unregisterScheme(accounts[0], avatar.address); + + return { networkContracts, addresses }; +} diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 36bedefe..14b91618 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -3,27 +3,21 @@ import { waitBlocks } from "./wait"; /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { - // Deploy Guilds - let guilds = {}; - let proposals = { - dxvote: [], - }; +export async function deployGuilds(guilds, addresses) { const networkContracts = {}; - const addresses = {}; const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); const permissionRegistry = await PermissionRegistry.new(); // Each guild is created and initialized and use a previously deployed token or specific token address await Promise.all( - deploymentConfig.guilds.map(async guildToDeploy => { + guilds.map(async guildToDeploy => { console.log("Deploying guild", guildToDeploy.name); const GuildContract = await hre.artifacts.require( guildToDeploy.contractName ); const newGuild = await GuildContract.new(); await newGuild.initialize( - tokens[guildToDeploy.token].address, + addresses[guildToDeploy.token], guildToDeploy.proposalTime, guildToDeploy.timeForExecution, guildToDeploy.votingPowerForProposalExecution, @@ -36,18 +30,11 @@ export async function deployGuilds(deploymentConfig, tokens, guildRegistry) { permissionRegistry.address ); await waitBlocks(1); + if (guildToDeploy.contractName === "SnapshotRepERC20Guild") - await tokens[guildToDeploy.token].transferOwnership(newGuild.address); - try { - await guildRegistry.addGuild(newGuild.address); - await waitBlocks(1); - } catch (e) { - // Likely not owner of registry - console.log("Failed to add guild to registry", e); - } - guilds[guildToDeploy.name] = newGuild; + await newGuild.transferOwnership(newGuild.address); + addresses[guildToDeploy.name] = newGuild.address; - proposals[guildToDeploy.name] = []; addresses[guildToDeploy.name + "-vault"] = await newGuild.getTokenVault(); }) ); diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 7746be14..5a57b1bd 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -1,14 +1,15 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployTokens(deploymentConfig, accounts) { +export async function deployTokens(tokens) { const ERC20Mock = await hre.artifacts.require("ERC20Mock"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); - let tokens = {}; + const accounts = await web3.eth.getAccounts(); + let addresses = {}; - for (const tokenToDeploy of deploymentConfig.tokens) { + for (const tokenToDeploy of tokens) { console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); const totalSupply = tokenToDeploy.distribution.reduce(function ( previous, @@ -28,27 +29,21 @@ export async function deployTokens(deploymentConfig, accounts) { tokenToDeploy.symbol, tokenToDeploy.decimals ); - // await waitBlocks(1); for (const tokenHolder of tokenToDeploy.distribution) { - // await tokenToDeploy.distribution.map(async tokenHolder => { await newToken.transfer(tokenHolder.address, tokenHolder.amount); - // await waitBlocks(1); } break; case "ERC20SnapshotRep": newToken = await ERC20SnapshotRep.new(); await newToken.initialize(tokenToDeploy.name, tokenToDeploy.symbol); - // await waitBlocks(1); for (const tokenHolder of tokenToDeploy.distribution) { await newToken.mint(tokenHolder.address, tokenHolder.amount); - // await waitBlocks(1); } break; } - tokens[tokenToDeploy.symbol] = newToken; addresses[tokenToDeploy.symbol] = newToken.address; } - return { tokens, addresses }; + return { addresses }; } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index df866be9..663a247a 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -6,13 +6,14 @@ const contentHash = require("content-hash"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -export async function doActions(actions, tokens, addresses) { +export async function doActions(actions, addresses) { const ipfs = await IPFS.create(); const ContributionReward = await hre.artifacts.require("ContributionReward"); const WalletScheme = await hre.artifacts.require("WalletScheme"); const DXDVotingMachine = await hre.artifacts.require("DXDVotingMachine"); const ERC20Guild = await hre.artifacts.require("ERC20Guild"); + const ERC20 = await hre.artifacts.require("ERC20"); // Execute a set of actions once all contracts are deployed let proposals = { @@ -30,9 +31,13 @@ export async function doActions(actions, tokens, addresses) { console.log("Executing action:", action); + // TO DO: Add guildRegistry actions + switch (action.type) { case "approve": - await tokens[action.data.asset].approve( + await ( + await ERC20.at(addresses[action.data.asset]) + ).approve( addresses[action.data.address] || action.data.address, action.data.amount, { from: action.from } @@ -46,7 +51,9 @@ export async function doActions(actions, tokens, addresses) { value: action.data.amount, from: action.from, }) - : await tokens[action.data.asset].transfer( + : await ( + await ERC20.at(addresses[action.data.asset]) + ).transfer( addresses[action.data.address] || action.data.address, action.data.amount, { from: action.from } @@ -137,8 +144,8 @@ export async function doActions(actions, tokens, addresses) { JSON.stringify({ description: action.data.proposalBody, url: "" }) ) ).cid.toString(); - const guildProposalCreationTx = await ERC20Guild.at( - addresses[action.data.guildName] + const guildProposalCreationTx = await ( + await ERC20Guild.at(addresses[action.data.guildName]) ).createProposal( action.data.to.map(_to => addresses[_to] || _to), action.data.callData, @@ -155,33 +162,34 @@ export async function doActions(actions, tokens, addresses) { ); break; case "guild-lockTokens": - await ERC20Guild.at(addresses[action.data.guildName]).lockTokens( - action.data.amount, - { - from: action.from, - } - ); + await ( + await ERC20Guild.at(addresses[action.data.guildName]) + ).lockTokens(action.data.amount, { + from: action.from, + }); break; case "guild-withdrawTokens": - await ERC20Guild.at(addresses[action.data.guildName]).withdrawTokens( - action.data.amount, - { - from: action.from, - } - ); + await ( + await ERC20Guild.at(addresses[action.data.guildName]) + ).withdrawTokens(action.data.amount, { + from: action.from, + }); break; case "guild-voteProposal": - await ERC20Guild.at(addresses[action.data.guildName]).setVote( + await ( + await ERC20Guild.at(addresses[action.data.guildName]) + ).setVote( proposals[action.data.guildName][action.data.proposal], action.data.action, action.data.votingPower ); break; case "guild-endProposal": - await ERC20Guild.at(addresses[action.data.guildName]).endProposal( - proposals[action.data.guildName][action.data.proposal], - { from: action.from } - ); + await ( + await ERC20Guild.at(addresses[action.data.guildName]) + ).endProposal(proposals[action.data.guildName][action.data.proposal], { + from: action.from, + }); break; default: break; From 641cca0848bd339b31bdb555391d08d1951e0bf8 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 13:08:20 -0300 Subject: [PATCH 25/37] refactor(scripts): change deploy scripts names --- hardhat.config.js | 4 +- scripts/DeploymentTemplates/dxvote-develop.js | 2 +- scripts/DeploymentTemplates/guilds-larp.js | 152 ------------------ scripts/DeploymentTemplates/guilds-rinkeby.js | 151 +++++++++++++++++ ...oy-dxvote.js => deploy-dxdao-contracts.js} | 2 +- 5 files changed, 155 insertions(+), 156 deletions(-) delete mode 100644 scripts/DeploymentTemplates/guilds-larp.js create mode 100644 scripts/DeploymentTemplates/guilds-rinkeby.js rename scripts/{deploy-dxvote.js => deploy-dxdao-contracts.js} (93%) diff --git a/hardhat.config.js b/hardhat.config.js index 881752c3..379eebcc 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -13,9 +13,9 @@ require("hardhat-dependency-compiler"); require("hardhat-contract-sizer"); require("./scripts/create2"); -require("./scripts/deploy-dxvote"); +require("./scripts/deploy-dxdao-contracts"); require("./scripts/DeploymentTemplates/dxvote-develop"); -require("./scripts/DeploymentTemplates/guilds-larp"); +require("./scripts/DeploymentTemplates/guilds-rinkeby"); const moment = require("moment"); diff --git a/scripts/DeploymentTemplates/dxvote-develop.js b/scripts/DeploymentTemplates/dxvote-develop.js index ed9040a5..86975bf9 100644 --- a/scripts/DeploymentTemplates/dxvote-develop.js +++ b/scripts/DeploymentTemplates/dxvote-develop.js @@ -466,7 +466,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( ], }; - await hre.run("deploy-dxvote", { + await hre.run("deploy-dxdao-contracts", { deployconfig: JSON.stringify(deployconfig), }); } diff --git a/scripts/DeploymentTemplates/guilds-larp.js b/scripts/DeploymentTemplates/guilds-larp.js deleted file mode 100644 index 7943ba66..00000000 --- a/scripts/DeploymentTemplates/guilds-larp.js +++ /dev/null @@ -1,152 +0,0 @@ -require("@nomiclabs/hardhat-web3"); -const moment = require("moment"); - -task("deploy-guilds-larp", "Deploy dxvote with develop config").setAction( - async () => { - const deployconfig = { - permissionRegistryDelay: moment.duration(10, "minutes").asSeconds(), - - tokens: [ - { - name: "SWPR on rinkeby", - symbol: "SWPR", - type: "ERC20", - decimals: "18", - distribution: [ - { - address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("10"), - }, - { - address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("10"), - }, - { - address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("10"), - }, - { - address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("10"), - }, - { - address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("10"), - }, - { - address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("10"), - }, - { - address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("10"), - }, - { - address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("10"), - }, - { - address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("90"), - }, - ], - }, - { - name: "Multisig1", - symbol: "REP", - type: "ERC20SnapshotRep", - decimals: "18", - distribution: [ - { - address: "0xA678B50F66d212d127491F5ee82776bdeF763841", - amount: web3.utils.toWei("10"), - }, - { - address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", - amount: web3.utils.toWei("10"), - }, - { - address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", - amount: web3.utils.toWei("10"), - }, - { - address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", - amount: web3.utils.toWei("10"), - }, - { - address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", - amount: web3.utils.toWei("10"), - }, - { - address: "0x2f6d58931beE95b6250A68C38173297B75a87000", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", - amount: web3.utils.toWei("10"), - }, - { - address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", - amount: web3.utils.toWei("10"), - }, - { - address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", - amount: web3.utils.toWei("10"), - }, - { - address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", - amount: web3.utils.toWei("10"), - }, - { - address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", - amount: web3.utils.toWei("40"), - }, - ], - }, - ], - - guilds: [ - { - token: "SWPR", - contractName: "EnforcedBinarySnapshotERC20Guild", - name: "SWPRGuild", - proposalTime: moment.duration(10, "minutes").asSeconds(), - timeForExecution: moment.duration(5, "minutes").asSeconds(), - votingPowerForProposalExecution: "30", - votingPowerForProposalCreation: "1", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "0", - lockTime: moment.duration(10, "minutes").asSeconds(), - }, - { - token: "REP", - contractName: "SnapshotRepERC20Guild", - name: "Multisig1", - proposalTime: moment.duration(5, "minutes").asSeconds(), - timeForExecution: moment.duration(2, "minutes").asSeconds(), - votingPowerForProposalExecution: "50", - votingPowerForProposalCreation: "5", - voteGas: "0", - maxGasPrice: "0", - maxActiveProposals: "5", - lockTime: moment.duration(5, "minutes").asSeconds(), - }, - ], - - actions: [], - }; - - await hre.run("deploy-dxvote", { - deployconfig: JSON.stringify(deployconfig), - }); - } -); diff --git a/scripts/DeploymentTemplates/guilds-rinkeby.js b/scripts/DeploymentTemplates/guilds-rinkeby.js new file mode 100644 index 00000000..03177d2c --- /dev/null +++ b/scripts/DeploymentTemplates/guilds-rinkeby.js @@ -0,0 +1,151 @@ +require("@nomiclabs/hardhat-web3"); +const moment = require("moment"); + +task( + "deploy-guilds-rinkeby", + "Deploy SWPR and MREP guilds in rinkeby network" +).setAction(async () => { + const deployconfig = { + tokens: [ + { + name: "SWPR", + symbol: "SWPR", + type: "ERC20", + decimals: "18", + distribution: [ + { + address: "0xA678B50F66d212d127491F5ee82776bdeF763841", + amount: web3.utils.toWei("10"), + }, + { + address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", + amount: web3.utils.toWei("10"), + }, + { + address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", + amount: web3.utils.toWei("10"), + }, + { + address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", + amount: web3.utils.toWei("10"), + }, + { + address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", + amount: web3.utils.toWei("10"), + }, + { + address: "0x2f6d58931beE95b6250A68C38173297B75a87000", + amount: web3.utils.toWei("10"), + }, + { + address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", + amount: web3.utils.toWei("10"), + }, + { + address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", + amount: web3.utils.toWei("10"), + }, + { + address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", + amount: web3.utils.toWei("10"), + }, + { + address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", + amount: web3.utils.toWei("10"), + }, + { + address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", + amount: web3.utils.toWei("90"), + }, + ], + }, + { + name: "Multisig REP #1", + symbol: "MREP", + type: "ERC20SnapshotRep", + decimals: "18", + distribution: [ + { + address: "0xA678B50F66d212d127491F5ee82776bdeF763841", + amount: web3.utils.toWei("10"), + }, + { + address: "0x91aef3c3b9bab2c306548269ff9b6771f2b107d8", + amount: web3.utils.toWei("10"), + }, + { + address: "0x881a01BBA8182E14624c046Fd5880c84D14A1507", + amount: web3.utils.toWei("10"), + }, + { + address: "0x8e900cf9bd655e34bb610f0ef365d8d476fd7337", + amount: web3.utils.toWei("10"), + }, + { + address: "0x1Bdb1089c24713537c56A01353a8E11e5bCc8216", + amount: web3.utils.toWei("10"), + }, + { + address: "0x2f6d58931beE95b6250A68C38173297B75a87000", + amount: web3.utils.toWei("10"), + }, + { + address: "0x3e989FD8b5fB0aaE1944f9642D011E9265eb7168", + amount: web3.utils.toWei("10"), + }, + { + address: "0x6dcb29d579c8f8cFD9ea5ae0b78da59EFa684719", + amount: web3.utils.toWei("10"), + }, + { + address: "0x3B5011De5805cead8538C1e7F373d0217169C1E0", + amount: web3.utils.toWei("10"), + }, + { + address: "0x92569bCd1862e192F9e9A1261d3B7e62aE4160d1", + amount: web3.utils.toWei("10"), + }, + { + address: "0x0b17cf48420400e1d71f8231d4a8e43b3566bb5b", + amount: web3.utils.toWei("40"), + }, + ], + }, + ], + + guilds: [ + { + token: "SWPR", + contractName: "EnforcedBinarySnapshotERC20Guild", + name: "SWPRGuild", + proposalTime: moment.duration(10, "minutes").asSeconds(), + timeForExecution: moment.duration(5, "minutes").asSeconds(), + votingPowerForProposalExecution: "30", + votingPowerForProposalCreation: "1", + voteGas: "0", + maxGasPrice: "0", + maxActiveProposals: "0", + lockTime: moment.duration(10, "minutes").asSeconds(), + }, + { + token: "MREP", + contractName: "SnapshotRepERC20Guild", + name: "Multisig #1", + proposalTime: moment.duration(5, "minutes").asSeconds(), + timeForExecution: moment.duration(2, "minutes").asSeconds(), + votingPowerForProposalExecution: "50", + votingPowerForProposalCreation: "5", + voteGas: "0", + maxGasPrice: "0", + maxActiveProposals: "5", + lockTime: moment.duration(5, "minutes").asSeconds(), + }, + ], + + actions: [], + }; + + await hre.run("deploy-dxdao-contracts", { + deployconfig: JSON.stringify(deployconfig), + }); +}); diff --git a/scripts/deploy-dxvote.js b/scripts/deploy-dxdao-contracts.js similarity index 93% rename from scripts/deploy-dxvote.js rename to scripts/deploy-dxdao-contracts.js index bb7b447c..d800025a 100644 --- a/scripts/deploy-dxvote.js +++ b/scripts/deploy-dxdao-contracts.js @@ -8,7 +8,7 @@ const { deployDao } = require("./utils/deploy-dao"); const { deployGuilds } = require("./utils/deploy-guilds"); const { doActions } = require("./utils/do-actions"); -task("deploy-dxvote", "Deploy dxvote in localhost network") +task("deploy-dxdao-contracts", "Deploy dxdao-contracts") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { let addresses = {}; From 78d9fa7943773857a1f1337b6ebd53cd0a1384f6 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 13:24:53 -0300 Subject: [PATCH 26/37] refactor(scripts): add addresses record to networkContracts --- scripts/deploy-dxdao-contracts.js | 38 ++++++++++++------ scripts/utils/deploy-dao.js | 66 ++++++++++++++----------------- scripts/utils/deploy-guilds.js | 12 +++--- scripts/utils/deploy-tokens.js | 8 ++-- scripts/utils/do-actions.js | 56 +++++++++++++++++--------- 5 files changed, 100 insertions(+), 80 deletions(-) diff --git a/scripts/deploy-dxdao-contracts.js b/scripts/deploy-dxdao-contracts.js index d800025a..b307412c 100644 --- a/scripts/deploy-dxdao-contracts.js +++ b/scripts/deploy-dxdao-contracts.js @@ -11,34 +11,46 @@ const { doActions } = require("./utils/do-actions"); task("deploy-dxdao-contracts", "Deploy dxdao-contracts") .addParam("deployconfig", "The deploy config json in string format") .setAction(async ({ deployconfig }) => { - let addresses = {}; + // Set networkContracts object that will store the contracts deployed + let networkContracts = { + fromBlock: (await web3.eth.getBlock("latest")).number, + avatar: null, + reputation: null, + token: null, + controller: null, + permissionRegistry: null, + schemes: {}, + utils: {}, + votingMachines: {}, + addresses: {}, + }; // Parse string json config to json object const deploymentConfig = JSON.parse(deployconfig); if (deploymentConfig.tokens) { - const tokensDeployment = await deployTokens( - deploymentConfig.tokens, - addresses + networkContracts = Object.assign( + await deployTokens(deploymentConfig.tokens, networkContracts), + networkContracts ); - addresses = Object.assign(tokensDeployment.addresses, addresses); } if (deploymentConfig.dao) { - const daoDeployment = await deployDao(deploymentConfig.dao, addresses); - addresses = Object.assign(daoDeployment.addresses, addresses); + networkContracts = Object.assign( + await deployDao(deploymentConfig.dao, networkContracts), + networkContracts + ); } if (deploymentConfig.guilds) { - const guildsDeployment = await deployGuilds( - deploymentConfig.guilds, - addresses + networkContracts = Object.assign( + await deployGuilds(deploymentConfig.guilds, networkContracts), + networkContracts ); - addresses = Object.assign(guildsDeployment.addresses, addresses); } // Do actions - await doActions(deploymentConfig.actions, addresses); + await doActions(deploymentConfig.actions, networkContracts); // Increase time to local time await hre.network.provider.request({ @@ -46,5 +58,5 @@ task("deploy-dxdao-contracts", "Deploy dxdao-contracts") params: [moment().unix() - (await web3.eth.getBlock("latest")).timestamp], }); - return { addresses }; + return networkContracts; }); diff --git a/scripts/utils/deploy-dao.js b/scripts/utils/deploy-dao.js index 54eb236f..96871f03 100644 --- a/scripts/utils/deploy-dao.js +++ b/scripts/utils/deploy-dao.js @@ -10,7 +10,7 @@ const { encodePermission } = require("../../test/helpers/permissions"); const { waitBlocks } = require("../utils/wait"); -export async function deployDao(daoConfig, addresses) { +export async function deployDao(daoConfig, networkContracts) { // Import contracts const DxAvatar = await hre.artifacts.require("DxAvatar"); const DxReputation = await hre.artifacts.require("DxReputation"); @@ -29,22 +29,6 @@ export async function deployDao(daoConfig, addresses) { // Get ETH accounts to be used const accounts = await web3.eth.getAccounts(); - // Get fromBlock for network contracts - const fromBlock = (await web3.eth.getBlock("latest")).number; - - // Set networkContracts object that will store the contracts deployed - let networkContracts = { - fromBlock: fromBlock, - avatar: null, - reputation: null, - token: null, - controller: null, - permissionRegistry: null, - schemes: {}, - utils: {}, - votingMachines: {}, - }; - // Get initial REP holders let founders = [], initialRep = []; @@ -67,7 +51,7 @@ export async function deployDao(daoConfig, addresses) { reputation = await DxReputation.new(); console.log("DX Reputation deployed to:", reputation.address); networkContracts.reputation = reputation.address; - addresses["Reputation"] = reputation.address; + networkContracts.addresses["Reputation"] = reputation.address; await waitBlocks(1); // Mint DXvote REP @@ -76,12 +60,20 @@ export async function deployDao(daoConfig, addresses) { // Deploy Avatar let avatar; - console.log("Deploying DxAvatar...", addresses["DXD"], reputation.address); - avatar = await DxAvatar.new("DXdao", addresses["DXD"], reputation.address); + console.log( + "Deploying DxAvatar...", + networkContracts.addresses["DXD"], + reputation.address + ); + avatar = await DxAvatar.new( + "DXdao", + networkContracts.addresses["DXD"], + reputation.address + ); console.log("DXdao Avatar deployed to:", avatar.address); networkContracts.avatar = avatar.address; - networkContracts.token = addresses["DXD"]; - addresses["Avatar"] = avatar.address; + networkContracts.token = networkContracts.addresses["DXD"]; + networkContracts.addresses["Avatar"] = avatar.address; await waitBlocks(1); // Deploy Controller and transfer avatar to controller @@ -92,27 +84,27 @@ export async function deployDao(daoConfig, addresses) { await avatar.transferOwnership(controller.address); await reputation.transferOwnership(controller.address); networkContracts.controller = controller.address; - addresses["Controller"] = controller.address; + networkContracts.addresses["Controller"] = controller.address; await waitBlocks(1); // Deploy DXDVotingMachine let votingMachine; console.log("Deploying DXDVotingMachine..."); - votingMachine = await DXDVotingMachine.new(addresses["DXD"]); + votingMachine = await DXDVotingMachine.new(networkContracts.addresses["DXD"]); console.log("DXDVotingMachine deployed to:", votingMachine.address); networkContracts.votingMachines[votingMachine.address] = { type: "DXDVotingMachine", - token: addresses["DXD"], + token: networkContracts.addresses["DXD"], }; await waitBlocks(1); - addresses["DXDVotingMachine"] = votingMachine.address; + networkContracts.addresses["DXDVotingMachine"] = votingMachine.address; // Deploy PermissionRegistry to be used by WalletSchemes let permissionRegistry; console.log("Deploying PermissionRegistry..."); permissionRegistry = await PermissionRegistry.new(); await permissionRegistry.initialize(); - addresses["PermissionRegistry"] = permissionRegistry.address; + networkContracts.addresses["PermissionRegistry"] = permissionRegistry.address; // Only allow the functions mintReputation, burnReputation, genericCall, registerScheme and unregisterScheme to be // called to in the controller contract from a scheme that calls the controller. @@ -171,7 +163,7 @@ export async function deployDao(daoConfig, addresses) { console.log("Permission Registry deployed to:", permissionRegistry.address); networkContracts.permissionRegistry = permissionRegistry.address; - addresses["PermissionRegstry"] = permissionRegistry.address; + networkContracts.addresses["PermissionRegstry"] = permissionRegistry.address; await waitBlocks(1); // Deploy ContributionReward Scheme @@ -277,7 +269,7 @@ export async function deployDao(daoConfig, addresses) { votingMachine: votingMachine.address, }, }; - addresses["ContributionReward"] = contributionReward.address; + networkContracts.addresses["ContributionReward"] = contributionReward.address; // Deploy Wallet Schemes for (var s = 0; s < daoConfig.walletSchemes.length; s++) { @@ -343,15 +335,15 @@ export async function deployDao(daoConfig, addresses) { for (var p = 0; p < schemeConfiguration.permissions.length; p++) { const permission = schemeConfiguration.permissions[p]; if (permission.to === "ITSELF") permission.to = newScheme.address; - else if (addresses[permission.to]) - permission.to = addresses[permission.to]; + else if (networkContracts.addresses[permission.to]) + permission.to = networkContracts.addresses[permission.to]; await permissionRegistry.setPermission( - addresses[permission.asset] || permission.asset, + networkContracts.addresses[permission.asset] || permission.asset, schemeConfiguration.doAvatarGenericCalls ? avatar.address : newScheme.address, - addresses[permission.to] || permission.to, + networkContracts.addresses[permission.to] || permission.to, permission.functionSignature, permission.value.toString(), permission.allowed @@ -405,7 +397,7 @@ export async function deployDao(daoConfig, addresses) { ); networkContracts.schemes[schemeConfiguration.name] = newScheme.address; - addresses[schemeConfiguration.name] = newScheme.address; + networkContracts.addresses[schemeConfiguration.name] = newScheme.address; } // Deploy dxDaoNFT @@ -413,7 +405,7 @@ export async function deployDao(daoConfig, addresses) { console.log("Deploying ERC721Factory..."); dxDaoNFT = await ERC721Factory.new("DX DAO NFT", "DXDNFT"); networkContracts.utils.dxDaoNFT = dxDaoNFT.address; - addresses["ERC721Factory"] = dxDaoNFT.address; + networkContracts.addresses["ERC721Factory"] = dxDaoNFT.address; // Deploy ERC20VestingFactory let dxdVestingFactory; @@ -423,7 +415,7 @@ export async function deployDao(daoConfig, addresses) { avatar.address ); networkContracts.utils.dxdVestingFactory = dxdVestingFactory.address; - addresses["ERC20VestingFactory"] = dxdVestingFactory.address; + networkContracts.addresses["ERC20VestingFactory"] = dxdVestingFactory.address; // Transfer all ownership and power to the dao console.log("Transfering ownership..."); @@ -432,5 +424,5 @@ export async function deployDao(daoConfig, addresses) { await dxDaoNFT.transferOwnership(avatar.address); await controller.unregisterScheme(accounts[0], avatar.address); - return { networkContracts, addresses }; + return networkContracts; } diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 14b91618..02ac7e4b 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -3,8 +3,7 @@ import { waitBlocks } from "./wait"; /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -export async function deployGuilds(guilds, addresses) { - const networkContracts = {}; +export async function deployGuilds(guilds, networkContracts) { const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); const permissionRegistry = await PermissionRegistry.new(); @@ -17,7 +16,7 @@ export async function deployGuilds(guilds, addresses) { ); const newGuild = await GuildContract.new(); await newGuild.initialize( - addresses[guildToDeploy.token], + networkContracts.addresses[guildToDeploy.token], guildToDeploy.proposalTime, guildToDeploy.timeForExecution, guildToDeploy.votingPowerForProposalExecution, @@ -34,12 +33,13 @@ export async function deployGuilds(guilds, addresses) { if (guildToDeploy.contractName === "SnapshotRepERC20Guild") await newGuild.transferOwnership(newGuild.address); - addresses[guildToDeploy.name] = newGuild.address; - addresses[guildToDeploy.name + "-vault"] = await newGuild.getTokenVault(); + networkContracts.addresses[guildToDeploy.name] = newGuild.address; + networkContracts.addresses[guildToDeploy.name + "-vault"] = + await newGuild.getTokenVault(); }) ); console.log("Contracts deployed:", networkContracts); - return { networkContracts, addresses }; + return networkContracts; } diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index 5a57b1bd..d7b87bad 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -1,14 +1,12 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployTokens(tokens) { +export async function deployTokens(tokens, networkContracts) { const ERC20Mock = await hre.artifacts.require("ERC20Mock"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); const accounts = await web3.eth.getAccounts(); - let addresses = {}; - for (const tokenToDeploy of tokens) { console.log("Deploying token", tokenToDeploy.name, tokenToDeploy.symbol); const totalSupply = tokenToDeploy.distribution.reduce(function ( @@ -42,8 +40,8 @@ export async function deployTokens(tokens) { } break; } - addresses[tokenToDeploy.symbol] = newToken.address; + networkContracts.addresses[tokenToDeploy.symbol] = newToken.address; } - return { addresses }; + return networkContracts; } diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index 663a247a..c4bdae07 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -6,7 +6,7 @@ const contentHash = require("content-hash"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -export async function doActions(actions, addresses) { +export async function doActions(actions, networkContracts) { const ipfs = await IPFS.create(); const ContributionReward = await hre.artifacts.require("ContributionReward"); @@ -36,9 +36,10 @@ export async function doActions(actions, addresses) { switch (action.type) { case "approve": await ( - await ERC20.at(addresses[action.data.asset]) + await ERC20.at(networkContracts.addresses[action.data.asset]) ).approve( - addresses[action.data.address] || action.data.address, + networkContracts.addresses[action.data.address] || + action.data.address, action.data.amount, { from: action.from } ); @@ -47,14 +48,17 @@ export async function doActions(actions, addresses) { case "transfer": action.data.asset === NULL_ADDRESS ? await web3.eth.sendTransaction({ - to: addresses[action.data.address] || action.data.address, + to: + networkContracts.addresses[action.data.address] || + action.data.address, value: action.data.amount, from: action.from, }) : await ( - await ERC20.at(addresses[action.data.asset]) + await ERC20.at(networkContracts.addresses[action.data.asset]) ).transfer( - addresses[action.data.address] || action.data.address, + networkContracts.addresses[action.data.address] || + action.data.address, action.data.amount, { from: action.from } ); @@ -76,7 +80,7 @@ export async function doActions(actions, addresses) { ? await ( await ContributionReward.at(contributionReward.address) ).proposeContributionReward( - addresses["AVATAR"], + networkContracts.addresses["AVATAR"], contentHash.fromIpfs(proposalDescriptionHash), action.data.reputationChange, action.data.rewards, @@ -85,9 +89,13 @@ export async function doActions(actions, addresses) { { from: action.from } ) : await ( - await WalletScheme.at(addresses[action.data.scheme]) + await WalletScheme.at( + networkContracts.addresses[action.data.scheme] + ) ).proposeCalls( - action.data.to.map(_to => addresses[_to] || _to), + action.data.to.map( + _to => networkContracts.addresses[_to] || _to + ), action.data.callData, action.data.value, action.data.title, @@ -100,7 +108,9 @@ export async function doActions(actions, addresses) { break; case "vote": await ( - await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + await DXDVotingMachine.at( + networkContracts.addresses["DXDVotingMachine"] + ) ).vote( proposals.dxvote[action.data.proposal], action.data.decision, @@ -111,7 +121,9 @@ export async function doActions(actions, addresses) { break; case "stake": await ( - await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + await DXDVotingMachine.at( + networkContracts.addresses["DXDVotingMachine"] + ) ).stake( proposals.dxvote[action.data.proposal], action.data.decision, @@ -122,7 +134,9 @@ export async function doActions(actions, addresses) { case "execute": try { await ( - await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + await DXDVotingMachine.at( + networkContracts.addresses["DXDVotingMachine"] + ) ).execute(proposals.dxvote[action.data.proposal], { from: action.from, gas: 9000000, @@ -133,7 +147,9 @@ export async function doActions(actions, addresses) { break; case "redeem": await ( - await DXDVotingMachine.at(addresses["DXDVotingMachine"]) + await DXDVotingMachine.at( + networkContracts.addresses["DXDVotingMachine"] + ) ).redeem(proposals.dxvote[action.data.proposal], action.from, { from: action.from, }); @@ -145,9 +161,9 @@ export async function doActions(actions, addresses) { ) ).cid.toString(); const guildProposalCreationTx = await ( - await ERC20Guild.at(addresses[action.data.guildName]) + await ERC20Guild.at(networkContracts.addresses[action.data.guildName]) ).createProposal( - action.data.to.map(_to => addresses[_to] || _to), + action.data.to.map(_to => networkContracts.addresses[_to] || _to), action.data.callData, action.data.value, action.data.totalActions, @@ -163,21 +179,21 @@ export async function doActions(actions, addresses) { break; case "guild-lockTokens": await ( - await ERC20Guild.at(addresses[action.data.guildName]) + await ERC20Guild.at(networkContracts.addresses[action.data.guildName]) ).lockTokens(action.data.amount, { from: action.from, }); break; case "guild-withdrawTokens": await ( - await ERC20Guild.at(addresses[action.data.guildName]) + await ERC20Guild.at(networkContracts.addresses[action.data.guildName]) ).withdrawTokens(action.data.amount, { from: action.from, }); break; case "guild-voteProposal": await ( - await ERC20Guild.at(addresses[action.data.guildName]) + await ERC20Guild.at(networkContracts.addresses[action.data.guildName]) ).setVote( proposals[action.data.guildName][action.data.proposal], action.data.action, @@ -186,7 +202,7 @@ export async function doActions(actions, addresses) { break; case "guild-endProposal": await ( - await ERC20Guild.at(addresses[action.data.guildName]) + await ERC20Guild.at(networkContracts.addresses[action.data.guildName]) ).endProposal(proposals[action.data.guildName][action.data.proposal], { from: action.from, }); @@ -209,4 +225,6 @@ export async function doActions(actions, addresses) { process.on("SIGINT", stop); process.on("SIGHUP", stop); process.on("uncaughtException", stop); + + return networkContracts; } From d23a40ae24f17afd2edb9550d3ae60344b4e8bb1 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 14:42:06 -0300 Subject: [PATCH 27/37] fix(hardhat): change mnemonic dev seedphrase --- hardhat.config.js | 103 +++++++----------- scripts/DeploymentTemplates/dxvote-develop.js | 60 +++++----- 2 files changed, 69 insertions(+), 94 deletions(-) diff --git a/hardhat.config.js b/hardhat.config.js index 379eebcc..6bf1efba 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -19,73 +19,48 @@ require("./scripts/DeploymentTemplates/guilds-rinkeby"); const moment = require("moment"); -// MNEMONIC KEY = "dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao" -// # Account #0: 0x79706c8e413cdaee9e63f282507287b9ea9c0928 (10000 ETH) -// # Private Key: 0xe408e147b1335674887c1ac7dc3c45de9762aa824cf6255fd8bd61fecf15f021 -// # -// # Account #1: 0xc73480525e9d1198d448ece4a01daea851f72a9d (10000 ETH) -// # Private Key: 0x6c8a6a9a7dbad13d6b41089648ae4b7971116611e4acd8f052c478dd8c62673e -// # -// # Account #2: 0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351 (10000 ETH) -// # Private Key: 0x0054b824c2083e7db09f36edb2ab24eb31f8276fa6cd62e30b42e3a185b37179 -// # -// # Account #3: 0xaf1a6415202453d79b84d8a9d055b8f9141f696b (10000 ETH) -// # Private Key: 0x3688ff0d0a95dd8b90bc68739505b488ff4908291eeb36380a94227d22653ce3 -// # -// # Account #4: 0x02803e2cdff171d1910d178dac948c711937bd3f (10000 ETH) -// # Private Key: 0x530caa05cf058253ed14a2e6ccc5dcb952f09c7bcdcfb4be37e572e85dcafd1e -// # -// # Account #5: 0x797c62953ef866a1ece855c4033cc5dc3c11290b (10000 ETH) -// # Private Key: 0x88ae5259286213d051e99da743d79be5d69dc75ee317bc887f5996ff004b83a6 -// # -// # Account #6: 0x016f70459e4ba98e0d60a5f5855e117e8ff39cae (10000 ETH) -// # Private Key: 0x68f5bc4b52a67b3d800d0d8832ae3b89067a3bbee68c66544147e312d996d994 -// # -// # Account #7: 0x073f4fdc12f805b8d98e58551fc10d0a71bbc7db (10000 ETH) -// # Private Key: 0x9adc9dfdce8383a1634716bf7a2e317a145f37a176a7b42538ace5ac20e223a1 -// # -// # Account #8: 0x6829556f30899d70403947590ffe8900e8c0d0d7 (10000 ETH) -// # Private Key: 0x13436bc37e24487c2f1739d1ce6b8271a8465fee93aa3685ce543e56a50e1692 -// # -// # Account #9: 0x2b410bcb3b8096164fa8c6a06220a66bfb77058d (10000 ETH) -// # Private Key: 0x4fe097bbfe75d9531d253b7f917f89dcee6664d832e40a8d82d717602dfeeb6c -// # -// # Account #10: 0x309f75c54a57937a7a0c6eb9b36eb1dbca82407e (10000 ETH) -// # Private Key: 0xb10da35e4abe181d1143aa28a7da6c5f303660b954cf283accfeba2dfb56ab51 -// # -// # Account #11: 0xec9d2d34ad6acda19ab8afe71595051b206e3e4d (10000 ETH) -// # Private Key: 0xfdf0c66289fafea1803c64522d073d6cc9ec71ba76e945a7c207f1f5ebb8e3b1 -// # -// # Account #12: 0x40c23c536bad1fe206ce911114f2c70309a7e487 (10000 ETH) -// # Private Key: 0x97c63b257e8f86e05ae5a7bbb025b02d179b8d00fb9fbcdbfcdf04dcf9173cf2 -// # -// # Account #13: 0x28d254f2ddb522c43a21d338e337fd8d2f820db2 (10000 ETH) -// # Private Key: 0xcdef57c095755d77bbbb327a187e67039c62fe39425e29b3646d334f54d28808 -// # -// # Account #14: 0xaf7386ce842cc0cffef91361059b0ca9ae48d6a0 (10000 ETH) -// # Private Key: 0x4739bf3390cd5be10d0f58d2c1e887a186b544af563fa62717a6c324b36fed59 -// # -// # Account #15: 0x46c18451aaead6a2cb888b5bd6193c0f2c402329 (10000 ETH) -// # Private Key: 0xc6b5889c8fbd0f3304ddd53b85f056a32b8338f99e5b8877ecb1d1c5543c8d6a -// # -// # Account #16: 0xc707c8143a6e1274ae7f637946f685870925261f (10000 ETH) -// # Private Key: 0x4b00e0c8e17e88d588b204121594f14d20d1abe50e280d599ff39d6b35c44533 -// # -// # Account #17: 0x5b14a88dbbb04abcb6e5bf6384491be8d939cf57 (10000 ETH) -// # Private Key: 0x18eecce45e3211ce6ce967f66c404798e36e8298b4b5222ebf597b841ebd868a -// # -// # Account #18: 0x92d356240dda25d050aa441690b92b2fa0011b84 (10000 ETH) -// # Private Key: 0xe53525f97971b006e14820a8a7b74f8aae375b6635735d89b4db2e4cbdf0e8e0 -// # -// # Account #19: 0x5a485c203d9537095a6be2acc5a7ad83805d301d (10000 ETH) -// # Private Key: 0xb86f3287c11a77c7317c2484be2bd386816876ead8ceaf86971b7b7c1afbb12b +const MNEMONIC_KEY = + "cream core pear sure dinner indoor citizen divorce sudden captain subject remember"; + +// # Accounts +// # ======== +// # Account #0: 0x9578e973bba0cc33bdbc93c7f77bb3fe6d47d68a (10000 ETH) +// # Private Key #0: 0x2edaf5755c340d57c68ab5c084a0afd867caafcbcf556838f404468e2ad0ea94 + +// # Account #1: 0xc5b20ade9c9cd5e0cc087c62b26b815a4bc1881f (10000 ETH) +// # Private Key #1: 0x40126ad770c1ff59937436ddab2872193c01d5353213d297fdb0ea2c13b5981e + +// # Account #2: 0xaf8eb8c3a5d9d900aa0b98e3df0bcc17d3c5f698 (10000 ETH) +// # Private Key #2: 0x4db6b61624bd4a9bf87ff59e7fca0991b02ff605664a3ad97dc237c84ba0e013 + +// # Account #3: 0x84eeb305da0a4309a696d43de9f79f04e66eb4f8 (10000 ETH) +// # Private Key #3: 0x6d8b1b46346a00fec52fd0e2edba75592e8814b11aec5815ec0f6b882e072131 + +// # Account #4: 0x1b929bdde0fb3b7b759696f23d6cac0963d326e6 (10000 ETH) +// # Private Key #4: 0x19ea21f217094f12da6bab83fe697f902caea0dcf5a2914d7c000b73938f7d85 + +// # Account #5: 0xd507743abcdb265f5fcef125e3f6cf7250cfe9da (10000 ETH) +// # Private Key #5: 0x6a944885ff4551fd546c59a2322a967af9906f596f60ecd110505c278f464f6e + +// # Account #6: 0x9af7a0d34fcf09a735ddaa03adc825398a6557ae (10000 ETH) +// # Private Key #6: 0x4299ee99407089bfc51e829734c0f6c1b366f515d5ddb5ece4f880a2f8fd430c + +// # Account #7: 0x2154cdc3632db21a2635819afa450f2dda08aebd (10000 ETH) +// # Private Key #7: 0x0e7ee7881e497062427ed392d310f09ca993fa964040c751cc383c10f55efc7c + +// # Account #8: 0x73c8825893ba6b197f883f60a20b4926c0f32a2c (10000 ETH) +// # Private Key #8: 0xd84954f2cea66fd01a872496f25ddb86db79ee81366609fbcff8087c9739b63a + +// # Account #9: 0x73d2888f96bc0eb530490ca5342d0c274d95654d (10000 ETH) +// # Private Key #9: 0xd20a2f6a6656d291ca4c4e6121b479db81b3b281e64707ff4a068acf549dc03c + +// # Account #10: 0xf8a3681248934f1139be67e0c22a6af450eb9d7c (10000 ETH) +// # Private Key #10: 0x8188d555d06262bfa3a343fa809b59b6368f02aa5a1ac5a3d2cb24e18e2b556e const INFURA_PROJECT_ID = "5730f284ad6741b183c921ebb0509880"; -const MNEMONIC = - process.env.KEY_MNEMONIC || - "dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao dxdao"; +const MNEMONIC = process.env.KEY_MNEMONIC || MNEMONIC_KEY; const ETHERSCAN_API_KEY = process.env.KEY_ETHERSCAN; -console.log({ MNEMONIC }); + const hardharNetworks = process.env.CI ? { hardhat: { diff --git a/scripts/DeploymentTemplates/dxvote-develop.js b/scripts/DeploymentTemplates/dxvote-develop.js index 86975bf9..d25688de 100644 --- a/scripts/DeploymentTemplates/dxvote-develop.js +++ b/scripts/DeploymentTemplates/dxvote-develop.js @@ -15,15 +15,15 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( dao: { reputation: [ { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + address: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", amount: 6000, }, { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + address: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", amount: 4000, }, { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + address: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", amount: 1000, }, ], @@ -171,15 +171,15 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( decimals: 18, distribution: [ { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + address: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", amount: web3.utils.toWei("220"), }, { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + address: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", amount: web3.utils.toWei("50"), }, { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + address: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", amount: web3.utils.toWei("10"), }, ], @@ -191,15 +191,15 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( decimals: 18, distribution: [ { - address: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + address: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", amount: 1000, }, { - address: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + address: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", amount: 4000, }, { - address: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + address: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", amount: 10000, }, ], @@ -239,7 +239,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { timestamp: moment().subtract(30, "minutes").unix(), type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: NULL_ADDRESS, address: "Avatar", @@ -248,7 +248,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: "DXD", address: "Avatar", @@ -258,7 +258,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: NULL_ADDRESS, address: "DXDGuild", @@ -267,7 +267,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: "DXD", address: "DXDGuild", @@ -277,7 +277,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "transfer", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: NULL_ADDRESS, address: "REPGuild", @@ -287,7 +287,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "proposal", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { to: ["PermissionRegistry"], callData: [ @@ -311,7 +311,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "approve", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { asset: "DXD", address: "DXDVotingMachine", @@ -320,7 +320,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "stake", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "0", decision: "1", @@ -330,7 +330,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "vote", increaseTime: moment.duration(1, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "0", decision: "1", @@ -340,14 +340,14 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "execute", increaseTime: moment.duration(3, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "0", }, }, { type: "redeem", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "0", }, @@ -355,7 +355,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "proposal", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { to: ["0xdE0A2DFE54721526Aa05BE76F825Ef94CD8F585a"], callData: ["0x0"], @@ -368,7 +368,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "stake", - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "1", decision: "1", @@ -378,7 +378,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { type: "vote", increaseTime: moment.duration(1, "minutes").asSeconds(), - from: "0x3f943f38b2fbe1ee5daf0516cecfe4e0f8734351", + from: "0xaF8eB8C3A5d9d900AA0B98e3Df0bcC17d3C5F698", data: { proposal: "1", decision: "1", @@ -387,7 +387,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "vote", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + from: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", data: { proposal: "1", decision: "2", @@ -396,7 +396,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "approve", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { asset: "DXD", address: "DXDGuild-vault", @@ -405,7 +405,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "guild-lockTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { guildName: "DXDGuild", amount: web3.utils.toWei("100"), @@ -413,7 +413,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "guild-withdrawTokens", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { guildName: "DXDGuild", amount: web3.utils.toWei("10"), @@ -422,7 +422,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "guild-createProposal", - from: "0x79706c8e413cdaee9e63f282507287b9ea9c0928", + from: "0x9578e973bbA0Cc33BDbc93C7f77bb3fe6D47d68a", data: { guildName: "DXDGuild", to: ["DXDGuild"], @@ -446,7 +446,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( }, { type: "guild-voteProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + from: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", data: { guildName: "DXDGuild", proposal: 0, @@ -457,7 +457,7 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( { increaseTime: moment.duration(10, "minutes").asSeconds(), type: "guild-endProposal", - from: "0xc73480525e9d1198d448ece4a01daea851f72a9d", + from: "0xC5B20AdE9c9Cd5e0CC087C62b26B815A4bc1881f", data: { guildName: "DXDGuild", proposal: 0, From 7e6a4534b73da8b063ce242b4b070212a6c02da4 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 13 May 2022 15:26:20 -0300 Subject: [PATCH 28/37] feat(scripts): add more deploy utils scripts --- hardhat.config.js | 4 +-- scripts/deploy-dxdao-contracts.js | 24 ++++++++++++++++++ .../dxvote-develop.js | 5 ++++ .../guilds-rinkeby.js | 9 +++++++ scripts/utils/deploy-guildRegistry.js | 25 +++++++++++++++++++ scripts/utils/deploy-permissionRegistry.js | 24 ++++++++++++++++++ 6 files changed, 89 insertions(+), 2 deletions(-) rename scripts/{DeploymentTemplates => deploymentTemplates}/dxvote-develop.js (96%) rename scripts/{DeploymentTemplates => deploymentTemplates}/guilds-rinkeby.js (93%) create mode 100644 scripts/utils/deploy-guildRegistry.js create mode 100644 scripts/utils/deploy-permissionRegistry.js diff --git a/hardhat.config.js b/hardhat.config.js index 6bf1efba..ca3013c7 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -14,8 +14,8 @@ require("hardhat-contract-sizer"); require("./scripts/create2"); require("./scripts/deploy-dxdao-contracts"); -require("./scripts/DeploymentTemplates/dxvote-develop"); -require("./scripts/DeploymentTemplates/guilds-rinkeby"); +require("./scripts/deploymentTemplates/dxvote-develop"); +require("./scripts/deploymentTemplates/guilds-rinkeby"); const moment = require("moment"); diff --git a/scripts/deploy-dxdao-contracts.js b/scripts/deploy-dxdao-contracts.js index b307412c..9097327f 100644 --- a/scripts/deploy-dxdao-contracts.js +++ b/scripts/deploy-dxdao-contracts.js @@ -4,6 +4,10 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); const { deployTokens } = require("./utils/deploy-tokens"); +const { + deployPermissionRegistry, +} = require("./utils/deploy-permissionRegistry"); +const { deployGuildRegistry } = require("./utils/deploy-guildRegistry"); const { deployDao } = require("./utils/deploy-dao"); const { deployGuilds } = require("./utils/deploy-guilds"); const { doActions } = require("./utils/do-actions"); @@ -35,6 +39,16 @@ task("deploy-dxdao-contracts", "Deploy dxdao-contracts") ); } + if (deploymentConfig.permissionRegistry) { + networkContracts = Object.assign( + await deployPermissionRegistry( + deploymentConfig.permissionRegistry, + networkContracts + ), + networkContracts + ); + } + if (deploymentConfig.dao) { networkContracts = Object.assign( await deployDao(deploymentConfig.dao, networkContracts), @@ -42,6 +56,16 @@ task("deploy-dxdao-contracts", "Deploy dxdao-contracts") ); } + if (deploymentConfig.guildRegistry) { + networkContracts = Object.assign( + await deployGuildRegistry( + deploymentConfig.guildRegistry, + networkContracts + ), + networkContracts + ); + } + if (deploymentConfig.guilds) { networkContracts = Object.assign( await deployGuilds(deploymentConfig.guilds, networkContracts), diff --git a/scripts/DeploymentTemplates/dxvote-develop.js b/scripts/deploymentTemplates/dxvote-develop.js similarity index 96% rename from scripts/DeploymentTemplates/dxvote-develop.js rename to scripts/deploymentTemplates/dxvote-develop.js index d25688de..3f41ed49 100644 --- a/scripts/DeploymentTemplates/dxvote-develop.js +++ b/scripts/deploymentTemplates/dxvote-develop.js @@ -163,6 +163,11 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( ], }, + guildRegistry: { + address: NULL_ADDRESS, + owner: "Avatar", + }, + tokens: [ { name: "DXDao on localhost", diff --git a/scripts/DeploymentTemplates/guilds-rinkeby.js b/scripts/deploymentTemplates/guilds-rinkeby.js similarity index 93% rename from scripts/DeploymentTemplates/guilds-rinkeby.js rename to scripts/deploymentTemplates/guilds-rinkeby.js index 03177d2c..07c1e362 100644 --- a/scripts/DeploymentTemplates/guilds-rinkeby.js +++ b/scripts/deploymentTemplates/guilds-rinkeby.js @@ -1,5 +1,6 @@ require("@nomiclabs/hardhat-web3"); const moment = require("moment"); +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; task( "deploy-guilds-rinkeby", @@ -113,6 +114,14 @@ task( }, ], + permissionRegistry: { + address: NULL_ADDRESS, + }, + + guildRegistry: { + address: NULL_ADDRESS, + }, + guilds: [ { token: "SWPR", diff --git a/scripts/utils/deploy-guildRegistry.js b/scripts/utils/deploy-guildRegistry.js new file mode 100644 index 00000000..7199311a --- /dev/null +++ b/scripts/utils/deploy-guildRegistry.js @@ -0,0 +1,25 @@ +require("@nomiclabs/hardhat-web3"); +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; + +export async function deployGuildRegistry( + guildRegistryConfig, + networkContracts +) { + const GuildRegistry = await hre.artifacts.require("GuildRegistry"); + + const guildRegistry = + guildRegistryConfig.address === NULL_ADDRESS + ? await GuildRegistry.new() + : await GuildRegistry.at(guildRegistryConfig.address); + + if (guildRegistryConfig.owner) + await guildRegistry.transferOwnership( + networkContracts.addresses[guildRegistryConfig.owner] || + guildRegistryConfig.owner + ); + + networkContracts.addresses["GuildRegistry"] = guildRegistry.address; + networkContracts.guildRegistry = guildRegistry.address; + + return networkContracts; +} diff --git a/scripts/utils/deploy-permissionRegistry.js b/scripts/utils/deploy-permissionRegistry.js new file mode 100644 index 00000000..177345b0 --- /dev/null +++ b/scripts/utils/deploy-permissionRegistry.js @@ -0,0 +1,24 @@ +require("@nomiclabs/hardhat-web3"); +const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; + +export async function deployPermissionRegistry( + permissionRegistryConfig, + networkContracts +) { + const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); + + const permissionRegistry = + permissionRegistryConfig.address === NULL_ADDRESS + ? await PermissionRegistry.new() + : await PermissionRegistry.at(permissionRegistryConfig.address); + + if (permissionRegistryConfig.owner) + await permissionRegistry.transferOwnership( + networkContracts.addresses[permissionRegistryConfig.owner] || + permissionRegistryConfig.owner + ); + + networkContracts.addresses["PermissionRegistry"] = permissionRegistry.address; + + return networkContracts; +} From 7dc69e34bdc240f7a947ca647be2fd9663a75ab9 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Tue, 17 May 2022 10:22:32 -0300 Subject: [PATCH 29/37] fix(scripts): use js exports for script utils to work in dxvote dapp --- scripts/utils/deploy-dao.js | 8 ++++-- scripts/utils/deploy-guildRegistry.js | 8 ++++-- scripts/utils/deploy-guilds.js | 10 ++++--- scripts/utils/deploy-permissionRegistry.js | 8 ++++-- scripts/utils/deploy-tokens.js | 8 ++++-- scripts/utils/do-actions.js | 31 +++++++++++++--------- scripts/utils/wait.js | 8 ++++-- 7 files changed, 56 insertions(+), 25 deletions(-) diff --git a/scripts/utils/deploy-dao.js b/scripts/utils/deploy-dao.js index 96871f03..d5db7801 100644 --- a/scripts/utils/deploy-dao.js +++ b/scripts/utils/deploy-dao.js @@ -10,7 +10,7 @@ const { encodePermission } = require("../../test/helpers/permissions"); const { waitBlocks } = require("../utils/wait"); -export async function deployDao(daoConfig, networkContracts) { +const deployDao = async function (daoConfig, networkContracts) { // Import contracts const DxAvatar = await hre.artifacts.require("DxAvatar"); const DxReputation = await hre.artifacts.require("DxReputation"); @@ -425,4 +425,8 @@ export async function deployDao(daoConfig, networkContracts) { await controller.unregisterScheme(accounts[0], avatar.address); return networkContracts; -} +}; + +module.exports = { + deployDao, +}; diff --git a/scripts/utils/deploy-guildRegistry.js b/scripts/utils/deploy-guildRegistry.js index 7199311a..3013449c 100644 --- a/scripts/utils/deploy-guildRegistry.js +++ b/scripts/utils/deploy-guildRegistry.js @@ -1,7 +1,7 @@ require("@nomiclabs/hardhat-web3"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -export async function deployGuildRegistry( +const deployGuildRegistry = async function ( guildRegistryConfig, networkContracts ) { @@ -22,4 +22,8 @@ export async function deployGuildRegistry( networkContracts.guildRegistry = guildRegistry.address; return networkContracts; -} +}; + +module.exports = { + deployGuildRegistry, +}; diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 02ac7e4b..84c10c00 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -1,9 +1,9 @@ -import { waitBlocks } from "./wait"; +const { waitBlocks } = require("./wait"); /* eslint-disable no-case-declarations */ require("@nomiclabs/hardhat-web3"); -export async function deployGuilds(guilds, networkContracts) { +const deployGuilds = async function (guilds, networkContracts) { const PermissionRegistry = await hre.artifacts.require("PermissionRegistry"); const permissionRegistry = await PermissionRegistry.new(); @@ -42,4 +42,8 @@ export async function deployGuilds(guilds, networkContracts) { console.log("Contracts deployed:", networkContracts); return networkContracts; -} +}; + +module.exports = { + deployGuilds, +}; diff --git a/scripts/utils/deploy-permissionRegistry.js b/scripts/utils/deploy-permissionRegistry.js index 177345b0..e2a002b2 100644 --- a/scripts/utils/deploy-permissionRegistry.js +++ b/scripts/utils/deploy-permissionRegistry.js @@ -1,7 +1,7 @@ require("@nomiclabs/hardhat-web3"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -export async function deployPermissionRegistry( +const deployPermissionRegistry = async function ( permissionRegistryConfig, networkContracts ) { @@ -21,4 +21,8 @@ export async function deployPermissionRegistry( networkContracts.addresses["PermissionRegistry"] = permissionRegistry.address; return networkContracts; -} +}; + +module.exports = { + deployPermissionRegistry, +}; diff --git a/scripts/utils/deploy-tokens.js b/scripts/utils/deploy-tokens.js index d7b87bad..b6ad7382 100644 --- a/scripts/utils/deploy-tokens.js +++ b/scripts/utils/deploy-tokens.js @@ -1,7 +1,7 @@ require("@nomiclabs/hardhat-web3"); const { default: BigNumber } = require("bignumber.js"); -export async function deployTokens(tokens, networkContracts) { +const deployTokens = async function (tokens, networkContracts) { const ERC20Mock = await hre.artifacts.require("ERC20Mock"); const ERC20SnapshotRep = await hre.artifacts.require("ERC20SnapshotRep"); @@ -44,4 +44,8 @@ export async function deployTokens(tokens, networkContracts) { } return networkContracts; -} +}; + +module.exports = { + deployTokens, +}; diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index c4bdae07..ad6a9f98 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -6,7 +6,7 @@ const contentHash = require("content-hash"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; -export async function doActions(actions, networkContracts) { +const doActions = async function (actions, networkContracts) { const ipfs = await IPFS.create(); const ContributionReward = await hre.artifacts.require("ContributionReward"); @@ -17,17 +17,22 @@ export async function doActions(actions, networkContracts) { // Execute a set of actions once all contracts are deployed let proposals = { - dxvote: [], + dao: [], }; for (const i in actions) { const action = actions[i]; if (action.timestamp) await hre.network.provider.request({ method: "evm_increaseTime", - params: [action.time - (await web3.eth.getBlock("latest")).timestamp], + params: [ + action.timestamp - (await web3.eth.getBlock("latest")).timestamp, + ], }); else if (action.increaseTime) - await network.provider.send("evm_increaseTime", [action.increaseTime]); + await network.provider.request({ + method: "evm_increaseTime", + params: [action.increaseTime], + }); console.log("Executing action:", action); @@ -102,9 +107,7 @@ export async function doActions(actions, networkContracts) { contentHash.fromIpfs(proposalDescriptionHash), { from: action.from } ); - proposals.dxvote.push( - proposalCreationTx.receipt.logs[0].args._proposalId - ); + proposals.dao.push(proposalCreationTx.receipt.logs[0].args._proposalId); break; case "vote": await ( @@ -112,7 +115,7 @@ export async function doActions(actions, networkContracts) { networkContracts.addresses["DXDVotingMachine"] ) ).vote( - proposals.dxvote[action.data.proposal], + proposals.dao[action.data.proposal], action.data.decision, action.data.amount, action.from, @@ -125,7 +128,7 @@ export async function doActions(actions, networkContracts) { networkContracts.addresses["DXDVotingMachine"] ) ).stake( - proposals.dxvote[action.data.proposal], + proposals.dao[action.data.proposal], action.data.decision, action.data.amount, { from: action.from } @@ -137,7 +140,7 @@ export async function doActions(actions, networkContracts) { await DXDVotingMachine.at( networkContracts.addresses["DXDVotingMachine"] ) - ).execute(proposals.dxvote[action.data.proposal], { + ).execute(proposals.dao[action.data.proposal], { from: action.from, gas: 9000000, }); @@ -150,7 +153,7 @@ export async function doActions(actions, networkContracts) { await DXDVotingMachine.at( networkContracts.addresses["DXDVotingMachine"] ) - ).redeem(proposals.dxvote[action.data.proposal], action.from, { + ).redeem(proposals.dao[action.data.proposal], action.from, { from: action.from, }); break; @@ -227,4 +230,8 @@ export async function doActions(actions, networkContracts) { process.on("uncaughtException", stop); return networkContracts; -} +}; + +module.exports = { + doActions, +}; diff --git a/scripts/utils/wait.js b/scripts/utils/wait.js index 8d8c1098..5dde2d72 100644 --- a/scripts/utils/wait.js +++ b/scripts/utils/wait.js @@ -2,10 +2,14 @@ function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } -export async function waitBlocks(blocks) { +const waitBlocks = async function (blocks) { const toBlock = (await web3.eth.getBlock("latest")).number + blocks; while ((await web3.eth.getBlock("latest")).number < toBlock) { await sleep(500); } return; -} +}; + +module.exports = { + waitBlocks, +}; From 2ac3546607cf5a60c2a4afc4ce6d08907b67f439 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Fri, 20 May 2022 11:12:34 -0300 Subject: [PATCH 30/37] feat(scripts): separate actions in specific task --- hardhat.config.js | 1 + scripts/actions-dxdao-contracts.js | 17 +++++ scripts/deploy-dxdao-contracts.js | 9 +-- scripts/deploymentTemplates/dxvote-develop.js | 26 ++++++-- scripts/utils/deploy-guilds.js | 62 +++++++++---------- scripts/utils/do-actions.js | 6 +- 6 files changed, 74 insertions(+), 47 deletions(-) create mode 100644 scripts/actions-dxdao-contracts.js diff --git a/hardhat.config.js b/hardhat.config.js index ca3013c7..3e4c6fc5 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -13,6 +13,7 @@ require("hardhat-dependency-compiler"); require("hardhat-contract-sizer"); require("./scripts/create2"); +require("./scripts/actions-dxdao-contracts"); require("./scripts/deploy-dxdao-contracts"); require("./scripts/deploymentTemplates/dxvote-develop"); require("./scripts/deploymentTemplates/guilds-rinkeby"); diff --git a/scripts/actions-dxdao-contracts.js b/scripts/actions-dxdao-contracts.js new file mode 100644 index 00000000..ff54f4cd --- /dev/null +++ b/scripts/actions-dxdao-contracts.js @@ -0,0 +1,17 @@ +/* eslint-disable no-case-declarations */ +require("@nomiclabs/hardhat-web3"); + +const { doActions } = require("./utils/do-actions"); + +task("actions-dxdao-contracts", "Execute actions on dxdao-contracts") + .addParam("actions", "The actions json array in string format") + .addParam( + "networkContracts", + "The networkContracts json object in string format" + ) + .setAction(async ({ actions, networkContracts }) => { + // Do actions + await doActions(JSON.parse(actions), JSON.parse(networkContracts)); + + return; + }); diff --git a/scripts/deploy-dxdao-contracts.js b/scripts/deploy-dxdao-contracts.js index 9097327f..e1528583 100644 --- a/scripts/deploy-dxdao-contracts.js +++ b/scripts/deploy-dxdao-contracts.js @@ -73,14 +73,7 @@ task("deploy-dxdao-contracts", "Deploy dxdao-contracts") ); } - // Do actions - await doActions(deploymentConfig.actions, networkContracts); - - // Increase time to local time - await hre.network.provider.request({ - method: "evm_increaseTime", - params: [moment().unix() - (await web3.eth.getBlock("latest")).timestamp], - }); + console.log("Contracts deployed:", networkContracts); return networkContracts; }); diff --git a/scripts/deploymentTemplates/dxvote-develop.js b/scripts/deploymentTemplates/dxvote-develop.js index 3f41ed49..340b50e8 100644 --- a/scripts/deploymentTemplates/dxvote-develop.js +++ b/scripts/deploymentTemplates/dxvote-develop.js @@ -11,6 +11,8 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( ); const ERC20Guild = await hre.artifacts.require("ERC20Guild"); + const accounts = await web3.eth.getAccounts(); + const deployconfig = { dao: { reputation: [ @@ -239,8 +241,23 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( lockTime: moment.duration(5, "minutes").asSeconds(), }, ], + }; - actions: [ + const networkContracts = await hre.run("deploy-dxdao-contracts", { + deployconfig: JSON.stringify(deployconfig), + }); + await hre.run("actions-dxdao-contracts", { + actions: JSON.stringify([ + { + type: "raw", + transaction: { + to: networkContracts.addresses.RGT, + from: accounts[0], + data: new web3.eth.Contract(PermissionRegistry.abi).methods + .transferOwnership(networkContracts.addresses.REPGuild) + .encodeABI(), + }, + }, { timestamp: moment().subtract(30, "minutes").unix(), type: "transfer", @@ -468,11 +485,8 @@ task("deploy-dxvote-develop", "Deploy dxvote with develop config").setAction( proposal: 0, }, }, - ], - }; - - await hre.run("deploy-dxdao-contracts", { - deployconfig: JSON.stringify(deployconfig), + ]), + networkContracts: JSON.stringify(networkContracts), }); } ); diff --git a/scripts/utils/deploy-guilds.js b/scripts/utils/deploy-guilds.js index 84c10c00..9a8f128a 100644 --- a/scripts/utils/deploy-guilds.js +++ b/scripts/utils/deploy-guilds.js @@ -8,38 +8,36 @@ const deployGuilds = async function (guilds, networkContracts) { const permissionRegistry = await PermissionRegistry.new(); // Each guild is created and initialized and use a previously deployed token or specific token address - await Promise.all( - guilds.map(async guildToDeploy => { - console.log("Deploying guild", guildToDeploy.name); - const GuildContract = await hre.artifacts.require( - guildToDeploy.contractName - ); - const newGuild = await GuildContract.new(); - await newGuild.initialize( - networkContracts.addresses[guildToDeploy.token], - guildToDeploy.proposalTime, - guildToDeploy.timeForExecution, - guildToDeploy.votingPowerForProposalExecution, - guildToDeploy.votingPowerForProposalCreation, - guildToDeploy.name, - guildToDeploy.voteGas, - guildToDeploy.maxGasPrice, - guildToDeploy.maxActiveProposals, - guildToDeploy.lockTime, - permissionRegistry.address - ); - await waitBlocks(1); - - if (guildToDeploy.contractName === "SnapshotRepERC20Guild") - await newGuild.transferOwnership(newGuild.address); - - networkContracts.addresses[guildToDeploy.name] = newGuild.address; - networkContracts.addresses[guildToDeploy.name + "-vault"] = - await newGuild.getTokenVault(); - }) - ); - - console.log("Contracts deployed:", networkContracts); + + for (let i = 0; i < guilds.length; i++) { + const guildToDeploy = guilds[i]; + console.log("Deploying guild", guildToDeploy.name); + const GuildContract = await hre.artifacts.require( + guildToDeploy.contractName + ); + const newGuild = await GuildContract.new(); + await newGuild.initialize( + networkContracts.addresses[guildToDeploy.token], + guildToDeploy.proposalTime, + guildToDeploy.timeForExecution, + guildToDeploy.votingPowerForProposalExecution, + guildToDeploy.votingPowerForProposalCreation, + guildToDeploy.name, + guildToDeploy.voteGas, + guildToDeploy.maxGasPrice, + guildToDeploy.maxActiveProposals, + guildToDeploy.lockTime, + permissionRegistry.address + ); + await waitBlocks(1); + + if (guildToDeploy.contractName === "SnapshotRepERC20Guild") + await newGuild.transferOwnership(newGuild.address); + + networkContracts.addresses[guildToDeploy.name] = newGuild.address; + networkContracts.addresses[guildToDeploy.name + "-vault"] = + await newGuild.getTokenVault(); + } return networkContracts; }; diff --git a/scripts/utils/do-actions.js b/scripts/utils/do-actions.js index ad6a9f98..175e7b50 100644 --- a/scripts/utils/do-actions.js +++ b/scripts/utils/do-actions.js @@ -39,6 +39,10 @@ const doActions = async function (actions, networkContracts) { // TO DO: Add guildRegistry actions switch (action.type) { + case "raw": + await web3.eth.sendTransaction(action.transaction); + break; + case "approve": await ( await ERC20.at(networkContracts.addresses[action.data.asset]) @@ -229,7 +233,7 @@ const doActions = async function (actions, networkContracts) { process.on("SIGHUP", stop); process.on("uncaughtException", stop); - return networkContracts; + return; }; module.exports = { From f67e1fe800889ffd598af358b3298b8aedeae3f9 Mon Sep 17 00:00:00 2001 From: AugustoL Date: Tue, 7 Jun 2022 11:12:48 -0300 Subject: [PATCH 31/37] refactor(networks): change rinkeby for goerli --- hardhat.config.js | 11 +++++++---- .../{guilds-rinkeby.js => guilds-goerli.js} | 4 ++-- 2 files changed, 9 insertions(+), 6 deletions(-) rename scripts/deploymentTemplates/{guilds-rinkeby.js => guilds-goerli.js} (95%) diff --git a/hardhat.config.js b/hardhat.config.js index 3e4c6fc5..67160445 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -16,7 +16,7 @@ require("./scripts/create2"); require("./scripts/actions-dxdao-contracts"); require("./scripts/deploy-dxdao-contracts"); require("./scripts/deploymentTemplates/dxvote-develop"); -require("./scripts/deploymentTemplates/guilds-rinkeby"); +require("./scripts/deploymentTemplates/guilds-goerli"); const moment = require("moment"); @@ -92,19 +92,22 @@ const hardharNetworks = process.env.CI mainnet: { url: `https://mainnet.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, + chainId: 1, gasLimit: 9000000, gasPrice: 100000000000, // 100 gwei timeout: 60000, }, - rinkeby: { - url: `https://rinkeby.infura.io/v3/${INFURA_PROJECT_ID}`, + goerli: { + url: `https://goerli.infura.io/v3/${INFURA_PROJECT_ID}`, accounts: { mnemonic: MNEMONIC }, - gasMultiplier: 5, + chainId: 5, + gasMultiplier: 10, timeout: 600000, // 10 minutes }, xdai: { url: "https://rpc.xdaichain.com/", accounts: { mnemonic: MNEMONIC }, + chainId: 100, gasLimit: 17000000, gasPrice: 2000000000, // 2 gwei timeout: 60000, diff --git a/scripts/deploymentTemplates/guilds-rinkeby.js b/scripts/deploymentTemplates/guilds-goerli.js similarity index 95% rename from scripts/deploymentTemplates/guilds-rinkeby.js rename to scripts/deploymentTemplates/guilds-goerli.js index 07c1e362..65338f81 100644 --- a/scripts/deploymentTemplates/guilds-rinkeby.js +++ b/scripts/deploymentTemplates/guilds-goerli.js @@ -3,8 +3,8 @@ const moment = require("moment"); const NULL_ADDRESS = "0x0000000000000000000000000000000000000000"; task( - "deploy-guilds-rinkeby", - "Deploy SWPR and MREP guilds in rinkeby network" + "deploy-guilds-goerli", + "Deploy SWPR and MREP guilds in goerli network" ).setAction(async () => { const deployconfig = { tokens: [ From 2ce05f2447d60592672563da9a6e23d41b91680a Mon Sep 17 00:00:00 2001 From: Kenny Chung Date: Mon, 13 Jun 2022 19:15:10 +0200 Subject: [PATCH 32/37] fix: bug and also add helper method and more testing --- contracts/erc20guild/utils/GuildRegistry.sol | 7 ++++- test/erc20guild/utils/GuildRegistry.js | 27 +++++++++++++++----- 2 files changed, 27 insertions(+), 7 deletions(-) diff --git a/contracts/erc20guild/utils/GuildRegistry.sol b/contracts/erc20guild/utils/GuildRegistry.sol index 82c64121..12f68986 100644 --- a/contracts/erc20guild/utils/GuildRegistry.sol +++ b/contracts/erc20guild/utils/GuildRegistry.sol @@ -3,6 +3,7 @@ pragma solidity ^0.8.8; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; +import "hardhat/console.sol"; /* @title GuildRegistry @@ -34,7 +35,7 @@ contract GuildRegistry is Ownable { uint256 guildIndexToDelete = guildsByAddress[guildAddress]; address guildAddressToMove = guilds[guilds.length - 1]; guilds[guildIndexToDelete] = guildAddressToMove; - guildsByAddress[guildAddress] = guildIndexToDelete; + guildsByAddress[guildAddressToMove] = guildIndexToDelete; guilds.pop(); index.decrement(); emit RemoveGuild(guildAddress); @@ -43,4 +44,8 @@ contract GuildRegistry is Ownable { function getGuildsAddresses() external view returns (address[] memory) { return guilds; } + + function getGuildIndex(address guildAddress) external view returns (uint256) { + return guildsByAddress[guildAddress]; + } } diff --git a/test/erc20guild/utils/GuildRegistry.js b/test/erc20guild/utils/GuildRegistry.js index d23e25a2..e9e26c63 100644 --- a/test/erc20guild/utils/GuildRegistry.js +++ b/test/erc20guild/utils/GuildRegistry.js @@ -1,6 +1,10 @@ import { assert } from "chai"; import { artifacts, contract } from "hardhat"; -import { SOME_ADDRESS, SOME_OTHER_ADDRESS } from "../../helpers/constants"; +import { + ANY_ADDRESS, + SOME_ADDRESS, + SOME_OTHER_ADDRESS, +} from "../../helpers/constants"; import { expectRevert, expectEvent } from "@openzeppelin/test-helpers"; const GuildRegistry = artifacts.require("GuildRegistry.sol"); @@ -53,16 +57,27 @@ contract("GuildRegistry", accounts => { ); }); - it("should remove the right guild address in the array", async () => { + it.only("should remove the right guild address in the array", async () => { guildRegistry.addGuild(SOME_ADDRESS, { from: accounts[0] }); guildRegistry.addGuild(SOME_OTHER_ADDRESS, { from: accounts[0] }); - - const removeGuild = await guildRegistry.removeGuild(SOME_OTHER_ADDRESS, { + guildRegistry.addGuild(ANY_ADDRESS, { from: accounts[0] }); + const removeGuild = await guildRegistry.removeGuild(SOME_ADDRESS, { from: accounts[0], }); - const getGuildsAddresses = await guildRegistry.getGuildsAddresses(); - assert.deepEqual(getGuildsAddresses, [SOME_ADDRESS]); + const getGuildsAddresses1 = await guildRegistry.getGuildsAddresses(); + assert.deepEqual(getGuildsAddresses1, [ANY_ADDRESS, SOME_OTHER_ADDRESS]); await expectEvent(removeGuild, "RemoveGuild"); + await guildRegistry.removeGuild(ANY_ADDRESS, { + from: accounts[0], + }); + const getGuildsAddresses2 = await guildRegistry.getGuildsAddresses(); + assert.deepEqual(getGuildsAddresses2, [SOME_OTHER_ADDRESS]); + + await guildRegistry.removeGuild(SOME_OTHER_ADDRESS, { + from: accounts[0], + }); + const getGuildsAddresses3 = await guildRegistry.getGuildsAddresses(); + assert.deepEqual(getGuildsAddresses3, []); }); it("should return all guild addresses", async () => { From a96fa1e313f2b5722081a835fd86b8ddcb0b3970 Mon Sep 17 00:00:00 2001 From: Kenny Chung Date: Mon, 13 Jun 2022 19:18:44 +0200 Subject: [PATCH 33/37] chore: remove import --- contracts/erc20guild/utils/GuildRegistry.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/erc20guild/utils/GuildRegistry.sol b/contracts/erc20guild/utils/GuildRegistry.sol index 12f68986..3880548f 100644 --- a/contracts/erc20guild/utils/GuildRegistry.sol +++ b/contracts/erc20guild/utils/GuildRegistry.sol @@ -3,7 +3,6 @@ pragma solidity ^0.8.8; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; -import "hardhat/console.sol"; /* @title GuildRegistry From 6e0de0ec91794653442c2721a642d4ff3b228327 Mon Sep 17 00:00:00 2001 From: Kenny Chung Date: Mon, 13 Jun 2022 20:08:34 +0200 Subject: [PATCH 34/37] chore: added tests and removed only --- test/erc20guild/utils/GuildRegistry.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/test/erc20guild/utils/GuildRegistry.js b/test/erc20guild/utils/GuildRegistry.js index e9e26c63..09b9a73f 100644 --- a/test/erc20guild/utils/GuildRegistry.js +++ b/test/erc20guild/utils/GuildRegistry.js @@ -57,7 +57,7 @@ contract("GuildRegistry", accounts => { ); }); - it.only("should remove the right guild address in the array", async () => { + it("should remove the right guild address in the array", async () => { guildRegistry.addGuild(SOME_ADDRESS, { from: accounts[0] }); guildRegistry.addGuild(SOME_OTHER_ADDRESS, { from: accounts[0] }); guildRegistry.addGuild(ANY_ADDRESS, { from: accounts[0] }); @@ -86,5 +86,12 @@ contract("GuildRegistry", accounts => { const getGuildsAddresses = await guildRegistry.getGuildsAddresses(); assert.equal(getGuildsAddresses.length, 2); }); + + it("should return a guild index", async () => { + await guildRegistry.addGuild(SOME_ADDRESS, { from: accounts[0] }); + await guildRegistry.addGuild(SOME_OTHER_ADDRESS, { from: accounts[0] }); + const guildIndex = await guildRegistry.getGuildIndex(SOME_ADDRESS); + assert.equal(guildIndex, 0); + }); }); }); From 37977b21f5d6152be0fd257cf0570af25972cece Mon Sep 17 00:00:00 2001 From: Kenny Chung Date: Wed, 15 Jun 2022 11:57:55 +0200 Subject: [PATCH 35/37] remove: getGuildIndex --- contracts/erc20guild/utils/GuildRegistry.sol | 4 ---- test/erc20guild/utils/GuildRegistry.js | 7 ------- 2 files changed, 11 deletions(-) diff --git a/contracts/erc20guild/utils/GuildRegistry.sol b/contracts/erc20guild/utils/GuildRegistry.sol index 3880548f..bc4e4691 100644 --- a/contracts/erc20guild/utils/GuildRegistry.sol +++ b/contracts/erc20guild/utils/GuildRegistry.sol @@ -43,8 +43,4 @@ contract GuildRegistry is Ownable { function getGuildsAddresses() external view returns (address[] memory) { return guilds; } - - function getGuildIndex(address guildAddress) external view returns (uint256) { - return guildsByAddress[guildAddress]; - } } diff --git a/test/erc20guild/utils/GuildRegistry.js b/test/erc20guild/utils/GuildRegistry.js index 09b9a73f..48c0320b 100644 --- a/test/erc20guild/utils/GuildRegistry.js +++ b/test/erc20guild/utils/GuildRegistry.js @@ -86,12 +86,5 @@ contract("GuildRegistry", accounts => { const getGuildsAddresses = await guildRegistry.getGuildsAddresses(); assert.equal(getGuildsAddresses.length, 2); }); - - it("should return a guild index", async () => { - await guildRegistry.addGuild(SOME_ADDRESS, { from: accounts[0] }); - await guildRegistry.addGuild(SOME_OTHER_ADDRESS, { from: accounts[0] }); - const guildIndex = await guildRegistry.getGuildIndex(SOME_ADDRESS); - assert.equal(guildIndex, 0); - }); }); }); From 2771666cd34bc80e3f5018fae0d3750c180ac385 Mon Sep 17 00:00:00 2001 From: Dino Date: Thu, 16 Jun 2022 16:02:15 -0300 Subject: [PATCH 36/37] fix(SnapshotERC20Guild): added check to prevent zero lock tokens --- contracts/erc20guild/implementations/SnapshotERC20Guild.sol | 1 + test/erc20guild/ERC20Guild.js | 6 ++++++ test/erc20guild/implementations/SnapshotERC2Guild.js | 6 ++++++ 3 files changed, 13 insertions(+) diff --git a/contracts/erc20guild/implementations/SnapshotERC20Guild.sol b/contracts/erc20guild/implementations/SnapshotERC20Guild.sol index 6b8a095a..074a89ee 100644 --- a/contracts/erc20guild/implementations/SnapshotERC20Guild.sol +++ b/contracts/erc20guild/implementations/SnapshotERC20Guild.sol @@ -79,6 +79,7 @@ contract SnapshotERC20Guild is ERC20GuildUpgradeable { // @dev Lock tokens in the guild to be used as voting power // @param tokenAmount The amount of tokens to be locked function lockTokens(uint256 tokenAmount) external virtual override { + require(tokenAmount > 0, "SnapshotERC20Guild: Tokens to lock should be higher than 0"); if (tokensLocked[msg.sender].amount == 0) totalMembers = totalMembers.add(1); _updateAccountSnapshot(msg.sender); _updateTotalSupplySnapshot(); diff --git a/test/erc20guild/ERC20Guild.js b/test/erc20guild/ERC20Guild.js index cebd564a..fe8c6d69 100644 --- a/test/erc20guild/ERC20Guild.js +++ b/test/erc20guild/ERC20Guild.js @@ -1290,6 +1290,12 @@ contract("ERC20Guild", function (accounts) { "ERC20: transfer amount exceeds balance" ); + // Cant lock zero tokens + await expectRevert( + erc20Guild.lockTokens(0, { from: accounts[1] }), + "ERC20Guild: Tokens to lock should be higher than 0" + ); + // try to release more than locked and fail await expectRevert( erc20Guild.withdrawTokens(50001, { from: accounts[1] }), diff --git a/test/erc20guild/implementations/SnapshotERC2Guild.js b/test/erc20guild/implementations/SnapshotERC2Guild.js index e2f94b22..c0c183a7 100644 --- a/test/erc20guild/implementations/SnapshotERC2Guild.js +++ b/test/erc20guild/implementations/SnapshotERC2Guild.js @@ -162,6 +162,12 @@ contract("SnapshotERC20Guild", function (accounts) { ); assert.equal(await erc20Guild.getTotalMembers(), 5); + // Cant lock zero tokens + await expectRevert( + erc20Guild.lockTokens(0, { from: accounts[1] }), + "SnapshotERC20Guild: Tokens to lock should be higher than 0" + ); + // Cant vote because it locked tokens after proposal await expectRevert( erc20Guild.setVote(guildProposalId, 1, 10, { from: accounts[4] }), From b677c47ca9bfbcf200a3848b742b479db527a2f2 Mon Sep 17 00:00:00 2001 From: Kenny Chung Date: Mon, 20 Jun 2022 15:51:32 +0200 Subject: [PATCH 37/37] testing signed commit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 53afb742..e5962b85 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,7 @@ This hardhat task runs on the selected network, it receives the name of the cont Example for ERC20Token: -`yarn hardhat create2 --network arbitrumTestnet --contract ERC20Token --salt 2 --initializer "DXGovTestToken,DXGTT,0xC4B60a931929d3ed0AC423F9Ea80e5962726dA73,100000000000000000000000"` +`yarn hardhat create2 --network arbitrumTestnet --contract ERC20Token --salt 2 --initializer "DXGovTestToken,DXGTT,0xC4B60a931929d3ed0AC423F9Ea80e5962726dA73,1000000000000000000000000"` ## Sourcify