diff --git a/config/bsc-config.js b/config/bsc-config.js index 818e257..d5ca032 100644 --- a/config/bsc-config.js +++ b/config/bsc-config.js @@ -47,6 +47,7 @@ module.exports = { //Proxy DODOV2Proxy: "", DSPProxy: "0x2442A8B5cdf1E659F3F949A7E454Caa554D4E65a", + UpCpProxy: "", //vDODO DODOCirculationHelper: "", diff --git a/config/eth-config.js b/config/eth-config.js index a78f7b7..dfefb28 100644 --- a/config/eth-config.js +++ b/config/eth-config.js @@ -46,6 +46,7 @@ module.exports = { //Proxy DODOV2Proxy: "", DSPProxy: "0x4599ed18F34cFE06820E3684bF0aACB8D75c644d", + UpCpProxy: "", //vDODO DODOCirculationHelper: "0x357c5e9cfa8b834edcef7c7aabd8f9db09119d11", diff --git a/config/heco-config.js b/config/heco-config.js index 255c437..deda1ba 100644 --- a/config/heco-config.js +++ b/config/heco-config.js @@ -46,6 +46,7 @@ module.exports = { //Proxy DODOV2Proxy: "0xAc7cC7d2374492De2D1ce21e2FEcA26EB0d113e7", DSPProxy: "0x9951CdEc21F42ab69D02daAAFEF4C3fc810B36FF", + UpCpProxy: "", //vDODO DODOCirculationHelper: "", diff --git a/config/kovan-config.js b/config/kovan-config.js index 695145c..780a384 100644 --- a/config/kovan-config.js +++ b/config/kovan-config.js @@ -46,6 +46,7 @@ module.exports = { //Proxy DODOV2Proxy: "0x85CAA68ae47f047aa01C48BCaA711CA70a950fFb", DSPProxy: "0xC5fF477667E29df8887D258CaE593e04A1961A69", + UpCpProxy: "0x6F9C270A13fB267216216C53e48de9e3B840aBB6", //vDODO DODOCirculationHelper: "", diff --git a/contracts/SmartRoute/proxies/DODOUpCpProxy.sol b/contracts/SmartRoute/proxies/DODOUpCpProxy.sol new file mode 100644 index 0000000..884244b --- /dev/null +++ b/contracts/SmartRoute/proxies/DODOUpCpProxy.sol @@ -0,0 +1,110 @@ +/* + Copyright 2021 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 +*/ + +pragma solidity 0.6.9; + +import {IDODOApproveProxy} from "../DODOApproveProxy.sol"; +import {IDODOV2} from "./../intf/IDODOV2.sol"; +import {IERC20} from "../../intf/IERC20.sol"; +import {SafeERC20} from "../../lib/SafeERC20.sol"; +import {IWETH} from "../../intf/IWETH.sol"; +import {SafeMath} from "../../lib/SafeMath.sol"; +import {SafeERC20} from "../../lib/SafeERC20.sol"; +import {ReentrancyGuard} from "../../lib/ReentrancyGuard.sol"; + +/** + * @title DODOUpCpProxy + * @author DODO Breeder + * + * @notice UpCrowdPooling Proxy + */ +contract DODOUpCpProxy is ReentrancyGuard { + using SafeMath for uint256; + using SafeERC20 for IERC20; + + // ============ Storage ============ + + address constant _ETH_ADDRESS_ = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; + address public immutable _WETH_; + address public immutable _DODO_APPROVE_PROXY_; + address public immutable _UPCP_FACTORY_; + + // ============ Modifiers ============ + + modifier judgeExpired(uint256 deadLine) { + require(deadLine >= block.timestamp, "DODOUpCpProxy: EXPIRED"); + _; + } + + fallback() external payable {} + + receive() external payable {} + + constructor( + address payable weth, + address upCpFactory, + address dodoApproveProxy + ) public { + _WETH_ = weth; + _UPCP_FACTORY_ = upCpFactory; + _DODO_APPROVE_PROXY_ = dodoApproveProxy; + } + + //============ UpCrowdPooling Functions (create) ============ + + function createUpCrowdPooling( + address baseToken, + address quoteToken, + uint256 baseInAmount, + uint256[] memory timeLine, + uint256[] memory valueList, + bool isOpenTWAP, + uint256 deadLine + ) external payable preventReentrant judgeExpired(deadLine) returns (address payable newUpCrowdPooling) { + address _baseToken = baseToken; + address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken; + + newUpCrowdPooling = IDODOV2(_UPCP_FACTORY_).createCrowdPooling(); + + _deposit( + msg.sender, + newUpCrowdPooling, + _baseToken, + baseInAmount, + false + ); + + newUpCrowdPooling.transfer(msg.value); + + IDODOV2(_UPCP_FACTORY_).initCrowdPooling( + newUpCrowdPooling, + msg.sender, + _baseToken, + _quoteToken, + timeLine, + valueList, + isOpenTWAP + ); + } + + //====================== internal ======================= + + function _deposit( + address from, + address to, + address token, + uint256 amount, + bool isETH + ) internal { + if (isETH) { + if (amount > 0) { + IWETH(_WETH_).deposit{value: amount}(); + if (to != address(this)) SafeERC20.safeTransfer(IERC20(_WETH_), to, amount); + } + } else { + IDODOApproveProxy(_DODO_APPROVE_PROXY_).claimTokens(token, from, to, amount); + } + } +} \ No newline at end of file diff --git a/deploy-detail-periphery.txt b/deploy-detail-periphery.txt index 4bfb577..54c03c2 100644 --- a/deploy-detail-periphery.txt +++ b/deploy-detail-periphery.txt @@ -397,3 +397,15 @@ network type: heco Deploy time: 2021/4/20 下午12:41:59 Deploy type: DODORouteProxy DODORouteProxy Address: 0x8D3102e4fe76B5E1a896D8BCBC1BA2643D8Bea1a +==================================================== +network type: kovan +Deploy time: 2021/4/21 下午3:28:46 +Deploy type: DODOUpCpProxy +UpCpProxy address: 0x6F9C270A13fB267216216C53e48de9e3B840aBB6 +==================================================== +network type: kovan +Deploy time: 2021/4/21 下午3:35:09 +Deploy type: ERC20Mine +erc20Mine address: 0x9DbbfFE2C5BA6c931C518199C861ff0b6067c2EB +Init ERC20Mine Tx: 0xcac325824615f35b1a085985a1fa391419516dff41a7ad4464f43dcfc64e2b5e +Add rewardToken0 Tx: 0x8377ceb97929a66f0276d6bae3dc98de60a6b54d219fc66ee8cd9985f2fd0c33 diff --git a/migrations/4_deploy_periphery.js b/migrations/4_deploy_periphery.js index 7176093..c8e02d0 100644 --- a/migrations/4_deploy_periphery.js +++ b/migrations/4_deploy_periphery.js @@ -18,6 +18,7 @@ const CpFactory = artifacts.require("CrowdPoolingFactory"); const MultiCall = artifacts.require("Multicall"); const LockedTokenVault = artifacts.require("LockedTokenVault"); const DODORouteProxy = artifacts.require("DODORouteProxy"); +const DODOUpCpProxy = artifacts.require("DODOUpCpProxy"); const DspTemplate = artifacts.require("DSP"); const DspFactory = artifacts.require("DSPFactory"); @@ -39,6 +40,7 @@ module.exports = async (deployer, network, accounts) => { let DspFactoryAddress = CONFIG.DSPFactory; let DvmFactoryAddress = CONFIG.DVMFactory; let DppFactoryAddress = CONFIG.DPPFactory; + let UpCpFactoryAddress = CONFIG.UpCpFactory; let DODOCirculationHelperAddress = CONFIG.DODOCirculationHelper; @@ -61,7 +63,7 @@ module.exports = async (deployer, network, accounts) => { logger.log("Deploy time: " + new Date().toLocaleString()); logger.log("Deploy type: ERC20Mine"); - var erc20TokenAddress = "0xd8C30a4E866B188F16aD266dC3333BD47F34ebaE"; + var erc20TokenAddress = "0x86a7649aD78F6a0432189C99B909fe1E6682E0d8"; var owner = multiSigAddress; await deployer.deploy(ERC20Mine); @@ -74,9 +76,9 @@ module.exports = async (deployer, network, accounts) => { //add Token var reward0Token = "0xd7f02d1b4f9495b549787808503ecfd231c3fbda" var reward1Token = "0xfe1133ea03d701c5006b7f065bbf987955e7a67c" - var rewardPerBlock = "100000000000000000" //0.1 - var startBlock = 24231000 - var endBlock = 24270000 + var rewardPerBlock = "10000000000000000" //0.01 + var startBlock = 24368900 + var endBlock = 25368900 tx = await erc20MineInstance.addRewardToken( reward0Token, rewardPerBlock, @@ -85,17 +87,15 @@ module.exports = async (deployer, network, accounts) => { ); logger.log("Add rewardToken0 Tx:", tx.tx); - tx = await erc20MineInstance.addRewardToken( - reward1Token, - rewardPerBlock, - startBlock, - endBlock - ); - logger.log("Add rewardToken1 Tx:", tx.tx); + // tx = await erc20MineInstance.addRewardToken( + // reward1Token, + // rewardPerBlock, + // startBlock, + // endBlock + // ); + // logger.log("Add rewardToken1 Tx:", tx.tx); - //init - //addToken - //TransferToken + //TODO: TransferReward to RewardVault } if (deploySwitch.LockedVault) { @@ -154,6 +154,20 @@ module.exports = async (deployer, network, accounts) => { logger.log("DODODspProxy Address: ", DODODspProxy.address); } + if (deploySwitch.UpCpProxy) { + logger.log("===================================================="); + logger.log("network type: " + network); + logger.log("Deploy time: " + new Date().toLocaleString()); + logger.log("Deploy type: DODOUpCpProxy"); + await deployer.deploy( + DODOUpCpProxy, + WETHAddress, + UpCpFactoryAddress, + DODOApproveProxyAddress + ); + logger.log("UpCpProxy address: ", DODOUpCpProxy.address); + } + if (deploySwitch.UpCP) { logger.log("===================================================="); diff --git a/truffle-config.js b/truffle-config.js index cffe8c5..2563771 100644 --- a/truffle-config.js +++ b/truffle-config.js @@ -57,8 +57,8 @@ module.exports = { MultiCall: false, DSP: false, LockedVault: false, - ERC20Mine: false, - MULTIHOP: true + MULTIHOP: false, + UpCpProxy: false }, networks: {