Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
EOFeedManager
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 10000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; import { OwnableUpgradeable } from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import { Initializable } from "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; import { IEOFeedVerifier } from "./interfaces/IEOFeedVerifier.sol"; import { IEOFeedManager } from "./interfaces/IEOFeedManager.sol"; import { InvalidAddress, CallerIsNotWhitelisted, MissingLeafInputs, FeedNotSupported, SymbolReplay } from "./interfaces/Errors.sol"; /** * @title EOFeedManager * @notice The EOFeedManager contract is responsible for receiving feed updates from whitelisted publishers. These * updates are verified using the logic in the EOFeedVerifier. Upon successful verification, the feed data is stored in * the EOFeedManager and made available for other smart contracts to read. Only supported feed IDs can be published to * the feed manager. */ contract EOFeedManager is Initializable, OwnableUpgradeable, IEOFeedManager { /// @dev Map of feed id to price feed (feed id => PriceFeed) mapping(uint16 => PriceFeed) internal _priceFeeds; /// @dev Map of whitelisted publishers (publisher => is whitelisted) mapping(address => bool) internal _whitelistedPublishers; /// @dev Map of supported feeds, (feed id => is supported) mapping(uint16 => bool) internal _supportedFeedIds; /// @dev feed verifier contract IEOFeedVerifier internal _feedVerifier; /// @dev Allows only whitelisted publishers to call the function modifier onlyWhitelisted() { if (!_whitelistedPublishers[msg.sender]) revert CallerIsNotWhitelisted(msg.sender); _; } /// @dev Allows only non-zero addresses modifier onlyNonZeroAddress(address addr) { if (addr == address(0)) revert InvalidAddress(); _; } /** * @notice Initialize the contract with the feed verifier address * @dev The feed verifier contract must be deployed first * @param feedVerifier Address of the feed verifier contract * @param owner Owner of the contract */ function initialize(address feedVerifier, address owner) external onlyNonZeroAddress(feedVerifier) initializer { __Ownable_init(owner); _feedVerifier = IEOFeedVerifier(feedVerifier); } /** * @notice Set the feed verifier contract address * @param feedVerifier Address of the feed verifier contract */ function setFeedVerifier(address feedVerifier) external onlyOwner onlyNonZeroAddress(feedVerifier) { _feedVerifier = IEOFeedVerifier(feedVerifier); } /** * @notice Set the supported feeds * @param feedIds Array of feed ids * @param isSupported Array of booleans indicating whether the feed is supported */ function setSupportedFeeds(uint16[] calldata feedIds, bool[] calldata isSupported) external onlyOwner { for (uint256 i = 0; i < feedIds.length; i++) { _supportedFeedIds[feedIds[i]] = isSupported[i]; } } /** * @inheritdoc IEOFeedManager */ function whitelistPublishers(address[] memory publishers, bool[] memory isWhitelisted) external onlyOwner { for (uint256 i = 0; i < publishers.length; i++) { if (publishers[i] == address(0)) revert InvalidAddress(); _whitelistedPublishers[publishers[i]] = isWhitelisted[i]; } } /** * @inheritdoc IEOFeedManager */ // Reentrancy is not an issue because _feedVerifier is set by the owner // slither-disable-next-line reentrancy-benign,reentrancy-events function updatePriceFeed( IEOFeedVerifier.LeafInput memory input, IEOFeedVerifier.Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external onlyWhitelisted { bytes memory data = _feedVerifier.verify(input, checkpoint, signature, bitmap); _processVerifiedRate(data, checkpoint.blockNumber); } /** * @inheritdoc IEOFeedManager */ // Reentrancy is not an issue because _feedVerifier is set by the owner // slither-disable-next-line reentrancy-benign,reentrancy-events function updatePriceFeeds( IEOFeedVerifier.LeafInput[] calldata inputs, IEOFeedVerifier.Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external onlyWhitelisted { if (inputs.length == 0) revert MissingLeafInputs(); bytes[] memory data = _feedVerifier.batchVerify(inputs, checkpoint, signature, bitmap); for (uint256 i = 0; i < data.length; i++) { _processVerifiedRate(data[i], checkpoint.blockNumber); } } /** * @inheritdoc IEOFeedManager */ function getLatestPriceFeed(uint16 feedId) external view returns (PriceFeed memory) { return _getLatestPriceFeed(feedId); } /** * @inheritdoc IEOFeedManager */ function getLatestPriceFeeds(uint16[] calldata feedIds) external view returns (PriceFeed[] memory) { PriceFeed[] memory retVal = new PriceFeed[](feedIds.length); for (uint256 i = 0; i < feedIds.length; i++) { retVal[i] = _getLatestPriceFeed(feedIds[i]); } return retVal; } /** * @inheritdoc IEOFeedManager */ function isWhitelistedPublisher(address publisher) external view returns (bool) { return _whitelistedPublishers[publisher]; } /** * @inheritdoc IEOFeedManager */ function isSupportedFeed(uint16 feedId) external view returns (bool) { return _supportedFeedIds[feedId]; } /** * @notice Get the feed verifier contract address * @return Address of the feed verifier contract */ function getFeedVerifier() external view returns (IEOFeedVerifier) { return _feedVerifier; } /** * @notice Process the verified rate, check and save it * @param data Verified rate data, abi encoded (uint16 feedId, uint256 rate, uint256 timestamp) * @param blockNumber eoracle chain block number */ function _processVerifiedRate(bytes memory data, uint256 blockNumber) internal { (uint16 feedId, uint256 rate, uint256 timestamp) = abi.decode(data, (uint16, uint256, uint256)); if (!_supportedFeedIds[feedId]) revert FeedNotSupported(feedId); if (_priceFeeds[feedId].timestamp >= timestamp) revert SymbolReplay(feedId); _priceFeeds[feedId] = PriceFeed(rate, timestamp, blockNumber); emit RateUpdated(feedId, rate, timestamp); } //1716948831 / 41/ sc //1717425992 /** * @notice Get the latest price feed * @param feedId Feed id * @return PriceFeed struct */ function _getLatestPriceFeed(uint16 feedId) internal view returns (PriceFeed memory) { if (!_supportedFeedIds[feedId]) revert FeedNotSupported(feedId); return _priceFeeds[feedId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { OwnableStorage storage $ = _getOwnableStorage(); return $._owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.20; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; interface IEOFeedVerifier { /** * @dev Leaf input structure * @param leafIndex Index of the leaf * @param unhashedLeaf Unhashed leaf data * abi encoded (uint256 id, address sender, address receiver, bytes memory data) * where bytes memory data = abi encoded (uint16 feedId, uint256 rate, uint256 timestamp) * @param proof Merkle proof of the leaf */ struct LeafInput { uint256 leafIndex; bytes unhashedLeaf; bytes32[] proof; } /** * @dev Checkpoint structure * @param epoch Epoch number * @param blockNumber Block number * @param eventRoot Event root of the merkle tree * @param blockHash Block hash * @param blockRound Block round */ struct Checkpoint { uint256 epoch; uint256 blockNumber; bytes32 eventRoot; bytes32 blockHash; uint256 blockRound; } /** * @dev Validator structure * @param _address Validator address * @param blsKey Validator BLS key * @param votingPower Validator voting power */ struct Validator { address _address; uint256[4] blsKey; uint256 votingPower; } /** * @dev Event emitted when the validator set is updated * @param currentValidatorSetLength Length of the current validator set * @param currentValidatorSetHash Hash of the current validator set * @param totalVotingPower Total voting power of the current validator set */ event ValidatorSetUpdated( uint256 currentValidatorSetLength, bytes32 currentValidatorSetHash, uint256 totalVotingPower ); /** * @dev Event emitted when the feed manager is set * @param feedManager Address of the feed manager */ event FeedManagerSet(address feedManager); /** * @notice Verifies leaf, processes checkpoint, * returns leaf data in case if checkpoint is valid and leaf is part of the merkle tree * @param input leaf input data and proof (LeafInput) * @param checkpoint Checkpoint data (Checkpoint) * @param signature Aggregated signature of the checkpoint * @param bitmap Bitmap of the validators who signed the checkpoint * @return leafData Leaf data, abi encoded (uint16 feedId, uint256 rate, uint256 timestamp) */ function verify( LeafInput memory input, Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external returns (bytes memory leafData); /** * @notice Verifies multiple leaves, processes checkpoint, * returns leaf data in case if checkpoint is valid and leaves are part of the merkle tree * @param inputs Exit leaves inputs * @param checkpoint Checkpoint data * @param signature Aggregated signature of the checkpoint * @param bitmap Bitmap of the validators who signed the checkpoint */ function batchVerify( LeafInput[] memory inputs, Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external returns (bytes[] memory); /** * @notice Function to set a new validator set * @param newValidatorSet The new validator set to store */ function setNewValidatorSet(Validator[] calldata newValidatorSet) external; /** * @notice Sets the address of the feed manager. * @param feedManager_ The address of the new feed manager. */ function setFeedManager(address feedManager_) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; import { IEOFeedVerifier } from "./IEOFeedVerifier.sol"; interface IEOFeedManager { /** * @dev Price feed structure * @param value Price feed value * @param timestamp Price feed timestamp (block timestamp in eoracle chain when price feed rate is aggregated) * @param eoracleBlockNumber eoracle block number */ struct PriceFeed { uint256 value; uint256 timestamp; uint256 eoracleBlockNumber; } /** * @dev Event emitted when a price feed is updated * @param feedId Feed id * @param rate Price feed value * @param timestamp Price feed timestamp */ event RateUpdated(uint16 indexed feedId, uint256 rate, uint256 timestamp); /** * @notice Update the price for a feed * @param input A merkle leaf containing price data and its merkle proof * @param checkpoint Checkpoint data containing eoracle chain metadata and the data merkle root * @param signature Aggregated signature of the checkpoint * @param bitmap Bitmap of the validators who signed the checkpoint */ function updatePriceFeed( IEOFeedVerifier.LeafInput calldata input, IEOFeedVerifier.Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external; /** * @notice Update the price for multiple feeds * @param inputs Array of leafs to prove the price feeds * @param checkpoint Checkpoint data * @param signature Aggregated signature of the checkpoint * @param bitmap Bitmap of the validators who signed the checkpoint */ function updatePriceFeeds( IEOFeedVerifier.LeafInput[] calldata inputs, IEOFeedVerifier.Checkpoint calldata checkpoint, uint256[2] calldata signature, bytes calldata bitmap ) external; /** * @notice Set the whitelisted publishers * @param publishers Array of publisher addresses * @param isWhitelisted Array of booleans indicating whether the publisher is whitelisted */ function whitelistPublishers(address[] memory publishers, bool[] memory isWhitelisted) external; /** * @notice Get the latest price for a feed * @param feedId Feed id * @return PriceFeed struct */ function getLatestPriceFeed(uint16 feedId) external view returns (PriceFeed memory); /** * @notice Get the latest price feeds for multiple feeds * @param feedIds Array of feed ids * @return Array of PriceFeed structs */ function getLatestPriceFeeds(uint16[] calldata feedIds) external view returns (PriceFeed[] memory); /** * @notice Check if a publisher is whitelisted * @param publisher Address of the publisher * @return Boolean indicating whether the publisher is whitelisted */ function isWhitelistedPublisher(address publisher) external view returns (bool); /** * @notice Check if a feed is supported * @param feedId feed Id to check * @return Boolean indicating whether the feed is supported */ function isSupportedFeed(uint16 feedId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; /*////////////////////////////////////////////////////////////////////////// EOFeedManager //////////////////////////////////////////////////////////////////////////*/ error CallerIsNotWhitelisted(address caller); error MissingLeafInputs(); error FeedNotSupported(uint16 feedId); error SymbolReplay(uint16 feedId); /*////////////////////////////////////////////////////////////////////////// EOFeedVerifier //////////////////////////////////////////////////////////////////////////*/ error CallerIsNotFeedManager(); error InvalidProof(); error InvalidAddress(); error InvalidEventRoot(); error VotingPowerIsZero(); error AggVotingPowerIsZero(); error InsufficientVotingPower(); error SignatureVerificationFailed(); /*////////////////////////////////////////////////////////////////////////// EOFeedRegistryAdapter //////////////////////////////////////////////////////////////////////////*/ error FeedAlreadyExists(); error BaseQuotePairExists();
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
{ "remappings": [ "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/", "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/", "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/" ], "optimizer": { "enabled": true, "runs": 10000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
[{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CallerIsNotWhitelisted","type":"error"},{"inputs":[{"internalType":"uint16","name":"feedId","type":"uint16"}],"name":"FeedNotSupported","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"MissingLeafInputs","type":"error"},{"inputs":[],"name":"NotInitializing","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"uint16","name":"feedId","type":"uint16"}],"name":"SymbolReplay","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"feedId","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RateUpdated","type":"event"},{"inputs":[],"name":"getFeedVerifier","outputs":[{"internalType":"contract IEOFeedVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"feedId","type":"uint16"}],"name":"getLatestPriceFeed","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"eoracleBlockNumber","type":"uint256"}],"internalType":"struct IEOFeedManager.PriceFeed","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"feedIds","type":"uint16[]"}],"name":"getLatestPriceFeeds","outputs":[{"components":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"eoracleBlockNumber","type":"uint256"}],"internalType":"struct IEOFeedManager.PriceFeed[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feedVerifier","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"feedId","type":"uint16"}],"name":"isSupportedFeed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"publisher","type":"address"}],"name":"isWhitelistedPublisher","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feedVerifier","type":"address"}],"name":"setFeedVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16[]","name":"feedIds","type":"uint16[]"},{"internalType":"bool[]","name":"isSupported","type":"bool[]"}],"name":"setSupportedFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"leafIndex","type":"uint256"},{"internalType":"bytes","name":"unhashedLeaf","type":"bytes"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct IEOFeedVerifier.LeafInput","name":"input","type":"tuple"},{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"eventRoot","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"uint256","name":"blockRound","type":"uint256"}],"internalType":"struct IEOFeedVerifier.Checkpoint","name":"checkpoint","type":"tuple"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"updatePriceFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"leafIndex","type":"uint256"},{"internalType":"bytes","name":"unhashedLeaf","type":"bytes"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct IEOFeedVerifier.LeafInput[]","name":"inputs","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"epoch","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"eventRoot","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"uint256","name":"blockRound","type":"uint256"}],"internalType":"struct IEOFeedVerifier.Checkpoint","name":"checkpoint","type":"tuple"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"bytes","name":"bitmap","type":"bytes"}],"name":"updatePriceFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"publishers","type":"address[]"},{"internalType":"bool[]","name":"isWhitelisted","type":"bool[]"}],"name":"whitelistPublishers","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052348015600f57600080fd5b50611ada8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063b1fd0f1c11610066578063b1fd0f1c1461024b578063c33d68ff1461025e578063cbc2483b1461027c578063f2fde38b1461029c57600080fd5b80638da5cb5b146101a157806392d82f22146101ff578063969b01061461021257600080fd5b8063485cc955116100c8578063485cc9551461016057806357ffc861146101735780636a7fc0c514610186578063715018a61461019957600080fd5b80630ef3734f146100ef57806321c7b4791461010457806338e98c6914610140575b600080fd5b6101026100fd366004611035565b6102af565b005b61012b610112366004611105565b61ffff1660009081526002602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61015361014e366004611175565b6103dc565b60405161013791906111b7565b61010261016e366004611219565b6104ba565b6101026101813660046112b7565b6106ca565b6101026101943660046113d6565b61083a565b610102610943565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610137565b61010261020d3660046114fe565b610957565b61012b6102203660046114fe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b610102610259366004611519565b6109f5565b60035473ffffffffffffffffffffffffffffffffffffffff166101da565b61028f61028a366004611105565b610aaa565b6040516101379190611585565b6101026102aa3660046114fe565b610ad7565b6102b7610b3b565b60005b82518110156103d757600073ffffffffffffffffffffffffffffffffffffffff168382815181106102ed576102ed6115a6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610342576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610354576103546115a6565b602002602001015160016000858481518110610372576103726115a6565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016102ba565b505050565b606060008267ffffffffffffffff8111156103f9576103f9610ed9565b60405190808252806020026020018201604052801561044e57816020015b61043b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816104175790505b50905060005b838110156104b05761048b858583818110610471576104716115a6565b90506020020160208101906104869190611105565b610bc9565b82828151811061049d5761049d6115a6565b6020908102919091010152600101610454565b5090505b92915050565b8173ffffffffffffffffffffffffffffffffffffffff8116610508576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105535750825b905060008267ffffffffffffffff1660011480156105705750303b155b90508115801561057e575080155b156105b5576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156106165784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61061f87610c7b565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905583156106c05784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b3360009081526001602052604090205460ff1661071a576040517f84d38f930000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6000859003610755576040517f1a0a55b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517fd845f9c200000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063d845f9c2906107b6908a908a908a908a908a908a90600401611654565b6000604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107fd919081019061189e565b905060005b81518110156106c057610832828281518110610820576108206115a6565b60200260200101518760200135610c8c565b600101610802565b3360009081526001602052604090205460ff16610885576040517f84d38f93000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b6003546040517f88688cfb00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906388688cfb906108e4908990899089908990899060040161194f565b6000604051808303816000875af1158015610903573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261092b9190810190611a46565b905061093b818660200135610c8c565b505050505050565b61094b610b3b565b6109556000610dd4565b565b61095f610b3b565b8073ffffffffffffffffffffffffffffffffffffffff81166109ad576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109fd610b3b565b60005b83811015610aa357828282818110610a1a57610a1a6115a6565b9050602002016020810190610a2f9190611a7b565b60026000878785818110610a4557610a456115a6565b9050602002016020810190610a5a9190611105565b61ffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610a00565b5050505050565b610ace60405180606001604052806000815260200160008152602001600081525090565b6104b482610bc9565b610adf610b3b565b73ffffffffffffffffffffffffffffffffffffffff8116610b2f576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610711565b610b3881610dd4565b50565b33610b7a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610955576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b610bed60405180606001604052806000815260200160008152602001600081525090565b61ffff821660009081526002602052604090205460ff16610c40576040517f02b98f2900000000000000000000000000000000000000000000000000000000815261ffff83166004820152602401610711565b5061ffff1660009081526020818152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b610c83610e6a565b610b3881610ed1565b600080600084806020019051810190610ca59190611a96565b61ffff8316600090815260026020526040902054929550909350915060ff16610d00576040517f02b98f2900000000000000000000000000000000000000000000000000000000815261ffff84166004820152602401610711565b61ffff83166000908152602081905260409020600101548111610d55576040517f0b0ca61700000000000000000000000000000000000000000000000000000000815261ffff84166004820152602401610711565b60408051606081018252838152602080820184815282840188815261ffff88166000818152808552869020945185559151600185015551600290930192909255825185815290810184905290917fc76854b213bc5c9d5de46c929a6d0dbee4dfcf688f88b51aa24c9a16cac3c8aa910160405180910390a25050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610955576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610adf610e6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610f2b57610f2b610ed9565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5a57610f5a610ed9565b604052919050565b600067ffffffffffffffff821115610f7c57610f7c610ed9565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114610faa57600080fd5b919050565b80358015158114610faa57600080fd5b600082601f830112610fd057600080fd5b81356020610fe5610fe083610f62565b610f31565b8083825260208201915060208460051b87010193508684111561100757600080fd5b602086015b8481101561102a5761101d81610faf565b835291830191830161100c565b509695505050505050565b6000806040838503121561104857600080fd5b823567ffffffffffffffff8082111561106057600080fd5b818501915085601f83011261107457600080fd5b81356020611084610fe083610f62565b82815260059290921b840181019181810190898411156110a357600080fd5b948201945b838610156110c8576110b986610f86565b825294820194908201906110a8565b965050860135925050808211156110de57600080fd5b506110eb85828601610fbf565b9150509250929050565b61ffff81168114610b3857600080fd5b60006020828403121561111757600080fd5b8135611122816110f5565b9392505050565b60008083601f84011261113b57600080fd5b50813567ffffffffffffffff81111561115357600080fd5b6020830191508360208260051b850101111561116e57600080fd5b9250929050565b6000806020838503121561118857600080fd5b823567ffffffffffffffff81111561119f57600080fd5b6111ab85828601611129565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561120d576111fa8385518051825260208082015190830152604090810151910152565b92840192606092909201916001016111d3565b50909695505050505050565b6000806040838503121561122c57600080fd5b61123583610f86565b915061124360208401610f86565b90509250929050565b600060a0828403121561125e57600080fd5b50919050565b80604081018310156104b457600080fd5b60008083601f84011261128757600080fd5b50813567ffffffffffffffff81111561129f57600080fd5b60208301915083602082850101111561116e57600080fd5b60008060008060008061012087890312156112d157600080fd5b863567ffffffffffffffff808211156112e957600080fd5b6112f58a838b01611129565b909850965086915061130a8a60208b0161124c565b95506113198a60c08b01611264565b945061010089013591508082111561133057600080fd5b5061133d89828a01611275565b979a9699509497509295939492505050565b600067ffffffffffffffff82111561136957611369610ed9565b50601f01601f191660200190565b600082601f83011261138857600080fd5b81356020611398610fe083610f62565b8083825260208201915060208460051b8701019350868411156113ba57600080fd5b602086015b8481101561102a57803583529183019183016113bf565b600080600080600061012086880312156113ef57600080fd5b853567ffffffffffffffff8082111561140757600080fd5b908701906060828a03121561141b57600080fd5b611423610f08565b823581526020808401358381111561143a57600080fd5b8401601f81018c1361144b57600080fd5b8035611459610fe08261134f565b8181528d8483850101111561146d57600080fd5b81848401858301376000848383010152808486015250505060408401358381111561149757600080fd5b6114a38c828701611377565b6040840152508198506114b88b828c0161124c565b975050506114c98960c08a01611264565b94506101008801359150808211156114e057600080fd5b506114ed88828901611275565b969995985093965092949392505050565b60006020828403121561151057600080fd5b61112282610f86565b6000806000806040858703121561152f57600080fd5b843567ffffffffffffffff8082111561154757600080fd5b61155388838901611129565b9096509450602087013591508082111561156c57600080fd5b5061157987828801611129565b95989497509550505050565b815181526020808301519082015260408083015190820152606081016104b4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561163257600080fd5b8260051b80836020870137939093016020019392505050565b60408183375050565b6101208082528101869052600061014080830190600589811b8501909101908a845b8b8110156117c3577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec087850301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18e36030181126116d757600080fd5b8d01803585526060602080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10180821261171757600080fd5b90840182810191903567ffffffffffffffff8082111561173657600080fd5b81360384131561174557600080fd5b85858c0152611757868c0183866115d5565b95506040935083870135915082821261176f57600080fd5b95810184810196903592508083111561178757600080fd5b505080881b360385131561179a57600080fd5b888403828a01526117ac848287611600565b998301999850505093909301925050600101611676565b5050506117fe602085018980358252602081013560208301526040810135604083015260608101356060830152608081013560808301525050565b61180b60c085018861164b565b83810361010085015261181f8186886115d5565b9a9950505050505050505050565b60005b83811015611848578181015183820152602001611830565b50506000910152565b600082601f83011261186257600080fd5b8151611870610fe08261134f565b81815284602083860101111561188557600080fd5b61189682602083016020870161182d565b949350505050565b600060208083850312156118b157600080fd5b825167ffffffffffffffff808211156118c957600080fd5b818501915085601f8301126118dd57600080fd5b81516118eb610fe082610f62565b81815260059190911b8301840190848101908883111561190a57600080fd5b8585015b83811015611942578051858111156119265760008081fd5b6119348b89838a0101611851565b84525091860191860161190e565b5098975050505050505050565b60006101208083528751818401525060208088015160606101408501528051806101808601526101a06119878282880186860161182d565b60408b0151601f92909201601f1916860186810360800161016088015282519181018290528483019350600092916101c0909101905b808410156119dd57845182529385019360019390930192908501906119bd565b50611a158588018c80358252602081013560208301526040810135604083015260608101356060830152608081013560808301525050565b611a2260c088018b61164b565b868103610100880152611a3681898b6115d5565b9c9b505050505050505050505050565b600060208284031215611a5857600080fd5b815167ffffffffffffffff811115611a6f57600080fd5b61189684828501611851565b600060208284031215611a8d57600080fd5b61112282610faf565b600080600060608486031215611aab57600080fd5b8351611ab6816110f5565b60208501516040909501519096949550939250505056fea164736f6c6343000819000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c80638da5cb5b1161008c578063b1fd0f1c11610066578063b1fd0f1c1461024b578063c33d68ff1461025e578063cbc2483b1461027c578063f2fde38b1461029c57600080fd5b80638da5cb5b146101a157806392d82f22146101ff578063969b01061461021257600080fd5b8063485cc955116100c8578063485cc9551461016057806357ffc861146101735780636a7fc0c514610186578063715018a61461019957600080fd5b80630ef3734f146100ef57806321c7b4791461010457806338e98c6914610140575b600080fd5b6101026100fd366004611035565b6102af565b005b61012b610112366004611105565b61ffff1660009081526002602052604090205460ff1690565b60405190151581526020015b60405180910390f35b61015361014e366004611175565b6103dc565b60405161013791906111b7565b61010261016e366004611219565b6104ba565b6101026101813660046112b7565b6106ca565b6101026101943660046113d6565b61083a565b610102610943565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610137565b61010261020d3660046114fe565b610957565b61012b6102203660046114fe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b610102610259366004611519565b6109f5565b60035473ffffffffffffffffffffffffffffffffffffffff166101da565b61028f61028a366004611105565b610aaa565b6040516101379190611585565b6101026102aa3660046114fe565b610ad7565b6102b7610b3b565b60005b82518110156103d757600073ffffffffffffffffffffffffffffffffffffffff168382815181106102ed576102ed6115a6565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610342576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818181518110610354576103546115a6565b602002602001015160016000858481518110610372576103726115a6565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016102ba565b505050565b606060008267ffffffffffffffff8111156103f9576103f9610ed9565b60405190808252806020026020018201604052801561044e57816020015b61043b60405180606001604052806000815260200160008152602001600081525090565b8152602001906001900390816104175790505b50905060005b838110156104b05761048b858583818110610471576104716115a6565b90506020020160208101906104869190611105565b610bc9565b82828151811061049d5761049d6115a6565b6020908102919091010152600101610454565b5090505b92915050565b8173ffffffffffffffffffffffffffffffffffffffff8116610508576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156105535750825b905060008267ffffffffffffffff1660011480156105705750303b155b90508115801561057e575080155b156105b5576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156106165784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61061f87610c7b565b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a1617905583156106c05784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b5050505050505050565b3360009081526001602052604090205460ff1661071a576040517f84d38f930000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b6000859003610755576040517f1a0a55b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517fd845f9c200000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063d845f9c2906107b6908a908a908a908a908a908a90600401611654565b6000604051808303816000875af11580156107d5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526107fd919081019061189e565b905060005b81518110156106c057610832828281518110610820576108206115a6565b60200260200101518760200135610c8c565b600101610802565b3360009081526001602052604090205460ff16610885576040517f84d38f93000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b6003546040517f88688cfb00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff16906388688cfb906108e4908990899089908990899060040161194f565b6000604051808303816000875af1158015610903573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261092b9190810190611a46565b905061093b818660200135610c8c565b505050505050565b61094b610b3b565b6109556000610dd4565b565b61095f610b3b565b8073ffffffffffffffffffffffffffffffffffffffff81166109ad576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109fd610b3b565b60005b83811015610aa357828282818110610a1a57610a1a6115a6565b9050602002016020810190610a2f9190611a7b565b60026000878785818110610a4557610a456115a6565b9050602002016020810190610a5a9190611105565b61ffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610a00565b5050505050565b610ace60405180606001604052806000815260200160008152602001600081525090565b6104b482610bc9565b610adf610b3b565b73ffffffffffffffffffffffffffffffffffffffff8116610b2f576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610711565b610b3881610dd4565b50565b33610b7a7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610955576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610711565b610bed60405180606001604052806000815260200160008152602001600081525090565b61ffff821660009081526002602052604090205460ff16610c40576040517f02b98f2900000000000000000000000000000000000000000000000000000000815261ffff83166004820152602401610711565b5061ffff1660009081526020818152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b610c83610e6a565b610b3881610ed1565b600080600084806020019051810190610ca59190611a96565b61ffff8316600090815260026020526040902054929550909350915060ff16610d00576040517f02b98f2900000000000000000000000000000000000000000000000000000000815261ffff84166004820152602401610711565b61ffff83166000908152602081905260409020600101548111610d55576040517f0b0ca61700000000000000000000000000000000000000000000000000000000815261ffff84166004820152602401610711565b60408051606081018252838152602080820184815282840188815261ffff88166000818152808552869020945185559151600185015551600290930192909255825185815290810184905290917fc76854b213bc5c9d5de46c929a6d0dbee4dfcf688f88b51aa24c9a16cac3c8aa910160405180910390a25050505050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610955576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610adf610e6a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040516060810167ffffffffffffffff81118282101715610f2b57610f2b610ed9565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715610f5a57610f5a610ed9565b604052919050565b600067ffffffffffffffff821115610f7c57610f7c610ed9565b5060051b60200190565b803573ffffffffffffffffffffffffffffffffffffffff81168114610faa57600080fd5b919050565b80358015158114610faa57600080fd5b600082601f830112610fd057600080fd5b81356020610fe5610fe083610f62565b610f31565b8083825260208201915060208460051b87010193508684111561100757600080fd5b602086015b8481101561102a5761101d81610faf565b835291830191830161100c565b509695505050505050565b6000806040838503121561104857600080fd5b823567ffffffffffffffff8082111561106057600080fd5b818501915085601f83011261107457600080fd5b81356020611084610fe083610f62565b82815260059290921b840181019181810190898411156110a357600080fd5b948201945b838610156110c8576110b986610f86565b825294820194908201906110a8565b965050860135925050808211156110de57600080fd5b506110eb85828601610fbf565b9150509250929050565b61ffff81168114610b3857600080fd5b60006020828403121561111757600080fd5b8135611122816110f5565b9392505050565b60008083601f84011261113b57600080fd5b50813567ffffffffffffffff81111561115357600080fd5b6020830191508360208260051b850101111561116e57600080fd5b9250929050565b6000806020838503121561118857600080fd5b823567ffffffffffffffff81111561119f57600080fd5b6111ab85828601611129565b90969095509350505050565b6020808252825182820181905260009190848201906040850190845b8181101561120d576111fa8385518051825260208082015190830152604090810151910152565b92840192606092909201916001016111d3565b50909695505050505050565b6000806040838503121561122c57600080fd5b61123583610f86565b915061124360208401610f86565b90509250929050565b600060a0828403121561125e57600080fd5b50919050565b80604081018310156104b457600080fd5b60008083601f84011261128757600080fd5b50813567ffffffffffffffff81111561129f57600080fd5b60208301915083602082850101111561116e57600080fd5b60008060008060008061012087890312156112d157600080fd5b863567ffffffffffffffff808211156112e957600080fd5b6112f58a838b01611129565b909850965086915061130a8a60208b0161124c565b95506113198a60c08b01611264565b945061010089013591508082111561133057600080fd5b5061133d89828a01611275565b979a9699509497509295939492505050565b600067ffffffffffffffff82111561136957611369610ed9565b50601f01601f191660200190565b600082601f83011261138857600080fd5b81356020611398610fe083610f62565b8083825260208201915060208460051b8701019350868411156113ba57600080fd5b602086015b8481101561102a57803583529183019183016113bf565b600080600080600061012086880312156113ef57600080fd5b853567ffffffffffffffff8082111561140757600080fd5b908701906060828a03121561141b57600080fd5b611423610f08565b823581526020808401358381111561143a57600080fd5b8401601f81018c1361144b57600080fd5b8035611459610fe08261134f565b8181528d8483850101111561146d57600080fd5b81848401858301376000848383010152808486015250505060408401358381111561149757600080fd5b6114a38c828701611377565b6040840152508198506114b88b828c0161124c565b975050506114c98960c08a01611264565b94506101008801359150808211156114e057600080fd5b506114ed88828901611275565b969995985093965092949392505050565b60006020828403121561151057600080fd5b61112282610f86565b6000806000806040858703121561152f57600080fd5b843567ffffffffffffffff8082111561154757600080fd5b61155388838901611129565b9096509450602087013591508082111561156c57600080fd5b5061157987828801611129565b95989497509550505050565b815181526020808301519082015260408083015190820152606081016104b4565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83111561163257600080fd5b8260051b80836020870137939093016020019392505050565b60408183375050565b6101208082528101869052600061014080830190600589811b8501909101908a845b8b8110156117c3577ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec087850301855281357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18e36030181126116d757600080fd5b8d01803585526060602080830135368490037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe10180821261171757600080fd5b90840182810191903567ffffffffffffffff8082111561173657600080fd5b81360384131561174557600080fd5b85858c0152611757868c0183866115d5565b95506040935083870135915082821261176f57600080fd5b95810184810196903592508083111561178757600080fd5b505080881b360385131561179a57600080fd5b888403828a01526117ac848287611600565b998301999850505093909301925050600101611676565b5050506117fe602085018980358252602081013560208301526040810135604083015260608101356060830152608081013560808301525050565b61180b60c085018861164b565b83810361010085015261181f8186886115d5565b9a9950505050505050505050565b60005b83811015611848578181015183820152602001611830565b50506000910152565b600082601f83011261186257600080fd5b8151611870610fe08261134f565b81815284602083860101111561188557600080fd5b61189682602083016020870161182d565b949350505050565b600060208083850312156118b157600080fd5b825167ffffffffffffffff808211156118c957600080fd5b818501915085601f8301126118dd57600080fd5b81516118eb610fe082610f62565b81815260059190911b8301840190848101908883111561190a57600080fd5b8585015b83811015611942578051858111156119265760008081fd5b6119348b89838a0101611851565b84525091860191860161190e565b5098975050505050505050565b60006101208083528751818401525060208088015160606101408501528051806101808601526101a06119878282880186860161182d565b60408b0151601f92909201601f1916860186810360800161016088015282519181018290528483019350600092916101c0909101905b808410156119dd57845182529385019360019390930192908501906119bd565b50611a158588018c80358252602081013560208301526040810135604083015260608101356060830152608081013560808301525050565b611a2260c088018b61164b565b868103610100880152611a3681898b6115d5565b9c9b505050505050505050505050565b600060208284031215611a5857600080fd5b815167ffffffffffffffff811115611a6f57600080fd5b61189684828501611851565b600060208284031215611a8d57600080fd5b61112282610faf565b600080600060608486031215611aab57600080fd5b8351611ab6816110f5565b60208501516040909501519096949550939250505056fea164736f6c6343000819000a
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.