// SPDX-License-Identifier: BlueOak-1.0.0
pragma solidity 0.8.17;
import "@openzeppelin/contracts/utils/math/Math.sol";
import "../../../libraries/Fixed.sol";
import "../AppreciatingFiatCollateral.sol";
import "../OracleLib.sol";
import "./IsfrxEth.sol";
/**
* @title SFraxEthCollateral
* @notice Collateral plugin for Frax-ETH,
* tok = sfrxETH
* ref = frxETH
* tar = ETH
* UoA = USD
*/
contract SFraxEthCollateral is AppreciatingFiatCollateral {
using OracleLib for AggregatorV3Interface;
using FixLib for uint192;
// solhint-disable no-empty-blocks
/// @param config.chainlinkFeed Feed units: {UoA/target}
constructor(CollateralConfig memory config, uint192 revenueHiding)
AppreciatingFiatCollateral(config, revenueHiding)
{}
// solhint-enable no-empty-blocks
/// Can revert, used by other contract functions in order to catch errors
/// @return low {UoA/tok} The low price estimate
/// @return high {UoA/tok} The high price estimate
/// @return pegPrice {target/ref} The actual price observed in the peg
function tryPrice()
external
view
override
returns (
uint192 low,
uint192 high,
uint192 pegPrice
)
{
// {UoA/tok} = {UoA/target} * {ref/tok} * {target/ref} (1)
uint192 p = chainlinkFeed.price(oracleTimeout).mul(_underlyingRefPerTok());
uint192 err = p.mul(oracleError, CEIL);
low = p - err;
high = p + err;
// assert(low <= high); obviously true just by inspection
pegPrice = targetPerRef();
}
/// @return {ref/tok} Quantity of whole reference units per whole collateral tokens
function _underlyingRefPerTok() internal view override returns (uint192) {
uint256 rate = IsfrxEth(address(erc20)).pricePerShare();
return _safeWrap(rate);
}
}
|