编译器
0.8.15+commit.e14f2714
文件 1 的 5:ICrossDomainMessenger.sol
pragma solidity >0.5.0 <0.9.0;
interface ICrossDomainMessenger {
event SentMessage(
address indexed target,
address sender,
bytes message,
uint256 messageNonce,
uint256 gasLimit
);
event RelayedMessage(bytes32 indexed msgHash);
event FailedRelayedMessage(bytes32 indexed msgHash);
function xDomainMessageSender() external view returns (address);
function sendMessage(
address _target,
bytes calldata _message,
uint32 _gasLimit
) external;
}
文件 2 的 5:RocketNetworkBalancesInterface.sol
pragma solidity >0.5.0 <0.9.0;
interface RocketNetworkBalancesInterface {
function getBalancesBlock() external view returns (uint256);
function getLatestReportableBlock() external view returns (uint256);
function getTotalETHBalance() external view returns (uint256);
function getStakingETHBalance() external view returns (uint256);
function getTotalRETHSupply() external view returns (uint256);
function getETHUtilizationRate() external view returns (uint256);
function submitBalances(uint256 _block, uint256 _total, uint256 _staking, uint256 _rethSupply) external;
function executeUpdateBalances(uint256 _block, uint256 _totalEth, uint256 _stakingEth, uint256 _rethSupply) external;
}
文件 3 的 5:RocketOvmPriceMessenger.sol
pragma solidity ^0.8.13;
import "@rocketpool/interface/RocketStorageInterface.sol";
import "@rocketpool/interface/network/RocketNetworkBalancesInterface.sol";
import "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
import "./RocketOvmPriceOracle.sol";
contract RocketOvmPriceMessenger {
ICrossDomainMessenger immutable ovmL1CrossDomainMessenger;
RocketStorageInterface immutable rocketStorage;
RocketOvmPriceOracle immutable rocketL2OvmPriceOracle;
bytes32 immutable rocketNetworkBalancesKey;
uint256 lastRate;
constructor(RocketStorageInterface _rocketStorage, RocketOvmPriceOracle _rocketL2OvmPriceOracle, ICrossDomainMessenger _ovmL1CrossDomainMessenger) {
rocketStorage = _rocketStorage;
rocketL2OvmPriceOracle = _rocketL2OvmPriceOracle;
ovmL1CrossDomainMessenger = _ovmL1CrossDomainMessenger;
rocketNetworkBalancesKey = keccak256(abi.encodePacked("contract.address", "rocketNetworkBalances"));
}
function rateStale() external view returns (bool) {
return rate() != lastRate;
}
function rate() public view returns (uint256) {
RocketNetworkBalancesInterface rocketNetworkBalances = RocketNetworkBalancesInterface(rocketStorage.getAddress(rocketNetworkBalancesKey));
uint256 supply = rocketNetworkBalances.getTotalRETHSupply();
if (supply == 0) {
return 0;
}
return 1 ether * rocketNetworkBalances.getTotalETHBalance() / supply;
}
function submitRate() external {
lastRate = rate();
ovmL1CrossDomainMessenger.sendMessage(
address(rocketL2OvmPriceOracle),
abi.encodeWithSelector(
rocketL2OvmPriceOracle.updateRate.selector,
lastRate
),
500000
);
}
}
文件 4 的 5:RocketOvmPriceOracle.sol
pragma solidity ^0.8.13;
import "@eth-optimism/contracts/libraries/bridge/ICrossDomainMessenger.sol";
contract RocketOvmPriceOracle {
event RateUpdated(uint256 rate);
ICrossDomainMessenger immutable ovmL2CrossDomainMessenger;
uint256 public rate;
uint256 public lastUpdated;
address public owner;
constructor(address _l2CrossDomainMessenger) {
ovmL2CrossDomainMessenger = ICrossDomainMessenger(_l2CrossDomainMessenger);
owner = msg.sender;
}
function setOwner(address _newOwner) external {
require(msg.sender == owner, "Only owner");
owner = _newOwner;
}
function updateRate(uint256 _newRate) external {
require(
msg.sender == address(ovmL2CrossDomainMessenger)
&& ovmL2CrossDomainMessenger.xDomainMessageSender() == owner,
"Only owner"
);
rate = _newRate;
lastUpdated = block.timestamp;
emit RateUpdated(_newRate);
}
}
文件 5 的 5:RocketStorageInterface.sol
pragma solidity >0.5.0 <0.9.0;
interface RocketStorageInterface {
function getDeployedStatus() external view returns (bool);
function getGuardian() external view returns(address);
function setGuardian(address _newAddress) external;
function confirmGuardian() external;
function getAddress(bytes32 _key) external view returns (address);
function getUint(bytes32 _key) external view returns (uint);
function getString(bytes32 _key) external view returns (string memory);
function getBytes(bytes32 _key) external view returns (bytes memory);
function getBool(bytes32 _key) external view returns (bool);
function getInt(bytes32 _key) external view returns (int);
function getBytes32(bytes32 _key) external view returns (bytes32);
function setAddress(bytes32 _key, address _value) external;
function setUint(bytes32 _key, uint _value) external;
function setString(bytes32 _key, string calldata _value) external;
function setBytes(bytes32 _key, bytes calldata _value) external;
function setBool(bytes32 _key, bool _value) external;
function setInt(bytes32 _key, int _value) external;
function setBytes32(bytes32 _key, bytes32 _value) external;
function deleteAddress(bytes32 _key) external;
function deleteUint(bytes32 _key) external;
function deleteString(bytes32 _key) external;
function deleteBytes(bytes32 _key) external;
function deleteBool(bytes32 _key) external;
function deleteInt(bytes32 _key) external;
function deleteBytes32(bytes32 _key) external;
function addUint(bytes32 _key, uint256 _amount) external;
function subUint(bytes32 _key, uint256 _amount) external;
function getNodeWithdrawalAddress(address _nodeAddress) external view returns (address);
function getNodePendingWithdrawalAddress(address _nodeAddress) external view returns (address);
function setWithdrawalAddress(address _nodeAddress, address _newWithdrawalAddress, bool _confirm) external;
function confirmWithdrawalAddress(address _nodeAddress) external;
}
{
"compilationTarget": {
"src/RocketOvmPriceMessenger.sol": "RocketOvmPriceMessenger"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": [
":@eth-optimism/=lib/optimism/packages/contracts/",
":@rocketpool/=lib/rocketpool/contracts/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
":forge-std/=lib/forge-std/src/",
":fx-portal/=lib/fx-portal/contracts/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
":optimism/=lib/optimism/",
":rocketpool/=lib/rocketpool/",
":src/=src/",
":test/=test/",
":v2-testnet-contracts/=lib/v2-testnet-contracts/"
]
}
[{"inputs":[{"internalType":"contract RocketStorageInterface","name":"_rocketStorage","type":"address"},{"internalType":"contract RocketOvmPriceOracle","name":"_rocketL2OvmPriceOracle","type":"address"},{"internalType":"contract ICrossDomainMessenger","name":"_ovmL1CrossDomainMessenger","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateStale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"submitRate","outputs":[],"stateMutability":"nonpayable","type":"function"}]