Files

173 lines
4.9 KiB
Solidity
Raw Permalink Normal View History

2020-11-05 00:26:45 +08:00
/*
Copyright 2020 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;
import {InitializableOwnable} from "../lib/InitializableOwnable.sol";
2020-11-05 00:26:45 +08:00
import {ICloneFactory} from "../lib/CloneFactory.sol";
2020-11-20 18:58:35 +08:00
import {IDVM} from "../DODOVendingMachine/intf/IDVM.sol";
2020-11-05 00:26:45 +08:00
2020-12-11 22:52:00 +08:00
interface IDVMFactory {
function createDODOVendingMachine(
2020-12-24 11:51:55 +08:00
address baseToken,
address quoteToken,
uint256 lpFeeRate,
uint256 i,
2021-01-19 17:10:46 +08:00
uint256 k,
bool isOpenTWAP
2020-12-24 11:51:55 +08:00
) external returns (address newVendingMachine);
2020-12-11 22:52:00 +08:00
}
/**
* @title DODO VendingMachine Factory
* @author DODO Breeder
*
* @notice Create And Register DVM Pools
*/
contract DVMFactory is InitializableOwnable {
2020-11-30 09:59:01 +08:00
// ============ Templates ============
2020-12-07 16:20:59 +08:00
address public immutable _CLONE_FACTORY_;
2020-12-24 11:51:55 +08:00
address public immutable _DEFAULT_MT_FEE_RATE_MODEL_;
2021-06-03 10:40:03 +08:00
address public _DEFAULT_MAINTAINER_;
address public _DVM_TEMPLATE_;
2020-11-11 16:42:00 +08:00
2020-11-30 09:59:01 +08:00
// ============ Registry ============
2020-11-05 00:26:45 +08:00
// base -> quote -> DVM address list
mapping(address => mapping(address => address[])) public _REGISTRY_;
2020-11-23 10:43:12 +08:00
// creator -> DVM address list
mapping(address => address[]) public _USER_REGISTRY_;
2020-11-05 00:26:45 +08:00
2020-11-30 09:59:01 +08:00
// ============ Events ============
event NewDVM(
2020-12-18 01:11:33 +08:00
address baseToken,
address quoteToken,
address creator,
2020-12-18 15:42:16 +08:00
address dvm
2020-11-30 09:59:01 +08:00
);
2020-12-24 11:51:55 +08:00
event RemoveDVM(address dvm);
2020-11-30 09:59:01 +08:00
// ============ Functions ============
2020-11-05 00:26:45 +08:00
constructor(
address cloneFactory,
address dvmTemplate,
2020-12-24 11:51:55 +08:00
address defaultMaintainer,
2020-12-30 12:23:52 +08:00
address defaultMtFeeRateModel
2020-11-05 00:26:45 +08:00
) public {
_CLONE_FACTORY_ = cloneFactory;
_DVM_TEMPLATE_ = dvmTemplate;
2020-12-24 11:51:55 +08:00
_DEFAULT_MAINTAINER_ = defaultMaintainer;
_DEFAULT_MT_FEE_RATE_MODEL_ = defaultMtFeeRateModel;
2020-11-05 00:26:45 +08:00
}
2020-11-23 22:33:23 +08:00
function createDODOVendingMachine(
2020-12-24 11:51:55 +08:00
address baseToken,
address quoteToken,
uint256 lpFeeRate,
uint256 i,
2021-01-19 17:10:46 +08:00
uint256 k,
bool isOpenTWAP
2020-12-24 11:51:55 +08:00
) external returns (address newVendingMachine) {
newVendingMachine = ICloneFactory(_CLONE_FACTORY_).clone(_DVM_TEMPLATE_);
{
IDVM(newVendingMachine).init(
_DEFAULT_MAINTAINER_,
baseToken,
quoteToken,
2020-12-30 12:23:52 +08:00
lpFeeRate,
2020-12-24 11:51:55 +08:00
_DEFAULT_MT_FEE_RATE_MODEL_,
i,
2021-01-19 17:10:46 +08:00
k,
isOpenTWAP
2020-12-24 11:51:55 +08:00
);
}
_REGISTRY_[baseToken][quoteToken].push(newVendingMachine);
2021-01-12 20:33:44 +08:00
_USER_REGISTRY_[tx.origin].push(newVendingMachine);
emit NewDVM(baseToken, quoteToken, tx.origin, newVendingMachine);
2020-11-24 17:25:10 +08:00
}
2020-12-24 11:51:55 +08:00
// ============ Admin Operation Functions ============
function updateDvmTemplate(address _newDVMTemplate) external onlyOwner {
_DVM_TEMPLATE_ = _newDVMTemplate;
}
2021-06-03 10:40:03 +08:00
function updateDefaultMaintainer(address _newMaintainer) external onlyOwner {
_DEFAULT_MAINTAINER_ = _newMaintainer;
}
2020-11-05 00:26:45 +08:00
2020-12-24 11:51:55 +08:00
function addPoolByAdmin(
address creator,
address baseToken,
address quoteToken,
address pool
) external onlyOwner {
_REGISTRY_[baseToken][quoteToken].push(pool);
_USER_REGISTRY_[creator].push(pool);
emit NewDVM(baseToken, quoteToken, creator, pool);
}
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 RemoveDVM(pool);
}
2020-11-30 09:59:01 +08:00
// ============ View Functions ============
2021-01-19 18:08:27 +08:00
function getDODOPool(address baseToken, address quoteToken)
2020-11-05 00:26:45 +08:00
external
view
returns (address[] memory machines)
{
return _REGISTRY_[baseToken][quoteToken];
}
2020-11-28 17:44:39 +08:00
2021-01-19 18:08:27 +08:00
function getDODOPoolBidirection(address token0, address token1)
2020-11-28 17:44:39 +08:00
external
view
returns (address[] memory baseToken0Machines, address[] memory baseToken1Machines)
{
return (_REGISTRY_[token0][token1], _REGISTRY_[token1][token0]);
}
2020-12-08 22:52:10 +08:00
2021-01-19 18:08:27 +08:00
function getDODOPoolByUser(address user)
2020-12-08 22:52:10 +08:00
external
view
returns (address[] memory machines)
{
return _USER_REGISTRY_[user];
}
2020-11-05 00:26:45 +08:00
}