Files
dodo-contractV2/contracts/Factory/Registries/DODOMineV3Registry.sol
2021-07-09 10:26:07 +08:00

105 lines
3.1 KiB
Solidity

/*
Copyright 2021 DODO ZOO.
SPDX-License-Identifier: Apache-2.0
*/
pragma solidity 0.6.9;
pragma experimental ABIEncoderV2;
import {InitializableOwnable} from "../../lib/InitializableOwnable.sol";
interface IDODOMineV3Registry {
function addMineV3(
address mine,
bool isLpToken,
address stakeToken
) external;
}
/**
* @title DODOMineV3 Registry
* @author DODO Breeder
*
* @notice Register DODOMineV3 Pools
*/
contract DODOMineV3Registry is InitializableOwnable, IDODOMineV3Registry {
mapping (address => bool) public isAdminListed;
// ============ Registry ============
// minePool -> stakeToken
mapping(address => address) public _MINE_REGISTRY_;
// lpToken -> minePool
mapping(address => address[]) public _LP_REGISTRY_;
// singleToken -> minePool
mapping(address => address[]) public _SINGLE_REGISTRY_;
// ============ Events ============
event NewMineV3(address mine, address stakeToken, bool isLpToken);
event RemoveMineV3(address mine, address stakeToken);
event addAdmin(address admin);
event removeAdmin(address admin);
function addMineV3(
address mine,
bool isLpToken,
address stakeToken
) override external {
require(isAdminListed[msg.sender], "ACCESS_DENIED");
_MINE_REGISTRY_[mine] = stakeToken;
if(isLpToken) {
_LP_REGISTRY_[stakeToken].push(mine);
}else {
_SINGLE_REGISTRY_[stakeToken].push(mine);
}
emit NewMineV3(mine, stakeToken, isLpToken);
}
// ============ Admin Operation Functions ============
function removeMineV3(
address mine,
bool isLpToken,
address stakeToken
) external onlyOwner {
_MINE_REGISTRY_[mine] = address(0);
if(isLpToken) {
uint256 len = _LP_REGISTRY_[stakeToken].length;
for (uint256 i = 0; i < len; i++) {
if (mine == _LP_REGISTRY_[stakeToken][i]) {
if(i != len - 1) {
_LP_REGISTRY_[stakeToken][i] = _LP_REGISTRY_[stakeToken][len - 1];
}
_LP_REGISTRY_[stakeToken].pop();
break;
}
}
}else {
uint256 len = _SINGLE_REGISTRY_[stakeToken].length;
for (uint256 i = 0; i < len; i++) {
if (mine == _SINGLE_REGISTRY_[stakeToken][i]) {
if(i != len - 1) {
_SINGLE_REGISTRY_[stakeToken][i] = _SINGLE_REGISTRY_[stakeToken][len - 1];
}
_SINGLE_REGISTRY_[stakeToken].pop();
break;
}
}
}
emit RemoveMineV3(mine, stakeToken);
}
function addAdminList (address contractAddr) external onlyOwner {
isAdminListed[contractAddr] = true;
emit addAdmin(contractAddr);
}
function removeAdminList (address contractAddr) external onlyOwner {
isAdminListed[contractAddr] = false;
emit removeAdmin(contractAddr);
}
}