128 lines
3.6 KiB
Solidity
128 lines
3.6 KiB
Solidity
/*
|
|
|
|
Copyright 2021 DODO ZOO.
|
|
SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
pragma solidity 0.6.9;
|
|
pragma experimental ABIEncoderV2;
|
|
|
|
import {IFeeRateModel} from "../../../lib/FeeRateModel.sol";
|
|
import {IERC20} from "../../../intf/IERC20.sol";
|
|
import {DPPTrader} from "./DPPTrader.sol";
|
|
|
|
/**
|
|
* @title DODO PrivatePool
|
|
* @author DODO Breeder
|
|
*
|
|
* @notice DODOPrivatePool with oracle price
|
|
*/
|
|
contract DPPOracle is DPPTrader {
|
|
|
|
event EnableOracle();
|
|
event DisableOracle(uint256 newI);
|
|
event ChangeOracle(address indexed oracle);
|
|
|
|
function init(
|
|
address owner,
|
|
address maintainer,
|
|
address baseTokenAddress,
|
|
address quoteTokenAddress,
|
|
uint256 lpFeeRate,
|
|
address mtFeeRateModel,
|
|
uint256 k,
|
|
uint256 i,
|
|
address o,
|
|
bool isOpenTWAP,
|
|
bool isOracleEnabled
|
|
) external {
|
|
initOwner(owner);
|
|
|
|
require(baseTokenAddress != quoteTokenAddress, "BASE_QUOTE_CAN_NOT_BE_SAME");
|
|
_BASE_TOKEN_ = IERC20(baseTokenAddress);
|
|
_QUOTE_TOKEN_ = IERC20(quoteTokenAddress);
|
|
|
|
_MAINTAINER_ = maintainer;
|
|
_MT_FEE_RATE_MODEL_ = IFeeRateModel(mtFeeRateModel);
|
|
|
|
require(lpFeeRate <= 1e18, "LP_FEE_RATE_OUT_OF_RANGE");
|
|
require(k <= 1e18, "K_OUT_OF_RANGE");
|
|
require(i > 0 && i <= 1e36, "I_OUT_OF_RANGE");
|
|
require(o != address(0), "INVALID_ORACLE");
|
|
|
|
_LP_FEE_RATE_ = uint64(lpFeeRate);
|
|
_K_ = uint64(k);
|
|
_I_ = uint128(i);
|
|
_O_ = o;
|
|
|
|
_IS_OPEN_TWAP_ = isOpenTWAP;
|
|
_IS_ORACLE_ENABLED = isOracleEnabled;
|
|
if(isOpenTWAP) _BLOCK_TIMESTAMP_LAST_ = uint32(block.timestamp % 2**32);
|
|
|
|
_resetTargetAndReserve();
|
|
}
|
|
|
|
function changeOracle(address newOracle) public preventReentrant onlyOwner {
|
|
require(newOracle != address(0), "INVALID_ORACLE");
|
|
_O_ = newOracle;
|
|
emit ChangeOracle(newOracle);
|
|
}
|
|
|
|
function enableOracle() public preventReentrant onlyOwner {
|
|
_IS_ORACLE_ENABLED = true;
|
|
emit EnableOracle();
|
|
}
|
|
|
|
function disableOracle(uint256 newI) public preventReentrant onlyOwner {
|
|
require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE");
|
|
_I_ = uint128(newI);
|
|
_IS_ORACLE_ENABLED = false;
|
|
emit DisableOracle(newI);
|
|
}
|
|
|
|
function tuneParameters(
|
|
uint256 newLpFeeRate,
|
|
uint256 newI,
|
|
uint256 newK,
|
|
uint256 minBaseReserve,
|
|
uint256 minQuoteReserve
|
|
) public preventReentrant onlyOwner returns (bool) {
|
|
require(
|
|
_BASE_RESERVE_ >= minBaseReserve && _QUOTE_RESERVE_ >= minQuoteReserve,
|
|
"RESERVE_AMOUNT_IS_NOT_ENOUGH"
|
|
);
|
|
require(newLpFeeRate <= 1e18, "LP_FEE_RATE_OUT_OF_RANGE");
|
|
require(newK <= 1e18, "K_OUT_OF_RANGE");
|
|
require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE");
|
|
|
|
_LP_FEE_RATE_ = uint64(newLpFeeRate);
|
|
_K_ = uint64(newK);
|
|
_I_ = uint128(newI);
|
|
|
|
emit LpFeeRateChange(newLpFeeRate);
|
|
return true;
|
|
}
|
|
|
|
function tunePrice(
|
|
uint256 newI,
|
|
uint256 minBaseReserve,
|
|
uint256 minQuoteReserve
|
|
) public preventReentrant onlyOwner returns (bool) {
|
|
require(
|
|
_BASE_RESERVE_ >= minBaseReserve && _QUOTE_RESERVE_ >= minQuoteReserve,
|
|
"RESERVE_AMOUNT_IS_NOT_ENOUGH"
|
|
);
|
|
require(newI > 0 && newI <= 1e36, "I_OUT_OF_RANGE");
|
|
_I_ = uint128(newI);
|
|
return true;
|
|
}
|
|
|
|
|
|
// ============ Version Control ============
|
|
|
|
function version() external pure returns (string memory) {
|
|
return "DPP Oracle 1.1.0";
|
|
}
|
|
}
|