编译器
0.8.18+commit.87f61d96
文件 1 的 4:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 4:GasOracle.sol
pragma solidity ^0.8.18;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IGasOracle} from "./interfaces/IGasOracle.sol";
contract GasOracle is Ownable, IGasOracle {
struct ChainData {
uint128 price;
uint128 gasPrice;
}
uint private constant ORACLE_PRECISION = 18;
uint private constant ORACLE_SCALING_FACTOR = 10 ** ORACLE_PRECISION;
uint private immutable fromOracleToChainScalingFactor;
mapping(uint chainId => ChainData) public override chainData;
uint public immutable override chainId;
constructor(uint chainId_, uint chainPrecision) {
chainId = chainId_;
fromOracleToChainScalingFactor = 10 ** (ORACLE_PRECISION - chainPrecision);
}
function setChainData(uint chainId_, uint128 price_, uint128 gasPrice) external override onlyOwner {
chainData[chainId_].price = price_;
chainData[chainId_].gasPrice = gasPrice;
}
function setPrice(uint chainId_, uint128 price_) external override onlyOwner {
chainData[chainId_].price = price_;
}
function setGasPrice(uint chainId_, uint128 gasPrice) external override onlyOwner {
chainData[chainId_].gasPrice = gasPrice;
}
function getTransactionGasCostInNativeToken(
uint otherChainId,
uint gasAmount
) external view override returns (uint) {
return
(chainData[otherChainId].gasPrice * gasAmount * chainData[otherChainId].price) /
chainData[chainId].price /
fromOracleToChainScalingFactor;
}
function getTransactionGasCostInUSD(uint otherChainId, uint gasAmount) external view override returns (uint) {
return (chainData[otherChainId].gasPrice * gasAmount * chainData[otherChainId].price) / ORACLE_SCALING_FACTOR;
}
function crossRate(uint otherChainId) external view override returns (uint) {
return (chainData[otherChainId].price * ORACLE_SCALING_FACTOR) / chainData[chainId].price;
}
function price(uint chainId_) external view override returns (uint) {
return chainData[chainId_].price;
}
fallback() external payable {
revert("Unsupported");
}
receive() external payable {
revert("Unsupported");
}
}
文件 3 的 4:IGasOracle.sol
pragma solidity ^0.8.18;
interface IGasOracle {
function chainData(uint chainId) external view returns (uint128 price, uint128 gasPrice);
function chainId() external view returns (uint);
function crossRate(uint otherChainId) external view returns (uint);
function getTransactionGasCostInNativeToken(uint otherChainId, uint256 gasAmount) external view returns (uint);
function getTransactionGasCostInUSD(uint otherChainId, uint256 gasAmount) external view returns (uint);
function price(uint chainId) external view returns (uint);
function setChainData(uint chainId, uint128 price, uint128 gasPrice) external;
function setGasPrice(uint chainId, uint128 gasPrice) external;
function setPrice(uint chainId, uint128 price) external;
}
文件 4 的 4:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
{
"compilationTarget": {
"contracts/GasOracle.sol": "GasOracle"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 1000
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"chainId_","type":"uint256"},{"internalType":"uint256","name":"chainPrecision","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"chainData","outputs":[{"internalType":"uint128","name":"price","type":"uint128"},{"internalType":"uint128","name":"gasPrice","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"otherChainId","type":"uint256"}],"name":"crossRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"otherChainId","type":"uint256"},{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"getTransactionGasCostInNativeToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"otherChainId","type":"uint256"},{"internalType":"uint256","name":"gasAmount","type":"uint256"}],"name":"getTransactionGasCostInUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId_","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId_","type":"uint256"},{"internalType":"uint128","name":"price_","type":"uint128"},{"internalType":"uint128","name":"gasPrice","type":"uint128"}],"name":"setChainData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId_","type":"uint256"},{"internalType":"uint128","name":"gasPrice","type":"uint128"}],"name":"setGasPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId_","type":"uint256"},{"internalType":"uint128","name":"price_","type":"uint128"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]