编译器
0.8.21+commit.d9974bed
文件 1 的 8:IEZETHBalancerRateProvider.sol
pragma solidity 0.8.21;
interface IEZETHBalancerRateProvider {
function getRate() external view returns (uint256 rate);
}
文件 2 的 8:error.sol
pragma solidity 0.8.21;
contract Error {
error FluidOracleError(uint256 errorId_);
}
文件 3 的 8:errorTypes.sol
pragma solidity 0.8.21;
library ErrorTypes {
uint256 internal constant FluidOracleL2__SequencerOutage = 60000;
uint256 internal constant UniV3CheckCLRSOracle__InvalidPrice = 60001;
uint256 internal constant UniV3CheckCLRSOracle__InvalidParams = 60002;
uint256 internal constant UniV3CheckCLRSOracle__ExchangeRateZero = 60003;
uint256 internal constant FluidOracle__InvalidInfoName = 60010;
uint256 internal constant SUSDeOracle__InvalidParams = 60102;
uint256 internal constant PendleOracle__InvalidParams = 60201;
uint256 internal constant PendleOracle__MarketNotInitialized = 60202;
uint256 internal constant PendleOracle__MarketInvalidDecimals = 60203;
uint256 internal constant PendleOracle__InvalidPrice = 60204;
uint256 internal constant CLRS2UniV3CheckCLRSOracleL2__ExchangeRateZero = 60301;
uint256 internal constant Ratio2xFallbackCLRSOracleL2__ExchangeRateZero = 60311;
uint256 internal constant WeETHsOracle__InvalidParams = 60321;
uint256 internal constant DexSmartColOracle__InvalidParams = 60331;
uint256 internal constant DexSmartColOracle__SmartColNotEnabled = 60332;
uint256 internal constant DexSmartColOracle__ExchangeRateZero = 60333;
uint256 internal constant DexSmartDebtOracle__InvalidParams = 60341;
uint256 internal constant DexSmartDebtOracle__SmartDebtNotEnabled = 60342;
uint256 internal constant DexSmartDebtOracle__ExchangeRateZero = 60343;
uint256 internal constant ContractRate__InvalidParams = 60351;
uint256 internal constant ContractRate__Unauthorized = 60352;
uint256 internal constant ContractRate__MinUpdateDiffNotReached = 60353;
uint256 internal constant ContractRate__NewRateZero = 60354;
uint256 internal constant SUSDsOracle__InvalidParams = 60361;
uint256 internal constant PegOracle__InvalidParams = 60371;
uint256 internal constant DexOracle__InvalidParams = 60381;
uint256 internal constant DexOracle__ExchangeRateZero = 60382;
uint256 internal constant GenericOracle__InvalidParams = 60401;
uint256 internal constant GenericOracle__UnexpectedConfig = 60402;
uint256 internal constant GenericOracle__RateZero = 60403;
uint256 internal constant ChainlinkOracle__InvalidParams = 61001;
uint256 internal constant UniV3Oracle__InvalidParams = 62001;
uint256 internal constant UniV3Oracle__InvalidSecondsAgos = 62002;
uint256 internal constant UniV3Oracle__InvalidDeltas = 62003;
uint256 internal constant WstETHOracle__InvalidParams = 63001;
uint256 internal constant RedstoneOracle__InvalidParams = 64001;
uint256 internal constant FallbackOracle__InvalidParams = 65001;
uint256 internal constant FallbackCLRSOracle__ExchangeRateZero = 66001;
uint256 internal constant WstETHCLRSOracle__ExchangeRateZero = 67001;
uint256 internal constant CLFallbackUniV3Oracle__ExchangeRateZero = 68001;
uint256 internal constant WstETHCLRS2UniV3CheckCLRSOracle__ExchangeRateZero = 69001;
uint256 internal constant WeETHOracle__InvalidParams = 70001;
}
文件 4 的 8:fluidCenterPrice.sol
pragma solidity 0.8.21;
import { IFluidCenterPrice } from "./interfaces/iFluidCenterPrice.sol";
import { ErrorTypes } from "./errorTypes.sol";
import { Error as OracleError } from "./error.sol";
abstract contract FluidCenterPrice is IFluidCenterPrice, OracleError {
bytes32 private immutable _infoName;
constructor(string memory infoName_) {
if (bytes(infoName_).length > 32 || bytes(infoName_).length == 0) {
revert FluidOracleError(ErrorTypes.FluidOracle__InvalidInfoName);
}
bytes32 infoNameBytes32_;
assembly {
infoNameBytes32_ := mload(add(infoName_, 32))
}
_infoName = infoNameBytes32_;
}
function infoName() public view virtual returns (string memory) {
uint256 length_;
while (length_ < 32 && _infoName[length_] != 0) {
length_++;
}
bytes memory infoNameBytes_ = new bytes(length_);
for (uint256 i; i < length_; i++) {
infoNameBytes_[i] = _infoName[i];
}
return string(infoNameBytes_);
}
function centerPrice() external virtual returns (uint256 price_);
}
文件 5 的 8:fluidContractRate.sol
pragma solidity 0.8.21;
import { IFluidOracle } from "./interfaces/iFluidOracle.sol";
import { FluidCenterPrice } from "./fluidCenterPrice.sol";
import { Error as OracleError } from "./error.sol";
import { ErrorTypes } from "./errorTypes.sol";
abstract contract Events {
event LogRebalanceRate(uint256 oldRate, uint256 newRate);
}
abstract contract Constants {
address internal immutable _RATE_SOURCE;
uint256 internal immutable _MIN_UPDATE_DIFF_PERCENT;
uint256 internal immutable _MIN_HEART_BEAT;
}
abstract contract Variables is Constants {
uint216 internal _rate;
uint40 internal _lastUpdateTime;
}
abstract contract FluidContractRate is IFluidOracle, FluidCenterPrice, Variables, Events {
modifier validAddress(address value_) {
if (value_ == address(0)) {
revert FluidOracleError(ErrorTypes.ContractRate__InvalidParams);
}
_;
}
constructor(
string memory infoName_,
address rateSource_,
uint256 minUpdateDiffPercent_,
uint256 minHeartBeat_
) validAddress(rateSource_) FluidCenterPrice(infoName_) {
if (minUpdateDiffPercent_ == 0 || minUpdateDiffPercent_ > 1e5 || minHeartBeat_ == 0) {
revert FluidOracleError(ErrorTypes.ContractRate__InvalidParams);
}
_RATE_SOURCE = rateSource_;
_MIN_UPDATE_DIFF_PERCENT = minUpdateDiffPercent_;
_MIN_HEART_BEAT = minHeartBeat_;
_rate = uint216(_getNewRate1e27());
_lastUpdateTime = uint40(block.timestamp);
}
function _getNewRate1e27() internal view virtual returns (uint256 exchangeRate_);
function infoName() public view override(IFluidOracle, FluidCenterPrice) returns (string memory) {
return super.infoName();
}
function getExchangeRate() external view virtual returns (uint256 exchangeRate_) {
return _rate;
}
function getExchangeRateOperate() external view virtual returns (uint256 exchangeRate_) {
return _rate;
}
function getExchangeRateLiquidate() external view virtual returns (uint256 exchangeRate_) {
return _rate;
}
function rebalance() external {
uint256 curRate_ = _rate;
uint256 newRate_ = _getNewRate1e27();
if (newRate_ == 0) {
revert FluidOracleError(ErrorTypes.ContractRate__NewRateZero);
}
uint256 rateDiffPercent;
unchecked {
if (curRate_ > newRate_) {
rateDiffPercent = ((curRate_ - newRate_) * 1e6) / curRate_;
} else if (newRate_ > curRate_) {
rateDiffPercent = ((newRate_ - curRate_) * 1e6) / curRate_;
}
}
if (rateDiffPercent < _MIN_UPDATE_DIFF_PERCENT) {
revert FluidOracleError(ErrorTypes.ContractRate__MinUpdateDiffNotReached);
}
_rate = uint216(newRate_);
_lastUpdateTime = uint40(block.timestamp);
emit LogRebalanceRate(curRate_, newRate_);
}
function centerPrice() external override returns (uint256 price_) {
if (_lastUpdateTime + _MIN_HEART_BEAT < block.timestamp) {
uint256 curRate_ = _rate;
uint256 newRate_ = _getNewRate1e27();
if (newRate_ == 0) {
revert FluidOracleError(ErrorTypes.ContractRate__NewRateZero);
}
_rate = uint216(newRate_);
_lastUpdateTime = uint40(block.timestamp);
emit LogRebalanceRate(curRate_, newRate_);
}
return _rate;
}
function configPercentDiff() public view virtual returns (uint256 configPercentDiff_) {
uint256 curRate_ = _rate;
uint256 newRate_ = _getNewRate1e27();
unchecked {
if (curRate_ > newRate_) {
configPercentDiff_ = ((curRate_ - newRate_) * 1e6) / curRate_;
} else if (newRate_ > curRate_) {
configPercentDiff_ = ((newRate_ - curRate_) * 1e6) / curRate_;
}
}
}
function configData()
external
view
returns (uint256 minUpdateDiffPercent_, uint256 minHeartBeat_, uint40 lastUpdateTime_, address rateSource_)
{
return (_MIN_UPDATE_DIFF_PERCENT, _MIN_HEART_BEAT, _lastUpdateTime, _RATE_SOURCE);
}
}
文件 6 的 8:iFluidCenterPrice.sol
pragma solidity 0.8.21;
interface IFluidCenterPrice {
function centerPrice() external returns (uint256 price_);
function infoName() external view returns (string memory);
}
文件 7 的 8:iFluidOracle.sol
pragma solidity 0.8.21;
interface IFluidOracle {
function getExchangeRate() external view returns (uint256 exchangeRate_);
function getExchangeRateOperate() external view returns (uint256 exchangeRate_);
function getExchangeRateLiquidate() external view returns (uint256 exchangeRate_);
function infoName() external view returns (string memory);
}
文件 8 的 8:main.sol
pragma solidity 0.8.21;
import { IEZETHBalancerRateProvider } from "../../interfaces/external/IEZETHBalancerRateProvider.sol";
import { FluidContractRate } from "../../fluidContractRate.sol";
contract EZETHContractRate is IEZETHBalancerRateProvider, FluidContractRate {
constructor(
string memory infoName_,
address rateSource_,
uint256 minUpdateDiffPercent_,
uint256 minHeartBeat_
) FluidContractRate(infoName_, rateSource_, minUpdateDiffPercent_, minHeartBeat_) {}
function _getNewRate1e27() internal view virtual override returns (uint256 exchangeRate_) {
return IEZETHBalancerRateProvider(_RATE_SOURCE).getRate() * 1e9;
}
function getRate() external view override returns (uint256) {
return _rate / 1e9;
}
}
{
"compilationTarget": {
"contracts/oracle/contractRates/ezeth/main.sol": "EZETHContractRate"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 10000000
},
"remappings": []
}
[{"inputs":[{"internalType":"string","name":"infoName_","type":"string"},{"internalType":"address","name":"rateSource_","type":"address"},{"internalType":"uint256","name":"minUpdateDiffPercent_","type":"uint256"},{"internalType":"uint256","name":"minHeartBeat_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"errorId_","type":"uint256"}],"name":"FluidOracleError","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"LogRebalanceRate","type":"event"},{"inputs":[],"name":"centerPrice","outputs":[{"internalType":"uint256","name":"price_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configData","outputs":[{"internalType":"uint256","name":"minUpdateDiffPercent_","type":"uint256"},{"internalType":"uint256","name":"minHeartBeat_","type":"uint256"},{"internalType":"uint40","name":"lastUpdateTime_","type":"uint40"},{"internalType":"address","name":"rateSource_","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"configPercentDiff","outputs":[{"internalType":"uint256","name":"configPercentDiff_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangeRate","outputs":[{"internalType":"uint256","name":"exchangeRate_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangeRateLiquidate","outputs":[{"internalType":"uint256","name":"exchangeRate_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangeRateOperate","outputs":[{"internalType":"uint256","name":"exchangeRate_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"infoName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]