{"file_path":"contracts/FeedVerifier.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport {Common} from \"@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol\";\nimport {IVerifierFeeManager} from \"@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol\";\nimport {AccessControlUpgradeable} from \"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\";\nimport {PausableUpgradeable} from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport {UUPSUpgradeable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol\";\nimport {Initializable} from \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\n\n/**\n * @title FeedVerifier\n * @notice Onchain verifier for Chainlink Data Streams Schema v7 (Redemption Rates).\n *\n * @dev UUPS upgradeable. Supports single and bulk report verification. Stores the\n *      latest price per feedId so multiple StakingVaults can share one contract.\n *\n *      Based on Chainlink's official ClientReportsVerifier example:\n *      https://docs.chain.link/data-streams/tutorials/evm-onchain-report-verification\n *\n *      Sepolia Verifier Proxy: 0x4e9935be37302B9C97Ff4ae6868F1b566ade26d2\n */\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  Interfaces\n// ─────────────────────────────────────────────────────────────────────────────\n\ninterface IVerifierProxy {\n    function verify(\n        bytes calldata payload,\n        bytes calldata parameterPayload\n    ) external payable returns (bytes memory verifierResponse);\n\n    function verifyBulk(\n        bytes[] calldata payloads,\n        bytes calldata parameterPayload\n    ) external payable returns (bytes[] memory verifiedReports);\n\n    function s_feeManager() external view returns (IVerifierFeeManager);\n}\n\ninterface IFeeManager {\n    function getFeeAndReward(\n        address subscriber,\n        bytes memory unverifiedReport,\n        address quoteAddress\n    ) external returns (Common.Asset memory, Common.Asset memory, uint256);\n\n    function i_nativeAddress() external view returns (address);\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n//  Contract\n// ─────────────────────────────────────────────────────────────────────────────\n\ncontract FeedVerifier is\n    Initializable,\n    AccessControlUpgradeable,\n    PausableUpgradeable,\n    UUPSUpgradeable\n{\n    bytes32 public constant PAUSER_ROLE   = keccak256(\"PAUSER_ROLE\");\n    bytes32 public constant UPGRADER_ROLE = keccak256(\"UPGRADER_ROLE\");\n    bytes32 public constant UPDATER_ROLE  = keccak256(\"UPDATER_ROLE\");\n\n    // ── Schema v7 (Redemption Rates) ─────────────────────────────────────────\n    struct ReportV7 {\n        bytes32 feedId;\n        uint32  validFromTimestamp;\n        uint32  observationsTimestamp;\n        uint192 nativeFee; // from Chainlink schema — not used directly but required for abi.decode offset alignment\n        uint192 linkFee;   // from Chainlink schema — not used directly but required for abi.decode offset alignment\n        uint32  expiresAt;\n        int192  price; // exchange rate, scaled 1e18\n    }\n\n    // ── Errors ────────────────────────────────────────────────────────────────\n    error InvalidReportVersion(uint16 version);\n    error NothingToWithdraw();\n    error StaleReport(uint32 newTimestamp, uint32 storedTimestamp);\n    error ExpiredReport(uint32 expiresAt, uint32 currentTime);\n    error ReportNotYetValid(uint32 validFromTimestamp, uint32 currentTime);\n    error StalePrice(bytes32 feedId, uint32 lastTimestamp, uint32 currentTime);\n    error PriceNotInitialized(bytes32 feedId);\n    error ZeroPriceInReport(bytes32 feedId);\n    error ZeroAddress();\n    error InvalidFeedId(bytes32 expected, bytes32 actual);\n\n    // ── Events ────────────────────────────────────────────────────────────────\n    event DecodedPrice(\n        bytes32 indexed feedId,\n        int192  price,\n        uint32  observationsTimestamp\n    );\n    event FeedIdUpdated(bytes32 indexed oldFeedId, bytes32 indexed newFeedId);\n    event MaxStalenessUpdated(uint32 oldMaxStaleness, uint32 newMaxStaleness);\n    event MaxStalenessByFeedUpdated(bytes32 indexed feedId, uint32 oldMaxStaleness, uint32 newMaxStaleness);\n    event EthWithdrawn(address indexed beneficiary, uint256 amount);\n\n    // ── State ─────────────────────────────────────────────────────────────────\n    IVerifierProxy public verifierProxy;\n\n    /// @notice Latest verified price per feedId (1e18 scaled int192).\n    mapping(bytes32 => int192) public priceByFeed;\n\n    /// @notice Latest observation timestamp per feedId.\n    mapping(bytes32 => uint32) public timestampByFeed;\n\n    /// @notice Most recently updated feedId (convenience for single-feed setups).\n    bytes32 public lastFeedId;\n\n    /// @notice When non-zero, only reports with this feedId are accepted.\n    bytes32 public allowedFeedId;\n\n    /// @notice Default maximum age (seconds) applied to all feeds without an explicit override.\n    ///         Defaults to 3600 (1 h). Set to 0 to disable default enforcement.\n    uint32 public defaultMaxStaleness;\n\n    /// @notice Per-feed staleness override. When non-zero, takes precedence over defaultMaxStaleness.\n    mapping(bytes32 => uint32) public maxStalenessByFeed;\n\n    // slither-disable-next-line unused-state\n    uint256[42] private __gap;\n\n    // Occupies the last slot of the original __gap[44] — storage footprint unchanged,\n    // safe for upgrading an existing proxy. OZ v4 ReentrancyGuardUpgradeable cannot be\n    // added here because: (1) Chainlink llo-feeds pins @openzeppelin/contracts@4.8.3\n    // via versioned imports, making a v5 mix unsafe in the same compilation unit;\n    // (2) adding it to an existing proxy would shift storage layout in OZ v4.\n    uint256 private _reentrancyStatus; // 0/1 = not entered, 2 = entered\n\n    modifier nonReentrant() {\n        require(_reentrancyStatus != 2, \"ReentrancyGuard: reentrant call\");\n        _reentrancyStatus = 2;\n        _;\n        _reentrancyStatus = 1;\n    }\n\n    // ── Constructor / Initializer ─────────────────────────────────────────────\n\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor() {\n        _disableInitializers();\n    }\n\n    /**\n     * @param admin_          Address that receives DEFAULT_ADMIN_ROLE, PAUSER_ROLE, UPGRADER_ROLE.\n     * @param updater_        Bot address that receives UPDATER_ROLE (may equal admin_ on testnets).\n     * @param verifierProxy_  Chainlink VerifierProxy address for this network.\n     * @param feedId_         Enforced feedId. Pass bytes32(0) to leave unenforced (migrate via initializeV2 later).\n     */\n    function initialize(address admin_, address updater_, address verifierProxy_, bytes32 feedId_) external initializer {\n        _initializeCore(admin_, updater_, verifierProxy_);\n        if (feedId_ != bytes32(0)) _setAllowedFeedId(feedId_);\n    }\n\n    /// @dev Shared setup extracted so FeedVerifierV1 mock can call it without the feedId param.\n    function _initializeCore(address admin_, address updater_, address verifierProxy_) internal {\n        if (admin_ == address(0) || updater_ == address(0) || verifierProxy_ == address(0)) revert ZeroAddress();\n        __AccessControl_init();\n        __Pausable_init();\n        __UUPSUpgradeable_init();\n        _grantRole(DEFAULT_ADMIN_ROLE, admin_);\n        _grantRole(PAUSER_ROLE,        admin_);\n        _grantRole(UPGRADER_ROLE,      admin_);\n        _grantRole(UPDATER_ROLE,       updater_);\n        verifierProxy = IVerifierProxy(verifierProxy_);\n        defaultMaxStaleness = 3600; // 1 h default; matches Solana vault-stake price_max_staleness\n    }\n\n    // ── Core ──────────────────────────────────────────────────────────────────\n\n    /**\n     * @notice Update the enforced feedId (e.g. during a scheduled feed rotation).\n     * @dev    Set to bytes32(0) to disable enforcement.\n     */\n    function setAllowedFeedId(bytes32 feedId_) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        _setAllowedFeedId(feedId_);\n    }\n\n    /**\n     * @notice Set the default maximum age (seconds) applied to all feeds without a per-feed override.\n     * @dev    Default is 3600 (1 h). Setting to 0 disables staleness enforcement for feeds\n     *         that have no per-feed override configured via setMaxStalenessByFeed().\n     */\n    function setMaxStaleness(uint32 maxStaleness_) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        emit MaxStalenessUpdated(defaultMaxStaleness, maxStaleness_);\n        defaultMaxStaleness = maxStaleness_;\n    }\n\n    /**\n     * @notice Set a per-feed staleness override for a specific feedId.\n     * @dev    When non-zero, this takes precedence over defaultMaxStaleness for that feed.\n     *         Set to 0 to remove the override and fall back to defaultMaxStaleness.\n     */\n    function setMaxStalenessByFeed(bytes32 feedId, uint32 maxStaleness_) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        emit MaxStalenessByFeedUpdated(feedId, maxStalenessByFeed[feedId], maxStaleness_);\n        maxStalenessByFeed[feedId] = maxStaleness_;\n    }\n\n    function _setAllowedFeedId(bytes32 feedId_) internal {\n        bytes32 old = allowedFeedId;\n        allowedFeedId = feedId_;\n        emit FeedIdUpdated(old, feedId_);\n    }\n\n    /**\n     * @notice Verify a single Data Streams Schema v7 report onchain.\n     * @param unverifiedReport Full payload returned by Chainlink Data Streams API.\n     */\n    function verifyReport(bytes memory unverifiedReport) external whenNotPaused onlyRole(UPDATER_ROLE) {\n        (bytes memory parameterPayload, uint256 nativeFee) = _buildParameterPayload(unverifiedReport);\n        bytes memory verified = verifierProxy.verify{value: nativeFee}(unverifiedReport, parameterPayload);\n        _storeReport(verified);\n    }\n\n    /**\n     * @notice Verify multiple Data Streams Schema v7 reports in a single call.\n     * @dev All reports must use the same fee token (single parameterPayload).\n     *      Uses VerifierProxy.verifyBulk() for gas efficiency.\n     * @param unverifiedReports Array of full payloads from Chainlink Data Streams API.\n     */\n    function verifyBulkReports(bytes[] calldata unverifiedReports) external whenNotPaused onlyRole(UPDATER_ROLE) {\n        if (unverifiedReports.length == 0) return;\n\n        (bytes memory parameterPayload, uint256 nativeFee) = _buildParameterPayload(unverifiedReports[0]);\n        bytes[] memory verifiedReports = verifierProxy.verifyBulk{value: nativeFee}(unverifiedReports, parameterPayload);\n\n        for (uint256 i = 0; i < verifiedReports.length; i++) {\n            _storeReport(verifiedReports[i]);\n        }\n    }\n\n    // ── Views ─────────────────────────────────────────────────────────────────\n\n    /// @notice Latest verified price for a specific feedId.\n    /// @dev    Reverts PriceNotInitialized if no report has been stored yet.\n    ///         Reverts StalePrice if the effective staleness limit is exceeded.\n    ///         maxStalenessByFeed[feedId] takes precedence over defaultMaxStaleness when non-zero.\n    function priceOf(bytes32 feedId) external view returns (int192) {\n        uint32 timestamp = timestampByFeed[feedId];\n        if (timestamp == 0) revert PriceNotInitialized(feedId);\n        uint32 effective = maxStalenessByFeed[feedId] > 0 ? maxStalenessByFeed[feedId] : defaultMaxStaleness;\n        if (effective > 0 && block.timestamp - timestamp > effective)\n            revert StalePrice(feedId, timestamp, uint32(block.timestamp));\n        int192 price = priceByFeed[feedId];\n        if (price <= 0) revert ZeroPriceInReport(feedId);\n        return price;\n    }\n\n    /// @notice Latest observation timestamp for a specific feedId.\n    function timestampOf(bytes32 feedId) external view returns (uint32) {\n        return timestampByFeed[feedId];\n    }\n\n    // ── Admin ─────────────────────────────────────────────────────────────────\n\n    function pause()   external onlyRole(PAUSER_ROLE) { _pause(); }\n    function unpause() external onlyRole(PAUSER_ROLE) { _unpause(); }\n\n    /// @notice Withdraw ETH held by this contract (e.g. unspent verification fees).\n    /// @dev    .transfer() caps the call at 2300 gas so reentrance is physically impossible;\n    ///         nonReentrant is added as defence-in-depth in case this is ever changed to .call().\n    function withdrawEth(address payable beneficiary) external onlyRole(DEFAULT_ADMIN_ROLE) nonReentrant {\n        if (beneficiary == address(0)) revert ZeroAddress();\n        uint256 amount = address(this).balance;\n        if (amount == 0) revert NothingToWithdraw();\n        emit EthWithdrawn(beneficiary, amount);\n        beneficiary.transfer(amount);\n    }\n\n    /// @notice Accept ETH to fund native fee payments on mainnet.\n    receive() external payable {}\n\n    // ── Internal ──────────────────────────────────────────────────────────────\n\n    function _authorizeUpgrade(address newImplementation)\n        internal\n        override\n        onlyRole(UPGRADER_ROLE)\n    {}\n\n    /**\n     * @dev Validates schema version and builds the fee parameterPayload.\n     *      Returns (empty bytes, 0) when no FeeManager is present (e.g. Sepolia).\n     *      Returns (abi.encode(nativeToken), nativeFee) on mainnet — caller must forward nativeFee.\n     */\n    function _buildParameterPayload(bytes memory unverifiedReport) internal returns (bytes memory parameterPayload, uint256 nativeFee) {\n        (, bytes memory reportData) = abi.decode(unverifiedReport, (bytes32[3], bytes));\n\n        uint16 reportVersion = (uint16(uint8(reportData[0])) << 8) | uint16(uint8(reportData[1]));\n        if (reportVersion != 7) revert InvalidReportVersion(reportVersion);\n\n        IFeeManager feeManager = IFeeManager(address(verifierProxy.s_feeManager()));\n        if (address(feeManager) != address(0)) {\n            address nativeToken = feeManager.i_nativeAddress();\n            (Common.Asset memory fee,,) = feeManager.getFeeAndReward(address(this), reportData, nativeToken);\n            nativeFee = fee.amount;\n            parameterPayload = abi.encode(nativeToken);\n        }\n        // else: no FeeManager (Sepolia) — parameterPayload stays empty, nativeFee stays 0\n    }\n\n    /**\n     * @dev Decodes a verified Schema v7 report and stores price + timestamp per feedId.\n     *      Reverts on expired or stale reports to prevent overwriting fresh data.\n     */\n    function _storeReport(bytes memory verified) internal {\n        ReportV7 memory report = abi.decode(verified, (ReportV7));\n\n        if (allowedFeedId != bytes32(0) && report.feedId != allowedFeedId)\n            revert InvalidFeedId(allowedFeedId, report.feedId);\n\n        if (block.timestamp < report.validFromTimestamp)\n            revert ReportNotYetValid(report.validFromTimestamp, uint32(block.timestamp));\n\n        if (block.timestamp > report.expiresAt)\n            revert ExpiredReport(report.expiresAt, uint32(block.timestamp));\n\n        if (report.observationsTimestamp <= timestampByFeed[report.feedId])\n            revert StaleReport(report.observationsTimestamp, timestampByFeed[report.feedId]);\n\n        if (report.price <= 0) revert ZeroPriceInReport(report.feedId);\n\n        priceByFeed[report.feedId]     = report.price;\n        timestampByFeed[report.feedId] = report.observationsTimestamp;\n        lastFeedId                     = report.feedId;\n\n        emit DecodedPrice(report.feedId, report.price, report.observationsTimestamp);\n    }\n}\n","deployed_bytecode":"0x6080604052600436106101e75760003560e01c80634f1ef2861161010257806391d1485411610095578063e63ab1e911610064578063e63ab1e9146105cf578063eec332fd146105f1578063f6d9adce14610611578063f72c0d8b1461064557600080fd5b806391d148541461055a578063a217fddf1461057a578063d547741f1461058f578063e25d933d146105af57600080fd5b80636e38eef3116100d15780636e38eef3146104d157806376fa0b8a146104f15780637d926870146105255780638456cb591461054557600080fd5b80634f1ef2861461047157806352d1902d146104845780635c975abb1461049957806363acc14d146104b157600080fd5b806325e160631161017a5780633f4ba83a116101495780633f4ba83a146103ea57806347e63380146103ff57806347f77bc0146104215780634cf897881461045a57600080fd5b806325e160631461036a5780632f2ff15d1461038a57806336568abe146103aa5780633659cfe6146103ca57600080fd5b80631af189a4116101b65780631af189a4146102a25780631fee5983146102c25780632452ceb7146102f6578063248a9ca31461033a57600080fd5b806301ffc9a7146101f357806304b9125b14610228578063068913be1461024d57806311829f491461026f57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004611eec565b610679565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023f6101305481565b60405190815260200161021f565b34801561025957600080fd5b5061026d610268366004611f16565b6106b0565b005b34801561027b57600080fd5b506101325461028d9063ffffffff1681565b60405163ffffffff909116815260200161021f565b3480156102ae57600080fd5b5061026d6102bd366004612076565b610804565b3480156102ce57600080fd5b5061028d6102dd3660046120aa565b6101336020526000908152604090205463ffffffff1681565b34801561030257600080fd5b506103276103113660046120aa565b61012e6020526000908152604090205460170b81565b60405160179190910b815260200161021f565b34801561034657600080fd5b5061023f6103553660046120aa565b60009081526065602052604090206001015490565b34801561037657600080fd5b5061026d6103853660046120d8565b6108c7565b34801561039657600080fd5b5061026d6103a53660046120f5565b6109ff565b3480156103b657600080fd5b5061026d6103c53660046120f5565b610a24565b3480156103d657600080fd5b5061026d6103e53660046120d8565b610aa2565b3480156103f657600080fd5b5061026d610b81565b34801561040b57600080fd5b5061023f60008051602061298683398151915281565b34801561042d57600080fd5b5061012d54610442906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561046657600080fd5b5061023f6101315481565b61026d61047f366004612125565b610ba1565b34801561049057600080fd5b5061023f610c6d565b3480156104a557600080fd5b5060975460ff16610213565b3480156104bd57600080fd5b5061026d6104cc366004612174565b610d20565b3480156104dd57600080fd5b5061026d6104ec3660046121d7565b610e46565b3480156104fd57600080fd5b5061028d61050c3660046120aa565b600090815261012f602052604090205463ffffffff1690565b34801561053157600080fd5b5061026d6105403660046120aa565b610ed2565b34801561055157600080fd5b5061026d610ee6565b34801561056657600080fd5b506102136105753660046120f5565b610f06565b34801561058657600080fd5b5061023f600081565b34801561059b57600080fd5b5061026d6105aa3660046120f5565b610f31565b3480156105bb57600080fd5b5061026d6105ca3660046121fc565b610f56565b3480156105db57600080fd5b5061023f6000805160206129a683398151915281565b3480156105fd57600080fd5b5061032761060c3660046120aa565b610fc4565b34801561061d57600080fd5b5061028d61062c3660046120aa565b61012f6020526000908152604090205463ffffffff1681565b34801561065157600080fd5b5061023f7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b14806106aa57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106b86110dd565b6000805160206129868339815191526106d081611125565b81156107ff5760008061073b858560008181106106ef576106ef612219565b9050602002810190610701919061222f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061112f92505050565b61012d54604051633e1ce98760e21b81529294509092506000916001600160a01b039091169063f873a61c90849061077b908a908a9089906004016122f5565b60006040518083038185885af1158015610799573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526107c291908101906123e5565b905060005b81518110156107fa576107f28282815181106107e5576107e5612219565b6020026020010151611360565b6001016107c7565b505050505b505050565b61080c6110dd565b60008051602061298683398151915261082481611125565b6000806108308461112f565b61012d54604051637bf41d7760e11b81529294509092506000916001600160a01b039091169063f7e83aee90849061086e90899088906004016124b4565b60006040518083038185885af115801561088c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526108b591908101906124e2565b90506108c081611360565b5050505050565b60006108d281611125565b61015e5460020361092a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600261015e556001600160a01b0382166109575760405163d92e233d60e01b815260040160405180910390fd5b47600081900361097a57604051630686827b60e51b815260040160405180910390fd5b826001600160a01b03167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b591815260200190565b60405180910390a26040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156109f3573d6000803e3d6000fd5b5050600161015e555050565b600082815260656020526040902060010154610a1a81611125565b6107ff838361157e565b6001600160a01b0381163314610a945760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610921565b610a9e8282611604565b5050565b6001600160a01b037f000000000000000000000000bc6023cb49f8e8ca6cef563d5fd97ba4c6a5d937163003610aea5760405162461bcd60e51b815260040161092190612516565b7f000000000000000000000000bc6023cb49f8e8ca6cef563d5fd97ba4c6a5d9376001600160a01b0316610b33600080516020612966833981519152546001600160a01b031690565b6001600160a01b031614610b595760405162461bcd60e51b815260040161092190612562565b610b628161166b565b60408051600080825260208201909252610b7e91839190611695565b50565b6000805160206129a6833981519152610b9981611125565b610b7e611800565b6001600160a01b037f000000000000000000000000bc6023cb49f8e8ca6cef563d5fd97ba4c6a5d937163003610be95760405162461bcd60e51b815260040161092190612516565b7f000000000000000000000000bc6023cb49f8e8ca6cef563d5fd97ba4c6a5d9376001600160a01b0316610c32600080516020612966833981519152546001600160a01b031690565b6001600160a01b031614610c585760405162461bcd60e51b815260040161092190612562565b610c618261166b565b610a9e82826001611695565b6000306001600160a01b037f000000000000000000000000bc6023cb49f8e8ca6cef563d5fd97ba4c6a5d9371614610d0d5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610921565b5060008051602061296683398151915290565b600054610100900460ff1615808015610d405750600054600160ff909116105b80610d5a5750303b158015610d5a575060005460ff166001145b610dbd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610921565b6000805460ff191660011790558015610de0576000805461ff0019166101001790555b610deb858585611852565b8115610dfa57610dfa82611954565b80156108c0576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000610e5181611125565b6000838152610133602090815260409182902054825163ffffffff91821681529085169181019190915284917ff147b2da100fe126ed656e714404ac929d336f244df13e546cd063c22b0fdea9910160405180910390a25060009182526101336020526040909120805463ffffffff191663ffffffff909216919091179055565b6000610edd81611125565b610a9e82611954565b6000805160206129a6833981519152610efe81611125565b610b7e61198e565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600082815260656020526040902060010154610f4c81611125565b6107ff8383611604565b6000610f6181611125565b610132546040805163ffffffff928316815291841660208301527f3537a40f73e1f477d9cf3d802d6d7d0a3b482de21a66cfb10a26497a10782a42910160405180910390a150610132805463ffffffff191663ffffffff92909216919091179055565b600081815261012f602052604081205463ffffffff16808203610ffd576040516354865dd760e11b815260048101849052602401610921565b6000838152610133602052604081205463ffffffff16611026576101325463ffffffff1661103d565b6000848152610133602052604090205463ffffffff165b905060008163ffffffff1611801561106b57508063ffffffff168263ffffffff164261106991906125c4565b115b1561109f5760405162835eb960e61b81526004810185905263ffffffff808416602483015242166044820152606401610921565b600084815261012e602052604081205460170b9081136110d55760405163f5f1401560e01b815260048101869052602401610921565b949350505050565b60975460ff16156111235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610921565b565b610b7e81336119cb565b60606000808380602001905181019061114891906125d7565b91505060008160018151811061116057611160612219565b602001015160f81c60f81b60f81c60ff1660088360008151811061118657611186612219565b016020015160f81c901b179050600761ffff8216146111be57604051636a75f7df60e01b815261ffff82166004820152602401610921565b61012d54604080516338416b5b60e01b815290516000926001600160a01b0316916338416b5b9160048083019260209291908290030181865afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190612670565b90506001600160a01b03811615611358576000816001600160a01b031663638786686040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612670565b90506000826001600160a01b031663e03dab1a3087856040518463ffffffff1660e01b81526004016112d69392919061268d565b60a0604051808303816000875af11580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113199190612723565b50509050806020015195508160405160200161134491906001600160a01b0391909116815260200190565b604051602081830303815290604052965050505b505050915091565b6000818060200190518101906113769190612780565b610131549091501580159061138f575061013154815114155b156113bc576101315481516040516316997ef960e01b815260048101929092526024820152604401610921565b806020015163ffffffff164210156113fe57602081015160405163029223f360e01b815263ffffffff9182166004820152429091166024820152604401610921565b8060a0015163ffffffff164211156114405760a0810151604051636ce02d4360e11b815263ffffffff9182166004820152429091166024820152604401610921565b8051600090815261012f602052604090819020549082015163ffffffff9182169116116114a6576040818101518251600090815261012f60205282902054915163a34aa45d60e01b815263ffffffff918216600482015291166024820152604401610921565b60008160c0015160170b136114d457805160405163f5f1401560e01b81526004810191909152602401610921565b60c0810180518251600090815261012e6020908152604080832080546001600160c01b0319166001600160c01b039095169490941790935582850180518651845261012f835292849020805463ffffffff191663ffffffff948516179055855161013081905594519051845160179290920b8252909216908201527f9d4c6cecfe59b949cddc17ce12e615ed15e349547ed2e6d376a5083450228e2a910160405180910390a25050565b6115888282610f06565b610a9e5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556115c03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61160e8282610f06565b15610a9e5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610a9e81611125565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156116c8576107ff83611a24565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611722575060408051601f3d908101601f1916820190925261171f9181019061281c565b60015b6117855760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610921565b60008051602061296683398151915281146117f45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610921565b506107ff838383611ac0565b611808611aeb565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038316158061186f57506001600160a01b038216155b8061188157506001600160a01b038116155b1561189f5760405163d92e233d60e01b815260040160405180910390fd5b6118a7611b34565b6118af611b5b565b6118b7611b34565b6118c260008461157e565b6118da6000805160206129a68339815191528461157e565b6119047f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e38461157e565b61191c6000805160206129868339815191528361157e565b61012d80546001600160a01b039092166001600160a01b03199092169190911790555050610132805463ffffffff1916610e10179055565b610131805490829055604051829082907fb1d3fd1043ba7e8aa4dc147ae75d3b4d9c9d05e5087cae2e72765ef47d84678f90600090a35050565b6119966110dd565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118353390565b6119d58282610f06565b610a9e576119e281611b8a565b6119ed836020611b9c565b6040516020016119fe929190612835565b60408051601f198184030181529082905262461bcd60e51b8252610921916004016128aa565b6001600160a01b0381163b611a915760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610921565b60008051602061296683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611ac983611d3e565b600082511180611ad65750805b156107ff57611ae58383611d7e565b50505050565b60975460ff166111235760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610921565b600054610100900460ff166111235760405162461bcd60e51b8152600401610921906128bd565b600054610100900460ff16611b825760405162461bcd60e51b8152600401610921906128bd565b611123611da3565b60606106aa6001600160a01b03831660145b60606000611bab836002612908565b611bb690600261291f565b6001600160401b03811115611bcd57611bcd611f8b565b6040519080825280601f01601f191660200182016040528015611bf7576020820181803683370190505b509050600360fc1b81600081518110611c1257611c12612219565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c4157611c41612219565b60200101906001600160f81b031916908160001a9053506000611c65846002612908565b611c7090600161291f565b90505b6001811115611ce8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611ca457611ca4612219565b1a60f81b828281518110611cba57611cba612219565b60200101906001600160f81b031916908160001a90535060049490941c93611ce181612932565b9050611c73565b508315611d375760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610921565b9392505050565b611d4781611a24565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611d3783836040518060600160405280602781526020016129c660279139611dd6565b600054610100900460ff16611dca5760405162461bcd60e51b8152600401610921906128bd565b6097805460ff19169055565b6060600080856001600160a01b031685604051611df39190612949565b600060405180830381855af49150503d8060008114611e2e576040519150601f19603f3d011682016040523d82523d6000602084013e611e33565b606091505b5091509150611e4486838387611e4e565b9695505050505050565b60608315611ebd578251600003611eb6576001600160a01b0385163b611eb65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610921565b50816110d5565b6110d58383815115611ed25781518083602001fd5b8060405162461bcd60e51b815260040161092191906128aa565b600060208284031215611efe57600080fd5b81356001600160e01b031981168114611d3757600080fd5b60008060208385031215611f2957600080fd5b82356001600160401b03811115611f3f57600080fd5b8301601f81018513611f5057600080fd5b80356001600160401b03811115611f6657600080fd5b8560208260051b8401011115611f7b57600080fd5b6020919091019590945092505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715611fc357611fc3611f8b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611ff157611ff1611f8b565b604052919050565b60006001600160401b0382111561201257612012611f8b565b50601f01601f191660200190565b600082601f83011261203157600080fd5b813561204461203f82611ff9565b611fc9565b81815284602083860101111561205957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561208857600080fd5b81356001600160401b0381111561209e57600080fd5b6110d584828501612020565b6000602082840312156120bc57600080fd5b5035919050565b6001600160a01b0381168114610b7e57600080fd5b6000602082840312156120ea57600080fd5b8135611d37816120c3565b6000806040838503121561210857600080fd5b82359150602083013561211a816120c3565b809150509250929050565b6000806040838503121561213857600080fd5b8235612143816120c3565b915060208301356001600160401b0381111561215e57600080fd5b61216a85828601612020565b9150509250929050565b6000806000806080858703121561218a57600080fd5b8435612195816120c3565b935060208501356121a5816120c3565b925060408501356121b5816120c3565b9396929550929360600135925050565b63ffffffff81168114610b7e57600080fd5b600080604083850312156121ea57600080fd5b82359150602083013561211a816121c5565b60006020828403121561220e57600080fd5b8135611d37816121c5565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261224657600080fd5b8301803591506001600160401b0382111561226057600080fd5b60200191503681900382131561227557600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b6040808252810183905260006060600585901b830181019083018683601e1936839003015b8882101561238a57868503605f19018452823581811261233957600080fd5b8a016020810190356001600160401b0381111561235557600080fd5b80360382131561236457600080fd5b61236f87828461227c565b9650505060208301925060208401935060018201915061231a565b505050508281036020840152611e4481856122c9565b600082601f8301126123b157600080fd5b81516123bf61203f82611ff9565b8181528460208386010111156123d457600080fd5b6110d58260208301602087016122a5565b6000602082840312156123f757600080fd5b81516001600160401b0381111561240d57600080fd5b8201601f8101841361241e57600080fd5b80516001600160401b0381111561243757612437611f8b565b8060051b61244760208201611fc9565b9182526020818401810192908101908784111561246357600080fd5b6020850192505b838310156124a95782516001600160401b0381111561248857600080fd5b612497896020838901016123a0565b8352506020928301929091019061246a565b979650505050505050565b6040815260006124c760408301856122c9565b82810360208401526124d981856122c9565b95945050505050565b6000602082840312156124f457600080fd5b81516001600160401b0381111561250a57600080fd5b6110d5848285016123a0565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106aa576106aa6125ae565b600080608083850312156125ea57600080fd5b83601f8401126125f957600080fd5b604051606081016001600160401b038111828210171561261b5761261b611f8b565b60405280606085018681111561263057600080fd5b855b8181101561264a578051835260209283019201612632565b5051919350506001600160401b0381111561266457600080fd5b61216a858286016123a0565b60006020828403121561268257600080fd5b8151611d37816120c3565b6001600160a01b03841681526060602082018190526000906126b1908301856122c9565b905060018060a01b0383166040830152949350505050565b6000604082840312156126db57600080fd5b604080519081016001600160401b03811182821017156126fd576126fd611f8b565b80604052508091508251612710816120c3565b8152602092830151920191909152919050565b600080600060a0848603121561273857600080fd5b61274285856126c9565b925061275185604086016126c9565b6080949094015192959394509192915050565b80516001600160c01b038116811461277b57600080fd5b919050565b600060e082840312801561279357600080fd5b5061279c611fa1565b8251815260208301516127ae816121c5565b602082015260408301516127c1816121c5565b60408201526127d260608401612764565b60608201526127e360808401612764565b608082015260a08301516127f6816121c5565b60a082015260c0830151601781900b811461281057600080fd5b60c08201529392505050565b60006020828403121561282e57600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161286d8160178501602088016122a5565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161289e8160288401602088016122a5565b01602801949350505050565b602081526000611d3760208301846122c9565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176106aa576106aa6125ae565b808201808211156106aa576106aa6125ae565b600081612941576129416125ae565b506000190190565b6000825161295b8184602087016122a5565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122090aea47c4b9f4824d2d78e1891b23f1ef14f77e9e193adf85aaa571a4265406464736f6c634300081c0033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"paris","libraries":{},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}}},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":null,"compiler_version":"v0.8.28+commit.7893614a","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-13T17:27:07.618837Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a06040523060805234801561001457600080fd5b5061001d610022565b6100e1565b600054610100900460ff161561008e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b60005460ff908116146100df576000805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b608051612a2261011860003960008181610aac01528181610aec01528181610bab01528181610beb0152610c7a0152612a226000f3fe6080604052600436106101e75760003560e01c80634f1ef2861161010257806391d1485411610095578063e63ab1e911610064578063e63ab1e9146105cf578063eec332fd146105f1578063f6d9adce14610611578063f72c0d8b1461064557600080fd5b806391d148541461055a578063a217fddf1461057a578063d547741f1461058f578063e25d933d146105af57600080fd5b80636e38eef3116100d15780636e38eef3146104d157806376fa0b8a146104f15780637d926870146105255780638456cb591461054557600080fd5b80634f1ef2861461047157806352d1902d146104845780635c975abb1461049957806363acc14d146104b157600080fd5b806325e160631161017a5780633f4ba83a116101495780633f4ba83a146103ea57806347e63380146103ff57806347f77bc0146104215780634cf897881461045a57600080fd5b806325e160631461036a5780632f2ff15d1461038a57806336568abe146103aa5780633659cfe6146103ca57600080fd5b80631af189a4116101b65780631af189a4146102a25780631fee5983146102c25780632452ceb7146102f6578063248a9ca31461033a57600080fd5b806301ffc9a7146101f357806304b9125b14610228578063068913be1461024d57806311829f491461026f57600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061021361020e366004611eec565b610679565b60405190151581526020015b60405180910390f35b34801561023457600080fd5b5061023f6101305481565b60405190815260200161021f565b34801561025957600080fd5b5061026d610268366004611f16565b6106b0565b005b34801561027b57600080fd5b506101325461028d9063ffffffff1681565b60405163ffffffff909116815260200161021f565b3480156102ae57600080fd5b5061026d6102bd366004612076565b610804565b3480156102ce57600080fd5b5061028d6102dd3660046120aa565b6101336020526000908152604090205463ffffffff1681565b34801561030257600080fd5b506103276103113660046120aa565b61012e6020526000908152604090205460170b81565b60405160179190910b815260200161021f565b34801561034657600080fd5b5061023f6103553660046120aa565b60009081526065602052604090206001015490565b34801561037657600080fd5b5061026d6103853660046120d8565b6108c7565b34801561039657600080fd5b5061026d6103a53660046120f5565b6109ff565b3480156103b657600080fd5b5061026d6103c53660046120f5565b610a24565b3480156103d657600080fd5b5061026d6103e53660046120d8565b610aa2565b3480156103f657600080fd5b5061026d610b81565b34801561040b57600080fd5b5061023f60008051602061298683398151915281565b34801561042d57600080fd5b5061012d54610442906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561046657600080fd5b5061023f6101315481565b61026d61047f366004612125565b610ba1565b34801561049057600080fd5b5061023f610c6d565b3480156104a557600080fd5b5060975460ff16610213565b3480156104bd57600080fd5b5061026d6104cc366004612174565b610d20565b3480156104dd57600080fd5b5061026d6104ec3660046121d7565b610e46565b3480156104fd57600080fd5b5061028d61050c3660046120aa565b600090815261012f602052604090205463ffffffff1690565b34801561053157600080fd5b5061026d6105403660046120aa565b610ed2565b34801561055157600080fd5b5061026d610ee6565b34801561056657600080fd5b506102136105753660046120f5565b610f06565b34801561058657600080fd5b5061023f600081565b34801561059b57600080fd5b5061026d6105aa3660046120f5565b610f31565b3480156105bb57600080fd5b5061026d6105ca3660046121fc565b610f56565b3480156105db57600080fd5b5061023f6000805160206129a683398151915281565b3480156105fd57600080fd5b5061032761060c3660046120aa565b610fc4565b34801561061d57600080fd5b5061028d61062c3660046120aa565b61012f6020526000908152604090205463ffffffff1681565b34801561065157600080fd5b5061023f7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e381565b60006001600160e01b03198216637965db0b60e01b14806106aa57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6106b86110dd565b6000805160206129868339815191526106d081611125565b81156107ff5760008061073b858560008181106106ef576106ef612219565b9050602002810190610701919061222f565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061112f92505050565b61012d54604051633e1ce98760e21b81529294509092506000916001600160a01b039091169063f873a61c90849061077b908a908a9089906004016122f5565b60006040518083038185885af1158015610799573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526107c291908101906123e5565b905060005b81518110156107fa576107f28282815181106107e5576107e5612219565b6020026020010151611360565b6001016107c7565b505050505b505050565b61080c6110dd565b60008051602061298683398151915261082481611125565b6000806108308461112f565b61012d54604051637bf41d7760e11b81529294509092506000916001600160a01b039091169063f7e83aee90849061086e90899088906004016124b4565b60006040518083038185885af115801561088c573d6000803e3d6000fd5b50505050506040513d6000823e601f3d908101601f191682016040526108b591908101906124e2565b90506108c081611360565b5050505050565b60006108d281611125565b61015e5460020361092a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b600261015e556001600160a01b0382166109575760405163d92e233d60e01b815260040160405180910390fd5b47600081900361097a57604051630686827b60e51b815260040160405180910390fd5b826001600160a01b03167f8455ae6be5d92f1df1c3c1484388e247a36c7e60d72055ae216dbc258f257d4b826040516109b591815260200190565b60405180910390a26040516001600160a01b0384169082156108fc029083906000818181858888f193505050501580156109f3573d6000803e3d6000fd5b5050600161015e555050565b600082815260656020526040902060010154610a1a81611125565b6107ff838361157e565b6001600160a01b0381163314610a945760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608401610921565b610a9e8282611604565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610aea5760405162461bcd60e51b815260040161092190612516565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b33600080516020612966833981519152546001600160a01b031690565b6001600160a01b031614610b595760405162461bcd60e51b815260040161092190612562565b610b628161166b565b60408051600080825260208201909252610b7e91839190611695565b50565b6000805160206129a6833981519152610b9981611125565b610b7e611800565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610be95760405162461bcd60e51b815260040161092190612516565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c32600080516020612966833981519152546001600160a01b031690565b6001600160a01b031614610c585760405162461bcd60e51b815260040161092190612562565b610c618261166b565b610a9e82826001611695565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d0d5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c00000000000000006064820152608401610921565b5060008051602061296683398151915290565b600054610100900460ff1615808015610d405750600054600160ff909116105b80610d5a5750303b158015610d5a575060005460ff166001145b610dbd5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610921565b6000805460ff191660011790558015610de0576000805461ff0019166101001790555b610deb858585611852565b8115610dfa57610dfa82611954565b80156108c0576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6000610e5181611125565b6000838152610133602090815260409182902054825163ffffffff91821681529085169181019190915284917ff147b2da100fe126ed656e714404ac929d336f244df13e546cd063c22b0fdea9910160405180910390a25060009182526101336020526040909120805463ffffffff191663ffffffff909216919091179055565b6000610edd81611125565b610a9e82611954565b6000805160206129a6833981519152610efe81611125565b610b7e61198e565b60009182526065602090815260408084206001600160a01b0393909316845291905290205460ff1690565b600082815260656020526040902060010154610f4c81611125565b6107ff8383611604565b6000610f6181611125565b610132546040805163ffffffff928316815291841660208301527f3537a40f73e1f477d9cf3d802d6d7d0a3b482de21a66cfb10a26497a10782a42910160405180910390a150610132805463ffffffff191663ffffffff92909216919091179055565b600081815261012f602052604081205463ffffffff16808203610ffd576040516354865dd760e11b815260048101849052602401610921565b6000838152610133602052604081205463ffffffff16611026576101325463ffffffff1661103d565b6000848152610133602052604090205463ffffffff165b905060008163ffffffff1611801561106b57508063ffffffff168263ffffffff164261106991906125c4565b115b1561109f5760405162835eb960e61b81526004810185905263ffffffff808416602483015242166044820152606401610921565b600084815261012e602052604081205460170b9081136110d55760405163f5f1401560e01b815260048101869052602401610921565b949350505050565b60975460ff16156111235760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610921565b565b610b7e81336119cb565b60606000808380602001905181019061114891906125d7565b91505060008160018151811061116057611160612219565b602001015160f81c60f81b60f81c60ff1660088360008151811061118657611186612219565b016020015160f81c901b179050600761ffff8216146111be57604051636a75f7df60e01b815261ffff82166004820152602401610921565b61012d54604080516338416b5b60e01b815290516000926001600160a01b0316916338416b5b9160048083019260209291908290030181865afa158015611209573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122d9190612670565b90506001600160a01b03811615611358576000816001600160a01b031663638786686040518163ffffffff1660e01b8152600401602060405180830381865afa15801561127e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a29190612670565b90506000826001600160a01b031663e03dab1a3087856040518463ffffffff1660e01b81526004016112d69392919061268d565b60a0604051808303816000875af11580156112f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113199190612723565b50509050806020015195508160405160200161134491906001600160a01b0391909116815260200190565b604051602081830303815290604052965050505b505050915091565b6000818060200190518101906113769190612780565b610131549091501580159061138f575061013154815114155b156113bc576101315481516040516316997ef960e01b815260048101929092526024820152604401610921565b806020015163ffffffff164210156113fe57602081015160405163029223f360e01b815263ffffffff9182166004820152429091166024820152604401610921565b8060a0015163ffffffff164211156114405760a0810151604051636ce02d4360e11b815263ffffffff9182166004820152429091166024820152604401610921565b8051600090815261012f602052604090819020549082015163ffffffff9182169116116114a6576040818101518251600090815261012f60205282902054915163a34aa45d60e01b815263ffffffff918216600482015291166024820152604401610921565b60008160c0015160170b136114d457805160405163f5f1401560e01b81526004810191909152602401610921565b60c0810180518251600090815261012e6020908152604080832080546001600160c01b0319166001600160c01b039095169490941790935582850180518651845261012f835292849020805463ffffffff191663ffffffff948516179055855161013081905594519051845160179290920b8252909216908201527f9d4c6cecfe59b949cddc17ce12e615ed15e349547ed2e6d376a5083450228e2a910160405180910390a25050565b6115888282610f06565b610a9e5760008281526065602090815260408083206001600160a01b03851684529091529020805460ff191660011790556115c03390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61160e8282610f06565b15610a9e5760008281526065602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b7f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e3610a9e81611125565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff16156116c8576107ff83611a24565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611722575060408051601f3d908101601f1916820190925261171f9181019061281c565b60015b6117855760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610921565b60008051602061296683398151915281146117f45760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610921565b506107ff838383611ac0565b611808611aeb565b6097805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b038316158061186f57506001600160a01b038216155b8061188157506001600160a01b038116155b1561189f5760405163d92e233d60e01b815260040160405180910390fd5b6118a7611b34565b6118af611b5b565b6118b7611b34565b6118c260008461157e565b6118da6000805160206129a68339815191528461157e565b6119047f189ab7a9244df0848122154315af71fe140f3db0fe014031783b0946b8c9d2e38461157e565b61191c6000805160206129868339815191528361157e565b61012d80546001600160a01b039092166001600160a01b03199092169190911790555050610132805463ffffffff1916610e10179055565b610131805490829055604051829082907fb1d3fd1043ba7e8aa4dc147ae75d3b4d9c9d05e5087cae2e72765ef47d84678f90600090a35050565b6119966110dd565b6097805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586118353390565b6119d58282610f06565b610a9e576119e281611b8a565b6119ed836020611b9c565b6040516020016119fe929190612835565b60408051601f198184030181529082905262461bcd60e51b8252610921916004016128aa565b6001600160a01b0381163b611a915760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610921565b60008051602061296683398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611ac983611d3e565b600082511180611ad65750805b156107ff57611ae58383611d7e565b50505050565b60975460ff166111235760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610921565b600054610100900460ff166111235760405162461bcd60e51b8152600401610921906128bd565b600054610100900460ff16611b825760405162461bcd60e51b8152600401610921906128bd565b611123611da3565b60606106aa6001600160a01b03831660145b60606000611bab836002612908565b611bb690600261291f565b6001600160401b03811115611bcd57611bcd611f8b565b6040519080825280601f01601f191660200182016040528015611bf7576020820181803683370190505b509050600360fc1b81600081518110611c1257611c12612219565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611c4157611c41612219565b60200101906001600160f81b031916908160001a9053506000611c65846002612908565b611c7090600161291f565b90505b6001811115611ce8576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611ca457611ca4612219565b1a60f81b828281518110611cba57611cba612219565b60200101906001600160f81b031916908160001a90535060049490941c93611ce181612932565b9050611c73565b508315611d375760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610921565b9392505050565b611d4781611a24565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060611d3783836040518060600160405280602781526020016129c660279139611dd6565b600054610100900460ff16611dca5760405162461bcd60e51b8152600401610921906128bd565b6097805460ff19169055565b6060600080856001600160a01b031685604051611df39190612949565b600060405180830381855af49150503d8060008114611e2e576040519150601f19603f3d011682016040523d82523d6000602084013e611e33565b606091505b5091509150611e4486838387611e4e565b9695505050505050565b60608315611ebd578251600003611eb6576001600160a01b0385163b611eb65760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610921565b50816110d5565b6110d58383815115611ed25781518083602001fd5b8060405162461bcd60e51b815260040161092191906128aa565b600060208284031215611efe57600080fd5b81356001600160e01b031981168114611d3757600080fd5b60008060208385031215611f2957600080fd5b82356001600160401b03811115611f3f57600080fd5b8301601f81018513611f5057600080fd5b80356001600160401b03811115611f6657600080fd5b8560208260051b8401011115611f7b57600080fd5b6020919091019590945092505050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715611fc357611fc3611f8b565b60405290565b604051601f8201601f191681016001600160401b0381118282101715611ff157611ff1611f8b565b604052919050565b60006001600160401b0382111561201257612012611f8b565b50601f01601f191660200190565b600082601f83011261203157600080fd5b813561204461203f82611ff9565b611fc9565b81815284602083860101111561205957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561208857600080fd5b81356001600160401b0381111561209e57600080fd5b6110d584828501612020565b6000602082840312156120bc57600080fd5b5035919050565b6001600160a01b0381168114610b7e57600080fd5b6000602082840312156120ea57600080fd5b8135611d37816120c3565b6000806040838503121561210857600080fd5b82359150602083013561211a816120c3565b809150509250929050565b6000806040838503121561213857600080fd5b8235612143816120c3565b915060208301356001600160401b0381111561215e57600080fd5b61216a85828601612020565b9150509250929050565b6000806000806080858703121561218a57600080fd5b8435612195816120c3565b935060208501356121a5816120c3565b925060408501356121b5816120c3565b9396929550929360600135925050565b63ffffffff81168114610b7e57600080fd5b600080604083850312156121ea57600080fd5b82359150602083013561211a816121c5565b60006020828403121561220e57600080fd5b8135611d37816121c5565b634e487b7160e01b600052603260045260246000fd5b6000808335601e1984360301811261224657600080fd5b8301803591506001600160401b0382111561226057600080fd5b60200191503681900382131561227557600080fd5b9250929050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60005b838110156122c05781810151838201526020016122a8565b50506000910152565b600081518084526122e18160208601602086016122a5565b601f01601f19169290920160200192915050565b6040808252810183905260006060600585901b830181019083018683601e1936839003015b8882101561238a57868503605f19018452823581811261233957600080fd5b8a016020810190356001600160401b0381111561235557600080fd5b80360382131561236457600080fd5b61236f87828461227c565b9650505060208301925060208401935060018201915061231a565b505050508281036020840152611e4481856122c9565b600082601f8301126123b157600080fd5b81516123bf61203f82611ff9565b8181528460208386010111156123d457600080fd5b6110d58260208301602087016122a5565b6000602082840312156123f757600080fd5b81516001600160401b0381111561240d57600080fd5b8201601f8101841361241e57600080fd5b80516001600160401b0381111561243757612437611f8b565b8060051b61244760208201611fc9565b9182526020818401810192908101908784111561246357600080fd5b6020850192505b838310156124a95782516001600160401b0381111561248857600080fd5b612497896020838901016123a0565b8352506020928301929091019061246a565b979650505050505050565b6040815260006124c760408301856122c9565b82810360208401526124d981856122c9565b95945050505050565b6000602082840312156124f457600080fd5b81516001600160401b0381111561250a57600080fd5b6110d5848285016123a0565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106aa576106aa6125ae565b600080608083850312156125ea57600080fd5b83601f8401126125f957600080fd5b604051606081016001600160401b038111828210171561261b5761261b611f8b565b60405280606085018681111561263057600080fd5b855b8181101561264a578051835260209283019201612632565b5051919350506001600160401b0381111561266457600080fd5b61216a858286016123a0565b60006020828403121561268257600080fd5b8151611d37816120c3565b6001600160a01b03841681526060602082018190526000906126b1908301856122c9565b905060018060a01b0383166040830152949350505050565b6000604082840312156126db57600080fd5b604080519081016001600160401b03811182821017156126fd576126fd611f8b565b80604052508091508251612710816120c3565b8152602092830151920191909152919050565b600080600060a0848603121561273857600080fd5b61274285856126c9565b925061275185604086016126c9565b6080949094015192959394509192915050565b80516001600160c01b038116811461277b57600080fd5b919050565b600060e082840312801561279357600080fd5b5061279c611fa1565b8251815260208301516127ae816121c5565b602082015260408301516127c1816121c5565b60408201526127d260608401612764565b60608201526127e360808401612764565b608082015260a08301516127f6816121c5565b60a082015260c0830151601781900b811461281057600080fd5b60c08201529392505050565b60006020828403121561282e57600080fd5b5051919050565b7f416363657373436f6e74726f6c3a206163636f756e742000000000000000000081526000835161286d8160178501602088016122a5565b7001034b99036b4b9b9b4b733903937b6329607d1b601791840191820152835161289e8160288401602088016122a5565b01602801949350505050565b602081526000611d3760208301846122c9565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b80820281158282048414176106aa576106aa6125ae565b808201808211156106aa576106aa6125ae565b600081612941576129416125ae565b506000190190565b6000825161295b8184602087016122a5565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc73e573f9566d61418a34d5de3ff49360f9c51fec37f7486551670290f6285dab65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122090aea47c4b9f4824d2d78e1891b23f1ef14f77e9e193adf85aaa571a4265406464736f6c634300081c0033","name":"FeedVerifier","is_blueprint":false,"license_type":"none","is_fully_verified":true,"is_verified_via_eth_bytecode_db":false,"language":"solidity","evm_version":"paris","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"@openzeppelin/contracts-upgradeable/interfaces/draft-IERC1822Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified\n * proxy whose upgrades are fully controlled by the current implementation.\n */\ninterface IERC1822ProxiableUpgradeable {\n    /**\n     * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation\n     * address.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy.\n     */\n    function proxiableUUID() external view returns (bytes32);\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/proxy/ERC1967/ERC1967UpgradeUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeaconUpgradeable.sol\";\nimport \"../../interfaces/IERC1967Upgradeable.sol\";\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../../utils/AddressUpgradeable.sol\";\nimport \"../../utils/StorageSlotUpgradeable.sol\";\nimport {Initializable} from \"../utils/Initializable.sol\";\n\n/**\n * @dev This abstract contract provides getters and event emitting update functions for\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.\n *\n * _Available since v4.1._\n */\nabstract contract ERC1967UpgradeUpgradeable is Initializable, IERC1967Upgradeable {\n    // This is the keccak-256 hash of \"eip1967.proxy.rollback\" subtracted by 1\n    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;\n\n    /**\n     * @dev Storage slot with the address of the current implementation.\n     * This is the keccak-256 hash of \"eip1967.proxy.implementation\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n\n    function __ERC1967Upgrade_init() internal onlyInitializing {\n    }\n\n    function __ERC1967Upgrade_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Returns the current implementation address.\n     */\n    function _getImplementation() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 implementation slot.\n     */\n    function _setImplementation(address newImplementation) private {\n        require(AddressUpgradeable.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n        StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n    }\n\n    /**\n     * @dev Perform implementation upgrade\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeTo(address newImplementation) internal {\n        _setImplementation(newImplementation);\n        emit Upgraded(newImplementation);\n    }\n\n    /**\n     * @dev Perform implementation upgrade with additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {\n        _upgradeTo(newImplementation);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(newImplementation, data);\n        }\n    }\n\n    /**\n     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.\n     *\n     * Emits an {Upgraded} event.\n     */\n    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {\n        // Upgrades from old implementations will perform a rollback test. This test requires the new\n        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing\n        // this special case will break upgrade paths from old UUPS implementation to new ones.\n        if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) {\n            _setImplementation(newImplementation);\n        } else {\n            try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) {\n                require(slot == _IMPLEMENTATION_SLOT, \"ERC1967Upgrade: unsupported proxiableUUID\");\n            } catch {\n                revert(\"ERC1967Upgrade: new implementation is not UUPS\");\n            }\n            _upgradeToAndCall(newImplementation, data, forceCall);\n        }\n    }\n\n    /**\n     * @dev Storage slot with the admin of the contract.\n     * This is the keccak-256 hash of \"eip1967.proxy.admin\" subtracted by 1, and is\n     * validated in the constructor.\n     */\n    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\n\n    /**\n     * @dev Returns the current admin.\n     */\n    function _getAdmin() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new address in the EIP1967 admin slot.\n     */\n    function _setAdmin(address newAdmin) private {\n        require(newAdmin != address(0), \"ERC1967: new admin is the zero address\");\n        StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin;\n    }\n\n    /**\n     * @dev Changes the admin of the proxy.\n     *\n     * Emits an {AdminChanged} event.\n     */\n    function _changeAdmin(address newAdmin) internal {\n        emit AdminChanged(_getAdmin(), newAdmin);\n        _setAdmin(newAdmin);\n    }\n\n    /**\n     * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy.\n     * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.\n     */\n    bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50;\n\n    /**\n     * @dev Returns the current beacon.\n     */\n    function _getBeacon() internal view returns (address) {\n        return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value;\n    }\n\n    /**\n     * @dev Stores a new beacon in the EIP1967 beacon slot.\n     */\n    function _setBeacon(address newBeacon) private {\n        require(AddressUpgradeable.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n        require(\n            AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()),\n            \"ERC1967: beacon implementation is not a contract\"\n        );\n        StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon;\n    }\n\n    /**\n     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does\n     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).\n     *\n     * Emits a {BeaconUpgraded} event.\n     */\n    function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {\n        _setBeacon(newBeacon);\n        emit BeaconUpgraded(newBeacon);\n        if (data.length > 0 || forceCall) {\n            AddressUpgradeable.functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data);\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/proxy/beacon/IBeaconUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This is the interface that {BeaconProxy} expects of its beacon.\n */\ninterface IBeaconUpgradeable {\n    /**\n     * @dev Must return an address that can be used as a delegate call target.\n     *\n     * {BeaconProxy} will check that this address is a contract.\n     */\n    function implementation() external view returns (address);\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/Initializable.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../../utils/AddressUpgradeable.sol\";\n\n/**\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\n *\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\n * reused. This mechanism prevents re-execution of each \"step\" but allows the creation of new initialization steps in\n * case an upgrade adds a module that needs to be initialized.\n *\n * For example:\n *\n * [.hljs-theme-light.nopadding]\n * ```solidity\n * contract MyToken is ERC20Upgradeable {\n *     function initialize() initializer public {\n *         __ERC20_init(\"MyToken\", \"MTK\");\n *     }\n * }\n *\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\n *     function initializeV2() reinitializer(2) public {\n *         __ERC20Permit_init(\"MyToken\");\n *     }\n * }\n * ```\n *\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\n *\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\n *\n * [CAUTION]\n * ====\n * Avoid leaving a contract uninitialized.\n *\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\n *\n * [.hljs-theme-light.nopadding]\n * ```\n * /// @custom:oz-upgrades-unsafe-allow constructor\n * constructor() {\n *     _disableInitializers();\n * }\n * ```\n * ====\n */\nabstract contract Initializable {\n    /**\n     * @dev Indicates that the contract has been initialized.\n     * @custom:oz-retyped-from bool\n     */\n    uint8 private _initialized;\n\n    /**\n     * @dev Indicates that the contract is in the process of being initialized.\n     */\n    bool private _initializing;\n\n    /**\n     * @dev Triggered when the contract has been initialized or reinitialized.\n     */\n    event Initialized(uint8 version);\n\n    /**\n     * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\n     * `onlyInitializing` functions can be used to initialize parent contracts.\n     *\n     * Similar to `reinitializer(1)`, except that functions marked with `initializer` can be nested in the context of a\n     * constructor.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier initializer() {\n        bool isTopLevelCall = !_initializing;\n        require(\n            (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\n            \"Initializable: contract is already initialized\"\n        );\n        _initialized = 1;\n        if (isTopLevelCall) {\n            _initializing = true;\n        }\n        _;\n        if (isTopLevelCall) {\n            _initializing = false;\n            emit Initialized(1);\n        }\n    }\n\n    /**\n     * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\n     * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\n     * used to initialize parent contracts.\n     *\n     * A reinitializer may be used after the original initialization step. This is essential to configure modules that\n     * are added through upgrades and that require initialization.\n     *\n     * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer`\n     * cannot be nested. If one is invoked in the context of another, execution will revert.\n     *\n     * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\n     * a contract, executing them in the right order is up to the developer or operator.\n     *\n     * WARNING: setting the version to 255 will prevent any future reinitialization.\n     *\n     * Emits an {Initialized} event.\n     */\n    modifier reinitializer(uint8 version) {\n        require(!_initializing && _initialized < version, \"Initializable: contract is already initialized\");\n        _initialized = version;\n        _initializing = true;\n        _;\n        _initializing = false;\n        emit Initialized(version);\n    }\n\n    /**\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\n     * {initializer} and {reinitializer} modifiers, directly or indirectly.\n     */\n    modifier onlyInitializing() {\n        require(_initializing, \"Initializable: contract is not initializing\");\n        _;\n    }\n\n    /**\n     * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\n     * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\n     * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\n     * through proxies.\n     *\n     * Emits an {Initialized} event the first time it is successfully executed.\n     */\n    function _disableInitializers() internal virtual {\n        require(!_initializing, \"Initializable: contract is initializing\");\n        if (_initialized != type(uint8).max) {\n            _initialized = type(uint8).max;\n            emit Initialized(type(uint8).max);\n        }\n    }\n\n    /**\n     * @dev Returns the highest version that has been initialized. See {reinitializer}.\n     */\n    function _getInitializedVersion() internal view returns (uint8) {\n        return _initialized;\n    }\n\n    /**\n     * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}.\n     */\n    function _isInitializing() internal view returns (bool) {\n        return _initializing;\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (proxy/utils/UUPSUpgradeable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../interfaces/draft-IERC1822Upgradeable.sol\";\nimport \"../ERC1967/ERC1967UpgradeUpgradeable.sol\";\nimport {Initializable} from \"./Initializable.sol\";\n\n/**\n * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an\n * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy.\n *\n * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is\n * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing\n * `UUPSUpgradeable` with a custom implementation of upgrades.\n *\n * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism.\n *\n * _Available since v4.1._\n */\nabstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable {\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment\n    address private immutable __self = address(this);\n\n    /**\n     * @dev Check that the execution is being performed through a delegatecall call and that the execution context is\n     * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case\n     * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a\n     * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to\n     * fail.\n     */\n    modifier onlyProxy() {\n        require(address(this) != __self, \"Function must be called through delegatecall\");\n        require(_getImplementation() == __self, \"Function must be called through active proxy\");\n        _;\n    }\n\n    /**\n     * @dev Check that the execution is not being performed through a delegate call. This allows a function to be\n     * callable on the implementing contract but not through proxies.\n     */\n    modifier notDelegated() {\n        require(address(this) == __self, \"UUPSUpgradeable: must not be called through delegatecall\");\n        _;\n    }\n\n    function __UUPSUpgradeable_init() internal onlyInitializing {\n    }\n\n    function __UUPSUpgradeable_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the\n     * implementation. It is used to validate the implementation's compatibility when performing an upgrade.\n     *\n     * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks\n     * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this\n     * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\n     */\n    function proxiableUUID() external view virtual override notDelegated returns (bytes32) {\n        return _IMPLEMENTATION_SLOT;\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeTo(address newImplementation) public virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, new bytes(0), false);\n    }\n\n    /**\n     * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call\n     * encoded in `data`.\n     *\n     * Calls {_authorizeUpgrade}.\n     *\n     * Emits an {Upgraded} event.\n     *\n     * @custom:oz-upgrades-unsafe-allow-reachable delegatecall\n     */\n    function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy {\n        _authorizeUpgrade(newImplementation);\n        _upgradeToAndCallUUPS(newImplementation, data, true);\n    }\n\n    /**\n     * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by\n     * {upgradeTo} and {upgradeToAndCall}.\n     *\n     * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}.\n     *\n     * ```solidity\n     * function _authorizeUpgrade(address) internal override onlyOwner {}\n     * ```\n     */\n    function _authorizeUpgrade(address newImplementation) internal virtual;\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165Upgradeable {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/math/MathUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard math utilities missing in the Solidity language.\n */\nlibrary MathUpgradeable {\n    enum Rounding {\n        Down, // Toward negative infinity\n        Up, // Toward infinity\n        Zero // Toward zero\n    }\n\n    /**\n     * @dev Returns the largest of two numbers.\n     */\n    function max(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two numbers.\n     */\n    function min(uint256 a, uint256 b) internal pure returns (uint256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two numbers. The result is rounded towards\n     * zero.\n     */\n    function average(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b) / 2 can overflow.\n        return (a & b) + (a ^ b) / 2;\n    }\n\n    /**\n     * @dev Returns the ceiling of the division of two numbers.\n     *\n     * This differs from standard division with `/` in that it rounds up instead\n     * of rounding down.\n     */\n    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {\n        // (a + b - 1) / b can overflow on addition, so we distribute.\n        return a == 0 ? 0 : (a - 1) / b + 1;\n    }\n\n    /**\n     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0\n     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)\n     * with further edits by Uniswap Labs also under MIT license.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {\n        unchecked {\n            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use\n            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256\n            // variables such that product = prod1 * 2^256 + prod0.\n            uint256 prod0; // Least significant 256 bits of the product\n            uint256 prod1; // Most significant 256 bits of the product\n            assembly {\n                let mm := mulmod(x, y, not(0))\n                prod0 := mul(x, y)\n                prod1 := sub(sub(mm, prod0), lt(mm, prod0))\n            }\n\n            // Handle non-overflow cases, 256 by 256 division.\n            if (prod1 == 0) {\n                // Solidity will revert if denominator == 0, unlike the div opcode on its own.\n                // The surrounding unchecked block does not change this fact.\n                // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.\n                return prod0 / denominator;\n            }\n\n            // Make sure the result is less than 2^256. Also prevents denominator == 0.\n            require(denominator > prod1, \"Math: mulDiv overflow\");\n\n            ///////////////////////////////////////////////\n            // 512 by 256 division.\n            ///////////////////////////////////////////////\n\n            // Make division exact by subtracting the remainder from [prod1 prod0].\n            uint256 remainder;\n            assembly {\n                // Compute remainder using mulmod.\n                remainder := mulmod(x, y, denominator)\n\n                // Subtract 256 bit number from 512 bit number.\n                prod1 := sub(prod1, gt(remainder, prod0))\n                prod0 := sub(prod0, remainder)\n            }\n\n            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.\n            // See https://cs.stackexchange.com/q/138556/92363.\n\n            // Does not overflow because the denominator cannot be zero at this stage in the function.\n            uint256 twos = denominator & (~denominator + 1);\n            assembly {\n                // Divide denominator by twos.\n                denominator := div(denominator, twos)\n\n                // Divide [prod1 prod0] by twos.\n                prod0 := div(prod0, twos)\n\n                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.\n                twos := add(div(sub(0, twos), twos), 1)\n            }\n\n            // Shift in bits from prod1 into prod0.\n            prod0 |= prod1 * twos;\n\n            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such\n            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for\n            // four bits. That is, denominator * inv = 1 mod 2^4.\n            uint256 inverse = (3 * denominator) ^ 2;\n\n            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works\n            // in modular arithmetic, doubling the correct bits in each step.\n            inverse *= 2 - denominator * inverse; // inverse mod 2^8\n            inverse *= 2 - denominator * inverse; // inverse mod 2^16\n            inverse *= 2 - denominator * inverse; // inverse mod 2^32\n            inverse *= 2 - denominator * inverse; // inverse mod 2^64\n            inverse *= 2 - denominator * inverse; // inverse mod 2^128\n            inverse *= 2 - denominator * inverse; // inverse mod 2^256\n\n            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.\n            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is\n            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1\n            // is no longer required.\n            result = prod0 * inverse;\n            return result;\n        }\n    }\n\n    /**\n     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.\n     */\n    function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {\n        uint256 result = mulDiv(x, y, denominator);\n        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {\n            result += 1;\n        }\n        return result;\n    }\n\n    /**\n     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.\n     *\n     * Inspired by Henry S. Warren, Jr.'s \"Hacker's Delight\" (Chapter 11).\n     */\n    function sqrt(uint256 a) internal pure returns (uint256) {\n        if (a == 0) {\n            return 0;\n        }\n\n        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.\n        //\n        // We know that the \"msb\" (most significant bit) of our target number `a` is a power of 2 such that we have\n        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.\n        //\n        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`\n        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`\n        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`\n        //\n        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.\n        uint256 result = 1 << (log2(a) >> 1);\n\n        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,\n        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at\n        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision\n        // into the expected uint128 result.\n        unchecked {\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            result = (result + a / result) >> 1;\n            return min(result, a / result);\n        }\n    }\n\n    /**\n     * @notice Calculates sqrt(a), following the selected rounding direction.\n     */\n    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = sqrt(a);\n            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 2, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 128;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 64;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 32;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 16;\n            }\n            if (value >> 8 > 0) {\n                value >>= 8;\n                result += 8;\n            }\n            if (value >> 4 > 0) {\n                value >>= 4;\n                result += 4;\n            }\n            if (value >> 2 > 0) {\n                value >>= 2;\n                result += 2;\n            }\n            if (value >> 1 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log2(value);\n            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 10, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >= 10 ** 64) {\n                value /= 10 ** 64;\n                result += 64;\n            }\n            if (value >= 10 ** 32) {\n                value /= 10 ** 32;\n                result += 32;\n            }\n            if (value >= 10 ** 16) {\n                value /= 10 ** 16;\n                result += 16;\n            }\n            if (value >= 10 ** 8) {\n                value /= 10 ** 8;\n                result += 8;\n            }\n            if (value >= 10 ** 4) {\n                value /= 10 ** 4;\n                result += 4;\n            }\n            if (value >= 10 ** 2) {\n                value /= 10 ** 2;\n                result += 2;\n            }\n            if (value >= 10 ** 1) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log10(value);\n            return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);\n        }\n    }\n\n    /**\n     * @dev Return the log in base 256, rounded down, of a positive value.\n     * Returns 0 if given 0.\n     *\n     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.\n     */\n    function log256(uint256 value) internal pure returns (uint256) {\n        uint256 result = 0;\n        unchecked {\n            if (value >> 128 > 0) {\n                value >>= 128;\n                result += 16;\n            }\n            if (value >> 64 > 0) {\n                value >>= 64;\n                result += 8;\n            }\n            if (value >> 32 > 0) {\n                value >>= 32;\n                result += 4;\n            }\n            if (value >> 16 > 0) {\n                value >>= 16;\n                result += 2;\n            }\n            if (value >> 8 > 0) {\n                result += 1;\n            }\n        }\n        return result;\n    }\n\n    /**\n     * @dev Return the log in base 256, following the selected rounding direction, of a positive value.\n     * Returns 0 if given 0.\n     */\n    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {\n        unchecked {\n            uint256 result = log256(value);\n            return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/interfaces/IERC1967Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.\n *\n * _Available since v4.8.3._\n */\ninterface IERC1967Upgradeable {\n    /**\n     * @dev Emitted when the implementation is upgraded.\n     */\n    event Upgraded(address indexed implementation);\n\n    /**\n     * @dev Emitted when the admin account has changed.\n     */\n    event AdminChanged(address previousAdmin, address newAdmin);\n\n    /**\n     * @dev Emitted when the beacon is changed.\n     */\n    event BeaconUpgraded(address indexed beacon);\n}\n"},{"file_path":"@chainlink/contracts/src/v0.8/llo-feeds/libraries/Common.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/*\n * @title Common\n * @author Michael Fletcher\n * @notice Common functions and structs\n */\nlibrary Common {\n  // @notice The asset struct to hold the address of an asset and amount\n  struct Asset {\n    address assetAddress;\n    uint256 amount;\n  }\n\n  // @notice Struct to hold the address and its associated weight\n  struct AddressAndWeight {\n    address addr;\n    uint64 weight;\n  }\n\n  /**\n   * @notice Checks if an array of AddressAndWeight has duplicate addresses\n   * @param recipients The array of AddressAndWeight to check\n   * @return bool True if there are duplicates, false otherwise\n   */\n  function _hasDuplicateAddresses(\n    address[] memory recipients\n  ) internal pure returns (bool) {\n    for (uint256 i = 0; i < recipients.length;) {\n      for (uint256 j = i + 1; j < recipients.length;) {\n        if (recipients[i] == recipients[j]) {\n          return true;\n        }\n        unchecked {\n          ++j;\n        }\n      }\n      unchecked {\n        ++i;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * @notice Checks if an array of AddressAndWeight has duplicate addresses\n   * @param recipients The array of AddressAndWeight to check\n   * @return bool True if there are duplicates, false otherwise\n   */\n  function _hasDuplicateAddresses(\n    Common.AddressAndWeight[] memory recipients\n  ) internal pure returns (bool) {\n    for (uint256 i = 0; i < recipients.length;) {\n      for (uint256 j = i + 1; j < recipients.length;) {\n        if (recipients[i].addr == recipients[j].addr) {\n          return true;\n        }\n        unchecked {\n          ++j;\n        }\n      }\n      unchecked {\n        ++i;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * @notice sorts a list of addresses numerically\n   * @param arr The array of addresses to sort\n   * @param left the start index\n   * @param right the end index\n   */\n  function _quickSort(address[] memory arr, int256 left, int256 right) internal pure {\n    int256 i = left;\n    int256 j = right;\n    if (i == j) return;\n    address pivot = arr[uint256(left + (right - left) / 2)];\n    while (i <= j) {\n      while (uint160(arr[uint256(i)]) < uint160(pivot)) i++;\n      while (uint160(pivot) < uint160(arr[uint256(j)])) j--;\n      if (i <= j) {\n        (arr[uint256(i)], arr[uint256(j)]) = (arr[uint256(j)], arr[uint256(i)]);\n        i++;\n        j--;\n      }\n    }\n    if (left < j) _quickSort(arr, left, j);\n    if (i < right) _quickSort(arr, i, right);\n  }\n}\n"},{"file_path":"@chainlink/contracts/src/v0.8/llo-feeds/v0.3.0/interfaces/IVerifierFeeManager.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport {Common} from \"../../libraries/Common.sol\";\nimport {IERC165} from \"@openzeppelin/contracts@4.8.3/interfaces/IERC165.sol\";\n\ninterface IVerifierFeeManager is IERC165 {\n  /**\n   * @notice Handles fees for a report from the subscriber and manages rewards\n   * @param payload report to process the fee for\n   * @param parameterPayload fee payload\n   * @param subscriber address of the fee will be applied\n   */\n  function processFee(bytes calldata payload, bytes calldata parameterPayload, address subscriber) external payable;\n\n  /**\n   * @notice Processes the fees for each report in the payload, billing the subscriber and paying the reward manager\n   * @param payloads reports to process\n   * @param parameterPayload fee payload\n   * @param subscriber address of the user to process fee for\n   */\n  function processFeeBulk(\n    bytes[] calldata payloads,\n    bytes calldata parameterPayload,\n    address subscriber\n  ) external payable;\n\n  /**\n   * @notice Sets the fee recipients according to the fee manager\n   * @param configDigest digest of the configuration\n   * @param rewardRecipientAndWeights the address and weights of all the recipients to receive rewards\n   */\n  function setFeeRecipients(\n    bytes32 configDigest,\n    Common.AddressAndWeight[] calldata rewardRecipientAndWeights\n  ) external;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IAccessControlUpgradeable.sol\";\nimport \"../utils/ContextUpgradeable.sol\";\nimport \"../utils/StringsUpgradeable.sol\";\nimport \"../utils/introspection/ERC165Upgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module that allows children to implement role-based access\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\n * members except through off-chain means by accessing the contract event logs. Some\n * applications may benefit from on-chain enumerability, for those cases see\n * {AccessControlEnumerable}.\n *\n * Roles are referred to by their `bytes32` identifier. These should be exposed\n * in the external API and be unique. The best way to achieve this is by\n * using `public constant` hash digests:\n *\n * ```solidity\n * bytes32 public constant MY_ROLE = keccak256(\"MY_ROLE\");\n * ```\n *\n * Roles can be used to represent a set of permissions. To restrict access to a\n * function call, use {hasRole}:\n *\n * ```solidity\n * function foo() public {\n *     require(hasRole(MY_ROLE, msg.sender));\n *     ...\n * }\n * ```\n *\n * Roles can be granted and revoked dynamically via the {grantRole} and\n * {revokeRole} functions. Each role has an associated admin role, and only\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\n *\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\n * that only accounts with this role will be able to grant or revoke other\n * roles. More complex role relationships can be created by using\n * {_setRoleAdmin}.\n *\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\n * grant and revoke this role. Extra precautions should be taken to secure\n * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}\n * to enforce additional security measures for this role.\n */\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\n    struct RoleData {\n        mapping(address => bool) members;\n        bytes32 adminRole;\n    }\n\n    mapping(bytes32 => RoleData) private _roles;\n\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /**\n     * @dev Modifier that checks that an account has a specific role. Reverts\n     * with a standardized message including the required role.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     *\n     * _Available since v4.1._\n     */\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role);\n        _;\n    }\n\n    function __AccessControl_init() internal onlyInitializing {\n    }\n\n    function __AccessControl_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\n    }\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\n        return _roles[role].members[account];\n    }\n\n    /**\n     * @dev Revert with a standard message if `_msgSender()` is missing `role`.\n     * Overriding this function changes the behavior of the {onlyRole} modifier.\n     *\n     * Format of the revert message is described in {_checkRole}.\n     *\n     * _Available since v4.6._\n     */\n    function _checkRole(bytes32 role) internal view virtual {\n        _checkRole(role, _msgSender());\n    }\n\n    /**\n     * @dev Revert with a standard message if `account` is missing `role`.\n     *\n     * The format of the revert reason is given by the following regular expression:\n     *\n     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\n     */\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!hasRole(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"AccessControl: account \",\n                        StringsUpgradeable.toHexString(account),\n                        \" is missing role \",\n                        StringsUpgradeable.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\n    }\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\n        return _roles[role].adminRole;\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been revoked `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function renounceRole(bytes32 role, address account) public virtual override {\n        require(account == _msgSender(), \"AccessControl: can only renounce roles for self\");\n\n        _revokeRole(role, account);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event. Note that unlike {grantRole}, this function doesn't perform any\n     * checks on the calling account.\n     *\n     * May emit a {RoleGranted} event.\n     *\n     * [WARNING]\n     * ====\n     * This function should only be called from the constructor when setting\n     * up the initial roles for the system.\n     *\n     * Using this function in any other way is effectively circumventing the admin\n     * system imposed by {AccessControl}.\n     * ====\n     *\n     * NOTE: This function is deprecated in favor of {_grantRole}.\n     */\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _grantRole(role, account);\n    }\n\n    /**\n     * @dev Sets `adminRole` as ``role``'s admin role.\n     *\n     * Emits a {RoleAdminChanged} event.\n     */\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = getRoleAdmin(role);\n        _roles[role].adminRole = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleGranted} event.\n     */\n    function _grantRole(bytes32 role, address account) internal virtual {\n        if (!hasRole(role, account)) {\n            _roles[role].members[account] = true;\n            emit RoleGranted(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * Internal function without access restriction.\n     *\n     * May emit a {RoleRevoked} event.\n     */\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        if (hasRole(role, account)) {\n            _roles[role].members[account] = false;\n            emit RoleRevoked(role, account, _msgSender());\n        }\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IAccessControlUpgradeable {\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted signaling this.\n     *\n     * _Available since v3.1._\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {AccessControl-_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) external;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/ContextUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which allows children to implement an emergency stop\n * mechanism that can be triggered by an authorized account.\n *\n * This module is used through inheritance. It will make available the\n * modifiers `whenNotPaused` and `whenPaused`, which can be applied to\n * the functions of your contract. Note that they will not be pausable by\n * simply including this module, only once the modifiers are put in place.\n */\nabstract contract PausableUpgradeable is Initializable, ContextUpgradeable {\n    /**\n     * @dev Emitted when the pause is triggered by `account`.\n     */\n    event Paused(address account);\n\n    /**\n     * @dev Emitted when the pause is lifted by `account`.\n     */\n    event Unpaused(address account);\n\n    bool private _paused;\n\n    /**\n     * @dev Initializes the contract in unpaused state.\n     */\n    function __Pausable_init() internal onlyInitializing {\n        __Pausable_init_unchained();\n    }\n\n    function __Pausable_init_unchained() internal onlyInitializing {\n        _paused = false;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is not paused.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    modifier whenNotPaused() {\n        _requireNotPaused();\n        _;\n    }\n\n    /**\n     * @dev Modifier to make a function callable only when the contract is paused.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    modifier whenPaused() {\n        _requirePaused();\n        _;\n    }\n\n    /**\n     * @dev Returns true if the contract is paused, and false otherwise.\n     */\n    function paused() public view virtual returns (bool) {\n        return _paused;\n    }\n\n    /**\n     * @dev Throws if the contract is paused.\n     */\n    function _requireNotPaused() internal view virtual {\n        require(!paused(), \"Pausable: paused\");\n    }\n\n    /**\n     * @dev Throws if the contract is not paused.\n     */\n    function _requirePaused() internal view virtual {\n        require(paused(), \"Pausable: not paused\");\n    }\n\n    /**\n     * @dev Triggers stopped state.\n     *\n     * Requirements:\n     *\n     * - The contract must not be paused.\n     */\n    function _pause() internal virtual whenNotPaused {\n        _paused = true;\n        emit Paused(_msgSender());\n    }\n\n    /**\n     * @dev Returns to normal state.\n     *\n     * Requirements:\n     *\n     * - The contract must be paused.\n     */\n    function _unpause() internal virtual whenPaused {\n        _paused = false;\n        emit Unpaused(_msgSender());\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[49] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary AddressUpgradeable {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     *\n     * Furthermore, `isContract` will also return true if the target contract within\n     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,\n     * which only has an effect at the end of a transaction.\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{value: amount}(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n     *\n     * _Available since v4.8._\n     */\n    function verifyCallResultFromTarget(\n        address target,\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        if (success) {\n            if (returndata.length == 0) {\n                // only check isContract if the call was successful and the return data is empty\n                // otherwise we already know that it was a contract\n                require(isContract(target), \"Address: call to non-contract\");\n            }\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    /**\n     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason or using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            _revert(returndata, errorMessage);\n        }\n    }\n\n    function _revert(bytes memory returndata, string memory errorMessage) private pure {\n        // Look for revert reason and bubble it up if present\n        if (returndata.length > 0) {\n            // The easiest way to bubble the revert reason is using memory via assembly\n            /// @solidity memory-safe-assembly\n            assembly {\n                let returndata_size := mload(returndata)\n                revert(add(32, returndata), returndata_size)\n            }\n        } else {\n            revert(errorMessage);\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract ContextUpgradeable is Initializable {\n    function __Context_init() internal onlyInitializing {\n    }\n\n    function __Context_init_unchained() internal onlyInitializing {\n    }\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n\n    function _contextSuffixLength() internal view virtual returns (uint256) {\n        return 0;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/StorageSlotUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)\n// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Library for reading and writing primitive types to specific storage slots.\n *\n * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.\n * This library helps with reading and writing to such slots without the need for inline assembly.\n *\n * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.\n *\n * Example usage to set ERC1967 implementation slot:\n * ```solidity\n * contract ERC1967 {\n *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\n *\n *     function _getImplementation() internal view returns (address) {\n *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;\n *     }\n *\n *     function _setImplementation(address newImplementation) internal {\n *         require(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;\n *     }\n * }\n * ```\n *\n * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._\n * _Available since v4.9 for `string`, `bytes`._\n */\nlibrary StorageSlotUpgradeable {\n    struct AddressSlot {\n        address value;\n    }\n\n    struct BooleanSlot {\n        bool value;\n    }\n\n    struct Bytes32Slot {\n        bytes32 value;\n    }\n\n    struct Uint256Slot {\n        uint256 value;\n    }\n\n    struct StringSlot {\n        string value;\n    }\n\n    struct BytesSlot {\n        bytes value;\n    }\n\n    /**\n     * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n     */\n    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.\n     */\n    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.\n     */\n    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.\n     */\n    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` with member `value` located at `slot`.\n     */\n    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.\n     */\n    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` with member `value` located at `slot`.\n     */\n    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := slot\n        }\n    }\n\n    /**\n     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.\n     */\n    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {\n        /// @solidity memory-safe-assembly\n        assembly {\n            r.slot := store.slot\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./math/MathUpgradeable.sol\";\nimport \"./math/SignedMathUpgradeable.sol\";\n\n/**\n * @dev String operations.\n */\nlibrary StringsUpgradeable {\n    bytes16 private constant _SYMBOLS = \"0123456789abcdef\";\n    uint8 private constant _ADDRESS_LENGTH = 20;\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            uint256 length = MathUpgradeable.log10(value) + 1;\n            string memory buffer = new string(length);\n            uint256 ptr;\n            /// @solidity memory-safe-assembly\n            assembly {\n                ptr := add(buffer, add(32, length))\n            }\n            while (true) {\n                ptr--;\n                /// @solidity memory-safe-assembly\n                assembly {\n                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))\n                }\n                value /= 10;\n                if (value == 0) break;\n            }\n            return buffer;\n        }\n    }\n\n    /**\n     * @dev Converts a `int256` to its ASCII `string` decimal representation.\n     */\n    function toString(int256 value) internal pure returns (string memory) {\n        return string(abi.encodePacked(value < 0 ? \"-\" : \"\", toString(SignedMathUpgradeable.abs(value))));\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        unchecked {\n            return toHexString(value, MathUpgradeable.log256(value) + 1);\n        }\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\n     */\n    function toHexString(address addr) internal pure returns (string memory) {\n        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\n    }\n\n    /**\n     * @dev Returns true if the two strings are equal.\n     */\n    function equal(string memory a, string memory b) internal pure returns (bool) {\n        return keccak256(bytes(a)) == keccak256(bytes(b));\n    }\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165Upgradeable.sol\";\nimport {Initializable} from \"../../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\n    function __ERC165_init() internal onlyInitializing {\n    }\n\n    function __ERC165_init_unchained() internal onlyInitializing {\n    }\n    /**\n     * @dev See {IERC165-supportsInterface}.\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n        return interfaceId == type(IERC165Upgradeable).interfaceId;\n    }\n\n    /**\n     * @dev This empty reserved space is put in place to allow future versions to add new\n     * variables without shifting down storage in the inheritance chain.\n     * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n     */\n    uint256[50] private __gap;\n}\n"},{"file_path":"@openzeppelin/contracts-upgradeable/utils/math/SignedMathUpgradeable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Standard signed math utilities missing in the Solidity language.\n */\nlibrary SignedMathUpgradeable {\n    /**\n     * @dev Returns the largest of two signed numbers.\n     */\n    function max(int256 a, int256 b) internal pure returns (int256) {\n        return a > b ? a : b;\n    }\n\n    /**\n     * @dev Returns the smallest of two signed numbers.\n     */\n    function min(int256 a, int256 b) internal pure returns (int256) {\n        return a < b ? a : b;\n    }\n\n    /**\n     * @dev Returns the average of two signed numbers without overflow.\n     * The result is rounded towards zero.\n     */\n    function average(int256 a, int256 b) internal pure returns (int256) {\n        // Formula from the book \"Hacker's Delight\"\n        int256 x = (a & b) + ((a ^ b) >> 1);\n        return x + (int256(uint256(x) >> 255) & (a ^ b));\n    }\n\n    /**\n     * @dev Returns the absolute unsigned value of a signed value.\n     */\n    function abs(int256 n) internal pure returns (uint256) {\n        unchecked {\n            // must be unchecked in order to support `n = type(int256).min`\n            return uint256(n >= 0 ? n : -n);\n        }\n    }\n}\n"},{"file_path":"@openzeppelin/contracts@4.8.3/interfaces/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/introspection/IERC165.sol\";\n"},{"file_path":"@openzeppelin/contracts@4.8.3/utils/introspection/IERC165.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint32","name":"expiresAt","type":"uint32"},{"internalType":"uint32","name":"currentTime","type":"uint32"}],"name":"ExpiredReport","type":"error"},{"inputs":[{"internalType":"bytes32","name":"expected","type":"bytes32"},{"internalType":"bytes32","name":"actual","type":"bytes32"}],"name":"InvalidFeedId","type":"error"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"InvalidReportVersion","type":"error"},{"inputs":[],"name":"NothingToWithdraw","type":"error"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"}],"name":"PriceNotInitialized","type":"error"},{"inputs":[{"internalType":"uint32","name":"validFromTimestamp","type":"uint32"},{"internalType":"uint32","name":"currentTime","type":"uint32"}],"name":"ReportNotYetValid","type":"error"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"},{"internalType":"uint32","name":"lastTimestamp","type":"uint32"},{"internalType":"uint32","name":"currentTime","type":"uint32"}],"name":"StalePrice","type":"error"},{"inputs":[{"internalType":"uint32","name":"newTimestamp","type":"uint32"},{"internalType":"uint32","name":"storedTimestamp","type":"uint32"}],"name":"StaleReport","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"}],"name":"ZeroPriceInReport","type":"error"},{"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":"bytes32","name":"feedId","type":"bytes32"},{"indexed":false,"internalType":"int192","name":"price","type":"int192"},{"indexed":false,"internalType":"uint32","name":"observationsTimestamp","type":"uint32"}],"name":"DecodedPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"oldFeedId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newFeedId","type":"bytes32"}],"name":"FeedIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"feedId","type":"bytes32"},{"indexed":false,"internalType":"uint32","name":"oldMaxStaleness","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newMaxStaleness","type":"uint32"}],"name":"MaxStalenessByFeedUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"oldMaxStaleness","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"newMaxStaleness","type":"uint32"}],"name":"MaxStalenessUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPGRADER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowedFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultMaxStaleness","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin_","type":"address"},{"internalType":"address","name":"updater_","type":"address"},{"internalType":"address","name":"verifierProxy_","type":"address"},{"internalType":"bytes32","name":"feedId_","type":"bytes32"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastFeedId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"maxStalenessByFeed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"priceByFeed","outputs":[{"internalType":"int192","name":"","type":"int192"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"}],"name":"priceOf","outputs":[{"internalType":"int192","name":"","type":"int192"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"feedId_","type":"bytes32"}],"name":"setAllowedFeedId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"maxStaleness_","type":"uint32"}],"name":"setMaxStaleness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"},{"internalType":"uint32","name":"maxStaleness_","type":"uint32"}],"name":"setMaxStalenessByFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"timestampByFeed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"feedId","type":"bytes32"}],"name":"timestampOf","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","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":[],"name":"verifierProxy","outputs":[{"internalType":"contract IVerifierProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"unverifiedReports","type":"bytes[]"}],"name":"verifyBulkReports","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"unverifiedReport","type":"bytes"}],"name":"verifyReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"beneficiary","type":"address"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}],"is_changed_bytecode":false,"is_partially_verified":false,"constructor_args":null}