Files
dodo-contractV2/contracts/Factory/DODOStarterFactory.sol

179 lines
5.6 KiB
Solidity
Raw Permalink Normal View History

2021-12-02 16:15:22 +08:00
/*
2022-02-15 23:13:26 +08:00
Copyright 2022 DODO ZOO.
2021-12-02 16:15:22 +08:00
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";
2021-12-27 21:40:32 +08:00
import {SafeERC20} from "../lib/SafeERC20.sol";
2021-12-02 16:15:22 +08:00
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;
2021-12-27 21:40:32 +08:00
using SafeERC20 for IERC20;
2021-12-02 16:15:22 +08:00
// ============ 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
);
2021-12-21 09:47:07 +08:00
event SetWhitelist(address creator, address baseToken);
event UpdateFairFundTempalte(address newTemplate);
event UpdateInstantFundTempalte(address newTemplate);
2021-12-02 16:15:22 +08:00
// ============ 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,
2021-12-23 18:13:04 +08:00
uint256 sellTokenAmount,
bool isOverCapStop
2021-12-19 12:33:17 +08:00
) external payable permissionCheck(addressList[0],addressList[1]) returns(address newFairFundPool){
2021-12-02 16:15:22 +08:00
newFairFundPool = ICloneFactory(_CLONE_FACTORY_).clone(_FAIR_FUND_TEMPLATE_);
2021-12-27 21:40:32 +08:00
IERC20(addressList[1]).safeTransferFrom(msg.sender, newFairFundPool,sellTokenAmount);
2021-12-19 12:33:17 +08:00
(bool success, ) = newFairFundPool.call{value: msg.value}("");
require(success, "Settle fund Transfer failed");
2021-12-02 16:15:22 +08:00
IDODOStarter(newFairFundPool).init(
addressList,
timeLine,
2021-12-23 18:13:04 +08:00
valueList,
isOverCapStop
2021-12-02 16:15:22 +08:00
);
_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_);
2021-12-27 21:40:32 +08:00
IERC20(addressList[1]).safeTransferFrom(msg.sender, newInstantFundPool,sellTokenAmount);
2021-12-02 16:15:22 +08:00
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;
2021-12-21 09:47:07 +08:00
emit SetWhitelist(creator, baseToken);
2021-12-02 16:15:22 +08:00
}
function updateFairFundTemplate(address _newFairFundTemplate) external onlyOwner {
_FAIR_FUND_TEMPLATE_ = _newFairFundTemplate;
2021-12-21 09:47:07 +08:00
emit UpdateFairFundTempalte(_newFairFundTemplate);
2021-12-02 16:15:22 +08:00
}
function updateInstantFundTemplate(address _newInstantFundTemplate) external onlyOwner {
_INSTANT_FUND_TEMPLATE_ = _newInstantFundTemplate;
2021-12-21 09:47:07 +08:00
emit UpdateInstantFundTempalte(_newInstantFundTemplate);
2021-12-02 16:15:22 +08:00
}
}