{
  "language": "Solidity",
  "sources": {
    "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol": {
      "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC20 standard.\n *\n * _Available since v4.1._\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"
    },
    "@openzeppelin/contracts/token/ERC20/IERC20.sol": {
      "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC20 standard as defined in the EIP.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the amount of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the amount of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves `amount` tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 amount) external returns (bool);\n\n    /**\n     * @dev Moves `amount` tokens from `from` to `to` using the\n     * allowance mechanism. `amount` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 amount) external returns (bool);\n}\n"
    },
    "@venusprotocol/solidity-utilities/contracts/constants.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\n/// @dev Base unit for computations, usually used in scaling (multiplications, divisions)\nuint256 constant EXP_SCALE = 1e18;\n\n/// @dev A unit (literal one) in EXP_SCALE, usually used in additions/subtractions\nuint256 constant MANTISSA_ONE = EXP_SCALE;\n\n/// @dev The approximate number of seconds per year\nuint256 constant SECONDS_PER_YEAR = 31_536_000;\n"
    },
    "@venusprotocol/solidity-utilities/contracts/validators.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\n/// @notice Thrown if the supplied address is a zero address where it is not allowed\nerror ZeroAddressNotAllowed();\n\n/// @notice Thrown if the supplied value is 0 where it is not allowed\nerror ZeroValueNotAllowed();\n\n/// @notice Checks if the provided address is nonzero, reverts otherwise\n/// @param address_ Address to check\n/// @custom:error ZeroAddressNotAllowed is thrown if the provided address is a zero address\nfunction ensureNonzeroAddress(address address_) pure {\n    if (address_ == address(0)) {\n        revert ZeroAddressNotAllowed();\n    }\n}\n\n/// @notice Checks if the provided value is nonzero, reverts otherwise\n/// @param value_ Value to check\n/// @custom:error ZeroValueNotAllowed is thrown if the provided value is 0\nfunction ensureNonzeroValue(uint256 value_) pure {\n    if (value_ == 0) {\n        revert ZeroValueNotAllowed();\n    }\n}\n"
    },
    "contracts/interfaces/IAnkrBNB.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAnkrBNB {\n    function sharesToBonds(uint256 amount) external view returns (uint256);\n    function decimals() external view returns (uint8);\n}\n"
    },
    "contracts/interfaces/IEtherFiLiquidityPool.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IEtherFiLiquidityPool {\n    function amountForShare(uint256 _share) external view returns (uint256);\n}\n"
    },
    "contracts/interfaces/IPendlePtOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IPendlePtOracle {\n    function getPtToAssetRate(address market, uint32 duration) external view returns (uint256);\n    function getOracleState(\n        address market,\n        uint32 duration\n    )\n        external\n        view\n        returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied);\n}\n"
    },
    "contracts/interfaces/IPStakePool.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IPStakePool {\n    struct Data {\n        uint256 totalWei;\n        uint256 poolTokenSupply;\n    }\n\n    /**\n     * @dev The current exchange rate for converting stkBNB to BNB.\n     */\n    function exchangeRate() external view returns (Data memory);\n}\n"
    },
    "contracts/interfaces/ISFrax.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISFrax {\n    function convertToAssets(uint256 shares) external view returns (uint256);\n    function decimals() external view returns (uint8);\n}\n"
    },
    "contracts/interfaces/ISfrxETH.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISfrxETH {\n    function convertToAssets(uint256 shares) external view returns (uint256);\n    function decimals() external view returns (uint8);\n}\n"
    },
    "contracts/interfaces/IStaderStakeManager.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IStaderStakeManager {\n    function convertBnbXToBnb(uint256 _amount) external view returns (uint256);\n}\n"
    },
    "contracts/interfaces/IStETH.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface IStETH {\n    function getPooledEthByShares(uint256 _sharesAmount) external view returns (uint256);\n    function decimals() external view returns (uint8);\n}\n"
    },
    "contracts/interfaces/ISynclubStakeManager.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISynclubStakeManager {\n    function convertSnBnbToBnb(uint256 _amount) external view returns (uint256);\n}\n"
    },
    "contracts/interfaces/IWBETH.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IWBETH {\n    function exchangeRate() external view returns (uint256);\n    function decimals() external view returns (uint8);\n}\n"
    },
    "contracts/interfaces/OracleInterface.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface OracleInterface {\n    function getPrice(address asset) external view returns (uint256);\n}\n\ninterface ResilientOracleInterface is OracleInterface {\n    function updatePrice(address vToken) external;\n\n    function updateAssetPrice(address asset) external;\n\n    function getUnderlyingPrice(address vToken) external view returns (uint256);\n}\n\ninterface TwapInterface is OracleInterface {\n    function updateTwap(address asset) external returns (uint256);\n}\n\ninterface BoundValidatorInterface {\n    function validatePriceWithAnchorPrice(\n        address asset,\n        uint256 reporterPrice,\n        uint256 anchorPrice\n    ) external view returns (bool);\n}\n"
    },
    "contracts/oracles/BNBxOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IStaderStakeManager } from \"../interfaces/IStaderStakeManager.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title BNBxOracle\n * @author Venus\n * @notice This oracle fetches the price of BNBx asset\n */\ncontract BNBxOracle is CorrelatedTokenOracle {\n    /// @notice This is used as token address of BNB on BSC\n    address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n    /// @notice Address of StakeManager\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    IStaderStakeManager public immutable STAKE_MANAGER;\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address stakeManager,\n        address bnbx,\n        address resilientOracle\n    ) CorrelatedTokenOracle(bnbx, NATIVE_TOKEN_ADDR, resilientOracle) {\n        ensureNonzeroAddress(stakeManager);\n        STAKE_MANAGER = IStaderStakeManager(stakeManager);\n    }\n\n    /**\n     * @notice Fetches the amount of BNB for 1 BNBx\n     * @return price The amount of BNB for BNBx\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return STAKE_MANAGER.convertBnbXToBnb(EXP_SCALE);\n    }\n}\n"
    },
    "contracts/oracles/common/CorrelatedTokenOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title CorrelatedTokenOracle\n * @notice This oracle fetches the price of a token that is correlated to another token.\n */\nabstract contract CorrelatedTokenOracle is OracleInterface {\n    /// @notice Address of the correlated token\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address public immutable CORRELATED_TOKEN;\n\n    /// @notice Address of the underlying token\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address public immutable UNDERLYING_TOKEN;\n\n    /// @notice Address of Resilient Oracle\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    OracleInterface public immutable RESILIENT_ORACLE;\n\n    /// @notice Thrown if the token address is invalid\n    error InvalidTokenAddress();\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(address correlatedToken, address underlyingToken, address resilientOracle) {\n        ensureNonzeroAddress(correlatedToken);\n        ensureNonzeroAddress(underlyingToken);\n        ensureNonzeroAddress(resilientOracle);\n        CORRELATED_TOKEN = correlatedToken;\n        UNDERLYING_TOKEN = underlyingToken;\n        RESILIENT_ORACLE = OracleInterface(resilientOracle);\n    }\n\n    /**\n     * @notice Fetches the price of the correlated token\n     * @param asset Address of the correlated token\n     * @return price The price of the correlated token in scaled decimal places\n     */\n    function getPrice(address asset) external view override returns (uint256) {\n        if (asset != CORRELATED_TOKEN) revert InvalidTokenAddress();\n\n        // get underlying token amount for 1 correlated token scaled by underlying token decimals\n        uint256 underlyingAmount = _getUnderlyingAmount();\n\n        // oracle returns (36 - asset decimal) scaled price\n        uint256 underlyingUSDPrice = RESILIENT_ORACLE.getPrice(UNDERLYING_TOKEN);\n\n        IERC20Metadata token = IERC20Metadata(CORRELATED_TOKEN);\n        uint256 decimals = token.decimals();\n\n        // underlyingAmount (for 1 correlated token) * underlyingUSDPrice / decimals(correlated token)\n        return (underlyingAmount * underlyingUSDPrice) / (10 ** decimals);\n    }\n\n    /**\n     * @notice Gets the underlying amount for correlated token\n     * @return underlyingAmount Amount of underlying token\n     */\n    function _getUnderlyingAmount() internal view virtual returns (uint256);\n}\n"
    },
    "contracts/oracles/OneJumpOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title OneJumpOracle\n * @author Venus\n * @notice This oracle fetches the price of an asset in through an intermediate asset\n */\ncontract OneJumpOracle is CorrelatedTokenOracle {\n    /// @notice Address of the intermediate oracle\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    OracleInterface public immutable INTERMEDIATE_ORACLE;\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address correlatedToken,\n        address underlyingToken,\n        address resilientOracle,\n        address intermediateOracle\n    ) CorrelatedTokenOracle(correlatedToken, underlyingToken, resilientOracle) {\n        ensureNonzeroAddress(intermediateOracle);\n        INTERMEDIATE_ORACLE = OracleInterface(intermediateOracle);\n    }\n\n    /**\n     * @notice Fetches the amount of the underlying token for 1 correlated token, using the intermediate oracle\n     * @return amount The amount of the underlying token for 1 correlated token, using the intermediate oracle\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        uint256 underlyingDecimals = IERC20Metadata(UNDERLYING_TOKEN).decimals();\n        uint256 correlatedDecimals = IERC20Metadata(CORRELATED_TOKEN).decimals();\n\n        uint256 underlyingAmount = INTERMEDIATE_ORACLE.getPrice(CORRELATED_TOKEN);\n\n        return\n            (underlyingAmount * (10 ** correlatedDecimals)) / (36 - underlyingDecimals);\n    }\n}\n"
    },
    "contracts/oracles/PendleOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IPendlePtOracle } from \"../interfaces/IPendlePtOracle.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title PendleOracle\n * @author Venus\n * @notice This oracle fetches the price of a pendle token\n */\ncontract PendleOracle is CorrelatedTokenOracle {\n    /// @notice Address of the PT oracle\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    IPendlePtOracle public immutable PT_ORACLE;\n\n    /// @notice Address of the market\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    address public immutable MARKET;\n\n    /// @notice Twap duration for the oracle\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    uint32 public immutable TWAP_DURATION;\n\n    /// @notice Thrown if the duration is invalid\n    error InvalidDuration();\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address market,\n        address ptOracle,\n        address ptToken,\n        address underlyingToken,\n        address resilientOracle,\n        uint32 twapDuration\n    ) CorrelatedTokenOracle(ptToken, underlyingToken, resilientOracle) {\n        ensureNonzeroAddress(market);\n        ensureNonzeroAddress(ptOracle);\n        ensureNonzeroValue(twapDuration);\n\n        MARKET = market;\n        PT_ORACLE = IPendlePtOracle(ptOracle);\n        TWAP_DURATION = twapDuration;\n\n        (bool increaseCardinalityRequired, , bool oldestObservationSatisfied) = PT_ORACLE.getOracleState(\n            MARKET,\n            TWAP_DURATION\n        );\n        if (increaseCardinalityRequired || !oldestObservationSatisfied) {\n            revert InvalidDuration();\n        }\n    }\n\n    /**\n     * @notice Fetches the amount of underlying token for 1 pendle token\n     * @return amount The amount of underlying token for pendle token\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return PT_ORACLE.getPtToAssetRate(MARKET, TWAP_DURATION);\n    }\n}\n"
    },
    "contracts/oracles/SFraxOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ISFrax } from \"../interfaces/ISFrax.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title SFraxOracle\n * @author Venus\n * @notice This oracle fetches the price of sFrax\n */\ncontract SFraxOracle is CorrelatedTokenOracle {\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address sFrax,\n        address frax,\n        address resilientOracle\n    ) CorrelatedTokenOracle(sFrax, frax, resilientOracle) {}\n\n    /**\n     * @notice Fetches the amount of FRAX for 1 sFrax\n     * @return amount The amount of FRAX for sFrax\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return ISFrax(CORRELATED_TOKEN).convertToAssets(EXP_SCALE);\n    }\n}\n"
    },
    "contracts/oracles/SFrxETHOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ISfrxETH } from \"../interfaces/ISfrxETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title SFrxETHOracle\n * @author Venus\n * @notice This oracle fetches the price of sfrxETH\n */\ncontract SFrxETHOracle is CorrelatedTokenOracle {\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address sfrxETH,\n        address frxETH,\n        address resilientOracle\n    ) CorrelatedTokenOracle(sfrxETH, frxETH, resilientOracle) {}\n\n    /**\n     * @notice Gets the frxETH for 1 sfrxETH\n     * @return amount Amount of frxETH\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return ISfrxETH(CORRELATED_TOKEN).convertToAssets(EXP_SCALE);\n    }\n}\n"
    },
    "contracts/oracles/SlisBNBOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ISynclubStakeManager } from \"../interfaces/ISynclubStakeManager.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title SlisBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of slisBNB asset\n */\ncontract SlisBNBOracle is CorrelatedTokenOracle {\n    /// @notice This is used as token address of BNB on BSC\n    address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n    /// @notice Address of StakeManager\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    ISynclubStakeManager public immutable STAKE_MANAGER;\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address stakeManager,\n        address slisBNB,\n        address resilientOracle\n    ) CorrelatedTokenOracle(slisBNB, NATIVE_TOKEN_ADDR, resilientOracle) {\n        ensureNonzeroAddress(stakeManager);\n        STAKE_MANAGER = ISynclubStakeManager(stakeManager);\n    }\n\n    /**\n     * @notice Fetches the amount of BNB for 1 slisBNB\n     * @return amount The amount of BNB for slisBNB\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return STAKE_MANAGER.convertSnBnbToBnb(EXP_SCALE);\n    }\n}\n"
    },
    "contracts/oracles/StkBNBOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IPStakePool } from \"../interfaces/IPStakePool.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title StkBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of stkBNB asset\n */\ncontract StkBNBOracle is CorrelatedTokenOracle {\n    /// @notice This is used as token address of BNB on BSC\n    address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n    /// @notice Address of StakePool\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    IPStakePool public immutable STAKE_POOL;\n\n    /// @notice Thrown if the pool token supply is zero\n    error PoolTokenSupplyIsZero();\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address stakePool,\n        address stkBNB,\n        address resilientOracle\n    ) CorrelatedTokenOracle(stkBNB, NATIVE_TOKEN_ADDR, resilientOracle) {\n        ensureNonzeroAddress(stakePool);\n        STAKE_POOL = IPStakePool(stakePool);\n    }\n\n    /**\n     * @notice Fetches the amount of BNB for 1 stkBNB\n     * @return price The amount of BNB for stkBNB\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        IPStakePool.Data memory exchangeRateData = STAKE_POOL.exchangeRate();\n\n        if (exchangeRateData.poolTokenSupply == 0) {\n            revert PoolTokenSupplyIsZero();\n        }\n\n        return (exchangeRateData.totalWei * EXP_SCALE) / exchangeRateData.poolTokenSupply;\n    }\n}\n"
    },
    "contracts/oracles/WBETHOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IWBETH } from \"../interfaces/IWBETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title WBETHOracle\n * @author Venus\n * @notice This oracle fetches the price of wBETH asset\n */\ncontract WBETHOracle is CorrelatedTokenOracle {\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address wbeth,\n        address eth,\n        address resilientOracle\n    ) CorrelatedTokenOracle(wbeth, eth, resilientOracle) {}\n\n    /**\n     * @notice Fetches the amount of ETH for 1 wBETH\n     * @return amount The amount of ETH for wBETH\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return IWBETH(CORRELATED_TOKEN).exchangeRate();\n    }\n}\n"
    },
    "contracts/oracles/WeETHOracle.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IEtherFiLiquidityPool } from \"../interfaces/IEtherFiLiquidityPool.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title WeETHOracle\n * @author Venus\n * @notice This oracle fetches the price of weETH\n */\ncontract WeETHOracle is CorrelatedTokenOracle {\n    /// @notice Address of Liqiudity pool\n    /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n    IEtherFiLiquidityPool public immutable LIQUIDITY_POOL;\n\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address liquidityPool,\n        address weETH,\n        address eETH,\n        address resilientOracle\n    ) CorrelatedTokenOracle(weETH, eETH, resilientOracle) {\n        ensureNonzeroAddress(liquidityPool);\n        LIQUIDITY_POOL = IEtherFiLiquidityPool(liquidityPool);\n    }\n\n    /**\n     * @notice Gets the eETH for 1 weETH\n     * @return amount Amount of eETH\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return LIQUIDITY_POOL.amountForShare(EXP_SCALE);\n    }\n}\n"
    },
    "contracts/oracles/WstETHOracleV2.sol": {
      "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IStETH } from \"../interfaces/IStETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title WstETHOracleV2\n * @author Venus\n * @notice This oracle fetches the price of wstETH\n */\ncontract WstETHOracleV2 is CorrelatedTokenOracle {\n    /// @notice Constructor for the implementation contract.\n    /// @custom:oz-upgrades-unsafe-allow constructor\n    constructor(\n        address wstETH,\n        address stETH,\n        address resilientOracle\n    ) CorrelatedTokenOracle(wstETH, stETH, resilientOracle) {}\n\n    /**\n     * @notice Gets the stETH for 1 wstETH\n     * @return amount Amount of stETH\n     */\n    function _getUnderlyingAmount() internal view override returns (uint256) {\n        return IStETH(UNDERLYING_TOKEN).getPooledEthByShares(EXP_SCALE);\n    }\n}\n"
    }
  },
  "settings": {
    "optimizer": {
      "enabled": true,
      "runs": 200,
      "details": {
        "yul": true
      }
    },
    "outputSelection": {
      "*": {
        "*": [
          "storageLayout",
          "abi",
          "evm.bytecode",
          "evm.deployedBytecode",
          "evm.methodIdentifiers",
          "metadata",
          "devdoc",
          "userdoc",
          "evm.gasEstimates"
        ],
        "": ["ast"]
      }
    },
    "evmVersion": "paris",
    "metadata": {
      "useLiteralContent": true
    }
  }
}
