diff --git a/contracts/Factory/DPPFactory.sol b/contracts/Factory/DPPFactory.sol index 17f9474..4e5e73a 100644 --- a/contracts/Factory/DPPFactory.sol +++ b/contracts/Factory/DPPFactory.sol @@ -8,7 +8,7 @@ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; -import {Ownable} from "../lib/Ownable.sol"; +import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; import {ICloneFactory} from "../lib/CloneFactory.sol"; import {IFeeRateModel} from "../lib/FeeRateModel.sol"; import {IExternalValue} from "../lib/ExternalValue.sol"; @@ -16,7 +16,7 @@ import {IDPP} from "../DODOPrivatePool/intf/IDPP.sol"; import {IDPPAdmin} from "../DODOPrivatePool/intf/IDPPAdmin.sol"; import {IPermissionManager} from "../lib/PermissionManager.sol"; -contract DPPFactory is Ownable { +contract DPPFactory is InitializableOwnable { // ============ Templates ============ address public immutable _CLONE_FACTORY_; diff --git a/contracts/Factory/DVMFactory.sol b/contracts/Factory/DVMFactory.sol index 17803f1..7f2302a 100644 --- a/contracts/Factory/DVMFactory.sol +++ b/contracts/Factory/DVMFactory.sol @@ -8,7 +8,7 @@ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; -import {Ownable} from "../lib/Ownable.sol"; +import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; import {ICloneFactory} from "../lib/CloneFactory.sol"; import {IConstFeeRateModel} from "../lib/ConstFeeRateModel.sol"; import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol"; @@ -27,7 +27,7 @@ interface IDVMFactory { ) external returns (address newVendingMachine); } -contract DVMFactory is Ownable { +contract DVMFactory is InitializableOwnable { // ============ Templates ============ address public immutable _CLONE_FACTORY_; diff --git a/contracts/Factory/ERC20Factory.sol b/contracts/Factory/ERC20Factory.sol index c905919..2a18905 100644 --- a/contracts/Factory/ERC20Factory.sol +++ b/contracts/Factory/ERC20Factory.sol @@ -8,7 +8,6 @@ pragma solidity 0.6.9; pragma experimental ABIEncoderV2; -import {Ownable} from "../lib/Ownable.sol"; import {ICloneFactory} from "../lib/CloneFactory.sol"; import {IConstFeeRateModel} from "../lib/ConstFeeRateModel.sol"; import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol"; @@ -17,7 +16,7 @@ import {IPermissionManager} from "../lib/PermissionManager.sol"; import {InitializableERC20} from "../external/ERC20/InitializableERC20.sol"; import {InitializableMintableERC20} from "../external/ERC20/InitializableMintableERC20.sol"; -contract ERC20Factory is Ownable { +contract ERC20Factory { // ============ Templates ============ address public immutable _CLONE_FACTORY_; diff --git a/deploy-detail-v2.0.txt b/deploy-detail-v2.0.txt index 6c6cd8a..913b48e 100644 --- a/deploy-detail-v2.0.txt +++ b/deploy-detail-v2.0.txt @@ -16,3 +16,27 @@ DvmFactoryAddress: 0xaeF2cce5678e6e29f7a7C2A6f5d2Ce26df600dc1 DppFactoryAddress: 0x5935a606383Ba43C61FcE5E632357744a95e9dC3 DODOProxyV2 Address: 0xD4b15Ab0e1F06373dA7ccd9f01D5e9776674DB9e DODOApprovce setProxy tx: 0x67c5c5b1883950baec753a99bff5e1c20bfb92f876cdcd03c90ae2aa0053d891 +==================================================== +network type: kovan +Deploy time: 2020/12/15 上午11:11:05 +Deploy type: V2 +ConstFeeRateModelTemplateAddress: 0x2ec9579Cf7ae77B4e538F56274501f518ABFeA2e +DefaultMtFeeRateAddress: 0xEfdE4225AC747136289979e29f1236527b2E4DB1 +Init DefaultMtFeeRate Tx: 0x8f2f522627c9e98a51ebaf7cadf66a88c79bcece4bfb96da538299fc811c291f +DefaultPermissionAddress: 0xACc7E23368261e1E02103c4e5ae672E7D01f5797 +Init DefaultPermissionAddress Tx: 0x40115ee57da686fddadc635a9048af0ba139b5fdd93f34a5ba79399a01b50c60 +DvmTemplateAddress: 0x176a7DBbcC3Fb9EB1F04bfA806a6615A7C1De766 +DvmAdminTemplateAddress: 0x210eF5260E1AcF26526b9CFe40b6fc7CD3D8b6B3 +DppTemplateAddress: 0x6E3bF8eC796c52d6e25FBB3f116795397a239BA4 +DppAdminTemplateAddress: 0x86366913A4ee1F6f01022aD42554EEAf4c5AC490 +CpTemplateAddress: 0x967b6A116e882E3d2F940f3ae2f44fd842BbF189 +DODOApprove Address: 0xC38ad4314bb44EE84cC2D4B2B1BBa4644550f172 +DvmFactoryAddress: 0x545ba2178c5581f836D4d10BDa208288dD1a8Bf8 +Init DvmFactory Tx: 0xd9412acda8972cd589c6e16fcabc9ede61e2737bc0076bf6a1ada3f771b2b525 +UnownedDvmFactoryAddress: 0x564F5B6614Afa50BB61B9d0694f3326446Bd24EF +DppFactoryAddress: 0x6F050dAc0CC28E2cD227536deFD40fe2A1505a13 +Init DppFactory Tx: 0xc7b27b3d0240a5938448ddf2be00df6f1ac93c1eaaf5bbb1eff28d188543ed83 +CpFactoryAddress: 0xCE0fD3600E9dD81A6fB7E1d5Eed0F93a90Da184D +DODOProxyV2 Address: 0x7102A9AA2146557EA60a6319EB40e8C8d856e628 +Init DODOProxyV2 Tx: 0xfd80f2545d8cb0d102bd8a9064bbc802e44aa16e23128256745e2f305b6da64a +DODOApprovce Init tx: 0x87e950811171b325701e0e94aae346614b5361ac0a0285f15383626709063e63 diff --git a/migrations/2_deploy_v1.5.js b/migrations/2_deploy_v1.5.js index 1076daf..d842c8b 100644 --- a/migrations/2_deploy_v1.5.js +++ b/migrations/2_deploy_v1.5.js @@ -7,7 +7,7 @@ const DODOProxyV1 = artifacts.require("DODOV1Proxy01"); const DODOSellHelper = artifacts.require("DODOSellHelper"); const DODOSwapCalcHelper = artifacts.require("DODOSwapCalcHelper"); -const DEPLOY_ROUTE = true; +const DEPLOY_ROUTE = false; module.exports = async (deployer, network, accounts) => { let DODOSellHelperAddress = ""; diff --git a/migrations/3_deploy_v2.js b/migrations/3_deploy_v2.js index 04f7db5..ce7c8ec 100644 --- a/migrations/3_deploy_v2.js +++ b/migrations/3_deploy_v2.js @@ -3,73 +3,158 @@ const file = fs.createWriteStream("../deploy-detail-v2.0.txt", { 'flags': 'a' }) let logger = new console.Console(file, file); const CloneFactory = artifacts.require("CloneFactory"); +const FeeRateModelTemplate = artifacts.require("FeeRateModel"); +const ConstFeeRateModelTemplate = artifacts.require("ConstFeeRateModel"); +const PermissionManagerTemplate = artifacts.require("PermissionManager"); +const ExternalValueTemplate = artifacts.require("ExternalValue"); + const DvmTemplate = artifacts.require("DVM"); const DvmAdminTemplate = artifacts.require("DVMAdmin"); const DppTemplate = artifacts.require("DPP"); const DppAdminTemplate = artifacts.require("DPPAdmin"); -const FeeRateModelTemplate = artifacts.require("FeeRateModel"); -const PermissionManagerTemplate = artifacts.require("PermissionManager"); -const ExternalValueTemplate = artifacts.require("ExternalValue"); +const CpTemplate = artifacts.require("CP"); const DvmFactory = artifacts.require("DVMFactory"); +const UnownedDvmFactory = artifacts.require("UnownedDVMFactory"); const DppFactory = artifacts.require("DPPFactory"); +const CpFactory = artifacts.require("CrowdPoolingFactory"); const DODOApprove = artifacts.require("DODOApprove"); const DODOProxyV2 = artifacts.require("DODOV2Proxy01"); const DODOSellHelper = artifacts.require("DODOSellHelper"); const DODOCalleeHelper = artifacts.require("DODOCalleeHelper"); -const DEPLOY_V2 = false; +const DEPLOY_V2 = true; module.exports = async (deployer, network, accounts) => { + //Helper And Common let DODOSellHelperAddress = ""; - let DODOCalleeHelperAddress = ""; let WETHAddress = ""; - let DODOApproveAddress = ""; let chiAddress = ""; + let DODOCalleeHelperAddress = ""; + //Template let CloneFactoryAddress = ""; let FeeRateModelTemplateAddress = ""; + let ConstFeeRateModelTemplateAddress = ""; let PermissionManagerTemplateAddress = ""; let ExternalValueTemplateAddress = ""; + //Default Template let DefaultGasSourceAddress = ""; + let DefaultMtFeeRateAddress = ""; + let DefaultPermissionAddress = ""; + let DvmTemplateAddress = ""; let DvmAdminTemplateAddress = ""; let DppTemplateAddress = ""; let DppAdminTemplateAddress = ""; + let CpTemplateAddress = ""; + //Facotry let DvmFactoryAddress = ""; + let UnownedDvmFactoryAddress = ""; let DppFactoryAddress = ""; + let CpFactoryAddress = ""; + //Approve + let DODOApproveAddress = ""; + //Account + let multiSigAddress = ""; + let defaultMaintainer = ""; if (network == "kovan") { + //Helper DODOSellHelperAddress = "0xbdEae617F2616b45DCB69B287D52940a76035Fe3"; WETHAddress = "0x5eca15b12d959dfcf9c71c59f8b467eb8c6efd0b"; chiAddress = "0x0000000000004946c0e9f43f4dee607b0ef1fa1c"; - DODOApproveAddress = "0x0C4a80B2e234448E5f6fD86e7eFA733d985004c8"; DODOCalleeHelperAddress = "0x507EBbb195CF54E0aF147A2b269C08a38EA36989"; //Template CloneFactoryAddress = "0xf7959fe661124C49F96CF30Da33729201aEE1b27"; FeeRateModelTemplateAddress = "0xEF3137780B387313c5889B999D03BdCf9aeEa892"; + ConstFeeRateModelTemplateAddress = ""; PermissionManagerTemplateAddress = "0x5D2Da09501d97a7bf0A8F192D2eb2F9Aa80d3241"; ExternalValueTemplateAddress = "0xe0f813951dE2BB012f7Feb981669F9a7b5250A57"; + //Default Template DefaultGasSourceAddress = "0xE0c0df0e0be7ec4f579503304a6C186cA4365407"; - DvmTemplateAddress = "0x460Ada67279Ff2ce8c87cb88F99070c6520Aa624"; - DvmAdminTemplateAddress = "0xbB9F79f6ac9e577B658E3B2E1340838d8965986B"; - DppTemplateAddress = "0x577c2cE26B8b5C8b3f7c57826Bf351ac7c21a441"; - DppAdminTemplateAddress = "0x402ace5a3e6Aa71FB942d309341F8867afcde302"; + DefaultMtFeeRateAddress = ""; + DefaultPermissionAddress = ""; + + DvmTemplateAddress = ""; + DvmAdminTemplateAddress = ""; + DppTemplateAddress = ""; + DppAdminTemplateAddress = ""; + CpTemplateAddress = ""; //Factory - DvmFactoryAddress = "0xaeF2cce5678e6e29f7a7C2A6f5d2Ce26df600dc1"; - DppFactoryAddress = "0x5935a606383Ba43C61FcE5E632357744a95e9dC3"; + DvmFactoryAddress = ""; + UnownedDvmFactoryAddress = ""; + DppFactoryAddress = ""; + CpFactoryAddress = ""; + //Proxy + DODOApproveAddress = ""; + //Account + multiSigAddress = accounts[0]; + defaultMaintainer = accounts[0]; } else if (network == "live") { + //Helper DODOSellHelperAddress = "0x533da777aedce766ceae696bf90f8541a4ba80eb"; WETHAddress = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2"; chiAddress = "0x0000000000004946c0e9F43F4Dee607b0eF1fA1c"; - DODOApproveAddress = "0x4eC851895d85bfa6835241b3157ae10FfFD3BebC"; - //Tempalte + DODOCalleeHelperAddress = ""; + //Template + CloneFactoryAddress = ""; + FeeRateModelTemplateAddress = ""; + ConstFeeRateModelTemplateAddress = ""; + PermissionManagerTemplateAddress = ""; + ExternalValueTemplateAddress = ""; + //Default Template + DefaultGasSourceAddress = ""; + DefaultMtFeeRateAddress = ""; + DefaultPermissionAddress = ""; + + DvmTemplateAddress = ""; + DvmAdminTemplateAddress = ""; + DppTemplateAddress = ""; + DppAdminTemplateAddress = ""; + CpTemplateAddress = ""; + //Factory + DvmFactoryAddress = ""; + UnownedDvmFactoryAddress = ""; + DppFactoryAddress = ""; + CpFactoryAddress = ""; + //Proxy + DODOApproveAddress = ""; + //Account + multiSigAddress = "0x95C4F5b83aA70810D4f142d58e5F7242Bd891CB0"; + defaultMaintainer = "0x95C4F5b83aA70810D4f142d58e5F7242Bd891CB0"; } else if (network == "bsclive") { + //Helper DODOSellHelperAddress = "0x0F859706AeE7FcF61D5A8939E8CB9dBB6c1EDA33"; WETHAddress = "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"; chiAddress = "0x0000000000000000000000000000000000000000"; - DODOApproveAddress = "0x19DA73be23Cea6bFA804Ec020041b8F3971BC522"; + DODOCalleeHelperAddress = ""; //Template + CloneFactoryAddress = ""; + FeeRateModelTemplateAddress = ""; + ConstFeeRateModelTemplateAddress = ""; + PermissionManagerTemplateAddress = ""; + ExternalValueTemplateAddress = ""; + //Default Template + DefaultGasSourceAddress = ""; + DefaultMtFeeRateAddress = ""; + DefaultPermissionAddress = ""; + + DvmTemplateAddress = ""; + DvmAdminTemplateAddress = ""; + DppTemplateAddress = ""; + DppAdminTemplateAddress = ""; + CpTemplateAddress = ""; + //Factory + DvmFactoryAddress = ""; + UnownedDvmFactoryAddress = ""; + DppFactoryAddress = ""; + CpFactoryAddress = ""; + //Proxy + DODOApproveAddress = ""; + //Account + multiSigAddress = ""; + defaultMaintainer = ""; } else return; @@ -78,6 +163,19 @@ module.exports = async (deployer, network, accounts) => { logger.log("network type: " + network); logger.log("Deploy time: " + new Date().toLocaleString()); logger.log("Deploy type: V2"); + //Helper + if (DODOSellHelperAddress == "") { + await deployer.deploy(DODOSellHelper); + DODOSellHelperAddress = DODOSellHelper.address; + logger.log("DODOSellHelper Address: ", DODOSellHelperAddress); + } + if (DODOCalleeHelperAddress == "") { + await deployer.deploy(DODOCalleeHelper, WETHAddress); + DODOCalleeHelperAddress = DODOCalleeHelper.address; + logger.log("DODOCalleeHelperAddress: ", DODOCalleeHelperAddress); + } + + //Template if (CloneFactoryAddress == "") { await deployer.deploy(CloneFactory); CloneFactoryAddress = CloneFactory.address; @@ -88,6 +186,11 @@ module.exports = async (deployer, network, accounts) => { FeeRateModelTemplateAddress = FeeRateModelTemplate.address; logger.log("FeeRateModelTemplateAddress: ", FeeRateModelTemplateAddress); } + if (ConstFeeRateModelTemplateAddress == "") { + await deployer.deploy(ConstFeeRateModelTemplate); + ConstFeeRateModelTemplateAddress = ConstFeeRateModelTemplate.address; + logger.log("ConstFeeRateModelTemplateAddress: ", ConstFeeRateModelTemplateAddress); + } if (PermissionManagerTemplateAddress == "") { await deployer.deploy(PermissionManagerTemplate); PermissionManagerTemplateAddress = PermissionManagerTemplate.address; @@ -103,9 +206,28 @@ module.exports = async (deployer, network, accounts) => { DefaultGasSourceAddress = ExternalValueTemplate.address; logger.log("DefaultGasSourceAddress: ", DefaultGasSourceAddress); const defaultGasSourceInstance = await ExternalValueTemplate.at(DefaultGasSourceAddress); - var tx = await defaultGasSourceInstance.init(accounts[0], "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); - logger.log("Set default Gas Tx:", tx.tx); + var tx = await defaultGasSourceInstance.init(multiSigAddress, "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"); + logger.log("Init DefaultGasSource Tx:", tx.tx); } + + if (DefaultMtFeeRateAddress == "") { + await deployer.deploy(ConstFeeRateModelTemplate); + DefaultMtFeeRateAddress = ConstFeeRateModelTemplate.address; + logger.log("DefaultMtFeeRateAddress: ", DefaultMtFeeRateAddress); + const defaultMtFeeRateInstance = await ConstFeeRateModelTemplate.at(DefaultMtFeeRateAddress); + var tx = await defaultMtFeeRateInstance.init(multiSigAddress, 0); + logger.log("Init DefaultMtFeeRate Tx:", tx.tx); + } + + if (DefaultPermissionAddress == "") { + await deployer.deploy(PermissionManagerTemplate); + DefaultPermissionAddress = PermissionManagerTemplate.address; + logger.log("DefaultPermissionAddress: ", DefaultPermissionAddress); + const defaultPermissionInstance = await PermissionManagerTemplate.at(DefaultPermissionAddress); + var tx = await defaultPermissionInstance.initOwner(multiSigAddress); + logger.log("Init DefaultPermissionAddress Tx:", tx.tx); + } + if (DvmTemplateAddress == "") { await deployer.deploy(DvmTemplate); DvmTemplateAddress = DvmTemplate.address; @@ -126,21 +248,19 @@ module.exports = async (deployer, network, accounts) => { DppAdminTemplateAddress = DppAdminTemplate.address; logger.log("DppAdminTemplateAddress: ", DppAdminTemplateAddress); } + if (CpTemplateAddress == "") { + await deployer.deploy(CpTemplate); + CpTemplateAddress = CpTemplate.address; + logger.log("CpTemplateAddress: ", CpTemplateAddress); + } + + //Approve if (DODOApproveAddress == "") { await deployer.deploy(DODOApprove); DODOApproveAddress = DODOApprove.address; logger.log("DODOApprove Address: ", DODOApproveAddress); } - if (DODOSellHelperAddress == "") { - await deployer.deploy(DODOSellHelper); - DODOSellHelperAddress = DODOSellHelper.address; - logger.log("DODOSellHelper Address: ", DODOSellHelperAddress); - } - if (DODOCalleeHelperAddress == "") { - await deployer.deploy(DODOCalleeHelper,WETHAddress); - DODOCalleeHelperAddress = DODOCalleeHelper.address; - logger.log("DODOCalleeHelperAddress: ", DODOCalleeHelperAddress); - } + //Factory if (DvmFactoryAddress == "") { await deployer.deploy( @@ -148,13 +268,32 @@ module.exports = async (deployer, network, accounts) => { CloneFactoryAddress, DvmTemplateAddress, DvmAdminTemplateAddress, - FeeRateModelTemplateAddress, + ConstFeeRateModelTemplateAddress, PermissionManagerTemplateAddress, DefaultGasSourceAddress ); DvmFactoryAddress = DvmFactory.address; logger.log("DvmFactoryAddress: ", DvmFactoryAddress); + const DvmFactoryInstance = await DvmFactory.at(DvmFactoryAddress); + var tx = await DvmFactoryInstance.initOwner(multiSigAddress); + logger.log("Init DvmFactory Tx:", tx.tx); } + + if (UnownedDvmFactoryAddress == "") { + await deployer.deploy( + UnownedDvmFactory, + CloneFactoryAddress, + DvmTemplateAddress, + ConstFeeRateModelTemplateAddress, + defaultMaintainer, + DefaultMtFeeRateAddress, + DefaultPermissionAddress, + DefaultGasSourceAddress + ); + UnownedDvmFactoryAddress = UnownedDvmFactory.address; + logger.log("UnownedDvmFactoryAddress: ", UnownedDvmFactoryAddress); + } + if (DppFactoryAddress == "") { await deployer.deploy( DppFactory, @@ -169,21 +308,45 @@ module.exports = async (deployer, network, accounts) => { ); DppFactoryAddress = DppFactory.address; logger.log("DppFactoryAddress: ", DppFactoryAddress); + const DppFactoryInstance = await DppFactory.at(DppFactoryAddress); + var tx = await DppFactoryInstance.initOwner(multiSigAddress); + logger.log("Init DppFactory Tx:", tx.tx); } + if (CpFactoryAddress == "") { + await deployer.deploy( + CpFactory, + CloneFactoryAddress, + CpTemplateAddress, + UnownedDvmFactoryAddress, + ConstFeeRateModelTemplateAddress, + defaultMaintainer, + DefaultMtFeeRateAddress, + DefaultPermissionAddress, + DefaultGasSourceAddress + ); + CpFactoryAddress = CpFactory.address; + logger.log("CpFactoryAddress: ", CpFactoryAddress); + } + //Proxy await deployer.deploy( DODOProxyV2, DvmFactoryAddress, DppFactoryAddress, + CpFactoryAddress, WETHAddress, DODOApproveAddress, DODOSellHelperAddress ); logger.log("DODOProxyV2 Address: ", DODOProxyV2.address); + const DODOProxyV2Instance = await DODOProxyV2.at(DODOProxyV2.address); + var tx = await DODOProxyV2Instance.initOwner(multiSigAddress); + logger.log("Init DODOProxyV2 Tx:", tx.tx); + const DODOApproveInstance = await DODOApprove.at(DODOApproveAddress); - var tx = await DODOApproveInstance.setDODOProxy(DODOProxyV2.address); - logger.log("DODOApprovce setProxy tx: ", tx.tx); + var tx = await DODOApproveInstance.init(multiSigAddress,DODOProxyV2.address); + logger.log("DODOApprovce Init tx: ", tx.tx); } };