diff --git a/contracts/DODOPrivatePool/impl/DPPOracle/DPPOracleAdmin.sol b/contracts/DODOPrivatePool/impl/DPPOracle/DPPOracleAdmin.sol new file mode 100644 index 0000000..5793084 --- /dev/null +++ b/contracts/DODOPrivatePool/impl/DPPOracle/DPPOracleAdmin.sol @@ -0,0 +1,142 @@ +/* + + Copyright 2021 DODO ZOO. + SPDX-License-Identifier: Apache-2.0 + +*/ + +pragma solidity 0.6.9; +pragma experimental ABIEncoderV2; + +import {IDPPOracle} from "../../intf/IDPPOracle.sol"; +import {IDODOApproveProxy} from "../../../SmartRoute/DODOApproveProxy.sol"; +import {InitializableOwnable} from "../../../lib/InitializableOwnable.sol"; + +/** + * @title DPPOracleAdmin + * @author DODO Breeder + * + * @notice Admin of Oracle DODOPrivatePool + */ +contract DPPOracleAdmin is InitializableOwnable { + address public _DPP_; + address public _OPERATOR_; + address public _DODO_APPROVE_PROXY_; + uint256 public _FREEZE_TIMESTAMP_; + + + modifier notFreezed() { + require(block.timestamp >= _FREEZE_TIMESTAMP_, "ADMIN_FREEZED"); + _; + } + + function init( + address owner, + address dpp, + address operator, + address dodoApproveProxy + ) external { + initOwner(owner); + _DPP_ = dpp; + _OPERATOR_ = operator; + _DODO_APPROVE_PROXY_ = dodoApproveProxy; + } + + function sync() external notFreezed onlyOwner { + IDPPOracle(_DPP_).ratioSync(); + } + + function setFreezeTimestamp(uint256 timestamp) external notFreezed onlyOwner { + _FREEZE_TIMESTAMP_ = timestamp; + } + + function setOperator(address newOperator) external notFreezed onlyOwner { + _OPERATOR_ = newOperator; + } + + function retrieve( + address payable to, + address token, + uint256 amount + ) external notFreezed onlyOwner { + IDPPOracle(_DPP_).retrieve(to, token, amount); + } + + function changeOracle(address newOracle) external onlyOwner notFreezed { + IDPPOracle(_DPP_).changeOracle(newOracle); + } + + function enableOracle() external onlyOwner notFreezed { + IDPPOracle(_DPP_).enableOracle(); + } + + function disableOracle(uint256 newI) external onlyOwner notFreezed { + IDPPOracle(_DPP_).disableOracle(newI); + } + + function tuneParameters( + uint256 newLpFeeRate, + uint256 newI, + uint256 newK, + uint256 minBaseReserve, + uint256 minQuoteReserve + ) external onlyOwner notFreezed returns (bool) { + return + IDPPOracle(_DPP_).tuneParameters( + newLpFeeRate, + newI, + newK, + minBaseReserve, + minQuoteReserve + ); + } + + function tunePrice( + uint256 newI, + uint256 minBaseReserve, + uint256 minQuoteReserve + ) external onlyOwner notFreezed returns (bool) { + return + IDPPOracle(_DPP_).tunePrice( + newI, + minBaseReserve, + minQuoteReserve + ); + } + + + function reset( + address operator, + uint256 newLpFeeRate, + uint256 newI, + uint256 newK, + uint256 baseOutAmount, + uint256 quoteOutAmount, + uint256 minBaseReserve, + uint256 minQuoteReserve + ) external notFreezed returns (bool) { + require( + msg.sender == _OWNER_ || + (IDODOApproveProxy(_DODO_APPROVE_PROXY_).isAllowedProxy(msg.sender) && + operator == _OPERATOR_), + "RESET FORBIDDEN!" + ); // only allow owner directly call or operator call via DODODppProxy + return + IDPPOracle(_DPP_).reset( + _OWNER_, //only support asset transfer out to owner + newLpFeeRate, + newI, + newK, + baseOutAmount, + quoteOutAmount, + minBaseReserve, + minQuoteReserve + ); + } + + // ============ Admin Version Control ============ + + function version() external pure returns (string memory) { + return "DPPOracle Admin 1.1.0"; + } +} \ No newline at end of file