Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
EtherFiOracle
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 2000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "@openzeppelin-upgradeable/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol"; import "@openzeppelin-upgradeable/contracts/access/OwnableUpgradeable.sol"; import "@openzeppelin-upgradeable/contracts/security/PausableUpgradeable.sol"; import "./interfaces/IEtherFiOracle.sol"; import "./interfaces/IEtherFiAdmin.sol"; contract EtherFiOracle is Initializable, OwnableUpgradeable, PausableUpgradeable, UUPSUpgradeable, IEtherFiOracle { mapping(address => IEtherFiOracle.CommitteeMemberState) public committeeMemberStates; // committee member wallet address to its State mapping(bytes32 => IEtherFiOracle.ConsensusState) public consensusStates; // report's hash -> Consensus State uint32 public consensusVersion; // the version of the consensus uint32 public quorumSize; // the required supports to reach the consensus uint32 public reportPeriodSlot; // the period of the oracle report in # of slots uint32 public reportStartSlot; // the first report slot uint32 public lastPublishedReportRefSlot; // the ref slot of the last published report uint32 public lastPublishedReportRefBlock; // the ref block of the last published report /// Chain specification uint32 internal SLOTS_PER_EPOCH; uint32 internal SECONDS_PER_SLOT; uint32 internal BEACON_GENESIS_TIME; uint32 public numCommitteeMembers; // the total number of committee members uint32 public numActiveCommitteeMembers; // the number of active (enabled) committee members IEtherFiAdmin etherFiAdmin; mapping(address => bool) public admins; event CommitteeMemberAdded(address indexed member); event CommitteeMemberRemoved(address indexed member); event CommitteeMemberUpdated(address indexed member, bool enabled); event QuorumUpdated(uint32 newQuorumSize); event ConsensusVersionUpdated(uint32 newConsensusVersion); event OracleReportPeriodUpdated(uint32 newOracleReportPeriod); event ReportStartSlotUpdated(uint32 reportStartSlot); event ReportPublished(uint32 consensusVersion, uint32 refSlotFrom, uint32 refSlotTo, uint32 refBlockFrom, uint32 refBlockTo, bytes32 indexed hash); event ReportSubmitted(uint32 consensusVersion, uint32 refSlotFrom, uint32 refSlotTo, uint32 refBlockFrom, uint32 refBlockTo, bytes32 indexed hash, address indexed committeeMember); /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } function initialize(uint32 _quorumSize, uint32 _reportPeriodSlot, uint32 _reportStartSlot, uint32 _slotsPerEpoch, uint32 _secondsPerSlot, uint32 _genesisTime) external initializer { __Ownable_init(); __UUPSUpgradeable_init(); consensusVersion = 1; reportPeriodSlot = _reportPeriodSlot; quorumSize = _quorumSize; reportStartSlot = _reportStartSlot; SLOTS_PER_EPOCH = _slotsPerEpoch; SECONDS_PER_SLOT = _secondsPerSlot; BEACON_GENESIS_TIME = _genesisTime; } function submitReport(OracleReport calldata _report) external whenNotPaused returns (bool) { bytes32 reportHash = generateReportHash(_report); require(!consensusStates[reportHash].consensusReached, "Consensus already reached"); require(shouldSubmitReport(msg.sender), "You don't need to submit a report"); verifyReport(_report); // update the member state CommitteeMemberState storage memberState = committeeMemberStates[msg.sender]; memberState.lastReportRefSlot = _report.refSlotTo; memberState.numReports++; // update the consensus state ConsensusState storage consenState = consensusStates[reportHash]; emit ReportSubmitted( _report.consensusVersion, _report.refSlotFrom, _report.refSlotTo, _report.refBlockFrom, _report.refBlockTo, reportHash, msg.sender ); // if the consensus reaches consenState.support++; bool consensusReached = (consenState.support >= quorumSize); if (consensusReached) { consenState.consensusReached = true; consenState.consensusTimestamp = uint32(block.timestamp); _publishReport(_report, reportHash); } return consensusReached; } // For generating the next report, the starting & ending points need to be specified. // The report should include data for the specified slot and block ranges (inclusive) function blockStampForNextReport() public view returns (uint32 slotFrom, uint32 slotTo, uint32 blockFrom) { slotFrom = lastPublishedReportRefSlot == 0 ? reportStartSlot : lastPublishedReportRefSlot + 1; slotTo = slotForNextReport(); blockFrom = lastPublishedReportRefBlock == 0 ? reportStartSlot : lastPublishedReportRefBlock + 1; // `blockTo` can't be decided since a slot may not have any block (`missed slot`) } function shouldSubmitReport(address _member) public view returns (bool) { require(committeeMemberStates[_member].registered, "You are not registered as the Oracle committee member"); require(committeeMemberStates[_member].enabled, "You are disabled"); uint32 slot = slotForNextReport(); require(_isFinalized(slot), "Report Epoch is not finalized yet"); require(computeSlotAtTimestamp(block.timestamp) >= reportStartSlot, "Report Slot has not started yet"); require(lastPublishedReportRefSlot == etherFiAdmin.lastHandledReportRefSlot(), "Last published report is not handled yet"); return slot > committeeMemberStates[_member].lastReportRefSlot; } function verifyReport(OracleReport calldata _report) public view { require(_report.consensusVersion == consensusVersion, "Report is for wrong consensusVersion"); (uint32 slotFrom, uint32 slotTo, uint32 blockFrom) = blockStampForNextReport(); require(_report.refSlotFrom == slotFrom, "Report is for wrong slotFrom"); require(_report.refSlotTo == slotTo, "Report is for wrong slotTo"); require(_report.refBlockFrom == blockFrom, "Report is for wrong blockFrom"); require(_report.refBlockTo < block.number, "Report is for wrong blockTo"); require(_report.refBlockTo > etherFiAdmin.lastAdminExecutionBlock(), "Report must be based on the block after the last admin execution block"); // If two epochs in a row are justified, the current_epoch - 2 is considered finalized // Put 1 epoch more as a safe buffer uint32 currSlot = computeSlotAtTimestamp(block.timestamp); uint32 currEpoch = (currSlot / SLOTS_PER_EPOCH); uint32 reportEpoch = (_report.refSlotTo / SLOTS_PER_EPOCH); require(reportEpoch + 2 < currEpoch, "Report Epoch is not finalized yet"); } function isConsensusReached(bytes32 _hash) public view returns (bool) { return consensusStates[_hash].consensusReached; } function getConsensusTimestamp(bytes32 _hash) public view returns (uint32) { require(consensusStates[_hash].consensusReached, "Consensus is not reached yet"); return consensusStates[_hash].consensusTimestamp; } function getConsensusSlot(bytes32 _hash) public view returns (uint32) { require(consensusStates[_hash].consensusReached, "Consensus is not reached yet"); return computeSlotAtTimestamp(consensusStates[_hash].consensusTimestamp); } function _isFinalized(uint32 _slot) internal view returns (bool) { uint32 currSlot = computeSlotAtTimestamp(block.timestamp); uint32 currEpoch = (currSlot / SLOTS_PER_EPOCH); uint32 slotEpoch = (_slot / SLOTS_PER_EPOCH); return slotEpoch + 2 < currEpoch; } function _publishReport(OracleReport calldata _report, bytes32 _hash) internal { lastPublishedReportRefSlot = _report.refSlotTo; lastPublishedReportRefBlock = _report.refBlockTo; // emit report published event emit ReportPublished( _report.consensusVersion, _report.refSlotFrom, _report.refSlotTo, _report.refBlockFrom, _report.refBlockTo, _hash ); } // Given the last published report AND the current slot number, // Return the next report's `slotTo` that we are waiting for function slotForNextReport() public view returns (uint32) { uint32 currSlot = computeSlotAtTimestamp(block.timestamp); uint32 pastSlot = reportStartSlot < lastPublishedReportRefSlot ? lastPublishedReportRefSlot + 1 : reportStartSlot; uint32 diff = currSlot > pastSlot ? currSlot - pastSlot : 0; uint32 tmp = pastSlot + (diff / reportPeriodSlot) * reportPeriodSlot; uint32 __slotForNextReport = (tmp > pastSlot + reportPeriodSlot) ? tmp : pastSlot + reportPeriodSlot; return __slotForNextReport - 1; } function computeSlotAtTimestamp(uint256 timestamp) public view returns (uint32) { return uint32((timestamp - BEACON_GENESIS_TIME) / SECONDS_PER_SLOT); } function generateReportHash(OracleReport calldata _report) public pure returns (bytes32) { bytes32 chunk1 = keccak256( abi.encode( _report.consensusVersion, _report.refSlotFrom, _report.refSlotTo, _report.refBlockFrom, _report.refBlockTo, _report.accruedRewards, _report.protocolFees ) ); bytes32 chunk2 = keccak256( abi.encode( _report.validatorsToApprove, _report.liquidityPoolValidatorsToExit, _report.exitedValidators, _report.exitedValidatorsExitTimestamps, _report.slashedValidators ) ); bytes32 chunk3 = keccak256( abi.encode( _report.withdrawalRequestsToInvalidate, _report.lastFinalizedWithdrawalRequestId, _report.eEthTargetAllocationWeight, _report.etherFanTargetAllocationWeight, _report.finalizedWithdrawalAmount, _report.numValidatorsToSpinUp ) ); return keccak256(abi.encode(chunk1, chunk2, chunk3)); } function beaconGenesisTimestamp() external view returns (uint32) { return BEACON_GENESIS_TIME; } function addCommitteeMember(address _address) public onlyOwner { require(committeeMemberStates[_address].registered == false, "Already registered"); numCommitteeMembers++; numActiveCommitteeMembers++; committeeMemberStates[_address] = CommitteeMemberState(true, true, 0, 0); emit CommitteeMemberAdded(_address); } function removeCommitteeMember(address _address) public onlyOwner { require(committeeMemberStates[_address].registered == true, "Not registered"); numCommitteeMembers--; if (committeeMemberStates[_address].enabled) numActiveCommitteeMembers--; delete committeeMemberStates[_address]; emit CommitteeMemberRemoved(_address); } function manageCommitteeMember(address _address, bool _enabled) public onlyOwner { require(committeeMemberStates[_address].registered == true, "Not registered"); require(committeeMemberStates[_address].enabled != _enabled, "Already in the target state"); committeeMemberStates[_address].enabled = _enabled; if (_enabled) { numActiveCommitteeMembers++; } else { numActiveCommitteeMembers--; } emit CommitteeMemberUpdated(_address, _enabled); } function setReportStartSlot(uint32 _reportStartSlot) public isAdmin { // check if the start slot is at the beginning of the epoch require(_reportStartSlot > computeSlotAtTimestamp(block.timestamp), "The start slot should be in the future"); require(_reportStartSlot > lastPublishedReportRefSlot, "The start slot should be after the last published report"); require(_reportStartSlot % SLOTS_PER_EPOCH == 0, "The start slot should be at the beginning of the epoch"); reportStartSlot = _reportStartSlot; emit ReportStartSlotUpdated(_reportStartSlot); } function setQuorumSize(uint32 _quorumSize) public onlyOwner { quorumSize = _quorumSize; emit QuorumUpdated(_quorumSize); } function setOracleReportPeriod(uint32 _reportPeriodSlot) public isAdmin { require(_reportPeriodSlot != 0, "Report period cannot be zero"); require(_reportPeriodSlot % SLOTS_PER_EPOCH == 0, "Report period must be a multiple of the epoch"); reportPeriodSlot = _reportPeriodSlot; emit OracleReportPeriodUpdated(_reportPeriodSlot); } function setConsensusVersion(uint32 _consensusVersion) public isAdmin { require(_consensusVersion > consensusVersion, "New consensus version must be greater than the current one"); consensusVersion = _consensusVersion; emit ConsensusVersionUpdated(_consensusVersion); } function setEtherFiAdmin(address _etherFiAdminAddress) external onlyOwner { require(etherFiAdmin == IEtherFiAdmin(address(0)), "EtherFiAdmin is already set"); etherFiAdmin = IEtherFiAdmin(_etherFiAdminAddress); } function unpublishReport(bytes32 _hash) external isAdmin { require(consensusStates[_hash].consensusReached, "Consensus is not reached yet"); consensusStates[_hash].support = 0; consensusStates[_hash].consensusReached = false; } function updateLastPublishedBlockStamps(uint32 _lastPublishedReportRefSlot, uint32 _lastPublishedReportRefBlock) external isAdmin { lastPublishedReportRefSlot = _lastPublishedReportRefSlot; lastPublishedReportRefBlock = _lastPublishedReportRefBlock; } function updateAdmin(address _address, bool _isAdmin) external onlyOwner { admins[_address] = _isAdmin; } function pauseContract() external isAdmin { _pause(); } function unPauseContract() external isAdmin { _unpause(); } function getImplementation() external view returns (address) { return _getImplementation(); } function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} modifier isAdmin() { require(admins[msg.sender] || msg.sender == owner(), "EtherFiAdmin: not an admin"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.1) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/AddressUpgradeable.sol"; /** * @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] * ``` * 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 Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 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 functions marked with `initializer` can be nested in the context of a * constructor. * * Emits an {Initialized} event. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _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 255 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _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() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @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 { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../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. * * By default, the owner account will be the one that deploys the contract. 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 { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _transferOwnership(_msgSender()); } /** * @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) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; import "../utils/ContextUpgradeable.sol"; import "../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 { /** * @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); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { _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) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IEtherFiOracle { struct OracleReport { uint32 consensusVersion; uint32 refSlotFrom; uint32 refSlotTo; uint32 refBlockFrom; uint32 refBlockTo; int128 accruedRewards; int128 protocolFees; uint256[] validatorsToApprove; uint256[] liquidityPoolValidatorsToExit; uint256[] exitedValidators; uint32[] exitedValidatorsExitTimestamps; uint256[] slashedValidators; uint256[] withdrawalRequestsToInvalidate; uint32 lastFinalizedWithdrawalRequestId; uint32 eEthTargetAllocationWeight; uint32 etherFanTargetAllocationWeight; uint128 finalizedWithdrawalAmount; uint32 numValidatorsToSpinUp; } struct CommitteeMemberState { bool registered; bool enabled; uint32 lastReportRefSlot; uint32 numReports; } struct ConsensusState { uint32 support; bool consensusReached; uint32 consensusTimestamp; } function consensusVersion() external view returns (uint32); function quorumSize() external view returns (uint32); function reportPeriodSlot() external view returns (uint32); function numCommitteeMembers() external view returns (uint32); function numActiveCommitteeMembers() external view returns (uint32); function lastPublishedReportRefSlot() external view returns (uint32); function lastPublishedReportRefBlock() external view returns (uint32); function submitReport(OracleReport calldata _report) external returns (bool); function shouldSubmitReport(address _member) external view returns (bool); function verifyReport(OracleReport calldata _report) external view; function isConsensusReached(bytes32 _hash) external view returns (bool); function getConsensusTimestamp(bytes32 _hash) external view returns (uint32); function getConsensusSlot(bytes32 _hash) external view returns (uint32); function generateReportHash(OracleReport calldata _report) external pure returns (bytes32); function computeSlotAtTimestamp(uint256 timestamp) external view returns (uint32); function addCommitteeMember(address _address) external; function removeCommitteeMember(address _address) external; function manageCommitteeMember(address _address, bool _enabled) external; function setQuorumSize(uint32 _quorumSize) external; function setOracleReportPeriod(uint32 _reportPeriodSlot) external; function setConsensusVersion(uint32 _consensusVersion) external; function setEtherFiAdmin(address _etherFiAdminAddress) external; function pauseContract() external; function unPauseContract() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IEtherFiAdmin { function lastHandledReportRefSlot() external view returns (uint32); function lastHandledReportRefBlock() external view returns (uint32); function lastAdminExecutionBlock() external view returns (uint32); function numValidatorsToSpinUp() external view returns (uint32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; import "../beacon/IBeaconUpgradeable.sol"; import "../../interfaces/draft-IERC1822Upgradeable.sol"; import "../../utils/AddressUpgradeable.sol"; import "../../utils/StorageSlotUpgradeable.sol"; import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function _functionDelegateCall(address target, bytes memory data) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; import "../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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } }
{ "remappings": [ "forge-std/=lib/forge-std/src/", "@openzeppelin/=lib/openzeppelin-contracts/", "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "@uniswap/=lib/", "@eigenlayer/=lib/eigenlayer-contracts/src/", "@layerzerolabs/lz-evm-oapp-v2/contracts/=lib/Etherfi-SyncPools/node_modules/@layerzerolabs/lz-evm-oapp-v2/contracts/", "@layerzerolabs/lz-evm-protocol-v2/contracts/=lib/Etherfi-SyncPools/node_modules/@layerzerolabs/lz-evm-protocol-v2/contracts/", "@layerzerolabs/lz-evm-messagelib-v2/contracts/=lib/Etherfi-SyncPools/node_modules/@layerzerolabs/lz-evm-messagelib-v2/contracts/", "@layerzerolabs/lz-evm-oapp-v2/contracts-upgradeable/=lib/Etherfi-SyncPools/node_modules/layerzero-v2/oapp/contracts/", "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/openzeppelin-contracts/", "v3-core/=lib/v3-core/", "v3-periphery/=lib/v3-periphery/contracts/" ], "optimizer": { "enabled": true, "runs": 2000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "ipfs", "appendCBOR": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"member","type":"address"}],"name":"CommitteeMemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"member","type":"address"}],"name":"CommitteeMemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"member","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"CommitteeMemberUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newConsensusVersion","type":"uint32"}],"name":"ConsensusVersionUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"newOracleReportPeriod","type":"uint32"}],"name":"OracleReportPeriodUpdated","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":false,"internalType":"uint32","name":"newQuorumSize","type":"uint32"}],"name":"QuorumUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"consensusVersion","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refSlotFrom","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refSlotTo","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refBlockFrom","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refBlockTo","type":"uint32"},{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ReportPublished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"reportStartSlot","type":"uint32"}],"name":"ReportStartSlotUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"consensusVersion","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refSlotFrom","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refSlotTo","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refBlockFrom","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"refBlockTo","type":"uint32"},{"indexed":true,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"committeeMember","type":"address"}],"name":"ReportSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addCommitteeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beaconGenesisTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockStampForNextReport","outputs":[{"internalType":"uint32","name":"slotFrom","type":"uint32"},{"internalType":"uint32","name":"slotTo","type":"uint32"},{"internalType":"uint32","name":"blockFrom","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"committeeMemberStates","outputs":[{"internalType":"bool","name":"registered","type":"bool"},{"internalType":"bool","name":"enabled","type":"bool"},{"internalType":"uint32","name":"lastReportRefSlot","type":"uint32"},{"internalType":"uint32","name":"numReports","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"computeSlotAtTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"consensusStates","outputs":[{"internalType":"uint32","name":"support","type":"uint32"},{"internalType":"bool","name":"consensusReached","type":"bool"},{"internalType":"uint32","name":"consensusTimestamp","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"consensusVersion","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"consensusVersion","type":"uint32"},{"internalType":"uint32","name":"refSlotFrom","type":"uint32"},{"internalType":"uint32","name":"refSlotTo","type":"uint32"},{"internalType":"uint32","name":"refBlockFrom","type":"uint32"},{"internalType":"uint32","name":"refBlockTo","type":"uint32"},{"internalType":"int128","name":"accruedRewards","type":"int128"},{"internalType":"int128","name":"protocolFees","type":"int128"},{"internalType":"uint256[]","name":"validatorsToApprove","type":"uint256[]"},{"internalType":"uint256[]","name":"liquidityPoolValidatorsToExit","type":"uint256[]"},{"internalType":"uint256[]","name":"exitedValidators","type":"uint256[]"},{"internalType":"uint32[]","name":"exitedValidatorsExitTimestamps","type":"uint32[]"},{"internalType":"uint256[]","name":"slashedValidators","type":"uint256[]"},{"internalType":"uint256[]","name":"withdrawalRequestsToInvalidate","type":"uint256[]"},{"internalType":"uint32","name":"lastFinalizedWithdrawalRequestId","type":"uint32"},{"internalType":"uint32","name":"eEthTargetAllocationWeight","type":"uint32"},{"internalType":"uint32","name":"etherFanTargetAllocationWeight","type":"uint32"},{"internalType":"uint128","name":"finalizedWithdrawalAmount","type":"uint128"},{"internalType":"uint32","name":"numValidatorsToSpinUp","type":"uint32"}],"internalType":"struct IEtherFiOracle.OracleReport","name":"_report","type":"tuple"}],"name":"generateReportHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getConsensusSlot","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"getConsensusTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_quorumSize","type":"uint32"},{"internalType":"uint32","name":"_reportPeriodSlot","type":"uint32"},{"internalType":"uint32","name":"_reportStartSlot","type":"uint32"},{"internalType":"uint32","name":"_slotsPerEpoch","type":"uint32"},{"internalType":"uint32","name":"_secondsPerSlot","type":"uint32"},{"internalType":"uint32","name":"_genesisTime","type":"uint32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"isConsensusReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPublishedReportRefBlock","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastPublishedReportRefSlot","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"manageCommitteeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"numActiveCommitteeMembers","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numCommitteeMembers","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quorumSize","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeCommitteeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reportPeriodSlot","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reportStartSlot","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_consensusVersion","type":"uint32"}],"name":"setConsensusVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_etherFiAdminAddress","type":"address"}],"name":"setEtherFiAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_reportPeriodSlot","type":"uint32"}],"name":"setOracleReportPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_quorumSize","type":"uint32"}],"name":"setQuorumSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_reportStartSlot","type":"uint32"}],"name":"setReportStartSlot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"shouldSubmitReport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"slotForNextReport","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"consensusVersion","type":"uint32"},{"internalType":"uint32","name":"refSlotFrom","type":"uint32"},{"internalType":"uint32","name":"refSlotTo","type":"uint32"},{"internalType":"uint32","name":"refBlockFrom","type":"uint32"},{"internalType":"uint32","name":"refBlockTo","type":"uint32"},{"internalType":"int128","name":"accruedRewards","type":"int128"},{"internalType":"int128","name":"protocolFees","type":"int128"},{"internalType":"uint256[]","name":"validatorsToApprove","type":"uint256[]"},{"internalType":"uint256[]","name":"liquidityPoolValidatorsToExit","type":"uint256[]"},{"internalType":"uint256[]","name":"exitedValidators","type":"uint256[]"},{"internalType":"uint32[]","name":"exitedValidatorsExitTimestamps","type":"uint32[]"},{"internalType":"uint256[]","name":"slashedValidators","type":"uint256[]"},{"internalType":"uint256[]","name":"withdrawalRequestsToInvalidate","type":"uint256[]"},{"internalType":"uint32","name":"lastFinalizedWithdrawalRequestId","type":"uint32"},{"internalType":"uint32","name":"eEthTargetAllocationWeight","type":"uint32"},{"internalType":"uint32","name":"etherFanTargetAllocationWeight","type":"uint32"},{"internalType":"uint128","name":"finalizedWithdrawalAmount","type":"uint128"},{"internalType":"uint32","name":"numValidatorsToSpinUp","type":"uint32"}],"internalType":"struct IEtherFiOracle.OracleReport","name":"_report","type":"tuple"}],"name":"submitReport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unPauseContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"unpublishReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isAdmin","type":"bool"}],"name":"updateAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_lastPublishedReportRefSlot","type":"uint32"},{"internalType":"uint32","name":"_lastPublishedReportRefBlock","type":"uint32"}],"name":"updateLastPublishedBlockStamps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"uint32","name":"consensusVersion","type":"uint32"},{"internalType":"uint32","name":"refSlotFrom","type":"uint32"},{"internalType":"uint32","name":"refSlotTo","type":"uint32"},{"internalType":"uint32","name":"refBlockFrom","type":"uint32"},{"internalType":"uint32","name":"refBlockTo","type":"uint32"},{"internalType":"int128","name":"accruedRewards","type":"int128"},{"internalType":"int128","name":"protocolFees","type":"int128"},{"internalType":"uint256[]","name":"validatorsToApprove","type":"uint256[]"},{"internalType":"uint256[]","name":"liquidityPoolValidatorsToExit","type":"uint256[]"},{"internalType":"uint256[]","name":"exitedValidators","type":"uint256[]"},{"internalType":"uint32[]","name":"exitedValidatorsExitTimestamps","type":"uint32[]"},{"internalType":"uint256[]","name":"slashedValidators","type":"uint256[]"},{"internalType":"uint256[]","name":"withdrawalRequestsToInvalidate","type":"uint256[]"},{"internalType":"uint32","name":"lastFinalizedWithdrawalRequestId","type":"uint32"},{"internalType":"uint32","name":"eEthTargetAllocationWeight","type":"uint32"},{"internalType":"uint32","name":"etherFanTargetAllocationWeight","type":"uint32"},{"internalType":"uint128","name":"finalizedWithdrawalAmount","type":"uint128"},{"internalType":"uint32","name":"numValidatorsToSpinUp","type":"uint32"}],"internalType":"struct IEtherFiOracle.OracleReport","name":"_report","type":"tuple"}],"name":"verifyReport","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a0604052306080523480156200001557600080fd5b506200002062000026565b620000e8565b600054610100900460ff1615620000935760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff9081161015620000e6576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051613f936200012060003960008181610fa50152818161103b015281816113fc0152818161149201526117d80152613f936000f3fe6080604052600436106102e75760003560e01c8063648fe7cc11610184578063bac15203116100d6578063dd05ddde1161008a578063f09c168311610064578063f09c16831461091d578063f2fde38b1461093d578063f62972ec1461095d57600080fd5b8063dd05ddde146108b8578063e7f1f953146108d8578063eb3ff72b146108f857600080fd5b8063c93a522b116100bb578063c93a522b14610854578063ccb6d74b14610874578063d3df59081461089457600080fd5b8063bac152031461081b578063bbee39c71461083057600080fd5b80637fad0d4811610138578063aaf10f4211610112578063aaf10f42146107c6578063add698bd146107db578063b5dbe0b2146107fb57600080fd5b80637fad0d48146107545780638da5cb5b1461077457806396dda1d4146107a657600080fd5b8063670a6fd911610169578063670a6fd91461070457806370568cf214610724578063715018a61461073f57600080fd5b8063648fe7cc1461067057806366a027f8146106e457600080fd5b8063429b62e51161023d57806352d1902d116101f15780635b884612116101cb5780635b884612146105995780635c651037146105d55780635c975abb1461065857600080fd5b806352d1902d1461052d57806359f3569b146105505780635ae001021461057957600080fd5b80634b564656116102225780634b564656146104da5780634f1ef286146104fa578063512556961461050d57600080fd5b8063429b62e514610494578063439766ce146104c557600080fd5b80632ada27741161029f5780633659cfe6116102795780633659cfe6146104375780633c214860146104575780634233f0fd1461047757600080fd5b80632ada2774146103dd5780632dd7635c146103fd5780633068ef4d1461041257600080fd5b80631a3451ca116102d05780631a3451ca1461035b5780631c4bcfe41461039457806324e16c3b146103b457600080fd5b8063077055c1146102ec57806319a9b5991461030e575b600080fd5b3480156102f857600080fd5b5061030c6103073660046138b1565b61097d565b005b34801561031a57600080fd5b506103466103293660046138ce565b600090815260fc6020526040902054640100000000900460ff1690565b60405190151581526020015b60405180910390f35b34801561036757600080fd5b5060fd5461037f90600160801b900463ffffffff1681565b60405163ffffffff9091168152602001610352565b3480156103a057600080fd5b5061037f6103af3660046138ce565b610c0e565b3480156103c057600080fd5b5060fe5461037f9068010000000000000000900463ffffffff1681565b3480156103e957600080fd5b5061030c6103f83660046138b1565b610c96565b34801561040957600080fd5b5061037f610e65565b34801561041e57600080fd5b5060fd5461037f90640100000000900463ffffffff1681565b34801561044357600080fd5b5061030c6104523660046138fe565b610f9b565b34801561046357600080fd5b5061030c610472366004613919565b611138565b34801561048357600080fd5b5060fd5461037f9063ffffffff1681565b3480156104a057600080fd5b506103466104af3660046138fe565b60ff602081905260009182526040909120541681565b3480156104d157600080fd5b5061030c611326565b3480156104e657600080fd5b5061037f6104f53660046138ce565b6113a5565b61030c61050836600461396b565b6113f2565b34801561051957600080fd5b5061030c610528366004613a2d565b611580565b34801561053957600080fd5b506105426117cb565b604051908152602001610352565b34801561055c57600080fd5b5060fd5461037f9068010000000000000000900463ffffffff1681565b34801561058557600080fd5b5061030c6105943660046138ce565b611890565b3480156105a557600080fd5b506105ae6119a1565b6040805163ffffffff94851681529284166020840152921691810191909152606001610352565b3480156105e157600080fd5b5061062a6105f03660046138fe565b60fb6020526000908152604090205460ff8082169161010081049091169063ffffffff620100008204811691660100000000000090041684565b604080519415158552921515602085015263ffffffff91821692840192909252166060820152608001610352565b34801561066457600080fd5b5060655460ff16610346565b34801561067c57600080fd5b506106bd61068b3660046138ce565b60fc6020526000908152604090205463ffffffff8082169160ff64010000000082041691650100000000009091041683565b6040805163ffffffff94851681529215156020840152921691810191909152606001610352565b3480156106f057600080fd5b5061030c6106ff366004613aaf565b611a48565b34801561071057600080fd5b5061030c61071f366004613919565b611e84565b34801561073057600080fd5b5060fe5463ffffffff1661037f565b34801561074b57600080fd5b5061030c611eb7565b34801561076057600080fd5b5061030c61076f3660046138fe565b611ec9565b34801561078057600080fd5b506033546001600160a01b03165b6040516001600160a01b039091168152602001610352565b3480156107b257600080fd5b506103466107c1366004613aaf565b612046565b3480156107d257600080fd5b5061078e612317565b3480156107e757600080fd5b506105426107f6366004613aaf565b61234f565b34801561080757600080fd5b5061037f6108163660046138ce565b612569565b34801561082757600080fd5b5061030c6125f6565b34801561083c57600080fd5b5060fd5461037f90600160601b900463ffffffff1681565b34801561086057600080fd5b5061030c61086f3660046138b1565b612673565b34801561088057600080fd5b5061030c61088f366004613aeb565b6127b1565b3480156108a057600080fd5b5060fd5461037f90600160a01b900463ffffffff1681565b3480156108c457600080fd5b5061030c6108d33660046138b1565b612892565b3480156108e457600080fd5b5061030c6108f33660046138fe565b612907565b34801561090457600080fd5b5060fe5461037f90640100000000900463ffffffff1681565b34801561092957600080fd5b506103466109383660046138fe565b612b02565b34801561094957600080fd5b5061030c6109583660046138fe565b612e06565b34801561096957600080fd5b5061030c6109783660046138fe565b612e93565b33600090815260ff602081905260409091205416806109a657506033546001600160a01b031633145b6109f75760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064015b60405180910390fd5b610a00426113a5565b63ffffffff168163ffffffff1611610a805760405162461bcd60e51b815260206004820152602660248201527f54686520737461727420736c6f742073686f756c6420626520696e207468652060448201527f667574757265000000000000000000000000000000000000000000000000000060648201526084016109ee565b60fd5463ffffffff600160801b909104811690821611610b085760405162461bcd60e51b815260206004820152603860248201527f54686520737461727420736c6f742073686f756c64206265206166746572207460448201527f6865206c617374207075626c6973686564207265706f7274000000000000000060648201526084016109ee565b60fd54610b2290600160c01b900463ffffffff1682613b2f565b63ffffffff1615610b9b5760405162461bcd60e51b815260206004820152603660248201527f54686520737461727420736c6f742073686f756c64206265206174207468652060448201527f626567696e6e696e67206f66207468652065706f63680000000000000000000060648201526084016109ee565b60fd80547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f847e2283d470625f974fb6ce04ca895fd8445fd346dd0aeede76600209270380906020015b60405180910390a150565b600081815260fc6020526040812054640100000000900460ff16610c745760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b50600090815260fc602052604090205465010000000000900463ffffffff1690565b33600090815260ff60208190526040909120541680610cbf57506033546001600160a01b031633145b610d0b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b8063ffffffff16600003610d615760405162461bcd60e51b815260206004820152601c60248201527f5265706f727420706572696f642063616e6e6f74206265207a65726f0000000060448201526064016109ee565b60fd54610d7b90600160c01b900463ffffffff1682613b2f565b63ffffffff1615610df45760405162461bcd60e51b815260206004820152602d60248201527f5265706f727420706572696f64206d7573742062652061206d756c7469706c6560448201527f206f66207468652065706f63680000000000000000000000000000000000000060648201526084016109ee565b60fd80547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000063ffffffff8416908102919091179091556040519081527f55ece5d27fbbf0ce0b355edda10842da266263e329354ea9ed02b24ba969fb7990602001610c03565b600080610e71426113a5565b60fd5490915060009063ffffffff600160801b82048116600160601b9092041610610eab5760fd54600160601b900463ffffffff16610ec6565b60fd54610ec690600160801b900463ffffffff166001613b68565b905060008163ffffffff168363ffffffff1611610ee4576000610eee565b610eee8284613b8c565b60fd5490915060009068010000000000000000900463ffffffff16610f138184613ba9565b610f1d9190613bcc565b610f279084613b68565b60fd54909150600090610f4c9068010000000000000000900463ffffffff1685613b68565b63ffffffff168263ffffffff1611610f825760fd54610f7d9068010000000000000000900463ffffffff1685613b68565b610f84565b815b9050610f91600182613b8c565b9550505050505090565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036110395760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016109ee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166110947f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146111105760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016109ee565b61111981612f28565b6040805160008082526020820190925261113591839190612f30565b50565b6111406130d5565b6001600160a01b038216600090815260fb602052604090205460ff1615156001146111ad5760405162461bcd60e51b815260206004820152600e60248201527f4e6f74207265676973746572656400000000000000000000000000000000000060448201526064016109ee565b6001600160a01b038216600090815260fb602052604090205481151561010090910460ff161515036112215760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920696e2074686520746172676574207374617465000000000060448201526064016109ee565b6001600160a01b038216600090815260fb602052604090208054821580156101000261ff00199092169190911790915561129b5760fe805468010000000000000000900463ffffffff1690600861127783613bf4565b91906101000a81548163ffffffff021916908363ffffffff160217905550506112dd565b60fe805468010000000000000000900463ffffffff169060086112bd83613c17565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b816001600160a01b03167f9dcafe810104fa98c663da717c190f40294d51f77f4d41183a01be882b14af038260405161131a911515815260200190565b60405180910390a25050565b33600090815260ff6020819052604090912054168061134f57506033546001600160a01b031633145b61139b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b6113a361312f565b565b60fd5460fe5460009163ffffffff7c01000000000000000000000000000000000000000000000000000000009091048116916113e2911684613c55565b6113ec9190613c68565b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036114905760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016109ee565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166114eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146115675760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016109ee565b61157082612f28565b61157c82826001612f30565b5050565b600054610100900460ff16158080156115a05750600054600160ff909116105b806115ba5750303b1580156115ba575060005460ff166001145b61162c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109ee565b6000805460ff19166001179055801561164f576000805461ff0019166101001790555b611657613189565b61165f61320e565b60fd805460017fffffffffffffffffffffffffffffffffffffffff00000000ffffffff000000009091166801000000000000000063ffffffff8a81169190910291909117919091177fffffffffffffffffffffffffffffffff00000000ffffffff00000000ffffffff166401000000008a8316027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff1617600160601b888316021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b878316027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16177c0100000000000000000000000000000000000000000000000000000000868316021790915560fe805463ffffffff191691841691909117905580156117c2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461186b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109ee565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b33600090815260ff602081905260409091205416806118b957506033546001600160a01b031633145b6119055760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b600081815260fc6020526040902054640100000000900460ff1661196b5760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b600090815260fc6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000169055565b60fd5460009081908190600160801b900463ffffffff16156119dd5760fd546119d890600160801b900463ffffffff166001613b68565b6119ee565b60fd54600160601b900463ffffffff165b92506119f8610e65565b60fd54909250600160a01b900463ffffffff1615611a305760fd54611a2b90600160a01b900463ffffffff166001613b68565b611a41565b60fd54600160601b900463ffffffff165b9050909192565b60fd5463ffffffff16611a5e60208301836138b1565b63ffffffff1614611ad65760405162461bcd60e51b8152602060048201526024808201527f5265706f727420697320666f722077726f6e6720636f6e73656e73757356657260448201527f73696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109ee565b6000806000611ae36119a1565b9194509250905063ffffffff8316611b0160408601602087016138b1565b63ffffffff1614611b545760405162461bcd60e51b815260206004820152601c60248201527f5265706f727420697320666f722077726f6e6720736c6f7446726f6d0000000060448201526064016109ee565b63ffffffff8216611b6b60608601604087016138b1565b63ffffffff1614611bbe5760405162461bcd60e51b815260206004820152601a60248201527f5265706f727420697320666f722077726f6e6720736c6f74546f00000000000060448201526064016109ee565b63ffffffff8116611bd560808601606087016138b1565b63ffffffff1614611c285760405162461bcd60e51b815260206004820152601d60248201527f5265706f727420697320666f722077726f6e6720626c6f636b46726f6d00000060448201526064016109ee565b43611c3960a08601608087016138b1565b63ffffffff1610611c8c5760405162461bcd60e51b815260206004820152601b60248201527f5265706f727420697320666f722077726f6e6720626c6f636b546f000000000060448201526064016109ee565b60fe600c9054906101000a90046001600160a01b03166001600160a01b0316634132f5906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d039190613c7c565b63ffffffff16611d1960a08601608087016138b1565b63ffffffff1611611db85760405162461bcd60e51b815260206004820152604660248201527f5265706f7274206d757374206265206261736564206f6e2074686520626c6f6360448201527f6b20616674657220746865206c6173742061646d696e20657865637574696f6e60648201527f20626c6f636b0000000000000000000000000000000000000000000000000000608482015260a4016109ee565b6000611dc3426113a5565b60fd54909150600090611de390600160c01b900463ffffffff1683613ba9565b60fd54909150600090600160c01b900463ffffffff16611e096060890160408a016138b1565b611e139190613ba9565b905063ffffffff8216611e27826002613b68565b63ffffffff16106117c25760405162461bcd60e51b815260206004820152602160248201527f5265706f72742045706f6368206973206e6f742066696e616c697a65642079656044820152601d60fa1b60648201526084016109ee565b611e8c6130d5565b6001600160a01b0391909116600090815260ff60205260409020805460ff1916911515919091179055565b611ebf6130d5565b6113a3600061328b565b611ed16130d5565b6001600160a01b038116600090815260fb602052604090205460ff161515600114611f3e5760405162461bcd60e51b815260206004820152600e60248201527f4e6f74207265676973746572656400000000000000000000000000000000000060448201526064016109ee565b60fe8054640100000000900463ffffffff16906004611f5c83613c17565b825463ffffffff91821661010093840a90810292021916179091556001600160a01b038316600090815260fb602052604090205460ff91900416159050611fdf5760fe805468010000000000000000900463ffffffff16906008611fbf83613c17565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b6001600160a01b038116600081815260fb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055517fc0cdacae5a1efb347198155da639c5dbd0a4231a08caed21a124471443a2f5629190a250565b60006120506132f5565b600061205b8361234f565b600081815260fc6020526040902054909150640100000000900460ff16156120c55760405162461bcd60e51b815260206004820152601960248201527f436f6e73656e73757320616c726561647920726561636865640000000000000060448201526064016109ee565b6120ce33612b02565b6121245760405162461bcd60e51b815260206004820152602160248201527f596f7520646f6e2774206e65656420746f207375626d69742061207265706f726044820152601d60fa1b60648201526084016109ee565b61212d83611a48565b33600090815260fb6020526040908190209061214f90606086019086016138b1565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff166201000063ffffffff9283160217808355660100000000000090041681600661219b83613bf4565b825463ffffffff9182166101009390930a928302919092021990911617905550600082815260fc6020908152604090912090339084907fe6f12615b1560447dc4b63bb3fb30c998c4839bbee68d976818a929cb8fd8bba906121ff908901896138b1565b61220f60408a0160208b016138b1565b61221f60608b0160408c016138b1565b61222f60808c0160608d016138b1565b61223f60a08d0160808e016138b1565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190a3805463ffffffff1681600061228b83613bf4565b82546101009290920a63ffffffff81810219909316918316021790915560fd54835464010000000090910482169116108015915061230c57815463ffffffff421665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff9091161764010000000017825561230c8685613348565b93505050505b919050565b600061234a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b60008061235f60208401846138b1565b61236f60408501602086016138b1565b61237f60608601604087016138b1565b61238f60808701606088016138b1565b61239f60a08801608089016138b1565b6123af60c0890160a08a01613c99565b6123bf60e08a0160c08b01613c99565b6040805163ffffffff9889166020820152968816908701529386166060860152918516608085015290931660a0830152600f92830b60c083015290910b60e08201526101000160408051601f1981840301815291905280516020909101209050600061242e60e0850185613cbc565b61243c610100870187613cbc565b61244a610120890189613cbc565b6124586101408b018b613cbc565b6124666101608d018d613cbc565b60405160200161247f9a99989796959493929190613d76565b60408051601f198184030181529190528051602090910120905060006124a9610180860186613cbc565b6124bb6101c088016101a089016138b1565b6124cd6101e089016101c08a016138b1565b6124df6102008a016101e08b016138b1565b6124f16102208b016102008c01613e1a565b6125036102408c016102208d016138b1565b6040516020016125199796959493929190613e4c565b60408051601f198184030181528282528051602091820120908301869052908201849052606082018190529150608001604051602081830303815290604052805190602001209350505050919050565b600081815260fc6020526040812054640100000000900460ff166125cf5760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b600082815260fc60205260409020546113ec9065010000000000900463ffffffff166113a5565b33600090815260ff6020819052604090912054168061261f57506033546001600160a01b031633145b61266b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b6113a3613488565b33600090815260ff6020819052604090912054168061269c57506033546001600160a01b031633145b6126e85760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b60fd5463ffffffff908116908216116127695760405162461bcd60e51b815260206004820152603a60248201527f4e657720636f6e73656e7375732076657273696f6e206d75737420626520677260448201527f6561746572207468616e207468652063757272656e74206f6e6500000000000060648201526084016109ee565b60fd805463ffffffff191663ffffffff83169081179091556040519081527fc73ffc0c4d416c755e9eec7e1472715f6329066f395eb71db110c02c5e4f429190602001610c03565b33600090815260ff602081905260409091205416806127da57506033546001600160a01b031633145b6128265760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b60fd80547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff948516027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1617600160a01b9290931691909102919091179055565b61289a6130d5565b60fd80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1664010000000063ffffffff8416908102919091179091556040519081527f9795472303adc5267a6814dd0c9fc79c467be77de1f44a519881eba38ae7586c90602001610c03565b61290f6130d5565b6001600160a01b038116600090815260fb602052604090205460ff16156129785760405162461bcd60e51b815260206004820152601260248201527f416c72656164792072656769737465726564000000000000000000000000000060448201526064016109ee565b60fe8054640100000000900463ffffffff1690600461299683613bf4565b91906101000a81548163ffffffff021916908363ffffffff1602179055505060fe600881819054906101000a900463ffffffff16809291906129d790613bf4565b825461010092830a63ffffffff81810219909216928216029190911790925560408051608081018252600180825260208083019182526000838501818152606085018281526001600160a01b038b1680845260fb909452868320955186549551925191517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090961690151561ff00191617911515909702177fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1662010000968816969096027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff169590951766010000000000009290961691909102949094179055519192507f0cb38e390fbd334396cf04e29d1374459cd2f2edeb56cf4d68004319aa1575c491a250565b6001600160a01b038116600090815260fb602052604081205460ff16612b905760405162461bcd60e51b815260206004820152603560248201527f596f7520617265206e6f74207265676973746572656420617320746865204f7260448201527f61636c6520636f6d6d6974746565206d656d626572000000000000000000000060648201526084016109ee565b6001600160a01b038216600090815260fb6020526040902054610100900460ff16612bfd5760405162461bcd60e51b815260206004820152601060248201527f596f75206172652064697361626c65640000000000000000000000000000000060448201526064016109ee565b6000612c07610e65565b9050612c12816134c1565b612c685760405162461bcd60e51b815260206004820152602160248201527f5265706f72742045706f6368206973206e6f742066696e616c697a65642079656044820152601d60fa1b60648201526084016109ee565b60fd54600160601b900463ffffffff16612c81426113a5565b63ffffffff161015612cd55760405162461bcd60e51b815260206004820152601f60248201527f5265706f727420536c6f7420686173206e6f742073746172746564207965740060448201526064016109ee565b60fe600c9054906101000a90046001600160a01b03166001600160a01b0316631ebb43c66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4c9190613c7c565b60fd54600160801b900463ffffffff908116911614612dd35760405162461bcd60e51b815260206004820152602860248201527f4c617374207075626c6973686564207265706f7274206973206e6f742068616e60448201527f646c65642079657400000000000000000000000000000000000000000000000060648201526084016109ee565b6001600160a01b03909216600090815260fb602052604090205463ffffffff620100009091048116921691909111919050565b612e0e6130d5565b6001600160a01b038116612e8a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ee565b6111358161328b565b612e9b6130d5565b60fe54600160601b90046001600160a01b031615612efb5760405162461bcd60e51b815260206004820152601b60248201527f4574686572466941646d696e20697320616c726561647920736574000000000060448201526064016109ee565b60fe80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b6111356130d5565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612f6857612f6383613531565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612fc2575060408051601f3d908101601f19168201909252612fbf91810190613eaa565b60015b6130345760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016109ee565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146130c95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016109ee565b50612f63838383613607565b6033546001600160a01b031633146113a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ee565b6131376132f5565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861316c3390565b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff166132065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b6113a3613632565b600054610100900460ff166113a35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113a35760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109ee565b61335860608301604084016138b1565b60fd805463ffffffff92909216600160801b027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556133a560a08301608084016138b1565b60fd805463ffffffff92909216600160a01b027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff909216919091179055807f806d044a61ac7edf13f9a0f3dc1846baec3dd94bddee1c6d9f4e7d4841a546b061341160208501856138b1565b61342160408601602087016138b1565b61343160608701604088016138b1565b61344160808801606089016138b1565b61345160a0890160808a016138b1565b6040805163ffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161131a565b6134906136b8565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361316c565b6000806134cd426113a5565b60fd549091506000906134ed90600160c01b900463ffffffff1683613ba9565b60fd5490915060009061350d90600160c01b900463ffffffff1686613ba9565b905063ffffffff8216613521826002613b68565b63ffffffff161095945050505050565b6001600160a01b0381163b6135ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016109ee565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6136108361370a565b60008251118061361d5750805b15612f635761362c838361374a565b50505050565b600054610100900460ff166136af5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b6113a33361328b565b60655460ff166113a35760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109ee565b61371381613531565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6137c95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016109ee565b600080846001600160a01b0316846040516137e49190613ee7565b600060405180830381855af49150503d806000811461381f576040519150601f19603f3d011682016040523d82523d6000602084013e613824565b606091505b509150915061384c8282604051806060016040528060278152602001613f3760279139613855565b95945050505050565b6060831561386457508161386e565b61386e8383613875565b9392505050565b8151156138855781518083602001fd5b8060405162461bcd60e51b81526004016109ee9190613f03565b63ffffffff8116811461113557600080fd5b6000602082840312156138c357600080fd5b813561386e8161389f565b6000602082840312156138e057600080fd5b5035919050565b80356001600160a01b038116811461231257600080fd5b60006020828403121561391057600080fd5b61386e826138e7565b6000806040838503121561392c57600080fd5b613935836138e7565b91506020830135801515811461394a57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561397e57600080fd5b613987836138e7565b9150602083013567ffffffffffffffff808211156139a457600080fd5b818501915085601f8301126139b857600080fd5b8135818111156139ca576139ca613955565b604051601f8201601f19908116603f011681019083821181831017156139f2576139f2613955565b81604052828152886020848701011115613a0b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060008060c08789031215613a4657600080fd5b8635613a518161389f565b95506020870135613a618161389f565b94506040870135613a718161389f565b93506060870135613a818161389f565b92506080870135613a918161389f565b915060a0870135613aa18161389f565b809150509295509295509295565b600060208284031215613ac157600080fd5b813567ffffffffffffffff811115613ad857600080fd5b8201610240818503121561386e57600080fd5b60008060408385031215613afe57600080fd5b8235613b098161389f565b9150602083013561394a8161389f565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680613b4657613b46613b19565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115613b8557613b85613b52565b5092915050565b63ffffffff828116828216039080821115613b8557613b85613b52565b600063ffffffff80841680613bc057613bc0613b19565b92169190910492915050565b63ffffffff818116838216028082169190828114613bec57613bec613b52565b505092915050565b600063ffffffff808316818103613c0d57613c0d613b52565b6001019392505050565b600063ffffffff821680613c2d57613c2d613b52565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156113ec576113ec613b52565b600082613c7757613c77613b19565b500490565b600060208284031215613c8e57600080fd5b815161386e8161389f565b600060208284031215613cab57600080fd5b813580600f0b811461386e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cf157600080fd5b83018035915067ffffffffffffffff821115613d0c57600080fd5b6020019150600581901b3603821315613d2457600080fd5b9250929050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613d5d57600080fd5b8260051b80836020870137939093016020019392505050565b60a081526000613d8a60a083018c8e613d2b565b60208382036020850152613d9f828c8e613d2b565b91508382036040850152613db4828a8c613d2b565b848103606086015287815288925060200160005b88811015613df3578335613ddb8161389f565b63ffffffff1682529282019290820190600101613dc8565b508481036080860152613e07818789613d2b565b9f9e505050505050505050505050505050565b600060208284031215613e2c57600080fd5b81356fffffffffffffffffffffffffffffffff8116811461386e57600080fd5b60c081526000613e6060c08301898b613d2b565b63ffffffff978816602084015295871660408301525092851660608401526fffffffffffffffffffffffffffffffff91909116608083015290921660a09092019190915292915050565b600060208284031215613ebc57600080fd5b5051919050565b60005b83811015613ede578181015183820152602001613ec6565b50506000910152565b60008251613ef9818460208701613ec3565b9190910192915050565b6020815260008251806020840152613f22816040850160208701613ec3565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fa2450ffa0269481fffd88f5c5eb0adab5abdff64315df9022763670db2cf66864736f6c63430008180033
Deployed Bytecode
0x6080604052600436106102e75760003560e01c8063648fe7cc11610184578063bac15203116100d6578063dd05ddde1161008a578063f09c168311610064578063f09c16831461091d578063f2fde38b1461093d578063f62972ec1461095d57600080fd5b8063dd05ddde146108b8578063e7f1f953146108d8578063eb3ff72b146108f857600080fd5b8063c93a522b116100bb578063c93a522b14610854578063ccb6d74b14610874578063d3df59081461089457600080fd5b8063bac152031461081b578063bbee39c71461083057600080fd5b80637fad0d4811610138578063aaf10f4211610112578063aaf10f42146107c6578063add698bd146107db578063b5dbe0b2146107fb57600080fd5b80637fad0d48146107545780638da5cb5b1461077457806396dda1d4146107a657600080fd5b8063670a6fd911610169578063670a6fd91461070457806370568cf214610724578063715018a61461073f57600080fd5b8063648fe7cc1461067057806366a027f8146106e457600080fd5b8063429b62e51161023d57806352d1902d116101f15780635b884612116101cb5780635b884612146105995780635c651037146105d55780635c975abb1461065857600080fd5b806352d1902d1461052d57806359f3569b146105505780635ae001021461057957600080fd5b80634b564656116102225780634b564656146104da5780634f1ef286146104fa578063512556961461050d57600080fd5b8063429b62e514610494578063439766ce146104c557600080fd5b80632ada27741161029f5780633659cfe6116102795780633659cfe6146104375780633c214860146104575780634233f0fd1461047757600080fd5b80632ada2774146103dd5780632dd7635c146103fd5780633068ef4d1461041257600080fd5b80631a3451ca116102d05780631a3451ca1461035b5780631c4bcfe41461039457806324e16c3b146103b457600080fd5b8063077055c1146102ec57806319a9b5991461030e575b600080fd5b3480156102f857600080fd5b5061030c6103073660046138b1565b61097d565b005b34801561031a57600080fd5b506103466103293660046138ce565b600090815260fc6020526040902054640100000000900460ff1690565b60405190151581526020015b60405180910390f35b34801561036757600080fd5b5060fd5461037f90600160801b900463ffffffff1681565b60405163ffffffff9091168152602001610352565b3480156103a057600080fd5b5061037f6103af3660046138ce565b610c0e565b3480156103c057600080fd5b5060fe5461037f9068010000000000000000900463ffffffff1681565b3480156103e957600080fd5b5061030c6103f83660046138b1565b610c96565b34801561040957600080fd5b5061037f610e65565b34801561041e57600080fd5b5060fd5461037f90640100000000900463ffffffff1681565b34801561044357600080fd5b5061030c6104523660046138fe565b610f9b565b34801561046357600080fd5b5061030c610472366004613919565b611138565b34801561048357600080fd5b5060fd5461037f9063ffffffff1681565b3480156104a057600080fd5b506103466104af3660046138fe565b60ff602081905260009182526040909120541681565b3480156104d157600080fd5b5061030c611326565b3480156104e657600080fd5b5061037f6104f53660046138ce565b6113a5565b61030c61050836600461396b565b6113f2565b34801561051957600080fd5b5061030c610528366004613a2d565b611580565b34801561053957600080fd5b506105426117cb565b604051908152602001610352565b34801561055c57600080fd5b5060fd5461037f9068010000000000000000900463ffffffff1681565b34801561058557600080fd5b5061030c6105943660046138ce565b611890565b3480156105a557600080fd5b506105ae6119a1565b6040805163ffffffff94851681529284166020840152921691810191909152606001610352565b3480156105e157600080fd5b5061062a6105f03660046138fe565b60fb6020526000908152604090205460ff8082169161010081049091169063ffffffff620100008204811691660100000000000090041684565b604080519415158552921515602085015263ffffffff91821692840192909252166060820152608001610352565b34801561066457600080fd5b5060655460ff16610346565b34801561067c57600080fd5b506106bd61068b3660046138ce565b60fc6020526000908152604090205463ffffffff8082169160ff64010000000082041691650100000000009091041683565b6040805163ffffffff94851681529215156020840152921691810191909152606001610352565b3480156106f057600080fd5b5061030c6106ff366004613aaf565b611a48565b34801561071057600080fd5b5061030c61071f366004613919565b611e84565b34801561073057600080fd5b5060fe5463ffffffff1661037f565b34801561074b57600080fd5b5061030c611eb7565b34801561076057600080fd5b5061030c61076f3660046138fe565b611ec9565b34801561078057600080fd5b506033546001600160a01b03165b6040516001600160a01b039091168152602001610352565b3480156107b257600080fd5b506103466107c1366004613aaf565b612046565b3480156107d257600080fd5b5061078e612317565b3480156107e757600080fd5b506105426107f6366004613aaf565b61234f565b34801561080757600080fd5b5061037f6108163660046138ce565b612569565b34801561082757600080fd5b5061030c6125f6565b34801561083c57600080fd5b5060fd5461037f90600160601b900463ffffffff1681565b34801561086057600080fd5b5061030c61086f3660046138b1565b612673565b34801561088057600080fd5b5061030c61088f366004613aeb565b6127b1565b3480156108a057600080fd5b5060fd5461037f90600160a01b900463ffffffff1681565b3480156108c457600080fd5b5061030c6108d33660046138b1565b612892565b3480156108e457600080fd5b5061030c6108f33660046138fe565b612907565b34801561090457600080fd5b5060fe5461037f90640100000000900463ffffffff1681565b34801561092957600080fd5b506103466109383660046138fe565b612b02565b34801561094957600080fd5b5061030c6109583660046138fe565b612e06565b34801561096957600080fd5b5061030c6109783660046138fe565b612e93565b33600090815260ff602081905260409091205416806109a657506033546001600160a01b031633145b6109f75760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064015b60405180910390fd5b610a00426113a5565b63ffffffff168163ffffffff1611610a805760405162461bcd60e51b815260206004820152602660248201527f54686520737461727420736c6f742073686f756c6420626520696e207468652060448201527f667574757265000000000000000000000000000000000000000000000000000060648201526084016109ee565b60fd5463ffffffff600160801b909104811690821611610b085760405162461bcd60e51b815260206004820152603860248201527f54686520737461727420736c6f742073686f756c64206265206166746572207460448201527f6865206c617374207075626c6973686564207265706f7274000000000000000060648201526084016109ee565b60fd54610b2290600160c01b900463ffffffff1682613b2f565b63ffffffff1615610b9b5760405162461bcd60e51b815260206004820152603660248201527f54686520737461727420736c6f742073686f756c64206265206174207468652060448201527f626567696e6e696e67206f66207468652065706f63680000000000000000000060648201526084016109ee565b60fd80547fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff16600160601b63ffffffff8416908102919091179091556040519081527f847e2283d470625f974fb6ce04ca895fd8445fd346dd0aeede76600209270380906020015b60405180910390a150565b600081815260fc6020526040812054640100000000900460ff16610c745760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b50600090815260fc602052604090205465010000000000900463ffffffff1690565b33600090815260ff60208190526040909120541680610cbf57506033546001600160a01b031633145b610d0b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b8063ffffffff16600003610d615760405162461bcd60e51b815260206004820152601c60248201527f5265706f727420706572696f642063616e6e6f74206265207a65726f0000000060448201526064016109ee565b60fd54610d7b90600160c01b900463ffffffff1682613b2f565b63ffffffff1615610df45760405162461bcd60e51b815260206004820152602d60248201527f5265706f727420706572696f64206d7573742062652061206d756c7469706c6560448201527f206f66207468652065706f63680000000000000000000000000000000000000060648201526084016109ee565b60fd80547fffffffffffffffffffffffffffffffffffffffff00000000ffffffffffffffff166801000000000000000063ffffffff8416908102919091179091556040519081527f55ece5d27fbbf0ce0b355edda10842da266263e329354ea9ed02b24ba969fb7990602001610c03565b600080610e71426113a5565b60fd5490915060009063ffffffff600160801b82048116600160601b9092041610610eab5760fd54600160601b900463ffffffff16610ec6565b60fd54610ec690600160801b900463ffffffff166001613b68565b905060008163ffffffff168363ffffffff1611610ee4576000610eee565b610eee8284613b8c565b60fd5490915060009068010000000000000000900463ffffffff16610f138184613ba9565b610f1d9190613bcc565b610f279084613b68565b60fd54909150600090610f4c9068010000000000000000900463ffffffff1685613b68565b63ffffffff168263ffffffff1611610f825760fd54610f7d9068010000000000000000900463ffffffff1685613b68565b610f84565b815b9050610f91600182613b8c565b9550505050505090565b6001600160a01b037f00000000000000000000000099be559fadf311d2cedea6265f4d36dfa4377b701630036110395760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016109ee565b7f00000000000000000000000099be559fadf311d2cedea6265f4d36dfa4377b706001600160a01b03166110947f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146111105760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016109ee565b61111981612f28565b6040805160008082526020820190925261113591839190612f30565b50565b6111406130d5565b6001600160a01b038216600090815260fb602052604090205460ff1615156001146111ad5760405162461bcd60e51b815260206004820152600e60248201527f4e6f74207265676973746572656400000000000000000000000000000000000060448201526064016109ee565b6001600160a01b038216600090815260fb602052604090205481151561010090910460ff161515036112215760405162461bcd60e51b815260206004820152601b60248201527f416c726561647920696e2074686520746172676574207374617465000000000060448201526064016109ee565b6001600160a01b038216600090815260fb602052604090208054821580156101000261ff00199092169190911790915561129b5760fe805468010000000000000000900463ffffffff1690600861127783613bf4565b91906101000a81548163ffffffff021916908363ffffffff160217905550506112dd565b60fe805468010000000000000000900463ffffffff169060086112bd83613c17565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b816001600160a01b03167f9dcafe810104fa98c663da717c190f40294d51f77f4d41183a01be882b14af038260405161131a911515815260200190565b60405180910390a25050565b33600090815260ff6020819052604090912054168061134f57506033546001600160a01b031633145b61139b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b6113a361312f565b565b60fd5460fe5460009163ffffffff7c01000000000000000000000000000000000000000000000000000000009091048116916113e2911684613c55565b6113ec9190613c68565b92915050565b6001600160a01b037f00000000000000000000000099be559fadf311d2cedea6265f4d36dfa4377b701630036114905760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f64656c656761746563616c6c000000000000000000000000000000000000000060648201526084016109ee565b7f00000000000000000000000099be559fadf311d2cedea6265f4d36dfa4377b706001600160a01b03166114eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b6001600160a01b0316146115675760405162461bcd60e51b815260206004820152602c60248201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060448201527f6163746976652070726f7879000000000000000000000000000000000000000060648201526084016109ee565b61157082612f28565b61157c82826001612f30565b5050565b600054610100900460ff16158080156115a05750600054600160ff909116105b806115ba5750303b1580156115ba575060005460ff166001145b61162c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109ee565b6000805460ff19166001179055801561164f576000805461ff0019166101001790555b611657613189565b61165f61320e565b60fd805460017fffffffffffffffffffffffffffffffffffffffff00000000ffffffff000000009091166801000000000000000063ffffffff8a81169190910291909117919091177fffffffffffffffffffffffffffffffff00000000ffffffff00000000ffffffff166401000000008a8316027fffffffffffffffffffffffffffffffff00000000ffffffffffffffffffffffff1617600160601b888316021777ffffffffffffffffffffffffffffffffffffffffffffffff16600160c01b878316027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16177c0100000000000000000000000000000000000000000000000000000000868316021790915560fe805463ffffffff191691841691909117905580156117c2576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6000306001600160a01b037f00000000000000000000000099be559fadf311d2cedea6265f4d36dfa4377b70161461186b5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016109ee565b507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc90565b33600090815260ff602081905260409091205416806118b957506033546001600160a01b031633145b6119055760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b600081815260fc6020526040902054640100000000900460ff1661196b5760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b600090815260fc6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000169055565b60fd5460009081908190600160801b900463ffffffff16156119dd5760fd546119d890600160801b900463ffffffff166001613b68565b6119ee565b60fd54600160601b900463ffffffff165b92506119f8610e65565b60fd54909250600160a01b900463ffffffff1615611a305760fd54611a2b90600160a01b900463ffffffff166001613b68565b611a41565b60fd54600160601b900463ffffffff165b9050909192565b60fd5463ffffffff16611a5e60208301836138b1565b63ffffffff1614611ad65760405162461bcd60e51b8152602060048201526024808201527f5265706f727420697320666f722077726f6e6720636f6e73656e73757356657260448201527f73696f6e0000000000000000000000000000000000000000000000000000000060648201526084016109ee565b6000806000611ae36119a1565b9194509250905063ffffffff8316611b0160408601602087016138b1565b63ffffffff1614611b545760405162461bcd60e51b815260206004820152601c60248201527f5265706f727420697320666f722077726f6e6720736c6f7446726f6d0000000060448201526064016109ee565b63ffffffff8216611b6b60608601604087016138b1565b63ffffffff1614611bbe5760405162461bcd60e51b815260206004820152601a60248201527f5265706f727420697320666f722077726f6e6720736c6f74546f00000000000060448201526064016109ee565b63ffffffff8116611bd560808601606087016138b1565b63ffffffff1614611c285760405162461bcd60e51b815260206004820152601d60248201527f5265706f727420697320666f722077726f6e6720626c6f636b46726f6d00000060448201526064016109ee565b43611c3960a08601608087016138b1565b63ffffffff1610611c8c5760405162461bcd60e51b815260206004820152601b60248201527f5265706f727420697320666f722077726f6e6720626c6f636b546f000000000060448201526064016109ee565b60fe600c9054906101000a90046001600160a01b03166001600160a01b0316634132f5906040518163ffffffff1660e01b8152600401602060405180830381865afa158015611cdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d039190613c7c565b63ffffffff16611d1960a08601608087016138b1565b63ffffffff1611611db85760405162461bcd60e51b815260206004820152604660248201527f5265706f7274206d757374206265206261736564206f6e2074686520626c6f6360448201527f6b20616674657220746865206c6173742061646d696e20657865637574696f6e60648201527f20626c6f636b0000000000000000000000000000000000000000000000000000608482015260a4016109ee565b6000611dc3426113a5565b60fd54909150600090611de390600160c01b900463ffffffff1683613ba9565b60fd54909150600090600160c01b900463ffffffff16611e096060890160408a016138b1565b611e139190613ba9565b905063ffffffff8216611e27826002613b68565b63ffffffff16106117c25760405162461bcd60e51b815260206004820152602160248201527f5265706f72742045706f6368206973206e6f742066696e616c697a65642079656044820152601d60fa1b60648201526084016109ee565b611e8c6130d5565b6001600160a01b0391909116600090815260ff60205260409020805460ff1916911515919091179055565b611ebf6130d5565b6113a3600061328b565b611ed16130d5565b6001600160a01b038116600090815260fb602052604090205460ff161515600114611f3e5760405162461bcd60e51b815260206004820152600e60248201527f4e6f74207265676973746572656400000000000000000000000000000000000060448201526064016109ee565b60fe8054640100000000900463ffffffff16906004611f5c83613c17565b825463ffffffff91821661010093840a90810292021916179091556001600160a01b038316600090815260fb602052604090205460ff91900416159050611fdf5760fe805468010000000000000000900463ffffffff16906008611fbf83613c17565b91906101000a81548163ffffffff021916908363ffffffff160217905550505b6001600160a01b038116600081815260fb602052604080822080547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000169055517fc0cdacae5a1efb347198155da639c5dbd0a4231a08caed21a124471443a2f5629190a250565b60006120506132f5565b600061205b8361234f565b600081815260fc6020526040902054909150640100000000900460ff16156120c55760405162461bcd60e51b815260206004820152601960248201527f436f6e73656e73757320616c726561647920726561636865640000000000000060448201526064016109ee565b6120ce33612b02565b6121245760405162461bcd60e51b815260206004820152602160248201527f596f7520646f6e2774206e65656420746f207375626d69742061207265706f726044820152601d60fa1b60648201526084016109ee565b61212d83611a48565b33600090815260fb6020526040908190209061214f90606086019086016138b1565b81547fffffffffffffffffffffffffffffffffffffffffffffffffffff00000000ffff166201000063ffffffff9283160217808355660100000000000090041681600661219b83613bf4565b825463ffffffff9182166101009390930a928302919092021990911617905550600082815260fc6020908152604090912090339084907fe6f12615b1560447dc4b63bb3fb30c998c4839bbee68d976818a929cb8fd8bba906121ff908901896138b1565b61220f60408a0160208b016138b1565b61221f60608b0160408c016138b1565b61222f60808c0160608d016138b1565b61223f60a08d0160808e016138b1565b6040805163ffffffff96871681529486166020860152928516848401529084166060840152909216608082015290519081900360a00190a3805463ffffffff1681600061228b83613bf4565b82546101009290920a63ffffffff81810219909316918316021790915560fd54835464010000000090910482169116108015915061230c57815463ffffffff421665010000000000027fffffffffffffffffffffffffffffffffffffffffffffff0000000000ffffffff9091161764010000000017825561230c8685613348565b93505050505b919050565b600061234a7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b905090565b60008061235f60208401846138b1565b61236f60408501602086016138b1565b61237f60608601604087016138b1565b61238f60808701606088016138b1565b61239f60a08801608089016138b1565b6123af60c0890160a08a01613c99565b6123bf60e08a0160c08b01613c99565b6040805163ffffffff9889166020820152968816908701529386166060860152918516608085015290931660a0830152600f92830b60c083015290910b60e08201526101000160408051601f1981840301815291905280516020909101209050600061242e60e0850185613cbc565b61243c610100870187613cbc565b61244a610120890189613cbc565b6124586101408b018b613cbc565b6124666101608d018d613cbc565b60405160200161247f9a99989796959493929190613d76565b60408051601f198184030181529190528051602090910120905060006124a9610180860186613cbc565b6124bb6101c088016101a089016138b1565b6124cd6101e089016101c08a016138b1565b6124df6102008a016101e08b016138b1565b6124f16102208b016102008c01613e1a565b6125036102408c016102208d016138b1565b6040516020016125199796959493929190613e4c565b60408051601f198184030181528282528051602091820120908301869052908201849052606082018190529150608001604051602081830303815290604052805190602001209350505050919050565b600081815260fc6020526040812054640100000000900460ff166125cf5760405162461bcd60e51b815260206004820152601c60248201527f436f6e73656e737573206973206e6f742072656163686564207965740000000060448201526064016109ee565b600082815260fc60205260409020546113ec9065010000000000900463ffffffff166113a5565b33600090815260ff6020819052604090912054168061261f57506033546001600160a01b031633145b61266b5760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b6113a3613488565b33600090815260ff6020819052604090912054168061269c57506033546001600160a01b031633145b6126e85760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b60fd5463ffffffff908116908216116127695760405162461bcd60e51b815260206004820152603a60248201527f4e657720636f6e73656e7375732076657273696f6e206d75737420626520677260448201527f6561746572207468616e207468652063757272656e74206f6e6500000000000060648201526084016109ee565b60fd805463ffffffff191663ffffffff83169081179091556040519081527fc73ffc0c4d416c755e9eec7e1472715f6329066f395eb71db110c02c5e4f429190602001610c03565b33600090815260ff602081905260409091205416806127da57506033546001600160a01b031633145b6128265760405162461bcd60e51b815260206004820152601a60248201527f4574686572466941646d696e3a206e6f7420616e2061646d696e00000000000060448201526064016109ee565b60fd80547fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff16600160801b63ffffffff948516027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff1617600160a01b9290931691909102919091179055565b61289a6130d5565b60fd80547fffffffffffffffffffffffffffffffffffffffffffffffff00000000ffffffff1664010000000063ffffffff8416908102919091179091556040519081527f9795472303adc5267a6814dd0c9fc79c467be77de1f44a519881eba38ae7586c90602001610c03565b61290f6130d5565b6001600160a01b038116600090815260fb602052604090205460ff16156129785760405162461bcd60e51b815260206004820152601260248201527f416c72656164792072656769737465726564000000000000000000000000000060448201526064016109ee565b60fe8054640100000000900463ffffffff1690600461299683613bf4565b91906101000a81548163ffffffff021916908363ffffffff1602179055505060fe600881819054906101000a900463ffffffff16809291906129d790613bf4565b825461010092830a63ffffffff81810219909216928216029190911790925560408051608081018252600180825260208083019182526000838501818152606085018281526001600160a01b038b1680845260fb909452868320955186549551925191517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090961690151561ff00191617911515909702177fffffffffffffffffffffffffffffffffffffffffffff0000000000000000ffff1662010000968816969096027fffffffffffffffffffffffffffffffffffffffffffff00000000ffffffffffff169590951766010000000000009290961691909102949094179055519192507f0cb38e390fbd334396cf04e29d1374459cd2f2edeb56cf4d68004319aa1575c491a250565b6001600160a01b038116600090815260fb602052604081205460ff16612b905760405162461bcd60e51b815260206004820152603560248201527f596f7520617265206e6f74207265676973746572656420617320746865204f7260448201527f61636c6520636f6d6d6974746565206d656d626572000000000000000000000060648201526084016109ee565b6001600160a01b038216600090815260fb6020526040902054610100900460ff16612bfd5760405162461bcd60e51b815260206004820152601060248201527f596f75206172652064697361626c65640000000000000000000000000000000060448201526064016109ee565b6000612c07610e65565b9050612c12816134c1565b612c685760405162461bcd60e51b815260206004820152602160248201527f5265706f72742045706f6368206973206e6f742066696e616c697a65642079656044820152601d60fa1b60648201526084016109ee565b60fd54600160601b900463ffffffff16612c81426113a5565b63ffffffff161015612cd55760405162461bcd60e51b815260206004820152601f60248201527f5265706f727420536c6f7420686173206e6f742073746172746564207965740060448201526064016109ee565b60fe600c9054906101000a90046001600160a01b03166001600160a01b0316631ebb43c66040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d4c9190613c7c565b60fd54600160801b900463ffffffff908116911614612dd35760405162461bcd60e51b815260206004820152602860248201527f4c617374207075626c6973686564207265706f7274206973206e6f742068616e60448201527f646c65642079657400000000000000000000000000000000000000000000000060648201526084016109ee565b6001600160a01b03909216600090815260fb602052604090205463ffffffff620100009091048116921691909111919050565b612e0e6130d5565b6001600160a01b038116612e8a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109ee565b6111358161328b565b612e9b6130d5565b60fe54600160601b90046001600160a01b031615612efb5760405162461bcd60e51b815260206004820152601b60248201527f4574686572466941646d696e20697320616c726561647920736574000000000060448201526064016109ee565b60fe80546001600160a01b03909216600160601b026bffffffffffffffffffffffff909216919091179055565b6111356130d5565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615612f6857612f6383613531565b505050565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612fc2575060408051601f3d908101601f19168201909252612fbf91810190613eaa565b60015b6130345760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201527f6f6e206973206e6f74205555505300000000000000000000000000000000000060648201526084016109ee565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81146130c95760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f7860448201527f6961626c6555554944000000000000000000000000000000000000000000000060648201526084016109ee565b50612f63838383613607565b6033546001600160a01b031633146113a35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ee565b6131376132f5565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861316c3390565b6040516001600160a01b03909116815260200160405180910390a1565b600054610100900460ff166132065760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b6113a3613632565b600054610100900460ff166113a35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60655460ff16156113a35760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016109ee565b61335860608301604084016138b1565b60fd805463ffffffff92909216600160801b027fffffffffffffffffffffffff00000000ffffffffffffffffffffffffffffffff9092169190911790556133a560a08301608084016138b1565b60fd805463ffffffff92909216600160a01b027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff909216919091179055807f806d044a61ac7edf13f9a0f3dc1846baec3dd94bddee1c6d9f4e7d4841a546b061341160208501856138b1565b61342160408601602087016138b1565b61343160608701604088016138b1565b61344160808801606089016138b1565b61345160a0890160808a016138b1565b6040805163ffffffff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161131a565b6134906136b8565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361316c565b6000806134cd426113a5565b60fd549091506000906134ed90600160c01b900463ffffffff1683613ba9565b60fd5490915060009061350d90600160c01b900463ffffffff1686613ba9565b905063ffffffff8216613521826002613b68565b63ffffffff161095945050505050565b6001600160a01b0381163b6135ae5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e74726163740000000000000000000000000000000000000060648201526084016109ee565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6136108361370a565b60008251118061361d5750805b15612f635761362c838361374a565b50505050565b600054610100900460ff166136af5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109ee565b6113a33361328b565b60655460ff166113a35760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016109ee565b61371381613531565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b6137c95760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e7472616374000000000000000000000000000000000000000000000000000060648201526084016109ee565b600080846001600160a01b0316846040516137e49190613ee7565b600060405180830381855af49150503d806000811461381f576040519150601f19603f3d011682016040523d82523d6000602084013e613824565b606091505b509150915061384c8282604051806060016040528060278152602001613f3760279139613855565b95945050505050565b6060831561386457508161386e565b61386e8383613875565b9392505050565b8151156138855781518083602001fd5b8060405162461bcd60e51b81526004016109ee9190613f03565b63ffffffff8116811461113557600080fd5b6000602082840312156138c357600080fd5b813561386e8161389f565b6000602082840312156138e057600080fd5b5035919050565b80356001600160a01b038116811461231257600080fd5b60006020828403121561391057600080fd5b61386e826138e7565b6000806040838503121561392c57600080fd5b613935836138e7565b91506020830135801515811461394a57600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b6000806040838503121561397e57600080fd5b613987836138e7565b9150602083013567ffffffffffffffff808211156139a457600080fd5b818501915085601f8301126139b857600080fd5b8135818111156139ca576139ca613955565b604051601f8201601f19908116603f011681019083821181831017156139f2576139f2613955565b81604052828152886020848701011115613a0b57600080fd5b8260208601602083013760006020848301015280955050505050509250929050565b60008060008060008060c08789031215613a4657600080fd5b8635613a518161389f565b95506020870135613a618161389f565b94506040870135613a718161389f565b93506060870135613a818161389f565b92506080870135613a918161389f565b915060a0870135613aa18161389f565b809150509295509295509295565b600060208284031215613ac157600080fd5b813567ffffffffffffffff811115613ad857600080fd5b8201610240818503121561386e57600080fd5b60008060408385031215613afe57600080fd5b8235613b098161389f565b9150602083013561394a8161389f565b634e487b7160e01b600052601260045260246000fd5b600063ffffffff80841680613b4657613b46613b19565b92169190910692915050565b634e487b7160e01b600052601160045260246000fd5b63ffffffff818116838216019080821115613b8557613b85613b52565b5092915050565b63ffffffff828116828216039080821115613b8557613b85613b52565b600063ffffffff80841680613bc057613bc0613b19565b92169190910492915050565b63ffffffff818116838216028082169190828114613bec57613bec613b52565b505092915050565b600063ffffffff808316818103613c0d57613c0d613b52565b6001019392505050565b600063ffffffff821680613c2d57613c2d613b52565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0192915050565b818103818111156113ec576113ec613b52565b600082613c7757613c77613b19565b500490565b600060208284031215613c8e57600080fd5b815161386e8161389f565b600060208284031215613cab57600080fd5b813580600f0b811461386e57600080fd5b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613cf157600080fd5b83018035915067ffffffffffffffff821115613d0c57600080fd5b6020019150600581901b3603821315613d2457600080fd5b9250929050565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115613d5d57600080fd5b8260051b80836020870137939093016020019392505050565b60a081526000613d8a60a083018c8e613d2b565b60208382036020850152613d9f828c8e613d2b565b91508382036040850152613db4828a8c613d2b565b848103606086015287815288925060200160005b88811015613df3578335613ddb8161389f565b63ffffffff1682529282019290820190600101613dc8565b508481036080860152613e07818789613d2b565b9f9e505050505050505050505050505050565b600060208284031215613e2c57600080fd5b81356fffffffffffffffffffffffffffffffff8116811461386e57600080fd5b60c081526000613e6060c08301898b613d2b565b63ffffffff978816602084015295871660408301525092851660608401526fffffffffffffffffffffffffffffffff91909116608083015290921660a09092019190915292915050565b600060208284031215613ebc57600080fd5b5051919050565b60005b83811015613ede578181015183820152602001613ec6565b50506000910152565b60008251613ef9818460208701613ec3565b9190910192915050565b6020815260008251806020840152613f22816040850160208701613ec3565b601f01601f1916919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220fa2450ffa0269481fffd88f5c5eb0adab5abdff64315df9022763670db2cf66864736f6c63430008180033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.