add crowdpooling factory and proxy
This commit is contained in:
36
contracts/CrowdPooling/intf/ICP.sol
Normal file
36
contracts/CrowdPooling/intf/ICP.sol
Normal file
@@ -0,0 +1,36 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
interface ICP {
|
||||
function init(
|
||||
address[] calldata addressList,
|
||||
uint256[] calldata timeLine,
|
||||
uint256[] calldata valueList
|
||||
) external;
|
||||
|
||||
//==============================
|
||||
|
||||
|
||||
//==============================
|
||||
|
||||
function bid(address to) external;
|
||||
|
||||
function cancel(address assetTo, uint256 amount) external;
|
||||
|
||||
function settle() external;
|
||||
|
||||
function emergencySettle() external;
|
||||
|
||||
function claimBase() external;
|
||||
|
||||
function claimQuote() external;
|
||||
|
||||
function claimLPToken() external;
|
||||
}
|
||||
@@ -20,11 +20,11 @@ contract DPPTrader is DPPVault {
|
||||
// ============ Events ============
|
||||
|
||||
event DODOSwap(
|
||||
address indexed fromToken,
|
||||
address indexed toToken,
|
||||
address fromToken,
|
||||
address toToken,
|
||||
uint256 fromAmount,
|
||||
uint256 toAmount,
|
||||
address indexed trader
|
||||
address trader
|
||||
);
|
||||
|
||||
// ============ Modifiers ============
|
||||
|
||||
@@ -21,11 +21,11 @@ contract DVMTrader is DVMVault {
|
||||
// ============ Events ============
|
||||
|
||||
event DODOSwap(
|
||||
address indexed fromToken,
|
||||
address indexed toToken,
|
||||
address fromToken,
|
||||
address toToken,
|
||||
uint256 fromAmount,
|
||||
uint256 toAmount,
|
||||
address indexed trader
|
||||
address trader
|
||||
);
|
||||
|
||||
// ============ Modifiers ============
|
||||
|
||||
126
contracts/Factory/CrowdPoolingFactory.sol
Normal file
126
contracts/Factory/CrowdPoolingFactory.sol
Normal file
@@ -0,0 +1,126 @@
|
||||
/*
|
||||
|
||||
Copyright 2020 DODO ZOO.
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
*/
|
||||
|
||||
pragma solidity 0.6.9;
|
||||
pragma experimental ABIEncoderV2;
|
||||
|
||||
import {Ownable} from "../lib/Ownable.sol";
|
||||
import {ICloneFactory} from "../lib/CloneFactory.sol";
|
||||
import {ICP} from "../CrowdPooling/intf/ICP.sol";
|
||||
|
||||
contract CrowdPoolingFactory {
|
||||
// ============ Templates ============
|
||||
|
||||
address public immutable _CLONE_FACTORY_;
|
||||
address public immutable _CP_TEMPLATE_;
|
||||
address public immutable _UNOWNED_DVM_FACTORY_;
|
||||
address public immutable _FEE_RATE_MODEL_TEMPLATE_;
|
||||
|
||||
address public immutable _DEFAULT_MAINTAINER_;
|
||||
address public immutable _DEFAULT_MT_FEE_RATE_MODEL_;
|
||||
address public immutable _DEFAULT_PERMISSION_MANAGER_;
|
||||
address public immutable _DEFAULT_GAS_PRICE_SOURCE_;
|
||||
|
||||
// ============ Registry ============
|
||||
|
||||
// base -> quote -> CP address list
|
||||
mapping(address => mapping(address => address[])) public _REGISTRY_;
|
||||
// creator -> CP address list
|
||||
mapping(address => address[]) public _USER_REGISTRY_;
|
||||
|
||||
// ============ Events ============
|
||||
|
||||
event NewCP(
|
||||
address indexed baseToken,
|
||||
address indexed quoteToken,
|
||||
address indexed creator,
|
||||
address cp
|
||||
);
|
||||
|
||||
// ============ Functions ============
|
||||
|
||||
constructor(
|
||||
address cloneFactory,
|
||||
address cpTemplate,
|
||||
address unOwnedDvmFactory,
|
||||
address feeRateModelTemplate,
|
||||
address defaultMaintainer,
|
||||
address defaultMtFeeRateModel,
|
||||
address defaultPermissionManager,
|
||||
address defaultGasPriceSource
|
||||
) public {
|
||||
_CLONE_FACTORY_ = cloneFactory;
|
||||
_CP_TEMPLATE_ = cpTemplate;
|
||||
_UNOWNED_DVM_FACTORY_ = unOwnedDvmFactory;
|
||||
_FEE_RATE_MODEL_TEMPLATE_ = feeRateModelTemplate;
|
||||
_DEFAULT_MAINTAINER_ = defaultMaintainer;
|
||||
_DEFAULT_MT_FEE_RATE_MODEL_ = defaultMtFeeRateModel;
|
||||
_DEFAULT_PERMISSION_MANAGER_ = defaultPermissionManager;
|
||||
_DEFAULT_GAS_PRICE_SOURCE_ = defaultGasPriceSource;
|
||||
}
|
||||
|
||||
function createCrowdPooling() external returns (address newCrowdPooling) {
|
||||
newCrowdPooling = ICloneFactory(_CLONE_FACTORY_).clone(_CP_TEMPLATE_);
|
||||
}
|
||||
|
||||
function initCrowdPooling(
|
||||
address cpAddress,
|
||||
address creator,
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList
|
||||
) external {
|
||||
{
|
||||
address[] memory addressList = new address[](7);
|
||||
addressList[0] = creator;
|
||||
addressList[1] = _DEFAULT_MAINTAINER_;
|
||||
addressList[2] = baseToken;
|
||||
addressList[3] = quoteToken;
|
||||
addressList[4] = _DEFAULT_PERMISSION_MANAGER_;
|
||||
addressList[5] = _DEFAULT_MT_FEE_RATE_MODEL_;
|
||||
addressList[6] = _UNOWNED_DVM_FACTORY_;
|
||||
|
||||
ICP(cpAddress).init(
|
||||
addressList,
|
||||
timeLine,
|
||||
valueList
|
||||
);
|
||||
}
|
||||
|
||||
_REGISTRY_[baseToken][quoteToken].push(cpAddress);
|
||||
_USER_REGISTRY_[creator].push(cpAddress);
|
||||
|
||||
emit NewCP(baseToken, quoteToken, creator, cpAddress);
|
||||
}
|
||||
|
||||
// ============ View Functions ============
|
||||
|
||||
function getCrowdPooling(address baseToken, address quoteToken)
|
||||
external
|
||||
view
|
||||
returns (address[] memory pools)
|
||||
{
|
||||
return _REGISTRY_[baseToken][quoteToken];
|
||||
}
|
||||
|
||||
function getCrowdPoolingBidirection(address token0, address token1)
|
||||
external
|
||||
view
|
||||
returns (address[] memory baseToken0Pools, address[] memory baseToken1Pools)
|
||||
{
|
||||
return (_REGISTRY_[token0][token1], _REGISTRY_[token1][token0]);
|
||||
}
|
||||
|
||||
function getCrowdPoolingByUser(address user)
|
||||
external
|
||||
view
|
||||
returns (address[] memory pools)
|
||||
{
|
||||
return _USER_REGISTRY_[user];
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,7 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, Ownable {
|
||||
address public immutable _DODO_SELL_HELPER_;
|
||||
address public immutable _DVM_FACTORY_;
|
||||
address public immutable _DPP_FACTORY_;
|
||||
address public immutable _CP_FACTORY_;
|
||||
mapping (address => bool) public isWhiteListed;
|
||||
|
||||
// ============ Events ============
|
||||
@@ -59,12 +60,14 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, Ownable {
|
||||
constructor(
|
||||
address dvmFactory,
|
||||
address dppFactory,
|
||||
address cpFactory,
|
||||
address payable weth,
|
||||
address dodoApprove,
|
||||
address dodoSellHelper
|
||||
) public {
|
||||
_DVM_FACTORY_ = dvmFactory;
|
||||
_DPP_FACTORY_ = dppFactory;
|
||||
_CP_FACTORY_ = cpFactory;
|
||||
_WETH_ = weth;
|
||||
_DODO_APPROVE_ = dodoApprove;
|
||||
_DODO_SELL_HELPER_ = dodoSellHelper;
|
||||
@@ -551,6 +554,51 @@ contract DODOV2Proxy01 is IDODOV2Proxy01, ReentrancyGuard, Ownable {
|
||||
return 0;
|
||||
}
|
||||
|
||||
//============ CrowdPooling Functions (create & bid) ============
|
||||
|
||||
function createCrowdPooling(
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
uint256 baseInAmount,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList,
|
||||
uint256 deadLine
|
||||
) external override judgeExpired(deadLine) returns (address newCrowdPooling) {
|
||||
address _baseToken = baseToken;
|
||||
address _quoteToken = quoteToken == _ETH_ADDRESS_ ? _WETH_ : quoteToken;
|
||||
|
||||
newCrowdPooling = IDODOV2(_CP_FACTORY_).createCrowdPooling();
|
||||
|
||||
_deposit(
|
||||
msg.sender,
|
||||
newCrowdPooling,
|
||||
_baseToken,
|
||||
baseInAmount,
|
||||
false
|
||||
);
|
||||
|
||||
|
||||
IDODOV2(_CP_FACTORY_).initCrowdPooling(
|
||||
newCrowdPooling,
|
||||
msg.sender,
|
||||
_baseToken,
|
||||
_quoteToken,
|
||||
timeLine,
|
||||
valueList
|
||||
);
|
||||
}
|
||||
|
||||
function bid(
|
||||
address assetTo,
|
||||
address cpAddress,
|
||||
uint256 quoteAmount,
|
||||
uint8 flag, // 0 - ERC20, 1 - quoteInETH
|
||||
uint256 deadLine
|
||||
) external override payable judgeExpired(deadLine) {
|
||||
_deposit(msg.sender, cpAddress, IDODOV2(cpAddress)._QUOTE_TOKEN_(), quoteAmount, flag == 1);
|
||||
IDODOV2(cpAddress).bid(assetTo);
|
||||
}
|
||||
|
||||
|
||||
function addLiquidityToV1(
|
||||
address to,
|
||||
|
||||
@@ -63,4 +63,19 @@ interface IDODOV2 {
|
||||
uint256 baseOutAmount,
|
||||
uint256 quoteOutAmount
|
||||
) external;
|
||||
|
||||
//========== CrowdPooling ===========
|
||||
|
||||
function createCrowdPooling() external returns (address newCrowdPooling);
|
||||
|
||||
function initCrowdPooling(
|
||||
address cpAddress,
|
||||
address creator,
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList
|
||||
) external;
|
||||
|
||||
function bid(address to) external;
|
||||
}
|
||||
@@ -98,6 +98,23 @@ interface IDODOV2Proxy01 is IDODOV1Proxy01 {
|
||||
uint256 deadLine
|
||||
) external payable;
|
||||
|
||||
function createCrowdPooling(
|
||||
address baseToken,
|
||||
address quoteToken,
|
||||
uint256 baseInAmount,
|
||||
uint256[] memory timeLine,
|
||||
uint256[] memory valueList,
|
||||
uint256 deadLine
|
||||
) external returns (address newCrowdPooling);
|
||||
|
||||
function bid(
|
||||
address assetTo,
|
||||
address cpAddress,
|
||||
uint256 quoteAmount,
|
||||
uint8 flag, // 0 - ERC20, 1 - quoteInETH
|
||||
uint256 deadLine
|
||||
) external payable;
|
||||
|
||||
function addLiquidityToV1(
|
||||
address to,
|
||||
address pair,
|
||||
|
||||
Reference in New Issue
Block a user