/* 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 {IDODOApproveProxy} from "../DODOApproveProxy.sol"; import {IRewardVault} from "../../DODOToken/DODOMineV3/RewardVault.sol"; import {IDODOMineV3Registry} from "../../Factory/Registries/DODOMineV3Registry.sol"; import {ICloneFactory} from "../../lib/CloneFactory.sol"; import {SafeMath} from "../../lib/SafeMath.sol"; interface IMineV3 { function init(address owner, address token) external; function addRewardToken( address rewardToken, uint256 rewardPerBlock, uint256 startBlock, uint256 endBlock ) external; function directTransferOwnership(address newOwner) external; function getVaultByRewardToken(address rewardToken) external view returns(address); } /** * @title DODOMineV3 Proxy * @author DODO Breeder * * @notice Create And Register DODOMineV3 Contracts */ contract DODOMineV3Proxy is InitializableOwnable { using SafeMath for uint256; // ============ Templates ============ address public immutable _CLONE_FACTORY_; address public immutable _DODO_APPROVE_PROXY_; address public immutable _DODO_MINEV3_REGISTRY_; address public _MINEV3_TEMPLATE_; // ============ Events ============ event DepositRewardToVault(address mine, address rewardToken, uint256 amount); event DepositRewardToMine(address mine, address rewardToken, uint256 amount); event CreateMineV3(address account, address mineV3); event ChangeMineV3Template(address mineV3); constructor( address cloneFactory, address mineTemplate, address dodoApproveProxy, address dodoMineV3Registry ) public { _CLONE_FACTORY_ = cloneFactory; _MINEV3_TEMPLATE_ = mineTemplate; _DODO_APPROVE_PROXY_ = dodoApproveProxy; _DODO_MINEV3_REGISTRY_ = dodoMineV3Registry; } // ============ Functions ============ function createDODOMineV3( address stakeToken, bool isLpToken, address[] memory rewardTokens, uint256[] memory rewardPerBlock, uint256[] memory startBlock, uint256[] memory endBlock ) external returns (address newMineV3) { 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"); newMineV3 = ICloneFactory(_CLONE_FACTORY_).clone(_MINEV3_TEMPLATE_); IMineV3(newMineV3).init(address(this), stakeToken); for(uint i = 0; i