Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Multichain 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
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 { PausableUpgradeable } from "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import { IPauserRegistry } from "eigenlayer-contracts/interfaces/IPauserRegistry.sol"; import { IEOFeedVerifier } from "./interfaces/IEOFeedVerifier.sol"; import { IEOFeedManager } from "./interfaces/IEOFeedManager.sol"; import { InvalidAddress, CallerIsNotWhitelisted, MissingLeafInputs, FeedNotSupported, InvalidInput, CallerIsNotPauser, CallerIsNotUnpauser, CallerIsNotFeedDeployer } from "./interfaces/Errors.sol"; /** * @title EOFeedManager * @author eOracle * @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 IEOFeedManager, OwnableUpgradeable, PausableUpgradeable { /// @dev Map of feed id to price feed (feed id => PriceFeed) mapping(uint256 => 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(uint256 => bool) internal _supportedFeedIds; /// @dev feed verifier contract IEOFeedVerifier internal _feedVerifier; /// @notice Address of the `PauserRegistry` contract that this contract defers to for determining access control /// (for pausing). IPauserRegistry internal _pauserRegistry; /// @dev Address of the feed deployer address internal _feedDeployer; /* ============ Modifiers ============ */ /// @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(); _; } modifier onlyPauser() { if (!_pauserRegistry.isPauser(msg.sender)) revert CallerIsNotPauser(); _; } modifier onlyUnpauser() { if (msg.sender != _pauserRegistry.unpauser()) revert CallerIsNotUnpauser(); _; } modifier onlyFeedDeployer() { if (msg.sender != _feedDeployer) revert CallerIsNotFeedDeployer(); _; } /* ============ Constructor ============ */ /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } /* ============ Initializer ============ */ /** * @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 * @param pauserRegistry Address of the pauser registry contract * @param feedDeployer Address of the feed deployer */ function initialize( address feedVerifier, address owner, address pauserRegistry, address feedDeployer ) external onlyNonZeroAddress(feedVerifier) onlyNonZeroAddress(feedDeployer) onlyNonZeroAddress(pauserRegistry) initializer { __Ownable_init(owner); __Pausable_init(); _feedVerifier = IEOFeedVerifier(feedVerifier); _pauserRegistry = IPauserRegistry(pauserRegistry); _feedDeployer = feedDeployer; } /* ============ External Functions ============ */ /** * @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); emit FeedVerifierSet(feedVerifier); } /** * @notice Set the feed deployer * @param feedDeployer The feed deployer address */ function setFeedDeployer(address feedDeployer) external onlyOwner onlyNonZeroAddress(feedDeployer) { _feedDeployer = feedDeployer; emit FeedDeployerSet(feedDeployer); } /** * @notice Reset timestamps for specified price feeds to zero * @dev This function can only be called by the contract owner * @dev Useful for emergency situations where you need to clear stale timestamp data * @param feedIds Array of feed IDs whose timestamps should be reset */ function resetFeedTimestamps(uint256[] calldata feedIds) external onlyOwner { for (uint256 i = 0; i < feedIds.length; i++) { uint256 feedId = feedIds[i]; if (!_supportedFeedIds[feedId]) { revert FeedNotSupported(feedId); } _priceFeeds[feedId].timestamp = 0; } } /** * @notice Set the supported feeds * @param feedIds Array of feed ids * @param isSupported Array of booleans indicating whether the feed is supported */ function setSupportedFeeds(uint256[] calldata feedIds, bool[] calldata isSupported) external onlyOwner { if (feedIds.length != isSupported.length) revert InvalidInput(); for (uint256 i = 0; i < feedIds.length; i++) { _supportedFeedIds[feedIds[i]] = isSupported[i]; emit SupportedFeedsUpdated(feedIds[i], isSupported[i]); } } /** * @notice Add supported feeds * @param feedIds Array of feed ids */ function addSupportedFeeds(uint256[] calldata feedIds) external onlyFeedDeployer { for (uint256 i = 0; i < feedIds.length; i++) { _supportedFeedIds[feedIds[i]] = true; emit SupportedFeedsUpdated(feedIds[i], true); } } /** * @inheritdoc IEOFeedManager */ function whitelistPublishers(address[] calldata publishers, bool[] calldata isWhitelisted) external onlyOwner { if (publishers.length != isWhitelisted.length) revert InvalidInput(); for (uint256 i = 0; i < publishers.length; i++) { if (publishers[i] == address(0)) revert InvalidAddress(); _whitelistedPublishers[publishers[i]] = isWhitelisted[i]; emit PublisherWhitelisted(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 updateFeed( IEOFeedVerifier.LeafInput calldata input, IEOFeedVerifier.VerificationParams calldata vParams ) external onlyWhitelisted whenNotPaused { bytes memory data = _feedVerifier.verify(input, vParams); _processVerifiedRate(data, vParams.blockNumber); } /** * @inheritdoc IEOFeedManager */ // Reentrancy is not an issue because _feedVerifier is set by the owner // slither-disable-next-line reentrancy-benign,reentrancy-events function updateFeeds( IEOFeedVerifier.LeafInput[] calldata inputs, IEOFeedVerifier.VerificationParams calldata vParams ) external onlyWhitelisted whenNotPaused { if (inputs.length == 0) revert MissingLeafInputs(); bytes[] memory data = _feedVerifier.batchVerify(inputs, vParams); for (uint256 i = 0; i < data.length; i++) { _processVerifiedRate(data[i], vParams.blockNumber); } } /** * @notice Set the pauser registry contract address * @param pauserRegistry Address of the pauser registry contract */ function setPauserRegistry(address pauserRegistry) external onlyOwner onlyNonZeroAddress(pauserRegistry) { _pauserRegistry = IPauserRegistry(pauserRegistry); emit PauserRegistrySet(pauserRegistry); } /** * @notice Pause the feed manager */ function pause() external onlyPauser { _pause(); } /** * @notice Unpause the feed manager */ function unpause() external onlyUnpauser { _unpause(); } /** * @inheritdoc IEOFeedManager */ function getLatestPriceFeed(uint256 feedId) external view returns (PriceFeed memory) { return _getLatestPriceFeed(feedId); } /** * @inheritdoc IEOFeedManager */ function getLatestPriceFeeds(uint256[] 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(uint256 feedId) external view returns (bool) { return _supportedFeedIds[feedId]; } /** * @inheritdoc IEOFeedManager */ function getFeedDeployer() external view returns (address) { return _feedDeployer; } /** * @inheritdoc IEOFeedManager */ function getFeedVerifier() external view returns (IEOFeedVerifier) { return _feedVerifier; } /** * @inheritdoc IEOFeedManager */ function getPauserRegistry() external view returns (IPauserRegistry) { return _pauserRegistry; } /* ============ Internal Functions ============ */ /** * @notice Process the verified feed data, validate it and store it. If the timestamp is newer than the * existing timestamp, updates the price feed and emits RateUpdated. Otherwise emits SymbolReplay without updating. * @param data verified feed data, abi encoded (uint256 feedId, uint256 rate, uint256 timestamp) * @param blockNumber eoracle chain block number */ function _processVerifiedRate(bytes memory data, uint256 blockNumber) internal { (uint256 feedId, uint256 rate, uint256 timestamp) = abi.decode(data, (uint256, uint256, uint256)); if (!_supportedFeedIds[feedId]) revert FeedNotSupported(feedId); if (_priceFeeds[feedId].timestamp < timestamp) { _priceFeeds[feedId] = PriceFeed(rate, timestamp, blockNumber); emit RateUpdated(feedId, rate, timestamp); } else { emit SymbolReplay(feedId, rate, timestamp, _priceFeeds[feedId].timestamp); } } /** * @notice Get the latest price feed * @param feedId Feed id * @return PriceFeed struct */ function _getLatestPriceFeed(uint256 feedId) internal view returns (PriceFeed memory) { if (!_supportedFeedIds[feedId]) revert FeedNotSupported(feedId); return _priceFeeds[feedId]; } /** * @dev Gap for future storage variables in upgradeable contract. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ // solhint-disable ordering // slither-disable-next-line unused-state,naming-convention uint256[48] private __gap; // solhint-disable enable }
// 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) (utils/Pausable.sol) pragma solidity ^0.8.20; import {ContextUpgradeable} from "../utils/ContextUpgradeable.sol"; import {Initializable} from "../proxy/utils/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Pausable struct PausableStorage { bool _paused; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300; function _getPausableStorage() private pure returns (PausableStorage storage $) { assembly { $.slot := PausableStorageLocation } } /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { PausableStorage storage $ = _getPausableStorage(); $._paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { PausableStorage storage $ = _getPausableStorage(); return $._paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; /** * @title Interface for the `PauserRegistry` contract. * @author Layr Labs, Inc. * @notice Terms of Service: https://docs.eigenlayer.xyz/overview/terms-of-service */ interface IPauserRegistry { event PauserStatusChanged(address pauser, bool canPause); event UnpauserChanged(address previousUnpauser, address newUnpauser); /// @notice Mapping of addresses to whether they hold the pauser role. function isPauser(address pauser) external view returns (bool); /// @notice Unique address that holds the unpauser role. Capable of changing *both* the pauser and unpauser addresses. function unpauser() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; /** * @title IEOFeedVerifier * @author eOracle */ interface IEOFeedVerifier { /* ============ Structs ============ */ /** * @dev Input data for leaf verification * @param leafIndex Index of the leaf * @param unhashedLeaf Unhashed leaf data * abi encoded (uint256 feedId, uint256 rate, uint256 timestamp) * @param proof Merkle proof of the leaf */ struct LeafInput { uint256 leafIndex; bytes unhashedLeaf; bytes32[] proof; } /** * @dev Signed Data structure * @param eventRoot merkle tree root for events * @param blockNumber the block number this merkle tree originated from (on EO chain) * @param signature G1 hashed payload of abi.encode(eventRoot, blockNumber) * @param apkG2 G2 apk provided from off-chain * @param nonSignersBitmap used to construct G1 apk onchain */ struct VerificationParams { uint64 blockNumber; // 8 bytes + uint32 chainId; // 4 bytes + address aggregator; // 20 bytes = 32 bytes bytes32 eventRoot; // 32 bytes bytes32 blockHash; // 32 bytes uint256[2] signature; // 64 bytes uint256[4] apkG2; // 128 bytes bytes nonSignersBitmap; // dynamic } /** * @notice Represents a validator in the system * @param _address The validator's address * @param g1pk validator G1 public key * @param g2pk validator G2 public key (not used in current implementation) * @param votingPower Validator voting power */ struct Validator { address _address; uint256[2] g1pk; uint256[4] g2pk; uint256 votingPower; } /* ============ Events ============ */ /** * @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); /* ============ External Functions ============ */ /** * @notice verify single leaf signature from a block merkle tree * @param input leaf input data and proof (LeafInput) * @param vParams verification params * @return leafData Leaf data, abi encoded (uint256 feedId, uint256 rate, uint256 timestamp) */ function verify( LeafInput memory input, VerificationParams calldata vParams ) external returns (bytes memory leafData); /** * @notice batch verify signature of multiple leaves from the same block merkle tree * @param inputs feed leaves * @param vParams verification params */ function batchVerify( LeafInput[] memory inputs, VerificationParams calldata vParams ) external returns (bytes[] memory); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; import { IEOFeedVerifier } from "./IEOFeedVerifier.sol"; import { IPauserRegistry } from "eigenlayer-contracts/interfaces/IPauserRegistry.sol"; /** * @title IEOFeedManager * @author eOracle */ interface IEOFeedManager { /* ============ Structs ============ */ /** * @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; } /* ============ Events ============ */ /** * @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(uint256 indexed feedId, uint256 rate, uint256 timestamp); /** * @dev Event emitted when a price feed is replayed * @param feedId Feed id * @param rate Price feed value * @param timestamp Price feed timestamp * @param latestTimestamp Latest price feed timestamp */ event SymbolReplay(uint256 indexed feedId, uint256 rate, uint256 timestamp, uint256 latestTimestamp); /** * @dev Event emitted when the feed deployer is set * @param feedDeployer Address of the feed deployer */ event FeedDeployerSet(address indexed feedDeployer); /** * @dev Event emitted when the feed verifier is set * @param feedVerifier Address of the feed verifier */ event FeedVerifierSet(address indexed feedVerifier); /** * @dev Event emitted when the pauser registry is set * @param pauserRegistry Address of the pauser registry */ event PauserRegistrySet(address indexed pauserRegistry); /** * @dev Event emitted when the supported feeds are updated * @param feedId Feed id * @param isSupported Boolean indicating whether the feed is supported */ event SupportedFeedsUpdated(uint256 indexed feedId, bool isSupported); /** * @dev Event emitted when a publisher is whitelisted * @param publisher Address of the publisher * @param isWhitelisted Boolean indicating whether the publisher is whitelisted */ event PublisherWhitelisted(address indexed publisher, bool isWhitelisted); /* ============ External Functions ============ */ /** * @notice Update the price for a feed * @param input A merkle leaf containing price data and its merkle proof * @param vParams Verification parameters */ function updateFeed( IEOFeedVerifier.LeafInput calldata input, IEOFeedVerifier.VerificationParams calldata vParams ) external; /** * @notice Update the price for multiple feeds * @param inputs Array of leafs to prove the price feeds * @param vParams Verification parameters */ function updateFeeds( IEOFeedVerifier.LeafInput[] calldata inputs, IEOFeedVerifier.VerificationParams calldata vParams ) external; /** * @notice Whitelist or remove publishers * @param publishers Array of publisher addresses * @param isWhitelisted Array of booleans indicating whether each publisher should be whitelisted */ function whitelistPublishers(address[] calldata publishers, bool[] calldata isWhitelisted) external; /** * @notice Get the latest price for a feed * @param feedId Feed id * @return The latest price feed data containing: * - value: The price feed value * - timestamp: The timestamp when the price was aggregated * - eoracleBlockNumber: The eoracle block number when the price was recorded */ function getLatestPriceFeed(uint256 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 corresponding to each requested feed ID */ function getLatestPriceFeeds(uint256[] 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(uint256 feedId) external view returns (bool); /** * @notice Get the feed deployer * @return Address of the feed deployer */ function getFeedDeployer() external view returns (address); /** * @notice Get the feed verifier contract address * @return Address of the feed verifier contract */ function getFeedVerifier() external view returns (IEOFeedVerifier); /** * @notice Get the pauser registry contract address * @return Address of the pauser registry contract */ function getPauserRegistry() external view returns (IPauserRegistry); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.25; /*////////////////////////////////////////////////////////////////////////// EOFeedManager //////////////////////////////////////////////////////////////////////////*/ error CallerIsNotWhitelisted(address caller); error MissingLeafInputs(); error FeedNotSupported(uint256 feedId); error CallerIsNotPauser(); error CallerIsNotUnpauser(); error CallerIsNotFeedDeployer(); /*////////////////////////////////////////////////////////////////////////// EOFeedVerifier //////////////////////////////////////////////////////////////////////////*/ error CallerIsNotFeedManager(); error InvalidInput(); error InvalidProof(); error InvalidAddress(); error InvalidEventRoot(); error VotingPowerIsZero(); error InsufficientVotingPower(); error SignatureVerificationFailed(); error SignaturePairingFailed(); error ValidatorIndexOutOfBounds(); error ValidatorSetTooSmall(); error DuplicatedAddresses(); /*////////////////////////////////////////////////////////////////////////// EOFeedRegistryAdapter //////////////////////////////////////////////////////////////////////////*/ error FeedAlreadyExists(); error BaseQuotePairExists(); error FeedDoesNotExist(); error NotFeedDeployer();
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (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; } }
// 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 } } }
{ "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/", "forge-safe/=lib/forge-safe/src/", "eigenlayer-contracts/=lib/eigenlayer-contracts/src/contracts/", "@openzeppelin-upgrades-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/", "@openzeppelin-upgrades/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable/", "@openzeppelin-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts-v4.9.0/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-v4.9.0/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/", "openzeppelin/=lib/eigenlayer-contracts/lib/openzeppelin-contracts-upgradeable-v4.9.0/contracts/", "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/", "solmate/=lib/forge-safe/lib/solmate/src/", "surl/=lib/forge-safe/lib/surl/", "zeus-templates/=lib/eigenlayer-contracts/lib/zeus-templates/src/" ], "optimizer": { "enabled": true, "runs": 10000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "paris", "viaIR": false }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CallerIsNotFeedDeployer","type":"error"},{"inputs":[],"name":"CallerIsNotPauser","type":"error"},{"inputs":[],"name":"CallerIsNotUnpauser","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CallerIsNotWhitelisted","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"uint256","name":"feedId","type":"uint256"}],"name":"FeedNotSupported","type":"error"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"InvalidInput","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feedDeployer","type":"address"}],"name":"FeedDeployerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feedVerifier","type":"address"}],"name":"FeedVerifierSet","type":"event"},{"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pauserRegistry","type":"address"}],"name":"PauserRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"publisher","type":"address"},{"indexed":false,"internalType":"bool","name":"isWhitelisted","type":"bool"}],"name":"PublisherWhitelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isSupported","type":"bool"}],"name":"SupportedFeedsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"feedId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"latestTimestamp","type":"uint256"}],"name":"SymbolReplay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"}],"name":"addSupportedFeeds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeedDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFeedVerifier","outputs":[{"internalType":"contract IEOFeedVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"feedId","type":"uint256"}],"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":"uint256[]","name":"feedIds","type":"uint256[]"}],"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":[],"name":"getPauserRegistry","outputs":[{"internalType":"contract IPauserRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"feedVerifier","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"pauserRegistry","type":"address"},{"internalType":"address","name":"feedDeployer","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"feedId","type":"uint256"}],"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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"}],"name":"resetFeedTimestamps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feedDeployer","type":"address"}],"name":"setFeedDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"feedVerifier","type":"address"}],"name":"setFeedVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pauserRegistry","type":"address"}],"name":"setPauserRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"feedIds","type":"uint256[]"},{"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":[],"name":"unpause","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":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"uint32","name":"chainId","type":"uint32"},{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"bytes32","name":"eventRoot","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"uint256[4]","name":"apkG2","type":"uint256[4]"},{"internalType":"bytes","name":"nonSignersBitmap","type":"bytes"}],"internalType":"struct IEOFeedVerifier.VerificationParams","name":"vParams","type":"tuple"}],"name":"updateFeed","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":"uint64","name":"blockNumber","type":"uint64"},{"internalType":"uint32","name":"chainId","type":"uint32"},{"internalType":"address","name":"aggregator","type":"address"},{"internalType":"bytes32","name":"eventRoot","type":"bytes32"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"},{"internalType":"uint256[4]","name":"apkG2","type":"uint256[4]"},{"internalType":"bytes","name":"nonSignersBitmap","type":"bytes"}],"internalType":"struct IEOFeedVerifier.VerificationParams","name":"vParams","type":"tuple"}],"name":"updateFeeds","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
6080604052348015600f57600080fd5b506016601a565b60ca565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560695760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c75780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b61239e806100d96000396000f3fe608060405234801561001057600080fd5b506004361061018d5760003560e01c80638da5cb5b116100e3578063bde753b21161008c578063ed19cddb11610066578063ed19cddb146103d3578063f2fde38b146103e6578063f8c8765e146103f957600080fd5b8063bde753b214610377578063c33d68ff14610395578063d407273a146103b357600080fd5b8063936800fc116100bd578063936800fc1461030b578063969b01061461032b5780639bdc70ed1461036457600080fd5b80638da5cb5b146102a85780638ffee0ac146102e557806392d82f22146102f857600080fd5b8063542ff9a711610145578063715018a61161011f578063715018a61461027557806377ad404a1461027d5780638456cb59146102a057600080fd5b8063542ff9a7146101e85780635c975abb146101fb578063619583761461023657600080fd5b806312d5ef781161017657806312d5ef78146101ba5780632edbd0ea146101cd5780633f4ba83a146101e057600080fd5b80630ef3734f1461019257806310d67a2f146101a7575b600080fd5b6101a56101a0366004611a40565b61040c565b005b6101a56101b5366004611ade565b61061a565b6101a56101c8366004611b02565b6106e0565b6101a56101db366004611b5d565b6107e2565b6101a561098a565b6101a56101f6366004611a40565b610a89565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff165b60405190151581526020015b60405180910390f35b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022d565b6101a5610bba565b61022161028b366004611bc6565b60009081526002602052604090205460ff1690565b6101a5610bcc565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff16610250565b6101a56102f3366004611bdf565b610c9d565b6101a5610306366004611ade565b610dc1565b61031e610319366004611b02565b610e87565b60405161022d9190611c4b565b610221610339366004611ade565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6101a5610372366004611b02565b610f57565b60055473ffffffffffffffffffffffffffffffffffffffff16610250565b60035473ffffffffffffffffffffffffffffffffffffffff16610250565b6103c66103c1366004611bc6565b610ff5565b60405161022d9190611cad565b6101a56103e1366004611ade565b611022565b6101a56103f4366004611ade565b6110e8565b6101a5610407366004611cce565b61114c565b610414611426565b82811461044d576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561061357600085858381811061046c5761046c611d2a565b90506020020160208101906104819190611ade565b73ffffffffffffffffffffffffffffffffffffffff16036104ce576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282828181106104e0576104e0611d2a565b90506020020160208101906104f59190611d67565b6001600087878581811061050b5761050b611d2a565b90506020020160208101906105209190611ade565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905584848281811061058557610585611d2a565b905060200201602081019061059a9190611ade565b73ffffffffffffffffffffffffffffffffffffffff167f2933e8329aab12cc989fd4e6a9ddc6f1e3f0bb5d401cd14120b9b009e6fabe8b8484848181106105e3576105e3611d2a565b90506020020160208101906105f89190611d67565b604051901515815260200160405180910390a2600101610450565b5050505050565b610622611426565b8073ffffffffffffffffffffffffffffffffffffffff8116610670576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f1f63f005af4eb4ebfcea6989911800f8d7f0d48b9b340da4585d590f7a263b2a90600090a25050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610731576040517fc8dcb77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156107dd5760016002600085858581811061075457610754611d2a565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555082828281811061079257610792611d2a565b905060200201357f2cc243015e5a8c8f177e98f65535f9a85efe7967d9d09fc386a1bbc554d2e46760016040516107cd911515815260200190565b60405180910390a2600101610734565b505050565b3360009081526001602052604090205460ff16610832576040517f84d38f930000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b61083a6114b4565b6000829003610875576040517f1a0a55b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f3faba50800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff1690633faba508906108d090879087908790600401611fff565b6000604051808303816000875af11580156108ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261093591908101906121e0565b905060005b81518110156106135761098282828151811061095857610958611d2a565b602002602001015184600001602081019061097391906122a3565b67ffffffffffffffff16611510565b60010161093a565b60048054604080517feab66d7a000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263eab66d7a9282820192602092908290030181865afa1580156109f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1b91906122be565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517fc71bbc8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a87611666565b565b610a91611426565b828114610aca576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561061357828282818110610ae757610ae7611d2a565b9050602002016020810190610afc9190611d67565b60026000878785818110610b1257610b12611d2a565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550848482818110610b5057610b50611d2a565b905060200201357f2cc243015e5a8c8f177e98f65535f9a85efe7967d9d09fc386a1bbc554d2e467848484818110610b8a57610b8a611d2a565b9050602002016020810190610b9f9190611d67565b604051901515815260200160405180910390a2600101610acd565b610bc2611426565b610a876000611703565b600480546040517f46fbf68e000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff16906346fbf68e90602401602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906122db565b610c95576040517fdaeefd6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a87611799565b3360009081526001602052604090205460ff16610ce8576040517f84d38f93000000000000000000000000000000000000000000000000000000008152336004820152602401610829565b610cf06114b4565b6003546040517fcbc3882d00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063cbc3882d90610d4990869086906004016122f8565b6000604051808303816000875af1158015610d68573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610dae9190810190612326565b90506107dd8161097360208501856122a3565b610dc9611426565b8073ffffffffffffffffffffffffffffffffffffffff8116610e17576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f447ae96f170a1a03cc28a6395ed7fb5497c70649dd9a0bcb09d7cc188280e43d90600090a25050565b606060008267ffffffffffffffff811115610ea457610ea46120bf565b604051908082528060200260200182016040528015610ef957816020015b610ee660405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610ec25790505b50905060005b83811015610f4d57610f28858583818110610f1c57610f1c611d2a565b90506020020135611812565b828281518110610f3a57610f3a611d2a565b6020908102919091010152600101610eff565b5090505b92915050565b610f5f611426565b60005b818110156107dd576000838383818110610f7e57610f7e611d2a565b60209081029290920135600081815260029093526040909220549192505060ff16610fd8576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101829052602401610829565b600090815260208190526040812060019081019190915501610f62565b61101960405180606001604052806000815260200160008152602001600081525090565b610f5182611812565b61102a611426565b8073ffffffffffffffffffffffffffffffffffffffff8116611078576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fffbd852c703949cef5053979e1baa7198e1620d055cbf35fbcc3627938c9fae990600090a25050565b6110f0611426565b73ffffffffffffffffffffffffffffffffffffffff8116611140576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610829565b61114981611703565b50565b8373ffffffffffffffffffffffffffffffffffffffff811661119a576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166111e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff8116611236576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156112815750825b905060008267ffffffffffffffff16600114801561129e5750303b155b9050811580156112ac575080155b156112e3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113445784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61134d8b6118b8565b6113556118c9565b6003805473ffffffffffffffffffffffffffffffffffffffff808f167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600480548d841690831617905560058054928c169290911691909117905583156114185784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b336114657f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610a87576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610829565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615610a87576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000848060200190518101906115299190612363565b600083815260026020526040902054929550909350915060ff1661157c576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101849052602401610829565b60008381526020819052604090206001015481111561160d576040805160608101825283815260208082018481528284018881526000888152808452859020935184559051600184015551600290920191909155815184815290810183905284917fa387c3601f61e88a17e341cfebf7ab826a8cd4544cd72b2dc0cf12988e77754b910160405180910390a2610613565b6000838152602081815260409182902060010154825185815291820184905281830152905184917f20de1fb90c8879c887d7b0e982b64b024323561b38587196b7e3f4e7adc9f07d919081900360600190a25050505050565b61166e6118d9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6117a16114b4565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336116d8565b61183660405180606001604052806000815260200160008152602001600081525090565b60008281526002602052604090205460ff16611881576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101839052602401610829565b5060009081526020818152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6118c0611934565b6111498161199b565b6118d1611934565b610a876119a3565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610a87576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610a87576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f0611934565b6119ab611934565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008083601f840112611a0657600080fd5b50813567ffffffffffffffff811115611a1e57600080fd5b6020830191508360208260051b8501011115611a3957600080fd5b9250929050565b60008060008060408587031215611a5657600080fd5b843567ffffffffffffffff80821115611a6e57600080fd5b611a7a888389016119f4565b90965094506020870135915080821115611a9357600080fd5b50611aa0878288016119f4565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461114957600080fd5b8035611ad981611aac565b919050565b600060208284031215611af057600080fd5b8135611afb81611aac565b9392505050565b60008060208385031215611b1557600080fd5b823567ffffffffffffffff811115611b2c57600080fd5b611b38858286016119f4565b90969095509350505050565b60006101808284031215611b5757600080fd5b50919050565b600080600060408486031215611b7257600080fd5b833567ffffffffffffffff80821115611b8a57600080fd5b611b96878388016119f4565b90955093506020860135915080821115611baf57600080fd5b50611bbc86828701611b44565b9150509250925092565b600060208284031215611bd857600080fd5b5035919050565b60008060408385031215611bf257600080fd5b823567ffffffffffffffff80821115611c0a57600080fd5b9084019060608287031215611c1e57600080fd5b90925060208401359080821115611c3457600080fd5b50611c4185828601611b44565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611ca157611c8e8385518051825260208082015190830152604090810151910152565b9284019260609290920191600101611c67565b50909695505050505050565b81518152602080830151908201526040808301519082015260608101610f51565b60008060008060808587031215611ce457600080fd5b8435611cef81611aac565b93506020850135611cff81611aac565b92506040850135611d0f81611aac565b91506060850135611d1f81611aac565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b801515811461114957600080fd5b600060208284031215611d7957600080fd5b8135611afb81611d59565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611db957600080fd5b830160208101925035905067ffffffffffffffff811115611dd957600080fd5b803603821315611a3957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b803582526000611e446020830183611d84565b60606020860152611e59606086018284611de8565b91505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e9157600080fd5b830160208101903567ffffffffffffffff811115611eae57600080fd5b8060051b803603831315611ec157600080fd5b86840360408801528184527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ef957600080fd5b808360208601379290920160200195945050505050565b803567ffffffffffffffff81168114611ad957600080fd5b60408183375050565b60808183375050565b600061018067ffffffffffffffff611f5184611f10565b168452602083013563ffffffff81168114611f6b57600080fd5b63ffffffff166020850152611f8260408401611ace565b73ffffffffffffffffffffffffffffffffffffffff81166040860152506060830135606085015260808301356080850152611fc360a0850160a08501611f28565b611fd360e0850160e08501611f31565b610160611fe281850185611d84565b8383880152611ff48488018284611de8565b979650505050505050565b6040808252810183905260006060600585901b830181019083018683805b8881101561209f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa087860301845282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18b360301811261207d578283fd5b612089868c8301611e31565b955050602093840193929092019160010161201d565b5050505082810360208401526120b58185611f3a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612135576121356120bf565b604052919050565b600082601f83011261214e57600080fd5b815167ffffffffffffffff811115612168576121686120bf565b602061219a817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116016120ee565b82815285828487010111156121ae57600080fd5b60005b838110156121cc5785810183015182820184015282016121b1565b506000928101909101919091529392505050565b600060208083850312156121f357600080fd5b825167ffffffffffffffff8082111561220b57600080fd5b818501915085601f83011261221f57600080fd5b815181811115612231576122316120bf565b8060051b6122408582016120ee565b918252838101850191858101908984111561225a57600080fd5b86860192505b83831015612296578251858111156122785760008081fd5b6122868b89838a010161213d565b8352509186019190860190612260565b9998505050505050505050565b6000602082840312156122b557600080fd5b611afb82611f10565b6000602082840312156122d057600080fd5b8151611afb81611aac565b6000602082840312156122ed57600080fd5b8151611afb81611d59565b60408152600061230b6040830185611e31565b828103602084015261231d8185611f3a565b95945050505050565b60006020828403121561233857600080fd5b815167ffffffffffffffff81111561234f57600080fd5b61235b8482850161213d565b949350505050565b60008060006060848603121561237857600080fd5b835192506020840151915060408401519050925092509256fea164736f6c6343000819000a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018d5760003560e01c80638da5cb5b116100e3578063bde753b21161008c578063ed19cddb11610066578063ed19cddb146103d3578063f2fde38b146103e6578063f8c8765e146103f957600080fd5b8063bde753b214610377578063c33d68ff14610395578063d407273a146103b357600080fd5b8063936800fc116100bd578063936800fc1461030b578063969b01061461032b5780639bdc70ed1461036457600080fd5b80638da5cb5b146102a85780638ffee0ac146102e557806392d82f22146102f857600080fd5b8063542ff9a711610145578063715018a61161011f578063715018a61461027557806377ad404a1461027d5780638456cb59146102a057600080fd5b8063542ff9a7146101e85780635c975abb146101fb578063619583761461023657600080fd5b806312d5ef781161017657806312d5ef78146101ba5780632edbd0ea146101cd5780633f4ba83a146101e057600080fd5b80630ef3734f1461019257806310d67a2f146101a7575b600080fd5b6101a56101a0366004611a40565b61040c565b005b6101a56101b5366004611ade565b61061a565b6101a56101c8366004611b02565b6106e0565b6101a56101db366004611b5d565b6107e2565b6101a561098a565b6101a56101f6366004611a40565b610a89565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff165b60405190151581526020015b60405180910390f35b60045473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022d565b6101a5610bba565b61022161028b366004611bc6565b60009081526002602052604090205460ff1690565b6101a5610bcc565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff16610250565b6101a56102f3366004611bdf565b610c9d565b6101a5610306366004611ade565b610dc1565b61031e610319366004611b02565b610e87565b60405161022d9190611c4b565b610221610339366004611ade565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b6101a5610372366004611b02565b610f57565b60055473ffffffffffffffffffffffffffffffffffffffff16610250565b60035473ffffffffffffffffffffffffffffffffffffffff16610250565b6103c66103c1366004611bc6565b610ff5565b60405161022d9190611cad565b6101a56103e1366004611ade565b611022565b6101a56103f4366004611ade565b6110e8565b6101a5610407366004611cce565b61114c565b610414611426565b82811461044d576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561061357600085858381811061046c5761046c611d2a565b90506020020160208101906104819190611ade565b73ffffffffffffffffffffffffffffffffffffffff16036104ce576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8282828181106104e0576104e0611d2a565b90506020020160208101906104f59190611d67565b6001600087878581811061050b5761050b611d2a565b90506020020160208101906105209190611ade565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905584848281811061058557610585611d2a565b905060200201602081019061059a9190611ade565b73ffffffffffffffffffffffffffffffffffffffff167f2933e8329aab12cc989fd4e6a9ddc6f1e3f0bb5d401cd14120b9b009e6fabe8b8484848181106105e3576105e3611d2a565b90506020020160208101906105f89190611d67565b604051901515815260200160405180910390a2600101610450565b5050505050565b610622611426565b8073ffffffffffffffffffffffffffffffffffffffff8116610670576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f1f63f005af4eb4ebfcea6989911800f8d7f0d48b9b340da4585d590f7a263b2a90600090a25050565b60055473ffffffffffffffffffffffffffffffffffffffff163314610731576040517fc8dcb77f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b818110156107dd5760016002600085858581811061075457610754611d2a565b90506020020135815260200190815260200160002060006101000a81548160ff02191690831515021790555082828281811061079257610792611d2a565b905060200201357f2cc243015e5a8c8f177e98f65535f9a85efe7967d9d09fc386a1bbc554d2e46760016040516107cd911515815260200190565b60405180910390a2600101610734565b505050565b3360009081526001602052604090205460ff16610832576040517f84d38f930000000000000000000000000000000000000000000000000000000081523360048201526024015b60405180910390fd5b61083a6114b4565b6000829003610875576040517f1a0a55b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003546040517f3faba50800000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff1690633faba508906108d090879087908790600401611fff565b6000604051808303816000875af11580156108ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261093591908101906121e0565b905060005b81518110156106135761098282828151811061095857610958611d2a565b602002602001015184600001602081019061097391906122a3565b67ffffffffffffffff16611510565b60010161093a565b60048054604080517feab66d7a000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263eab66d7a9282820192602092908290030181865afa1580156109f7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1b91906122be565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a7f576040517fc71bbc8900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a87611666565b565b610a91611426565b828114610aca576040517fb4fa3fb300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8381101561061357828282818110610ae757610ae7611d2a565b9050602002016020810190610afc9190611d67565b60026000878785818110610b1257610b12611d2a565b90506020020135815260200190815260200160002060006101000a81548160ff021916908315150217905550848482818110610b5057610b50611d2a565b905060200201357f2cc243015e5a8c8f177e98f65535f9a85efe7967d9d09fc386a1bbc554d2e467848484818110610b8a57610b8a611d2a565b9050602002016020810190610b9f9190611d67565b604051901515815260200160405180910390a2600101610acd565b610bc2611426565b610a876000611703565b600480546040517f46fbf68e000000000000000000000000000000000000000000000000000000008152339281019290925273ffffffffffffffffffffffffffffffffffffffff16906346fbf68e90602401602060405180830381865afa158015610c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5f91906122db565b610c95576040517fdaeefd6500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a87611799565b3360009081526001602052604090205460ff16610ce8576040517f84d38f93000000000000000000000000000000000000000000000000000000008152336004820152602401610829565b610cf06114b4565b6003546040517fcbc3882d00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063cbc3882d90610d4990869086906004016122f8565b6000604051808303816000875af1158015610d68573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610dae9190810190612326565b90506107dd8161097360208501856122a3565b610dc9611426565b8073ffffffffffffffffffffffffffffffffffffffff8116610e17576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517f447ae96f170a1a03cc28a6395ed7fb5497c70649dd9a0bcb09d7cc188280e43d90600090a25050565b606060008267ffffffffffffffff811115610ea457610ea46120bf565b604051908082528060200260200182016040528015610ef957816020015b610ee660405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081610ec25790505b50905060005b83811015610f4d57610f28858583818110610f1c57610f1c611d2a565b90506020020135611812565b828281518110610f3a57610f3a611d2a565b6020908102919091010152600101610eff565b5090505b92915050565b610f5f611426565b60005b818110156107dd576000838383818110610f7e57610f7e611d2a565b60209081029290920135600081815260029093526040909220549192505060ff16610fd8576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101829052602401610829565b600090815260208190526040812060019081019190915501610f62565b61101960405180606001604052806000815260200160008152602001600081525090565b610f5182611812565b61102a611426565b8073ffffffffffffffffffffffffffffffffffffffff8116611078576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600580547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84169081179091556040517fffbd852c703949cef5053979e1baa7198e1620d055cbf35fbcc3627938c9fae990600090a25050565b6110f0611426565b73ffffffffffffffffffffffffffffffffffffffff8116611140576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610829565b61114981611703565b50565b8373ffffffffffffffffffffffffffffffffffffffff811661119a576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff81166111e8576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff8116611236576040517fe6c4247b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000810460ff16159067ffffffffffffffff166000811580156112815750825b905060008267ffffffffffffffff16600114801561129e5750303b155b9050811580156112ac575080155b156112e3576040517ff92ee8a900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84547fffffffffffffffffffffffffffffffffffffffffffffffff000000000000000016600117855583156113445784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff16680100000000000000001785555b61134d8b6118b8565b6113556118c9565b6003805473ffffffffffffffffffffffffffffffffffffffff808f167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255600480548d841690831617905560058054928c169290911691909117905583156114185784547fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050505050505050565b336114657f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1614610a87576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610829565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff1615610a87576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806000848060200190518101906115299190612363565b600083815260026020526040902054929550909350915060ff1661157c576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101849052602401610829565b60008381526020819052604090206001015481111561160d576040805160608101825283815260208082018481528284018881526000888152808452859020935184559051600184015551600290920191909155815184815290810183905284917fa387c3601f61e88a17e341cfebf7ab826a8cd4544cd72b2dc0cf12988e77754b910160405180910390a2610613565b6000838152602081815260409182902060010154825185815291820184905281830152905184917f20de1fb90c8879c887d7b0e982b64b024323561b38587196b7e3f4e7adc9f07d919081900360600190a25050505050565b61166e6118d9565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3505050565b6117a16114b4565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258336116d8565b61183660405180606001604052806000815260200160008152602001600081525090565b60008281526002602052604090205460ff16611881576040517fbc97cdd200000000000000000000000000000000000000000000000000000000815260048101839052602401610829565b5060009081526020818152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b6118c0611934565b6111498161199b565b6118d1611934565b610a876119a3565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033005460ff16610a87576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005468010000000000000000900460ff16610a87576040517fd7e6bcf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110f0611934565b6119ab611934565b7fcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f0330080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60008083601f840112611a0657600080fd5b50813567ffffffffffffffff811115611a1e57600080fd5b6020830191508360208260051b8501011115611a3957600080fd5b9250929050565b60008060008060408587031215611a5657600080fd5b843567ffffffffffffffff80821115611a6e57600080fd5b611a7a888389016119f4565b90965094506020870135915080821115611a9357600080fd5b50611aa0878288016119f4565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff8116811461114957600080fd5b8035611ad981611aac565b919050565b600060208284031215611af057600080fd5b8135611afb81611aac565b9392505050565b60008060208385031215611b1557600080fd5b823567ffffffffffffffff811115611b2c57600080fd5b611b38858286016119f4565b90969095509350505050565b60006101808284031215611b5757600080fd5b50919050565b600080600060408486031215611b7257600080fd5b833567ffffffffffffffff80821115611b8a57600080fd5b611b96878388016119f4565b90955093506020860135915080821115611baf57600080fd5b50611bbc86828701611b44565b9150509250925092565b600060208284031215611bd857600080fd5b5035919050565b60008060408385031215611bf257600080fd5b823567ffffffffffffffff80821115611c0a57600080fd5b9084019060608287031215611c1e57600080fd5b90925060208401359080821115611c3457600080fd5b50611c4185828601611b44565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b81811015611ca157611c8e8385518051825260208082015190830152604090810151910152565b9284019260609290920191600101611c67565b50909695505050505050565b81518152602080830151908201526040808301519082015260608101610f51565b60008060008060808587031215611ce457600080fd5b8435611cef81611aac565b93506020850135611cff81611aac565b92506040850135611d0f81611aac565b91506060850135611d1f81611aac565b939692955090935050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b801515811461114957600080fd5b600060208284031215611d7957600080fd5b8135611afb81611d59565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611db957600080fd5b830160208101925035905067ffffffffffffffff811115611dd957600080fd5b803603821315611a3957600080fd5b8183528181602085013750600060208284010152600060207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b803582526000611e446020830183611d84565b60606020860152611e59606086018284611de8565b91505060408301357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112611e9157600080fd5b830160208101903567ffffffffffffffff811115611eae57600080fd5b8060051b803603831315611ec157600080fd5b86840360408801528184527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115611ef957600080fd5b808360208601379290920160200195945050505050565b803567ffffffffffffffff81168114611ad957600080fd5b60408183375050565b60808183375050565b600061018067ffffffffffffffff611f5184611f10565b168452602083013563ffffffff81168114611f6b57600080fd5b63ffffffff166020850152611f8260408401611ace565b73ffffffffffffffffffffffffffffffffffffffff81166040860152506060830135606085015260808301356080850152611fc360a0850160a08501611f28565b611fd360e0850160e08501611f31565b610160611fe281850185611d84565b8383880152611ff48488018284611de8565b979650505050505050565b6040808252810183905260006060600585901b830181019083018683805b8881101561209f577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa087860301845282357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18b360301811261207d578283fd5b612089868c8301611e31565b955050602093840193929092019160010161201d565b5050505082810360208401526120b58185611f3a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612135576121356120bf565b604052919050565b600082601f83011261214e57600080fd5b815167ffffffffffffffff811115612168576121686120bf565b602061219a817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f850116016120ee565b82815285828487010111156121ae57600080fd5b60005b838110156121cc5785810183015182820184015282016121b1565b506000928101909101919091529392505050565b600060208083850312156121f357600080fd5b825167ffffffffffffffff8082111561220b57600080fd5b818501915085601f83011261221f57600080fd5b815181811115612231576122316120bf565b8060051b6122408582016120ee565b918252838101850191858101908984111561225a57600080fd5b86860192505b83831015612296578251858111156122785760008081fd5b6122868b89838a010161213d565b8352509186019190860190612260565b9998505050505050505050565b6000602082840312156122b557600080fd5b611afb82611f10565b6000602082840312156122d057600080fd5b8151611afb81611aac565b6000602082840312156122ed57600080fd5b8151611afb81611d59565b60408152600061230b6040830185611e31565b828103602084015261231d8185611f3a565b95945050505050565b60006020828403121561233857600080fd5b815167ffffffffffffffff81111561234f57600080fd5b61235b8482850161213d565b949350505050565b60008060006060848603121561237857600080fd5b835192506020840151915060408401519050925092509256fea164736f6c6343000819000a
Deployed Bytecode Sourcemap
1144:10476:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6222:475;;;;;;:::i;:::-;;:::i;:::-;;8056:219;;;;;;:::i;:::-;;:::i;5905:261::-;;;;;;:::i;:::-;;:::i;7433:476::-;;;;;;:::i;:::-;;:::i;8459:68::-;;;:::i;5432:376::-;;;;;;:::i;:::-;;:::i;2692:145:4:-;1270:23;2821:9;;;2692:145;;;4013:14:9;;4006:22;3988:41;;3976:2;3961:18;2692:145:4;;;;;;;;9832:108:5;9918:15;;;;9832:108;;;4238:42:9;4226:55;;;4208:74;;4196:2;4181:18;9832:108:5;4040:248:9;3155:101:1;;;:::i;9345:119:5:-;;;;;;:::i;:::-;9409:4;9432:25;;;:17;:25;;;;;;;;;9345:119;8335:62;;;:::i;2441:144:1:-;1313:22;2570:8;;;2441:144;;6898:334:5;;;;;;:::i;:::-;;:::i;4079:205::-;;;;;;:::i;:::-;;:::i;8775:321::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;9152:137::-;;;;;;:::i;:::-;9249:33;;9226:4;9249:33;;;:22;:33;;;;;;;;;9152:137;4901:345;;;;;;:::i;:::-;;:::i;9520:96::-;9596:13;;;;9520:96;;9672:104;9756:13;;;;9672:104;;8583:136;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4396:188::-;;;;;;:::i;:::-;;:::i;3405:215:1:-;;;;;;:::i;:::-;;:::i;3358:524:5:-;;;;;;:::i;:::-;;:::i;6222:475::-;2334:13:1;:11;:13::i;:::-;6346:41:5;;::::1;6342:68;;6396:14;;;;;;;;;;;;;;6342:68;6425:9;6420:271;6440:21:::0;;::::1;6420:271;;;6511:1;6486:10:::0;;6497:1;6486:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:27;;::::0;6482:56:::1;;6522:16;;;;;;;;;;;;;;6482:56;6592:13;;6606:1;6592:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6552:22;:37;6575:10;;6586:1;6575:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6552:37;;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;6552:37:5;:56;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;6648:10;;6659:1;6648:13;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6627:53;;;6663:13;;6677:1;6663:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;6627:53;::::0;4013:14:9;;4006:22;3988:41;;3976:2;3961:18;6627:53:5::1;;;;;;;6463:3;;6420:271;;;;6222:475:::0;;;;:::o;8056:219::-;2334:13:1;:11;:13::i;:::-;8145:14:5;2317:18:::1;::::0;::::1;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;8171:15:::2;:49:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;8235:33:::2;::::0;::::2;::::0;-1:-1:-1;;8235:33:5::2;2357:1:1::1;8056:219:5::0;:::o;5905:261::-;2697:13;;;;2683:10;:27;2679:65;;2719:25;;;;;;;;;;;;;;2679:65;6001:9:::1;5996:164;6016:18:::0;;::::1;5996:164;;;6087:4;6055:17;:29;6073:7;;6081:1;6073:10;;;;;;;:::i;:::-;;;;;;;6055:29;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;6132:7;;6140:1;6132:10;;;;;;;:::i;:::-;;;;;;;6110:39;6144:4;6110:39;;;;4013:14:9::0;4006:22;3988:41;;3976:2;3961:18;;3848:187;6110:39:5::1;;;;;;;;6036:3;;5996:164;;;;5905:261:::0;;:::o;7433:476::-;2139:10;2116:34;;;;:22;:34;;;;;;;;2111:82;;2159:34;;;;;2182:10;2159:34;;;4208:74:9;4181:18;;2159:34:5;;;;;;;;2111:82;2316:19:4::1;:17;:19::i;:::-;7672:1:5::2;7655:18:::0;;;7651:50:::2;;7682:19;;;;;;;;;;;;;;7651:50;7734:13;::::0;:42:::2;::::0;;;;7712:19:::2;::::0;7734:13:::2;;::::0;:25:::2;::::0;:42:::2;::::0;7760:6;;;;7768:7;;7734:42:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;7712:64;;7791:9;7786:117;7810:4;:11;7806:1;:15;7786:117;;;7842:50;7863:4;7868:1;7863:7;;;;;;;;:::i;:::-;;;;;;;7872;:19;;;;;;;;;;:::i;:::-;7842:50;;:20;:50::i;:::-;7823:3;;7786:117;;8459:68:::0;2561:15;;;:26;;;;;;;;:15;;;;;:24;;:26;;;;;;;;;;;;:15;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2547:40;;:10;:40;;;2543:74;;2596:21;;;;;;;;;;;;;;2543:74;8510:10:::1;:8;:10::i;:::-;8459:68::o:0;5432:376::-;2334:13:1;:11;:13::i;:::-;5549:36:5;;::::1;5545:63;;5594:14;;;;;;;;;;;;;;5545:63;5623:9;5618:184;5638:18:::0;;::::1;5618:184;;;5709:11;;5721:1;5709:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5677:17;:29;5695:7;;5703:1;5695:10;;;;;;;:::i;:::-;;;;;;;5677:29;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;5764:7;;5772:1;5764:10;;;;;;;:::i;:::-;;;;;;;5742:49;5776:11;;5788:1;5776:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;5742:49;::::0;4013:14:9;;4006:22;3988:41;;3976:2;3961:18;5742:49:5::1;;;;;;;5658:3;;5618:184;;3155:101:1::0;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;8335:62:5:-:0;2421:15;;;:36;;;;;2446:10;2421:36;;;4208:74:9;;;;2421:15:5;;;:24;;4181:18:9;;2421:36:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2416:69;;2466:19;;;;;;;;;;;;;;2416:69;8382:8:::1;:6;:8::i;6898:334::-:0;2139:10;2116:34;;;;:22;:34;;;;;;;;2111:82;;2159:34;;;;;2182:10;2159:34;;;4208:74:9;4181:18;;2159:34:5;4040:248:9;2111:82:5;2316:19:4::1;:17;:19::i;:::-;7132:13:5::2;::::0;:36:::2;::::0;;;;7112:17:::2;::::0;7132:13:::2;;::::0;:20:::2;::::0;:36:::2;::::0;7153:5;;7160:7;;7132:36:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;;::::0;::::2;::::0;;;::::2;::::0;::::2;:::i;:::-;7112:56:::0;-1:-1:-1;7178:47:5::2;7112:56:::0;7205:19:::2;;::::0;::::2;:7:::0;:19:::2;:::i;4079:205::-:0;2334:13:1;:11;:13::i;:::-;4164:12:5;2317:18:::1;::::0;::::1;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;4188:13:::2;:45:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;4248:29:::2;::::0;::::2;::::0;-1:-1:-1;;4248:29:5::2;2357:1:1::1;4079:205:5::0;:::o;8775:321::-;8855:18;8885:25;8929:7;8913:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;8913:31:5;;;;;;;;;;;;;;;;;8885:59;;8959:9;8954:113;8974:18;;;8954:113;;;9025:31;9045:7;;9053:1;9045:10;;;;;;;:::i;:::-;;;;;;;9025:19;:31::i;:::-;9013:6;9020:1;9013:9;;;;;;;;:::i;:::-;;;;;;;;;;:43;8994:3;;8954:113;;;-1:-1:-1;9083:6:5;-1:-1:-1;8775:321:5;;;;;:::o;4901:345::-;2334:13:1;:11;:13::i;:::-;4992:9:5::1;4987:253;5007:18:::0;;::::1;4987:253;;;5046:14;5063:7;;5071:1;5063:10;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;::::1;;5092:25;::::0;;;:17:::1;:25:::0;;;;;;;;5063:10;;-1:-1:-1;;5092:25:5::1;;5087:96;;5144:24;::::0;::::1;::::0;;::::1;::::0;::::1;17229:25:9::0;;;17202:18;;5144:24:5::1;17083:177:9::0;5087:96:5::1;5228:1;5196:19:::0;;;::::1;::::0;;;;;;:29:::1;::::0;;::::1;:33:::0;;;;5027:3:::1;4987:253;;8583:136:::0;8650:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;8650:16:5;8685:27;8705:6;8685:19;:27::i;4396:188::-;2334:13:1;:11;:13::i;:::-;4481:12:5;2317:18:::1;::::0;::::1;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;4505:13:::2;:28:::0;;;::::2;;::::0;::::2;::::0;;::::2;::::0;;;4548:29:::2;::::0;::::2;::::0;-1:-1:-1;;4548:29:5::2;2357:1:1::1;4396:188:5::0;:::o;3405:215:1:-;2334:13;:11;:13::i;:::-;3489:22:::1;::::0;::::1;3485:91;;3534:31;::::0;::::1;::::0;;3562:1:::1;3534:31;::::0;::::1;4208:74:9::0;4181:18;;3534:31:1::1;4040:248:9::0;3485:91:1::1;3585:28;3604:8;3585:18;:28::i;:::-;3405:215:::0;:::o;3358:524:5:-;3543:12;2317:18;;;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;3584:12;2317:18:::1;::::0;::::1;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;3625:14:::0;2317:18:::2;::::0;::::2;2313:47;;2344:16;;;;;;;;;;;;;;2313:47;8870:21:2::0;4302:15;;;;::::3;;;4301:16;::::0;4348:14:::3;;4158:30;4726:16:::0;;:34;::::3;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;:16;;4805:1;4790:16;:50;;;;-1:-1:-1::0;4818:4:2::3;4810:25;:30:::0;4790:50:::3;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;;;;;;;;;;;;;4851:91;4951:18:::0;;;::::3;4968:1;4951:18;::::0;;4979:67;::::3;;;5013:22:::0;;;::::3;::::0;::::3;::::0;;4979:67:::3;3675:21:5::4;3690:5;3675:14;:21::i;:::-;3706:17;:15;:17::i;:::-;3733:13;:45:::0;;::::4;::::0;;::::4;::::0;;;::::4;;::::0;;;3788:15:::4;:49:::0;;;;::::4;::::0;;::::4;;::::0;;3847:13:::4;:28:::0;;;;::::4;::::0;;;::::4;::::0;;;::::4;::::0;;5066:101:2;::::3;;;5100:23:::0;;;::::3;::::0;;5142:14:::3;::::0;-1:-1:-1;17418:50:9;;5142:14:2::3;::::0;17406:2:9;17391:18;5142:14:2::3;;;;;;;5066:101;4092:1081;;;;;2370:1:5::2;::::1;3358:524:::0;;;;;:::o;2658:162:1:-;966:10:3;2717:7:1;1313:22;2570:8;;;;2441:144;2717:7;:23;;;2713:101;;2763:40;;;;;966:10:3;2763:40:1;;;4208:74:9;4181:18;;2763:40:1;4040:248:9;2905:128:4;1270:23;2821:9;;;2966:61;;;3001:15;;;;;;;;;;;;;;10401:567:5;10491:14;10507:12;10521:17;10553:4;10542:45;;;;;;;;;;;;:::i;:::-;10602:25;;;;:17;:25;;;;;;10490:97;;-1:-1:-1;10490:97:5;;-1:-1:-1;10490:97:5;-1:-1:-1;10602:25:5;;10597:63;;10636:24;;;;;;;;17229:25:9;;;17202:18;;10636:24:5;17083:177:9;10597:63:5;10674:11;:19;;;;;;;;;;:29;;;:41;-1:-1:-1;10670:292:5;;;10753:39;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10731:19:5;;;;;;;;;:61;;;;;;;;;;;;;;;;;;;10811:36;;17964:25:9;;;18005:18;;;17998:34;;;10731:19:5;;10811:36;;17937:18:9;10811:36:5;;;;;;;10670:292;;;10921:11;:19;;;;;;;;;;;;:29;;;10883:68;;18245:25:9;;;18286:18;;;18279:34;;;18329:18;;;18322:34;10883:68:5;;10921:19;;10883:68;;;;;;18233:2:9;10883:68:5;;;10480:488;;;10401:567;;:::o;3674:178:4:-;2563:16;:14;:16::i;:::-;1270:23;3791:17;;;::::1;::::0;;3823:22:::1;966:10:3::0;3832:12:4::1;3823:22;::::0;4238:42:9;4226:55;;;4208:74;;4196:2;4181:18;3823:22:4::1;;;;;;;3722:130;3674:178::o:0;3774:248:1:-;1313:22;3923:8;;3941:19;;;3923:8;3941:19;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;3366:176:4:-;2316:19;:17;:19::i;:::-;1270:23;3484:16;;;::::1;3496:4;3484:16;::::0;;3515:20:::1;966:10:3::0;3522:12:4::1;887:96:3::0;11092:202:5;11160:16;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;11160:16:5;11193:25;;;;:17;:25;;;;;;;;11188:63;;11227:24;;;;;;;;17229:25:9;;;17202:18;;11227:24:5;17083:177:9;11188:63:5;-1:-1:-1;11268:11:5;:19;;;;;;;;;;;;11261:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11092:202::o;1847:127:1:-;6931:20:2;:18;:20::i;:::-;1929:38:1::1;1954:12;1929:24;:38::i;1836:97:4:-:0;6931:20:2;:18;:20::i;:::-;1899:27:4::1;:25;:27::i;3105:126::-:0;1270:23;2821:9;;;3163:62;;3199:15;;;;;;;;;;;;;;7084:141:2;8870:21;8560:40;;;;;;7146:73;;7191:17;;;;;;;;;;;;;;1980:235:1;6931:20:2;:18;:20::i;1939:156:4:-;6931:20:2;:18;:20::i;:::-;1270:23:4;2071:17;;;::::1;::::0;;1939:156::o;14:367:9:-;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:55;;159:1;156;149:12;108:55;-1:-1:-1;182:20:9;;225:18;214:30;;211:50;;;257:1;254;247:12;211:50;294:4;286:6;282:17;270:29;;354:3;347:4;337:6;334:1;330:14;322:6;318:27;314:38;311:47;308:67;;;371:1;368;361:12;308:67;14:367;;;;;:::o;386:770::-;505:6;513;521;529;582:2;570:9;561:7;557:23;553:32;550:52;;;598:1;595;588:12;550:52;638:9;625:23;667:18;708:2;700:6;697:14;694:34;;;724:1;721;714:12;694:34;763:70;825:7;816:6;805:9;801:22;763:70;:::i;:::-;852:8;;-1:-1:-1;737:96:9;-1:-1:-1;940:2:9;925:18;;912:32;;-1:-1:-1;956:16:9;;;953:36;;;985:1;982;975:12;953:36;;1024:72;1088:7;1077:8;1066:9;1062:24;1024:72;:::i;:::-;386:770;;;;-1:-1:-1;1115:8:9;-1:-1:-1;;;;386:770:9:o;1161:154::-;1247:42;1240:5;1236:54;1229:5;1226:65;1216:93;;1305:1;1302;1295:12;1320:134;1388:20;;1417:31;1388:20;1417:31;:::i;:::-;1320:134;;;:::o;1459:247::-;1518:6;1571:2;1559:9;1550:7;1546:23;1542:32;1539:52;;;1587:1;1584;1577:12;1539:52;1626:9;1613:23;1645:31;1670:5;1645:31;:::i;:::-;1695:5;1459:247;-1:-1:-1;;;1459:247:9:o;1711:437::-;1797:6;1805;1858:2;1846:9;1837:7;1833:23;1829:32;1826:52;;;1874:1;1871;1864:12;1826:52;1914:9;1901:23;1947:18;1939:6;1936:30;1933:50;;;1979:1;1976;1969:12;1933:50;2018:70;2080:7;2071:6;2060:9;2056:22;2018:70;:::i;:::-;2107:8;;1992:96;;-1:-1:-1;1711:437:9;-1:-1:-1;;;;1711:437:9:o;2153:167::-;2224:5;2269:3;2260:6;2255:3;2251:16;2247:26;2244:46;;;2286:1;2283;2276:12;2244:46;-1:-1:-1;2308:6:9;2153:167;-1:-1:-1;2153:167:9:o;2325:743::-;2487:6;2495;2503;2556:2;2544:9;2535:7;2531:23;2527:32;2524:52;;;2572:1;2569;2562:12;2524:52;2612:9;2599:23;2641:18;2682:2;2674:6;2671:14;2668:34;;;2698:1;2695;2688:12;2668:34;2737:70;2799:7;2790:6;2779:9;2775:22;2737:70;:::i;:::-;2826:8;;-1:-1:-1;2711:96:9;-1:-1:-1;2914:2:9;2899:18;;2886:32;;-1:-1:-1;2930:16:9;;;2927:36;;;2959:1;2956;2949:12;2927:36;;2982:80;3054:7;3043:8;3032:9;3028:24;2982:80;:::i;:::-;2972:90;;;2325:743;;;;;:::o;4293:180::-;4352:6;4405:2;4393:9;4384:7;4380:23;4376:32;4373:52;;;4421:1;4418;4411:12;4373:52;-1:-1:-1;4444:23:9;;4293:180;-1:-1:-1;4293:180:9:o;4841:665::-;4976:6;4984;5037:2;5025:9;5016:7;5012:23;5008:32;5005:52;;;5053:1;5050;5043:12;5005:52;5093:9;5080:23;5122:18;5163:2;5155:6;5152:14;5149:34;;;5179:1;5176;5169:12;5149:34;5202:22;;;;5258:2;5240:16;;;5236:25;5233:45;;;5274:1;5271;5264:12;5233:45;5297:2;;-1:-1:-1;5352:2:9;5337:18;;5324:32;;5368:16;;;5365:36;;;5397:1;5394;5387:12;5365:36;;5420:80;5492:7;5481:8;5470:9;5466:24;5420:80;:::i;:::-;5410:90;;;4841:665;;;;;:::o;5722:709::-;5947:2;5999:21;;;6069:13;;5972:18;;;6091:22;;;5918:4;;5947:2;6170:15;;;;6144:2;6129:18;;;5918:4;6213:192;6227:6;6224:1;6221:13;6213:192;;;6276:47;6319:3;6310:6;6304:13;5586:12;;5574:25;;5648:4;5637:16;;;5631:23;5615:14;;;5608:47;5704:4;5693:16;;;5687:23;5671:14;;5664:47;5511:206;6276:47;6380:15;;;;6352:4;6343:14;;;;;6249:1;6242:9;6213:192;;;-1:-1:-1;6422:3:9;;5722:709;-1:-1:-1;;;;;;5722:709:9:o;6691:252::-;5586:12;;5574:25;;5648:4;5637:16;;;5631:23;5615:14;;;5608:47;5704:4;5693:16;;;5687:23;5671:14;;;5664:47;6879:2;6864:18;;6891:46;5511:206;6948:671;7034:6;7042;7050;7058;7111:3;7099:9;7090:7;7086:23;7082:33;7079:53;;;7128:1;7125;7118:12;7079:53;7167:9;7154:23;7186:31;7211:5;7186:31;:::i;:::-;7236:5;-1:-1:-1;7293:2:9;7278:18;;7265:32;7306:33;7265:32;7306:33;:::i;:::-;7358:7;-1:-1:-1;7417:2:9;7402:18;;7389:32;7430:33;7389:32;7430:33;:::i;:::-;7482:7;-1:-1:-1;7541:2:9;7526:18;;7513:32;7554:33;7513:32;7554:33;:::i;:::-;6948:671;;;;-1:-1:-1;6948:671:9;;-1:-1:-1;;6948:671:9:o;7624:184::-;7676:77;7673:1;7666:88;7773:4;7770:1;7763:15;7797:4;7794:1;7787:15;7813:118;7899:5;7892:13;7885:21;7878:5;7875:32;7865:60;;7921:1;7918;7911:12;7936:241;7992:6;8045:2;8033:9;8024:7;8020:23;8016:32;8013:52;;;8061:1;8058;8051:12;8013:52;8100:9;8087:23;8119:28;8141:5;8119:28;:::i;8182:559::-;8240:5;8247:6;8307:3;8294:17;8389:66;8378:8;8362:14;8358:29;8354:102;8334:18;8330:127;8320:155;;8471:1;8468;8461:12;8320:155;8499:33;;8603:4;8590:18;;;-1:-1:-1;8551:21:9;;-1:-1:-1;8631:18:9;8620:30;;8617:50;;;8663:1;8660;8653:12;8617:50;8710:6;8694:14;8690:27;8683:5;8679:39;8676:59;;;8731:1;8728;8721:12;8746:325;8834:6;8829:3;8822:19;8886:6;8879:5;8872:4;8867:3;8863:14;8850:43;;8938:1;8931:4;8922:6;8917:3;8913:16;8909:27;8902:38;8804:3;9060:4;8990:66;8985:2;8977:6;8973:15;8969:88;8964:3;8960:98;8956:109;8949:116;;8746:325;;;;:::o;9076:1140::-;9180:5;9167:19;9162:3;9155:32;9137:3;9230:55;9279:4;9272:5;9268:16;9261:5;9230:55;:::i;:::-;9317:4;9310;9305:3;9301:14;9294:28;9343:69;9406:4;9401:3;9397:14;9383:12;9369;9343:69;:::i;:::-;9331:81;;;9471:4;9464:5;9460:16;9447:30;9552:66;9544:5;9528:14;9524:26;9520:99;9500:18;9496:124;9486:152;;9634:1;9631;9624:12;9486:152;9662:30;;9773:4;9760:18;;;9715:21;9801:18;9790:30;;9787:50;;;9833:1;9830;9823:12;9787:50;9863:6;9860:1;9856:14;9915:2;9899:14;9895:23;9886:7;9882:37;9879:57;;;9932:1;9929;9922:12;9879:57;9978:3;9972:4;9968:14;9961:4;9956:3;9952:14;9945:38;10005:6;9999:4;9992:20;10035:66;10027:6;10024:78;10021:98;;;10115:1;10112;10105:12;10021:98;10167:2;10158:7;10151:4;10145;10141:15;10128:42;10190:13;;;;10205:4;10186:24;;9076:1140;-1:-1:-1;;;;;9076:1140:9:o;10221:171::-;10288:20;;10348:18;10337:30;;10327:41;;10317:69;;10382:1;10379;10372:12;10496:105;10590:4;10583:5;10578:3;10565:30;;;10496:105::o;10606:109::-;10704:4;10697:5;10692:3;10679:30;;;10606:109::o;10720:1005::-;10790:3;10818:6;10875:18;10849:24;10867:5;10849:24;:::i;:::-;10845:49;10840:3;10833:62;10943:4;10936:5;10932:16;10919:30;10993:10;10984:7;10980:24;10971:7;10968:37;10958:65;;11019:1;11016;11009:12;10958:65;10473:10;10462:22;11068:4;11059:14;;10450:35;11103:36;11133:4;11122:16;;11103:36;:::i;:::-;4555:42;4544:54;;11190:4;11181:14;;4532:67;11148:48;11252:4;11245:5;11241:16;11228:30;11221:4;11216:3;11212:14;11205:54;11315:4;11308:5;11304:16;11291:30;11284:4;11279:3;11275:14;11268:54;11331:67;11392:4;11387:3;11383:14;11376:4;11369:5;11365:16;11331:67;:::i;:::-;11407:71;11472:4;11467:3;11463:14;11456:4;11449:5;11445:16;11407:71;:::i;:::-;11497:6;11548:53;11597:2;11590:5;11586:14;11579:5;11548:53;:::i;:::-;11631:2;11626;11621:3;11617:12;11610:24;11650:69;11715:2;11710:3;11706:12;11692;11676:14;11650:69;:::i;:::-;11643:76;10720:1005;-1:-1:-1;;;;;;;10720:1005:9:o;11730:1376::-;12088:2;12100:21;;;12073:18;;12156:22;;;-1:-1:-1;12209:2:9;12258:1;12254:14;;;12239:30;;12235:39;;;12194:18;;12297:6;-1:-1:-1;;12352:609:9;12368:6;12363:3;12360:15;12352:609;;;12461:66;12449:9;12441:6;12437:22;12433:95;12428:3;12421:108;12581:6;12568:20;12668:66;12659:6;12643:14;12639:27;12635:100;12615:18;12611:125;12601:153;;12750:1;12747;12740:12;12601:153;12777:77;12847:6;12838;12818:18;12814:31;12777:77;:::i;:::-;12767:87;-1:-1:-1;;12877:4:9;12939:12;;;;12904:15;;;;;12394:1;12385:11;12352:609;;;12356:3;;;;13011:9;13003:6;12999:22;12992:4;12981:9;12977:20;12970:52;13039:61;13093:6;13085;13039:61;:::i;:::-;13031:69;11730:1376;-1:-1:-1;;;;;;11730:1376:9:o;13111:184::-;13163:77;13160:1;13153:88;13260:4;13257:1;13250:15;13284:4;13281:1;13274:15;13300:334;13371:2;13365:9;13427:2;13417:13;;13432:66;13413:86;13401:99;;13530:18;13515:34;;13551:22;;;13512:62;13509:88;;;13577:18;;:::i;:::-;13613:2;13606:22;13300:334;;-1:-1:-1;13300:334:9:o;13639:708::-;13692:5;13745:3;13738:4;13730:6;13726:17;13722:27;13712:55;;13763:1;13760;13753:12;13712:55;13792:6;13786:13;13818:18;13814:2;13811:26;13808:52;;;13840:18;;:::i;:::-;13879:4;13907:112;14015:2;13946:66;13939:4;13935:2;13931:13;13927:86;13923:95;13907:112;:::i;:::-;14044:2;14035:7;14028:19;14088:3;14083:2;14078;14070:6;14066:15;14062:24;14059:33;14056:53;;;14105:1;14102;14095:12;14056:53;14127:1;14137:134;14151:2;14148:1;14145:9;14137:134;;;14240:14;;;14236:23;;14230:30;14208:15;;;14204:24;;14197:64;14162:10;;14137:134;;;-1:-1:-1;14314:1:9;14291:16;;;14287:25;;;14280:36;;;;14295:7;13639:708;-1:-1:-1;;;13639:708:9:o;14352:1166::-;14456:6;14487:2;14530;14518:9;14509:7;14505:23;14501:32;14498:52;;;14546:1;14543;14536:12;14498:52;14579:9;14573:16;14608:18;14649:2;14641:6;14638:14;14635:34;;;14665:1;14662;14655:12;14635:34;14703:6;14692:9;14688:22;14678:32;;14748:7;14741:4;14737:2;14733:13;14729:27;14719:55;;14770:1;14767;14760:12;14719:55;14799:2;14793:9;14821:2;14817;14814:10;14811:36;;;14827:18;;:::i;:::-;14873:2;14870:1;14866:10;14896:28;14920:2;14916;14912:11;14896:28;:::i;:::-;14958:15;;;15028:11;;;15024:20;;;14989:12;;;;15056:19;;;15053:39;;;15088:1;15085;15078:12;15053:39;15120:2;15116;15112:11;15101:22;;15132:356;15148:6;15143:3;15140:15;15132:356;;;15227:3;15221:10;15263:2;15250:11;15247:19;15244:109;;;15307:1;15336:2;15332;15325:14;15244:109;15378:67;15437:7;15432:2;15418:11;15414:2;15410:20;15406:29;15378:67;:::i;:::-;15366:80;;-1:-1:-1;15165:12:9;;;;15466;;;;15132:356;;;15507:5;14352:1166;-1:-1:-1;;;;;;;;;14352:1166:9:o;15523:184::-;15581:6;15634:2;15622:9;15613:7;15609:23;15605:32;15602:52;;;15650:1;15647;15640:12;15602:52;15673:28;15691:9;15673:28;:::i;15712:251::-;15782:6;15835:2;15823:9;15814:7;15810:23;15806:32;15803:52;;;15851:1;15848;15841:12;15803:52;15883:9;15877:16;15902:31;15927:5;15902:31;:::i;15968:245::-;16035:6;16088:2;16076:9;16067:7;16063:23;16059:32;16056:52;;;16104:1;16101;16094:12;16056:52;16136:9;16130:16;16155:28;16177:5;16155:28;:::i;16218:520::-;16505:2;16494:9;16487:21;16468:4;16531:64;16591:2;16580:9;16576:18;16568:6;16531:64;:::i;:::-;16643:9;16635:6;16631:22;16626:2;16615:9;16611:18;16604:50;16671:61;16725:6;16717;16671:61;:::i;:::-;16663:69;16218:520;-1:-1:-1;;;;;16218:520:9:o;16743:335::-;16822:6;16875:2;16863:9;16854:7;16850:23;16846:32;16843:52;;;16891:1;16888;16881:12;16843:52;16924:9;16918:16;16957:18;16949:6;16946:30;16943:50;;;16989:1;16986;16979:12;16943:50;17012:60;17064:7;17055:6;17044:9;17040:22;17012:60;:::i;:::-;17002:70;16743:335;-1:-1:-1;;;;16743:335:9:o;17479:306::-;17567:6;17575;17583;17636:2;17624:9;17615:7;17611:23;17607:32;17604:52;;;17652:1;17649;17642:12;17604:52;17681:9;17675:16;17665:26;;17731:2;17720:9;17716:18;17710:25;17700:35;;17775:2;17764:9;17760:18;17754:25;17744:35;;17479:306;;;;;:::o
Swarm Source
none
Loading...
Loading
Loading...
Loading

Loading...
Loading
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.