dodo-start && cpV2 ing
This commit is contained in:
@@ -41,8 +41,6 @@ contract CrowdPoolingFactory is InitializableOwnable {
|
||||
uint256 public _K_ = 0;
|
||||
uint256 public _CLIFF_RATE_ = 10**18;
|
||||
|
||||
mapping(address => address) liquidityProtectWhitelist;
|
||||
|
||||
// ============ Registry ============
|
||||
|
||||
// base -> quote -> CP address list
|
||||
@@ -66,9 +64,6 @@ contract CrowdPoolingFactory is InitializableOwnable {
|
||||
|
||||
uint256 baseTokenBalance = IERC20(baseToken).balanceOf(cpAddress);
|
||||
require(valueList[0].mul(100) <= baseTokenBalance.mul(valueList[2]).div(10**18).mul(_CAP_RATIO_),"CP_FACTORY : QUOTE_CAP_INVALID");
|
||||
if(liquidityProtectWhitelist[creator] != baseToken) {
|
||||
require(timeLine[3]>= _FREEZE_DURATION_, "CP_FACTORY : FREEZE_DURATION_INVALID");
|
||||
}
|
||||
_;
|
||||
}
|
||||
|
||||
@@ -81,6 +76,8 @@ contract CrowdPoolingFactory is InitializableOwnable {
|
||||
address cp
|
||||
);
|
||||
|
||||
event RemoveCP(address cp);
|
||||
|
||||
constructor(
|
||||
address cloneFactory,
|
||||
address cpTemplate,
|
||||
@@ -162,10 +159,6 @@ contract CrowdPoolingFactory is InitializableOwnable {
|
||||
}
|
||||
|
||||
// ============ Owner Functions ============
|
||||
|
||||
function setLiquidityProtectWhitelist(address creator, address baseToken) external onlyOwner {
|
||||
liquidityProtectWhitelist[creator] = baseToken;
|
||||
}
|
||||
|
||||
function updateCPTemplate(address _newCPTemplate) external onlyOwner {
|
||||
_CP_TEMPLATE_ = _newCPTemplate;
|
||||
@@ -201,4 +194,31 @@ contract CrowdPoolingFactory is InitializableOwnable {
|
||||
require(_newCliffRate <= 10**18, "CP_FACTORY : INVALID");
|
||||
_CLIFF_RATE_ = _newCliffRate;
|
||||
}
|
||||
|
||||
function removePoolByAdmin(
|
||||
address creator,
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
address pool
|
||||
) external onlyOwner {
|
||||
address[] memory registryList = _REGISTRY_[baseToken][quoteToken];
|
||||
for (uint256 i = 0; i < registryList.length; i++) {
|
||||
if (registryList[i] == pool) {
|
||||
registryList[i] = registryList[registryList.length - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
_REGISTRY_[baseToken][quoteToken] = registryList;
|
||||
_REGISTRY_[baseToken][quoteToken].pop();
|
||||
address[] memory userRegistryList = _USER_REGISTRY_[creator];
|
||||
for (uint256 i = 0; i < userRegistryList.length; i++) {
|
||||
if (userRegistryList[i] == pool) {
|
||||
userRegistryList[i] = userRegistryList[userRegistryList.length - 1];
|
||||
break;
|
||||
}
|
||||
}
|
||||
_USER_REGISTRY_[creator] = userRegistryList;
|
||||
_USER_REGISTRY_[creator].pop();
|
||||
emit RemoveCP(pool);
|
||||
}
|
||||
}
|
||||
|
||||
164
contracts/Factory/DODOStarterFactory.sol
Normal file
164
contracts/Factory/DODOStarterFactory.sol
Normal file
@@ -0,0 +1,164 @@
|
||||
/*
|
||||
|
||||
Copyright 2021 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {InitializableOwnable} from "../lib/InitializableOwnable.sol";
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {SafeMath} from "../lib/SafeMath.sol";
|
||||
import {IERC20} from "../intf/IERC20.sol";
|
||||
import {DecimalMath} from "../lib/DecimalMath.sol";
|
||||
import {IDODOStarter} from "../DODOStarter/intf/IDODOStarter.sol";
|
||||
|
||||
/**
|
||||
* @title DODOStarterFactory
|
||||
* @author DODO Breeder
|
||||
*
|
||||
* @notice Create And Register DODOStarter Pools
|
||||
*/
|
||||
contract DODOStarterFactory is InitializableOwnable {
|
||||
using SafeMath for uint256;
|
||||
// ============ Templates ============
|
||||
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public _FAIR_FUND_TEMPLATE_;
|
||||
address public _INSTANT_FUND_TEMPLATE_;
|
||||
|
||||
mapping(address => address) fundingWhitelist;
|
||||
|
||||
// ============ Registry ============
|
||||
// baseToken -> fundToken -> fair Pool list
|
||||
mapping(address => mapping(address => address[])) public _FAIR_REGISTRY_;
|
||||
// baseToken -> fundToken -> Instant Pool list
|
||||
mapping(address => mapping(address => address[])) public _INSTANT_REGISTRY_;
|
||||
|
||||
// ============ Events ============
|
||||
event NewFairFund(
|
||||
address baseToken,
|
||||
address fundToken,
|
||||
address creator,
|
||||
address fairFundPool
|
||||
);
|
||||
|
||||
event NewInstantFund(
|
||||
address baseToken,
|
||||
address fundToken,
|
||||
address creator,
|
||||
address instantFundPool
|
||||
);
|
||||
|
||||
// ============ modifiers ===========
|
||||
|
||||
modifier permissionCheck(address creator, address baseToken) {
|
||||
require(fundingWhitelist[creator] == baseToken || msg.sender == _OWNER_, "NO_PERMISSION");
|
||||
_;
|
||||
}
|
||||
|
||||
constructor(
|
||||
address cloneFactory,
|
||||
address fairFundTemplate,
|
||||
address instantFundTemplate
|
||||
) public {
|
||||
_CLONE_FACTORY_ = cloneFactory;
|
||||
_FAIR_FUND_TEMPLATE_ = fairFundTemplate;
|
||||
_INSTANT_FUND_TEMPLATE_ = instantFundTemplate;
|
||||
}
|
||||
|
||||
// ============ Functions ============
|
||||
function createFairFund(
|
||||
address[] memory addressList,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList,
|
||||
uint256 sellTokenAmount
|
||||
) external permissionCheck(addressList[0],addressList[1]) returns(address newFairFundPool){
|
||||
newFairFundPool = ICloneFactory(_CLONE_FACTORY_).clone(_FAIR_FUND_TEMPLATE_);
|
||||
|
||||
IERC20(addressList[1]).transferFrom(msg.sender, newFairFundPool,sellTokenAmount);
|
||||
|
||||
IDODOStarter(newFairFundPool).init(
|
||||
addressList,
|
||||
timeLine,
|
||||
valueList
|
||||
);
|
||||
|
||||
_FAIR_REGISTRY_[addressList[1]][addressList[2]].push(newFairFundPool);
|
||||
|
||||
emit NewFairFund(addressList[1], addressList[2], addressList[0], newFairFundPool);
|
||||
}
|
||||
|
||||
function createInstantFund(
|
||||
address[] memory addressList,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList,
|
||||
uint256 sellTokenAmount
|
||||
) external permissionCheck(addressList[0],addressList[1]) returns(address newInstantFundPool){
|
||||
newInstantFundPool = ICloneFactory(_CLONE_FACTORY_).clone(_INSTANT_FUND_TEMPLATE_);
|
||||
|
||||
IERC20(addressList[1]).transferFrom(msg.sender, newInstantFundPool,sellTokenAmount);
|
||||
|
||||
IDODOStarter(newInstantFundPool).init(
|
||||
addressList,
|
||||
timeLine,
|
||||
valueList
|
||||
);
|
||||
|
||||
_INSTANT_REGISTRY_[addressList[1]][addressList[2]].push(newInstantFundPool);
|
||||
|
||||
emit NewInstantFund(addressList[1], addressList[2], addressList[0], newInstantFundPool);
|
||||
}
|
||||
|
||||
// ============ View Functions ============
|
||||
|
||||
function getFairFundPools(address baseToken, address fundToken)
|
||||
external
|
||||
view
|
||||
returns (address[] memory pools)
|
||||
{
|
||||
return _FAIR_REGISTRY_[baseToken][fundToken];
|
||||
}
|
||||
|
||||
function getFairFundPoolsBidirection(address token0, address token1)
|
||||
external
|
||||
view
|
||||
returns (address[] memory baseToken0Pools, address[] memory baseToken1Pools)
|
||||
{
|
||||
return (_FAIR_REGISTRY_[token0][token1], _FAIR_REGISTRY_[token1][token0]);
|
||||
}
|
||||
|
||||
function getInstantFundPools(address baseToken, address fundToken)
|
||||
external
|
||||
view
|
||||
returns (address[] memory pools)
|
||||
{
|
||||
return _INSTANT_REGISTRY_[baseToken][fundToken];
|
||||
}
|
||||
|
||||
function getInstantFundPoolsBidirection(address token0, address token1)
|
||||
external
|
||||
view
|
||||
returns (address[] memory baseToken0Pools, address[] memory baseToken1Pools)
|
||||
{
|
||||
return (_INSTANT_REGISTRY_[token0][token1], _INSTANT_REGISTRY_[token1][token0]);
|
||||
}
|
||||
|
||||
|
||||
// ============ Owner Functions ============
|
||||
|
||||
function setWhitelist(address creator, address baseToken) external onlyOwner {
|
||||
fundingWhitelist[creator] = baseToken;
|
||||
}
|
||||
|
||||
function updateFairFundTemplate(address _newFairFundTemplate) external onlyOwner {
|
||||
_FAIR_FUND_TEMPLATE_ = _newFairFundTemplate;
|
||||
}
|
||||
|
||||
function updateInstantFundTemplate(address _newInstantFundTemplate) external onlyOwner {
|
||||
_INSTANT_FUND_TEMPLATE_ = _newInstantFundTemplate;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user