diff --git a/contracts/Factory/DODOMineV2Factory.sol b/contracts/Factory/DODOMineV2Factory.sol new file mode 100644 index 0000000..43a9444 --- /dev/null +++ b/contracts/Factory/DODOMineV2Factory.sol @@ -0,0 +1,124 @@ +/* + + Copyright 2021 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; +pragma experimental ABIEncoderV2; + +import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; +import {ICloneFactory} from "../lib/CloneFactory.sol"; + +interface IMineV2 { + function init(address owner, address token) external; + + function addRewardToken( + address rewardToken, + uint256 rewardPerBlock, + uint256 startBlock, + uint256 endBlock + ) external; + + function transferOwnership(address newOwner) external; +} + +/** + * @title DODOMineV2 Factory + * @author DODO Breeder + * + * @notice Create And Register DODOMineV2 Contracts + */ +contract DODOMineV2Factory is InitializableOwnable { + // ============ Templates ============ + + address public immutable _CLONE_FACTORY_; + address public _DEFAULT_MAINTAINER_; + address public _MINEV2_TEMPLATE_; + + // mine -> stakeToken + mapping(address => address) public _MINE_REGISTRY_; + // stakeToken -> mine + mapping(address => address) public _STAKE_REGISTRY_; + + // ============ Events ============ + + event NewMineV2(address mine, address stakeToken); + event RemoveMineV2(address mine, address stakeToken); + + constructor( + address cloneFactory, + address mineTemplate, + address defaultMaintainer + ) public { + _CLONE_FACTORY_ = cloneFactory; + _MINEV2_TEMPLATE_ = mineTemplate; + _DEFAULT_MAINTAINER_ = defaultMaintainer; + } + + // ============ Functions ============ + + function createDODOMineV2( + address stakeToken, + address[] memory rewardTokens, + uint256[] memory rewardPerBlock, + uint256[] memory startBlock, + uint256[] memory endBlock + ) external onlyOwner returns (address newMineV2) { + require(rewardTokens.length > 0, "REWARD_EMPTY"); + require(rewardTokens.length == rewardPerBlock.length, "REWARD_PARAM_NOT_MATCH"); + require(startBlock.length == rewardPerBlock.length, "REWARD_PARAM_NOT_MATCH"); + require(endBlock.length == rewardPerBlock.length, "REWARD_PARAM_NOT_MATCH"); + + newMineV2 = ICloneFactory(_CLONE_FACTORY_).clone(_MINEV2_TEMPLATE_); + + IMineV2(newMineV2).init(address(this), stakeToken); + + for(uint i = 0; i