文件 1 的 2:AnchoredViewRelay.sol
pragma solidity 0.8.9;
import "../IOracleRelay.sol";
contract AnchoredViewRelay is IOracleRelay {
address public _anchorAddress;
IOracleRelay public _anchorRelay;
address public _mainAddress;
IOracleRelay public _mainRelay;
uint256 public _widthNumerator;
uint256 public _widthDenominator;
constructor(
address anchor_address,
address main_address,
uint256 widthNumerator,
uint256 widthDenominator
) {
_anchorAddress = anchor_address;
_anchorRelay = IOracleRelay(anchor_address);
_mainAddress = main_address;
_mainRelay = IOracleRelay(main_address);
_widthNumerator = widthNumerator;
_widthDenominator = widthDenominator;
}
function currentValue() external view override returns (uint256) {
return getLastSecond();
}
function getLastSecond() private view returns (uint256) {
uint256 mainValue = _mainRelay.currentValue();
require(mainValue > 0, "invalid oracle value");
uint256 anchorPrice = _anchorRelay.currentValue();
require(anchorPrice > 0, "invalid anchor value");
uint256 buffer = (_widthNumerator * anchorPrice) / _widthDenominator;
uint256 upperBounds = anchorPrice + buffer;
uint256 lowerBounds = anchorPrice - buffer;
require(mainValue < upperBounds, "anchor too low");
require(mainValue > lowerBounds, "anchor too high");
return mainValue;
}
}
文件 2 的 2:IOracleRelay.sol
pragma solidity 0.8.9;
interface IOracleRelay {
function currentValue() external view returns (uint256);
}
{
"compilationTarget": {
"contracts/oracle/Logic/AnchoredViewRelay.sol": "AnchoredViewRelay"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"anchor_address","type":"address"},{"internalType":"address","name":"main_address","type":"address"},{"internalType":"uint256","name":"widthNumerator","type":"uint256"},{"internalType":"uint256","name":"widthDenominator","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"_anchorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_anchorRelay","outputs":[{"internalType":"contract IOracleRelay","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mainAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_mainRelay","outputs":[{"internalType":"contract IOracleRelay","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_widthDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_widthNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]