114 lines
3.2 KiB
Solidity
114 lines
3.2 KiB
Solidity
/*
|
|
|
|
Copyright 2020 DODO ZOO.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
pragma solidity 0.6.9;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import {Ownable} from "./lib/Ownable.sol";
|
|
|
|
interface IDODO {
|
|
function init(
|
|
address supervisor,
|
|
address maintainer,
|
|
address baseToken,
|
|
address quoteToken,
|
|
address oracle,
|
|
uint256 lpFeeRate,
|
|
uint256 mtFeeRate,
|
|
uint256 k,
|
|
uint256 gasPriceLimit
|
|
) external;
|
|
|
|
function transferOwnership(address newOwner) external;
|
|
}
|
|
|
|
/**
|
|
* @title DODOZoo
|
|
* @author DODO Breeder
|
|
*
|
|
* @notice Register of All DODO
|
|
*/
|
|
contract DODOZoo is Ownable {
|
|
address public _DODO_LOGIC_;
|
|
mapping(address => mapping(address => address)) internal _DODO_REGISTER_;
|
|
|
|
// ============ Events ============
|
|
|
|
event DODOBirth(address newBorn, address baseToken, address quoteToken);
|
|
|
|
// ============ Constructor Function ============
|
|
|
|
constructor(address _dodoLogic) public {
|
|
_DODO_LOGIC_ = _dodoLogic;
|
|
}
|
|
|
|
// ============ Breed DODO Function ============
|
|
|
|
function breedDODO(
|
|
address supervisor,
|
|
address maintainer,
|
|
address baseToken,
|
|
address quoteToken,
|
|
address oracle,
|
|
uint256 lpFeeRate,
|
|
uint256 mtFeeRate,
|
|
uint256 k,
|
|
uint256 gasPriceLimit
|
|
) external onlyOwner returns (address newBornDODO) {
|
|
require(!isDODORegistered(baseToken, quoteToken), "DODO_REGISTERED");
|
|
// Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol
|
|
// create proxy
|
|
bytes20 targetBytes = bytes20(_DODO_LOGIC_);
|
|
assembly {
|
|
let clone := mload(0x40)
|
|
mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
|
|
mstore(add(clone, 0x14), targetBytes)
|
|
mstore(
|
|
add(clone, 0x28),
|
|
0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000
|
|
)
|
|
newBornDODO := create(0, clone, 0x37)
|
|
}
|
|
IDODO(newBornDODO).init(
|
|
supervisor,
|
|
maintainer,
|
|
baseToken,
|
|
quoteToken,
|
|
oracle,
|
|
lpFeeRate,
|
|
mtFeeRate,
|
|
k,
|
|
gasPriceLimit
|
|
);
|
|
IDODO(newBornDODO).transferOwnership(_OWNER_);
|
|
_DODO_REGISTER_[baseToken][quoteToken] = newBornDODO;
|
|
emit DODOBirth(newBornDODO, baseToken, quoteToken);
|
|
return newBornDODO;
|
|
}
|
|
|
|
function removeDODO(address baseToken, address quoteToken) external onlyOwner {
|
|
_DODO_REGISTER_[baseToken][quoteToken] = address(0);
|
|
}
|
|
|
|
// ============ View Functions ============
|
|
|
|
function isDODORegistered(address baseToken, address quoteToken) public view returns (bool) {
|
|
if (
|
|
_DODO_REGISTER_[baseToken][quoteToken] == address(0) &&
|
|
_DODO_REGISTER_[quoteToken][baseToken] == address(0)
|
|
) {
|
|
return false;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
function getDODO(address baseToken, address quoteToken) external view returns (address) {
|
|
return _DODO_REGISTER_[baseToken][quoteToken];
|
|
}
|
|
}
|