{"file_path":"src/priceFeed/PriceFeedChainlink.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { AggregatorV3Interface } from \"./interfaces/AggregatorV3Interface.sol\";\nimport { IPriceFeed } from \"./interfaces/IPriceFeed.sol\";\nimport { Ownable } from \"@openzeppelin/contracts/access/Ownable.sol\";\n\n/**\n * @title PriceFeed Contract to integrate with Chainlink\n *        Convert data from interface of Chainlink to Satoshi's IPriceFeed\n */\ncontract PriceFeedChainlink is IPriceFeed, Ownable {\n    AggregatorV3Interface internal immutable _source;\n    uint256 public maxTimeThreshold;\n\n    constructor(AggregatorV3Interface source_, uint256 _maxTimeThreshold) Ownable(msg.sender) {\n        _source = source_;\n        maxTimeThreshold = _maxTimeThreshold;\n        emit MaxTimeThresholdUpdated(_maxTimeThreshold);\n    }\n\n    function fetchPrice() external view returns (uint256) {\n        (, int256 price,, uint256 updatedAt,) = _source.latestRoundData();\n        if (price <= 0) revert InvalidPriceInt256(price);\n        if (block.timestamp - updatedAt > maxTimeThreshold) {\n            revert PriceTooOld();\n        }\n        return uint256(price);\n    }\n\n    function fetchPriceUnsafe() external view returns (uint256, uint256) {\n        (, int256 price,, uint256 updatedAt,) = _source.latestRoundData();\n        if (price <= 0) revert InvalidPriceInt256(price);\n        return (uint256(price), updatedAt);\n    }\n\n    function decimals() external view returns (uint8) {\n        return _source.decimals();\n    }\n\n    function updateMaxTimeThreshold(uint256 _maxTimeThreshold) external onlyOwner {\n        if (_maxTimeThreshold <= 120) {\n            revert InvalidMaxTimeThreshold();\n        }\n\n        maxTimeThreshold = _maxTimeThreshold;\n        emit MaxTimeThresholdUpdated(_maxTimeThreshold);\n    }\n\n    function source() external view returns (address) {\n        return address(_source);\n    }\n}\n","deployed_bytecode":"0x608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063715018a611610063578063715018a61461010c5780638da5cb5b14610116578063d9b8144c14610126578063f2fde38b14610139578063fed019191461014c575f80fd5b806301f5c5de146100945780630fdb11cf146100b0578063313ce567146100b857806367e828bf146100d2575b5f80fd5b61009d60015481565b6040519081526020015b60405180910390f35b61009d610169565b6100c061024d565b60405160ff90911681526020016100a7565b7f000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e5b6040516001600160a01b0390911681526020016100a7565b6101146102d3565b005b5f546001600160a01b03166100f4565b6101146101343660046104b9565b6102e6565b6101146101473660046104d0565b61034a565b610154610387565b604080519283526020830191909152016100a7565b5f805f7f000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec919061051b565b509350509250505f821361021b576040516373f4157160e11b8152600481018390526024015b60405180910390fd5b6001546102288242610567565b11156102475760405163c9cf1f8b60e01b815260040160405180910390fd5b50919050565b5f7f000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ce919061058c565b905090565b6102db61043e565b6102e45f61046a565b565b6102ee61043e565b6078811161030f576040516304e2feaf60e31b815260040160405180910390fd5b60018190556040518181527f31196645d05fc4d46fdbadcc63e38712aede3c733ac1d26f42c619c932043be29060200160405180910390a150565b61035261043e565b6001600160a01b03811661037b57604051631e4fbdf760e01b81525f6004820152602401610212565b6103848161046a565b50565b5f805f807f000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e6001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156103e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040b919061051b565b509350509250505f8213610435576040516373f4157160e11b815260048101839052602401610212565b90939092509050565b5f546001600160a01b031633146102e45760405163118cdaa760e01b8152336004820152602401610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156104c9575f80fd5b5035919050565b5f602082840312156104e0575f80fd5b81356001600160a01b03811681146104f6575f80fd5b9392505050565b805169ffffffffffffffffffff81168114610516575f80fd5b919050565b5f805f805f60a0868803121561052f575f80fd5b610538866104fd565b945060208601519350604086015192506060860151915061055b608087016104fd565b90509295509295909350565b8181038181111561058657634e487b7160e01b5f52601160045260245ffd5b92915050565b5f6020828403121561059c575f80fd5b815160ff811681146104f6575f80fdfea26469706673582212208389b206e1a3d63f22a639770ab376a98871ce6dacdc9f64ac6662cb0e93cc1c64736f6c63430008160033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"shanghai","libraries":{},"metadata":{"appendCBOR":true,"bytecodeHash":"ipfs","useLiteralContent":false},"optimizer":{"enabled":true,"runs":200},"outputSelection":{"*":{"":["*"],"*":["*"]}},"remappings":["solidity-bytes-utils/=node_modules/solidity-bytes-utils/","@layerzerolabs/=node_modules/@layerzerolabs/","@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@solidstate/contracts/=lib/solidstate-solidity/contracts/","@pythnetwork/pyth-sdk-solidity/=lib/pyth-sdk-solidity/","solmate/=lib/solmate/","@api3/contracts/=lib/contracts/contracts/","@chainsight-management-oracle/contracts/=lib/chainsight-management-oracle/contracts/","LayerZero-v2.git/=lib/LayerZero-v2.git/","chainsight-management-oracle/=lib/chainsight-management-oracle/contracts/","ds-test/=lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","layerzero-v2/=lib/layerzero-v2/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts/=lib/openzeppelin-contracts/","pyth-sdk-solidity/=lib/pyth-sdk-solidity/","solidstate-solidity/=lib/solidstate-solidity/contracts/"],"viaIR":false},"optimization_runs":200,"sourcify_repo_url":null,"decoded_constructor_args":[["0xCCADC697c55bbB68dc5bCdf8d3CBe83CdD4E071E",{"internalType":"contract AggregatorV3Interface","name":"source_","type":"address"}],["1500",{"internalType":"uint256","name":"_maxTimeThreshold","type":"uint256"}]],"compiler_version":"v0.8.22+commit.4fc1097e","is_verified_via_verifier_alliance":false,"verified_at":"2026-05-22T06:50:28.584107Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x60a060405234801561000f575f80fd5b5060405161073d38038061073d83398101604081905261002e916100f8565b338061005357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61005c816100a9565b506001600160a01b03821660805260018190556040518181527f31196645d05fc4d46fdbadcc63e38712aede3c733ac1d26f42c619c932043be29060200160405180910390a1505061012f565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610109575f80fd5b82516001600160a01b038116811461011f575f80fd5b6020939093015192949293505050565b6080516105e261015b5f395f818160d40152818161016e01528181610250015261038d01526105e25ff3fe608060405234801561000f575f80fd5b5060043610610090575f3560e01c8063715018a611610063578063715018a61461010c5780638da5cb5b14610116578063d9b8144c14610126578063f2fde38b14610139578063fed019191461014c575f80fd5b806301f5c5de146100945780630fdb11cf146100b0578063313ce567146100b857806367e828bf146100d2575b5f80fd5b61009d60015481565b6040519081526020015b60405180910390f35b61009d610169565b6100c061024d565b60405160ff90911681526020016100a7565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016100a7565b6101146102d3565b005b5f546001600160a01b03166100f4565b6101146101343660046104b9565b6102e6565b6101146101473660046104d0565b61034a565b610154610387565b604080519283526020830191909152016100a7565b5f805f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156101c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101ec919061051b565b509350509250505f821361021b576040516373f4157160e11b8152600481018390526024015b60405180910390fd5b6001546102288242610567565b11156102475760405163c9cf1f8b60e01b815260040160405180910390fd5b50919050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102ce919061058c565b905090565b6102db61043e565b6102e45f61046a565b565b6102ee61043e565b6078811161030f576040516304e2feaf60e31b815260040160405180910390fd5b60018190556040518181527f31196645d05fc4d46fdbadcc63e38712aede3c733ac1d26f42c619c932043be29060200160405180910390a150565b61035261043e565b6001600160a01b03811661037b57604051631e4fbdf760e01b81525f6004820152602401610212565b6103848161046a565b50565b5f805f807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156103e7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040b919061051b565b509350509250505f8213610435576040516373f4157160e11b815260048101839052602401610212565b90939092509050565b5f546001600160a01b031633146102e45760405163118cdaa760e01b8152336004820152602401610212565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f602082840312156104c9575f80fd5b5035919050565b5f602082840312156104e0575f80fd5b81356001600160a01b03811681146104f6575f80fd5b9392505050565b805169ffffffffffffffffffff81168114610516575f80fd5b919050565b5f805f805f60a0868803121561052f575f80fd5b610538866104fd565b945060208601519350604086015192506060860151915061055b608087016104fd565b90509295509295909350565b8181038181111561058657634e487b7160e01b5f52601160045260245ffd5b92915050565b5f6020828403121561059c575f80fd5b815160ff811681146104f6575f80fdfea26469706673582212208389b206e1a3d63f22a639770ab376a98871ce6dacdc9f64ac6662cb0e93cc1c64736f6c63430008160033000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e00000000000000000000000000000000000000000000000000000000000005dc","name":"PriceFeedChainlink","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"shanghai","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":false,"additional_sources":[{"file_path":"@openzeppelin/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"@openzeppelin/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 Context {\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"},{"file_path":"lib/openzeppelin-contracts/contracts/access/Ownable.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)\n\npragma solidity ^0.8.20;\n\nimport {Context} from \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * The initial owner is set to the address provided by the deployer. This can\n * later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n    address private _owner;\n\n    /**\n     * @dev The caller account is not authorized to perform an operation.\n     */\n    error OwnableUnauthorizedAccount(address account);\n\n    /**\n     * @dev The owner is not a valid owner account. (eg. `address(0)`)\n     */\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.\n     */\n    constructor(address initialOwner) {\n        if (initialOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(initialOwner);\n    }\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Returns the address of the current owner.\n     */\n    function owner() public view virtual returns (address) {\n        return _owner;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner() != _msgSender()) {\n            revert OwnableUnauthorizedAccount(_msgSender());\n        }\n    }\n\n    /**\n     * @dev Leaves the contract without owner. It will not be possible to call\n     * `onlyOwner` functions. Can only be called by the current owner.\n     *\n     * NOTE: Renouncing ownership will leave the contract without an owner,\n     * thereby disabling any functionality that is only available to the owner.\n     */\n    function renounceOwnership() public virtual onlyOwner {\n        _transferOwnership(address(0));\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = _owner;\n        _owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},{"file_path":"lib/openzeppelin-contracts/contracts/utils/Context.sol","source_code":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)\n\npragma solidity ^0.8.20;\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 Context {\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"},{"file_path":"src/priceFeed/interfaces/AggregatorV3Interface.sol","source_code":"// SPDX-License-Identifier: MIT\n// Code from https://github.com/smartcontractkit/chainlink/blob/master/evm-contracts/src/v0.6/interfaces/AggregatorV3Interface.sol\n\npragma solidity ^0.8.20;\n\ninterface AggregatorV3Interface {\n    function decimals() external view returns (uint8);\n\n    function description() external view returns (string memory);\n\n    function version() external view returns (uint256);\n\n    function getRoundData(uint80 _roundId)\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n    function latestRoundData()\n        external\n        view\n        returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n}\n"},{"file_path":"src/priceFeed/interfaces/IPriceFeed.sol","source_code":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.20;\n\nimport { AggregatorV3Interface } from \"./AggregatorV3Interface.sol\";\n\nstruct SourceConfig {\n    AggregatorV3Interface source;\n    uint256 maxTimeThreshold;\n    uint256 weight;\n}\n\ninterface IPriceFeed {\n    // invalid price error for different types of price sources\n    error InvalidPriceInt256(int256 price);\n    error InvalidPriceUInt128(uint128 price);\n    error InvalidPriceInt224(int224 price);\n    error InvalidPriceUInt256(uint256 price);\n    error PriceTooOld();\n    error InvalidMaxTimeThreshold();\n    error Deprecated();\n\n    // Events\n    event MaxTimeThresholdUpdated(uint256 newMaxTimeThreshold);\n    event MaxTimeThresholdsUpdated(uint256[] newMaxTimeThreshold);\n    event PriceIDUpdated(bytes32 newPriceID);\n    event ConfigSet(SourceConfig sources);\n\n    function fetchPrice() external returns (uint256);\n\n    function fetchPriceUnsafe() external returns (uint256, uint256);\n\n    function decimals() external view returns (uint8);\n\n    function maxTimeThreshold() external view returns (uint256);\n\n    function updateMaxTimeThreshold(uint256 _maxTimeThreshold) external;\n\n    function source() external view returns (address);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[{"internalType":"contract AggregatorV3Interface","name":"source_","type":"address"},{"internalType":"uint256","name":"_maxTimeThreshold","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"Deprecated","type":"error"},{"inputs":[],"name":"InvalidMaxTimeThreshold","type":"error"},{"inputs":[{"internalType":"int224","name":"price","type":"int224"}],"name":"InvalidPriceInt224","type":"error"},{"inputs":[{"internalType":"int256","name":"price","type":"int256"}],"name":"InvalidPriceInt256","type":"error"},{"inputs":[{"internalType":"uint128","name":"price","type":"uint128"}],"name":"InvalidPriceUInt128","type":"error"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"InvalidPriceUInt256","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"PriceTooOld","type":"error"},{"anonymous":false,"inputs":[{"components":[{"internalType":"contract AggregatorV3Interface","name":"source","type":"address"},{"internalType":"uint256","name":"maxTimeThreshold","type":"uint256"},{"internalType":"uint256","name":"weight","type":"uint256"}],"indexed":false,"internalType":"struct SourceConfig","name":"sources","type":"tuple"}],"name":"ConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newMaxTimeThreshold","type":"uint256"}],"name":"MaxTimeThresholdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[]","name":"newMaxTimeThreshold","type":"uint256[]"}],"name":"MaxTimeThresholdsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"newPriceID","type":"bytes32"}],"name":"PriceIDUpdated","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fetchPriceUnsafe","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTimeThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"source","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTimeThreshold","type":"uint256"}],"name":"updateMaxTimeThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"000000000000000000000000ccadc697c55bbb68dc5bcdf8d3cbe83cdd4e071e00000000000000000000000000000000000000000000000000000000000005dc"}