Files
dodo-contractV2/contracts/Factory/Registries/DODONFTRegistry.sol
2021-07-02 17:21:53 +08:00

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 {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
import {IDVM} from "../../DODOVendingMachine/intf/IDVM.sol";
import {IFragment} from "../../GeneralizedFragment/intf/IFragment.sol";
interface IDODONFTRegistry {
function addRegistry(
address vault,
address fragment,
address quoteToken,
address dvm
) external;
function removeRegistry(address fragment) external;
}
/**
* @title DODONFT Registry
* @author DODO Breeder
*
* @notice Register DODONFT Pools
*/
contract DODONFTRegistry is InitializableOwnable, IDODONFTRegistry {
mapping (address => bool) public isAdminListed;
// ============ Registry ============
// Vault -> Frag
mapping(address => address) public _VAULT_FRAG_REGISTRY_;
// base -> quote -> DVM address list
mapping(address => mapping(address => address[])) public _REGISTRY_;
// ============ Events ============
event NewRegistry(
address vault,
address fragment,
address dvm
);
event RemoveRegistry(address fragment);
// ============ Admin Operation Functions ============
function addRegistry(
address vault,
address fragment,
address quoteToken,
address dvm
) override external {
require(isAdminListed[msg.sender], "ACCESS_DENIED");
_VAULT_FRAG_REGISTRY_[vault] = fragment;
_REGISTRY_[fragment][quoteToken].push(dvm);
emit NewRegistry(vault, fragment, dvm);
}
function removeRegistry(address fragment) override external {
require(isAdminListed[msg.sender], "ACCESS_DENIED");
address vault = IFragment(fragment)._COLLATERAL_VAULT_();
address dvm = IFragment(fragment)._DVM_();
_VAULT_FRAG_REGISTRY_[vault] = address(0);
address quoteToken = IDVM(dvm)._QUOTE_TOKEN_();
address[] memory registryList = _REGISTRY_[fragment][quoteToken];
for (uint256 i = 0; i < registryList.length; i++) {
if (registryList[i] == dvm) {
if(i != registryList.length - 1) {
_REGISTRY_[fragment][quoteToken][i] = _REGISTRY_[fragment][quoteToken][registryList.length - 1];
}
_REGISTRY_[fragment][quoteToken].pop();
break;
}
}
emit RemoveRegistry(fragment);
}
function addAdminList (address contractAddr) external onlyOwner {
isAdminListed[contractAddr] = true;
}
function removeAdminList (address contractAddr) external onlyOwner {
isAdminListed[contractAddr] = false;
}
function getDODOPool(address baseToken, address quoteToken)
external
view
returns (address[] memory pools)
{
return _REGISTRY_[baseToken][quoteToken];
}
function getDODOPoolBidirection(address token0, address token1)
external
view
returns (address[] memory baseToken0Pool, address[] memory baseToken1Pool)
{
return (_REGISTRY_[token0][token1], _REGISTRY_[token1][token0]);
}
}