From 16784b91ff8e500ac5fdc568ef942fefc8c315ea Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Tue, 31 Mar 2026 21:58:14 +0530 Subject: [PATCH 01/30] feat: add initial DeviationBoundedOracle contract implementation --- contracts/DeviationBoundedOracle.sol | 656 ++++++++++++++++++ .../interfaces/IDeviationBoundedOracle.sol | 71 ++ 2 files changed, 727 insertions(+) create mode 100644 contracts/DeviationBoundedOracle.sol create mode 100644 contracts/interfaces/IDeviationBoundedOracle.sol diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol new file mode 100644 index 00000000..0509b62f --- /dev/null +++ b/contracts/DeviationBoundedOracle.sol @@ -0,0 +1,656 @@ +// SPDX-License-Identifier: BSD-3-Clause +// SPDX-FileCopyrightText: 2024 Venus +pragma solidity 0.8.25; + +import { VBep20Interface } from "./interfaces/VBep20Interface.sol"; +import { ResilientOracleInterface } from "./interfaces/OracleInterface.sol"; +import { IDeviationBoundedOracle } from "./interfaces/IDeviationBoundedOracle.sol"; +import { AccessControlledV8 } from "@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol"; +import { EXP_SCALE } from "@venusprotocol/solidity-utilities/contracts/constants.sol"; +import { ensureNonzeroAddress, ensureNonzeroValue } from "@venusprotocol/solidity-utilities/contracts/validators.sol"; +import { Transient } from "./lib/Transient.sol"; + +/** + * @title DeviationBoundedOracle + * @author Venus + * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. + * + * It maintains a per-market rolling min/max price window. When the current spot price deviates + * significantly from the window bounds, protection mode activates automatically and conservative + * pricing kicks in: + * - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low + * - Debt is valued at max(spot, windowMax) — floors debt value at recent window high + * + * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity + * collateral tokens. Sustained attacks beyond the window period are expected to be handled by + * off-chain monitoring systems. + * + * The oracle exposes both view and non-view price functions. The non-view variants update the + * price window and trigger protection. The view variants read stored state only. A transient + * price cache avoids redundant ResilientOracle calls within the same transaction when + * updateProtectionState is called before the view price reads. + */ +contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { + /// @notice Per-market protection state tracking the min/max price window + struct MarketProtectionState { + /// @notice Lowest price observed in the current window (packed with maxPrice in one slot) + uint128 minPrice; + /// @notice Highest price observed in the current window + uint128 maxPrice; + /// @notice Whether protection mode is currently active + bool protectedPriceEnabled; + /// @notice Timestamp of the last protection trigger — reset on every trigger + uint64 protectionEnabledAt; + /// @notice Minimum time protection stays active after last trigger + uint64 cooldownPeriod; + } + + /// @notice Minimum allowed threshold value (5%) to account for keeper deadband + uint256 public constant MIN_THRESHOLD = 5e16; + + /// @notice Maximum allowed threshold value (50%) + uint256 public constant MAX_THRESHOLD = 50e16; + + /// @notice Resilient Oracle used to fetch spot prices + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + ResilientOracleInterface public immutable RESILIENT_ORACLE; + + /// @notice Transient storage slot for caching spot prices within a transaction + /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache + /// keccak256(abi.encode(uint256(keccak256("venus-protocol/oracle/DeviationBoundedOracle/cache")) - 1)) + /// & ~bytes32(uint256(0xff)) + bytes32 public constant PRICE_CACHE_SLOT = 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200; + + /// @notice Per-market protection state + mapping(address => MarketProtectionState) public marketProtection; + + /// @notice Per-market entry trigger threshold (mantissa, e.g. 0.1667e18 = 16.67%) + mapping(address => uint256) public thresholds; + + /// @notice Per-market exit threshold (mantissa, default = threshold/2 for hysteresis) + mapping(address => uint256) public exitThresholds; + + /// @notice Per-market whitelist — only whitelisted assets use bounded pricing + mapping(address => bool) public whitelistedAssets; + + /// @notice Emitted when protection is initialized for an asset + event ProtectionInitialized( + address indexed asset, + uint128 minPrice, + uint128 maxPrice, + uint64 cooldownPeriod, + uint256 threshold + ); + + /// @notice Emitted when protection mode is triggered for an asset + event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice); + + /// @notice Emitted when protection mode is disabled for an asset + event ProtectionDisabled(address indexed asset); + + /// @notice Emitted when the keeper updates the minimum price for an asset + event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin); + + /// @notice Emitted when the keeper updates the maximum price for an asset + event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax); + + /// @notice Emitted when the price window is expanded + event WindowExpanded(address indexed asset, uint128 newMin, uint128 newMax); + + /// @notice Emitted when the entry threshold is updated for an asset + event ThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold); + + /// @notice Emitted when the exit threshold is updated for an asset + event ExitThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold); + + /// @notice Emitted when the cooldown period is updated for an asset + event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown); + + /// @notice Emitted when an asset's whitelist status changes + event WhitelistUpdated(address indexed asset, bool whitelisted); + + /// @notice Thrown when trying to initialize protection for an asset that is not initialized + error MarketNotInitialized(address asset); + + /// @notice Thrown when trying to initialize an already initialized market + error MarketAlreadyInitialized(address asset); + + /// @notice Thrown when trying to disable protection that is not active + error ProtectionNotActive(address asset); + + /// @notice Thrown when trying to disable protection before cooldown has elapsed + error CooldownNotElapsed(address asset, uint64 protectionEnabledAt, uint64 cooldownPeriod); + + /// @notice Thrown when trying to disable protection before price range has converged + error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 exitThreshold); + + /// @notice Thrown when keeper tries to set minPrice above current spot + error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot); + + /// @notice Thrown when keeper tries to set maxPrice below current spot + error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot); + + /// @notice Thrown when threshold is set below the minimum allowed value + error ThresholdBelowMinimum(uint256 threshold, uint256 minimum); + + /// @notice Thrown when threshold is set above the maximum allowed value + error ThresholdAboveMaximum(uint256 threshold, uint256 maximum); + + /// @notice Thrown when minPrice >= maxPrice during initialization + error InvalidPriceRange(uint128 minPrice, uint128 maxPrice); + + /// @notice Thrown when a price exceeds uint128 max + error PriceExceedsUint128(uint256 price); + + /** + * @notice Checks whether an address is null or not + */ + modifier notNullAddress(address someone) { + if (someone == address(0)) revert("can't be zero address"); + _; + } + + /// @notice Constructor for the implementation contract. Sets immutable variables. + /// @param _resilientOracle Address of the ResilientOracle contract + /// @custom:oz-upgrades-unsafe-allow constructor + constructor(ResilientOracleInterface _resilientOracle) notNullAddress(address(_resilientOracle)) { + RESILIENT_ORACLE = _resilientOracle; + _disableInitializers(); + } + + /** + * @notice Initializes the contract admin + * @param accessControlManager_ Address of the access control manager contract + */ + function initialize(address accessControlManager_) external initializer { + __AccessControlled_init(accessControlManager_); + } + + // ----- Non-view price functions (update window + trigger protection) ----- + + /** + * @notice Gets the bounded collateral price for a given vToken, updating protection state + * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger, + * and returns the conservative (lower) price when protection is active. + * Used by keepers or direct callers who want atomic update + read. + * @param vToken vToken address + * @return price The bounded collateral price + */ + function getBoundedCollateralPrice(address vToken) external returns (uint256) { + (uint256 spot, address asset) = _getSpotPrice(vToken); + + if (!whitelistedAssets[asset]) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + + _updateWindow(state, spot, asset); + _checkAndTriggerProtection(state, spot, thresholds[asset], asset); + + if (state.protectedPriceEnabled) { + return _getProtectedCollateralPrice(spot, state); + } + return spot; + } + + /** + * @notice Gets the bounded debt price for a given vToken, updating protection state + * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger, + * and returns the conservative (higher) price when protection is active. + * Used by keepers or direct callers who want atomic update + read. + * @param vToken vToken address + * @return price The bounded debt price + */ + function getBoundedDebtPrice(address vToken) external returns (uint256) { + (uint256 spot, address asset) = _getSpotPrice(vToken); + + if (!whitelistedAssets[asset]) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + + _updateWindow(state, spot, asset); + _checkAndTriggerProtection(state, spot, thresholds[asset], asset); + + if (state.protectedPriceEnabled) { + return _getProtectedDebtPrice(spot, state); + } + return spot; + } + + // ----- View price functions (read stored/cached state only) ----- + + /** + * @notice Gets the bounded collateral price for a given vToken (view variant) + * @dev Reads from transient cache first (populated by a prior updateProtectionState call + * in the same transaction). Falls back to ResilientOracle on cache miss. + * Returns min(spot, windowMin) when protection is active, spot otherwise. + * @param vToken vToken address + * @return price The bounded collateral price + */ + function getBoundedCollateralPriceView(address vToken) external view returns (uint256) { + (uint256 spot, address asset) = _getSpotPrice(vToken); + + if (!whitelistedAssets[asset]) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + + if (state.protectedPriceEnabled) { + return _getProtectedCollateralPrice(spot, state); + } + return spot; + } + + /** + * @notice Gets the bounded debt price for a given vToken (view variant) + * @dev Reads from transient cache first (populated by a prior updateProtectionState call + * in the same transaction). Falls back to ResilientOracle on cache miss. + * Returns max(spot, windowMax) when protection is active, spot otherwise. + * @param vToken vToken address + * @return price The bounded debt price + */ + function getBoundedDebtPriceView(address vToken) external view returns (uint256) { + (uint256 spot, address asset) = _getSpotPrice(vToken); + + if (!whitelistedAssets[asset]) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + + if (state.protectedPriceEnabled) { + return _getProtectedDebtPrice(spot, state); + } + return spot; + } + + // ----- State update (called before view price reads to populate transient cache) ----- + + /** + * @notice Updates the protection state for a given vToken + * @dev Fetches spot price from ResilientOracle, caches it in transient storage, + * expands the price window if spot is a new extreme, and triggers protection + * if the deviation threshold is exceeded. Called by PolicyFacet before liquidity + * calculations so that subsequent view price reads are gas-efficient. + * @param vToken vToken address + */ + function updateProtectionState(address vToken) external { + (uint256 spot, address asset) = _fetchAndCacheSpot(vToken); + + if (!whitelistedAssets[asset]) return; + + MarketProtectionState storage state = marketProtection[asset]; + + _updateWindow(state, spot, asset); + _checkAndTriggerProtection(state, spot, thresholds[asset], asset); + } + + // ----- Keeper functions ----- + + /** + * @notice Updates the minimum price in the rolling window for a given asset + * @dev Called by the keeper to push corrected min values from the off-chain sliding window. + * Constraint: newMin must be at or below the current spot price. + * @param asset The underlying asset address + * @param newMin The new minimum price + * @custom:access Only authorized keeper addresses + */ + function updateMinPrice(address asset, uint128 newMin) external { + _checkAccessAllowed("updateMinPrice(address,uint128)"); + ensureNonzeroAddress(asset); + + uint256 currentSpot = RESILIENT_ORACLE.getPrice(asset); + if (uint256(newMin) > currentSpot) revert InvalidMinPrice(asset, newMin, currentSpot); + + MarketProtectionState storage state = marketProtection[asset]; + uint128 oldMin = state.minPrice; + state.minPrice = newMin; + emit MinPriceUpdated(asset, oldMin, newMin); + } + + /** + * @notice Updates the maximum price in the rolling window for a given asset + * @dev Called by the keeper to push corrected max values from the off-chain sliding window. + * Constraint: newMax must be at or above the current spot price. + * @param asset The underlying asset address + * @param newMax The new maximum price + * @custom:access Only authorized keeper addresses + */ + function updateMaxPrice(address asset, uint128 newMax) external { + _checkAccessAllowed("updateMaxPrice(address,uint128)"); + ensureNonzeroAddress(asset); + + uint256 currentSpot = RESILIENT_ORACLE.getPrice(asset); + if (uint256(newMax) < currentSpot) revert InvalidMaxPrice(asset, newMax, currentSpot); + + MarketProtectionState storage state = marketProtection[asset]; + uint128 oldMax = state.maxPrice; + state.maxPrice = newMax; + emit MaxPriceUpdated(asset, oldMax, newMax); + } + + /** + * @notice Disables protection mode for a given asset + * @dev Called by the keeper/monitor after confirming price has normalised. + * Enforces two conditions on-chain: + * 1. Cooldown period has elapsed since the last trigger + * 2. Price range has converged below the exit threshold + * @param asset The underlying asset address + * @custom:access Only authorized monitor/keeper addresses + * @custom:error ProtectionNotActive if protection is not currently active + * @custom:error CooldownNotElapsed if cooldown period has not elapsed + * @custom:error PriceRangeNotConverged if window range is still above exit threshold + */ + function disableProtection(address asset) external { + _checkAccessAllowed("disableProtection(address)"); + + MarketProtectionState storage state = marketProtection[asset]; + + if (!state.protectedPriceEnabled) revert ProtectionNotActive(asset); + + if (block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod)) { + revert CooldownNotElapsed(asset, state.protectionEnabledAt, state.cooldownPeriod); + } + + // exit protection mode if price range has converged below exit threshold + uint256 rangeRatio = _getWindowRangeRatio(state); + if (rangeRatio >= exitThresholds[asset]) { + revert PriceRangeNotConverged(asset, rangeRatio, exitThresholds[asset]); + } + + state.protectedPriceEnabled = false; + emit ProtectionDisabled(asset); + } + + // ----- Admin functions (governance-gated) ----- + + /** + * @notice Initializes protection for a new asset + * @dev Sets the initial min/max window, cooldown period, threshold, exit threshold, + * and whitelists the asset. Can only be called once per asset. + * @param asset The underlying asset address + * @param minPrice Initial minimum price for the window + * @param maxPrice Initial maximum price for the window + * @param cooldownPeriod Minimum time protection stays active after last trigger + * @param threshold Deviation trigger threshold (mantissa). Must be > 5%. + * @custom:access Only Governance + * @custom:error MarketAlreadyInitialized if the asset has already been initialized + * @custom:error InvalidPriceRange if minPrice >= maxPrice or either is zero + * @custom:error ThresholdBelowMinimum if threshold is below 5% + * @custom:event ProtectionInitialized + * @custom:event WhitelistUpdated + */ + function initializeProtection( + address asset, + uint128 minPrice, + uint128 maxPrice, + uint64 cooldownPeriod, + uint256 threshold + ) external { + _checkAccessAllowed("initializeProtection(address,uint128,uint128,uint64,uint256)"); + ensureNonzeroAddress(asset); + + if (marketProtection[asset].minPrice != 0) revert MarketAlreadyInitialized(asset); + if (minPrice == 0 || maxPrice == 0 || minPrice > maxPrice) revert InvalidPriceRange(minPrice, maxPrice); + if (threshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(threshold, MIN_THRESHOLD); + if (threshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(threshold, MAX_THRESHOLD); + + marketProtection[asset] = MarketProtectionState({ + minPrice: minPrice, + maxPrice: maxPrice, + protectedPriceEnabled: false, + protectionEnabledAt: 0, + cooldownPeriod: cooldownPeriod + }); + + thresholds[asset] = threshold; + exitThresholds[asset] = threshold / 2; + whitelistedAssets[asset] = true; + + emit ProtectionInitialized(asset, minPrice, maxPrice, cooldownPeriod, threshold); + emit WhitelistUpdated(asset, true); + } + + /** + * @notice Sets the cooldown period for an asset + * @param asset The underlying asset address + * @param cooldown The new cooldown period in seconds + * @custom:access Only Governance + * @custom:event CooldownPeriodSet + */ + function setCooldownPeriod(address asset, uint64 cooldown) external { + _checkAccessAllowed("setCooldownPeriod(address,uint64)"); + ensureNonzeroAddress(asset); + + MarketProtectionState storage state = marketProtection[asset]; + if (state.minPrice == 0) revert MarketNotInitialized(asset); + + uint64 oldCooldown = state.cooldownPeriod; + state.cooldownPeriod = cooldown; + emit CooldownPeriodSet(asset, oldCooldown, cooldown); + } + + /** + * @notice Sets the entry trigger threshold for an asset + * @param asset The underlying asset address + * @param threshold The new threshold (mantissa). Must be > 5%. + * @custom:access Only Governance + * @custom:error ThresholdBelowMinimum if threshold is below 5% + * @custom:event ThresholdSet + */ + function setThreshold(address asset, uint256 threshold) external { + _checkAccessAllowed("setThreshold(address,uint256)"); + ensureNonzeroAddress(asset); + if (threshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(threshold, MIN_THRESHOLD); + if (threshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(threshold, MAX_THRESHOLD); + + uint256 oldThreshold = thresholds[asset]; + thresholds[asset] = threshold; + emit ThresholdSet(asset, oldThreshold, threshold); + } + + /** + * @notice Sets the exit threshold for an asset + * @param asset The underlying asset address + * @param exitThreshold The new exit threshold (mantissa) + * @custom:access Only Governance + * @custom:event ExitThresholdSet + */ + function setExitThreshold(address asset, uint256 exitThreshold) external { + _checkAccessAllowed("setExitThreshold(address,uint256)"); + ensureNonzeroAddress(asset); + ensureNonzeroValue(exitThreshold); + + uint256 oldExitThreshold = exitThresholds[asset]; + exitThresholds[asset] = exitThreshold; + emit ExitThresholdSet(asset, oldExitThreshold, exitThreshold); + } + + /** + * @notice Sets whether an asset is whitelisted for bounded pricing + * @param asset The underlying asset address + * @param whitelisted Whether the asset should be whitelisted + * @custom:access Only Governance + * @custom:event WhitelistUpdated + */ + function setWhitelisted(address asset, bool whitelisted) external { + _checkAccessAllowed("setWhitelisted(address,bool)"); + ensureNonzeroAddress(asset); + + whitelistedAssets[asset] = whitelisted; + emit WhitelistUpdated(asset, whitelisted); + } + + // ----- View helpers ----- + + /** + * @notice Checks if an asset is whitelisted for bounded pricing + * @param asset The underlying asset address + * @return True if the asset is whitelisted + */ + function isWhitelisted(address asset) external view returns (bool) { + return whitelistedAssets[asset]; + } + + /** + * @notice Checks if protection is currently active for an asset + * @param asset The underlying asset address + * @return True if protection mode is active + */ + function isProtected(address asset) external view returns (bool) { + return marketProtection[asset].protectedPriceEnabled; + } + + /** + * @notice Checks if protection can be exited for an asset + * @dev Returns true when both conditions are met: + * 1. Cooldown period has elapsed since last trigger + * 2. Price range has converged below exit threshold + * @param asset The underlying asset address + * @return True if protection can be disabled + */ + function canExitProtection(address asset) external view returns (bool) { + MarketProtectionState storage state = marketProtection[asset]; + + if (!state.protectedPriceEnabled) return false; + if (block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod)) return false; + if (state.minPrice == 0) return false; + + return _getWindowRangeRatio(state) < exitThresholds[asset]; + } + + // ----- Internal functions ----- + + /** + * @dev Computes the current window range ratio used for exit checks. + * Formula: \((maxPrice - minPrice) / minPrice\), scaled by `EXP_SCALE`. + * @param state The market protection state + * @return rangeRatio The scaled range ratio \(((max - min) * EXP_SCALE) / min\) + */ + function _getWindowRangeRatio(MarketProtectionState storage state) internal view returns (uint256) { + uint256 range = uint256(state.maxPrice) - uint256(state.minPrice); + return (range * EXP_SCALE) / uint256(state.minPrice); + } + + /** + * @dev Fetches the spot price from ResilientOracle and caches it in transient storage + * @param vToken vToken address + * @return spot The spot price + * @return asset The underlying asset address + */ + function _fetchAndCacheSpot(address vToken) internal returns (uint256 spot, address asset) { + spot = RESILIENT_ORACLE.getUnderlyingPrice(vToken); + asset = VBep20Interface(vToken).underlying(); + Transient.cachePrice(PRICE_CACHE_SLOT, asset, spot); + } + + /** + * @dev Reads the spot price from transient cache, falling back to ResilientOracle on miss. + * Used by view functions to avoid redundant oracle calls when updateProtectionState + * has already been called in the same transaction. + * @param vToken vToken address + * @return spot The spot price + */ + function _getSpotPrice(address vToken) internal view returns (uint256 spot, address asset) { + asset = VBep20Interface(vToken).underlying(); + uint256 cached = Transient.readCachedPrice(PRICE_CACHE_SLOT, asset); + if (cached != 0) return (cached, asset); + spot = RESILIENT_ORACLE.getUnderlyingPrice(vToken); + } + + /** + * @dev Expands the price window toward extremes if the spot price is a new min or max + * @param state The market protection state + * @param spot The current spot price + * @param asset The underlying asset address (for event emission) + */ + function _updateWindow(MarketProtectionState storage state, uint256 spot, address asset) internal { + uint128 spotU128 = _safeToUint128(spot); + bool expanded; + if (spotU128 < state.minPrice) { + state.minPrice = spotU128; + expanded = true; + } + if (spotU128 > state.maxPrice) { + state.maxPrice = spotU128; + expanded = true; + } + if (expanded) { + emit WindowExpanded(asset, state.minPrice, state.maxPrice); + } + } + + /** + * @dev Returns the conservative collateral price while protection is active. + * Collateral pricing uses `min(spot, windowMin)` to avoid over-valuing collateral. + * @param spot The current spot price + * @param state The market protection state (read-only) + * @return price The bounded collateral price + */ + function _getProtectedCollateralPrice( + uint256 spot, + MarketProtectionState storage state + ) internal view returns (uint256) { + uint256 minPrice = uint256(state.minPrice); + return spot < minPrice ? spot : minPrice; + } + + /** + * @dev Returns the conservative debt price while protection is active. + * Debt pricing uses `max(spot, windowMax)` to avoid under-valuing debt. + * @param spot The current spot price + * @param state The market protection state (read-only) + * @return price The bounded debt price + */ + function _getProtectedDebtPrice(uint256 spot, MarketProtectionState storage state) internal view returns (uint256) { + uint256 maxPrice = uint256(state.maxPrice); + return spot > maxPrice ? spot : maxPrice; + } + + /** + * @dev Checks if the spot price has deviated beyond the threshold and triggers protection + * @param state The market protection state + * @param spot The current spot price + * @param threshold The deviation threshold (mantissa) + * @param asset The underlying asset address (for event emission) + */ + function _checkAndTriggerProtection( + MarketProtectionState storage state, + uint256 spot, + uint256 threshold, + address asset + ) internal { + if (threshold == 0) return; + + if (_isDeviationTriggered(spot, state, threshold)) { + state.protectedPriceEnabled = true; + state.protectionEnabledAt = uint64(block.timestamp); + emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); + } + } + + /** + * @dev Checks if spot price has deviated beyond the threshold from window bounds + * Pump detection: spot > minPrice * (1 + threshold) + * Crash detection: spot < maxPrice * (1 - threshold) + * @param spot The current spot price + * @param state The market protection state + * @param threshold The deviation threshold (mantissa) + * @return True if deviation is triggered + */ + function _isDeviationTriggered( + uint256 spot, + MarketProtectionState storage state, + uint256 threshold + ) internal view returns (bool) { + uint256 upperBound = (uint256(state.minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE; + uint256 lowerBound = (uint256(state.maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE; + return (spot > upperBound || spot < lowerBound); + } + + /** + * @dev Safely casts a uint256 to uint128, reverting on overflow + * @param value The value to cast + * @return The value as uint128 + */ + function _safeToUint128(uint256 value) internal pure returns (uint128) { + if (value > type(uint128).max) revert PriceExceedsUint128(value); + return uint128(value); + } +} diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol new file mode 100644 index 00000000..e5bc509d --- /dev/null +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -0,0 +1,71 @@ +// SPDX-License-Identifier: BSD-3-Clause +pragma solidity ^0.8.25; + +interface IDeviationBoundedOracle { + // --- Non-view price functions (update window + trigger protection) --- + + function getBoundedCollateralPrice(address vToken) external returns (uint256); + + function getBoundedDebtPrice(address vToken) external returns (uint256); + + // --- View price functions (read stored/cached state only) --- + + function getBoundedCollateralPriceView(address vToken) external view returns (uint256); + + function getBoundedDebtPriceView(address vToken) external view returns (uint256); + + // --- State update (called before view price reads to populate transient cache) --- + + function updateProtectionState(address vToken) external; + + // --- Keeper functions --- + + function updateMinPrice(address asset, uint128 newMin) external; + + function updateMaxPrice(address asset, uint128 newMax) external; + + function disableProtection(address asset) external; + + // --- Admin functions (governance-gated) --- + + function initializeProtection( + address asset, + uint128 minPrice, + uint128 maxPrice, + uint64 cooldownPeriod, + uint256 threshold + ) external; + + function setCooldownPeriod(address asset, uint64 cooldown) external; + + function setThreshold(address asset, uint256 threshold) external; + + function setExitThreshold(address asset, uint256 exitThreshold) external; + + function setWhitelisted(address asset, bool whitelisted) external; + + // --- View helpers --- + + function isWhitelisted(address asset) external view returns (bool); + + function isProtected(address asset) external view returns (bool); + + function canExitProtection(address asset) external view returns (bool); + + function marketProtection( + address asset + ) + external + view + returns ( + uint128 minPrice, + uint128 maxPrice, + bool protectedPriceEnabled, + uint64 protectionEnabledAt, + uint64 cooldownPeriod + ); + + function thresholds(address asset) external view returns (uint256); + + function exitThresholds(address asset) external view returns (uint256); +} From cbf42d134a9119ef6ed5877d7e0422fc2735b231 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 1 Apr 2026 20:42:02 +0530 Subject: [PATCH 02/30] refactor: (WIP) add improvements to DeviationBoundedOracle --- contracts/DeviationBoundedOracle.sol | 427 +++++++++++++----- .../interfaces/IDeviationBoundedOracle.sol | 9 + 2 files changed, 312 insertions(+), 124 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 0509b62f..056bde11 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -39,6 +39,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint128 maxPrice; /// @notice Whether protection mode is currently active bool protectedPriceEnabled; + /// @notice Whether this market is whitelisted for bounded pricing + bool isWhitelisted; /// @notice Timestamp of the last protection trigger — reset on every trigger uint64 protectionEnabledAt; /// @notice Minimum time protection stays active after last trigger @@ -51,15 +53,37 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /// @notice Maximum allowed threshold value (50%) uint256 public constant MAX_THRESHOLD = 50e16; + /// @notice Keeper deadband threshold (5%) — min/max corrections below this are suppressed + uint256 public constant KEEPER_DEADBAND = 5e16; + /// @notice Resilient Oracle used to fetch spot prices /// @custom:oz-upgrades-unsafe-allow state-variable-immutable ResilientOracleInterface public immutable RESILIENT_ORACLE; - /// @notice Transient storage slot for caching spot prices within a transaction + /// @notice Native market address + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + address public immutable nativeMarket; + + /// @notice VAI address + /// @custom:oz-upgrades-unsafe-allow state-variable-immutable + address public immutable vai; + + /// @notice Transient storage slot for caching final collateral prices within a transaction /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache /// keccak256(abi.encode(uint256(keccak256("venus-protocol/oracle/DeviationBoundedOracle/cache")) - 1)) /// & ~bytes32(uint256(0xff)) - bytes32 public constant PRICE_CACHE_SLOT = 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200; + bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT = + 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200; + + /// @notice Transient storage slot for caching final debt prices within a transaction + /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache + /// keccak256(abi.encode(uint256(keccak256("venus-protocol/oracle/DeviationBoundedOracle/debtCache")) - 1)) + /// & ~bytes32(uint256(0xff)) + bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600; + + /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) + /// and can serve as any underlying asset of a market that supports native tokens + address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB; /// @notice Per-market protection state mapping(address => MarketProtectionState) public marketProtection; @@ -70,8 +94,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /// @notice Per-market exit threshold (mantissa, default = threshold/2 for hysteresis) mapping(address => uint256) public exitThresholds; - /// @notice Per-market whitelist — only whitelisted assets use bounded pricing - mapping(address => bool) public whitelistedAssets; + /// @notice Append-only array of all assets ever initialized, used for enumeration + address[] internal allAssets; /// @notice Emitted when protection is initialized for an asset event ProtectionInitialized( @@ -94,9 +118,6 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /// @notice Emitted when the keeper updates the maximum price for an asset event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax); - /// @notice Emitted when the price window is expanded - event WindowExpanded(address indexed asset, uint128 newMin, uint128 newMax); - /// @notice Emitted when the entry threshold is updated for an asset event ThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold); @@ -150,11 +171,21 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { _; } - /// @notice Constructor for the implementation contract. Sets immutable variables. - /// @param _resilientOracle Address of the ResilientOracle contract - /// @custom:oz-upgrades-unsafe-allow constructor - constructor(ResilientOracleInterface _resilientOracle) notNullAddress(address(_resilientOracle)) { + /** + * @notice Constructor for the implementation contract. Sets immutable variables. + * @param _resilientOracle Address of the ResilientOracle contract + * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address) + * @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain). + * @custom:oz-upgrades-unsafe-allow constructor + */ + constructor( + ResilientOracleInterface _resilientOracle, + address nativeMarketAddress, + address vaiAddress + ) notNullAddress(address(_resilientOracle)) notNullAddress(nativeMarketAddress) { RESILIENT_ORACLE = _resilientOracle; + nativeMarket = nativeMarketAddress; + vai = vaiAddress; _disableInitializers(); } @@ -177,19 +208,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return price The bounded collateral price */ function getBoundedCollateralPrice(address vToken) external returns (uint256) { - (uint256 spot, address asset) = _getSpotPrice(vToken); - - if (!whitelistedAssets[asset]) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - - _updateWindow(state, spot, asset); - _checkAndTriggerProtection(state, spot, thresholds[asset], asset); - - if (state.protectedPriceEnabled) { - return _getProtectedCollateralPrice(spot, state); - } - return spot; + return _getBoundedPrice(vToken, true); } /** @@ -201,19 +220,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return price The bounded debt price */ function getBoundedDebtPrice(address vToken) external returns (uint256) { - (uint256 spot, address asset) = _getSpotPrice(vToken); - - if (!whitelistedAssets[asset]) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - - _updateWindow(state, spot, asset); - _checkAndTriggerProtection(state, spot, thresholds[asset], asset); - - if (state.protectedPriceEnabled) { - return _getProtectedDebtPrice(spot, state); - } - return spot; + return _getBoundedPrice(vToken, false); } // ----- View price functions (read stored/cached state only) ----- @@ -227,16 +234,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return price The bounded collateral price */ function getBoundedCollateralPriceView(address vToken) external view returns (uint256) { - (uint256 spot, address asset) = _getSpotPrice(vToken); - - if (!whitelistedAssets[asset]) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - - if (state.protectedPriceEnabled) { - return _getProtectedCollateralPrice(spot, state); - } - return spot; + return _getBoundedPriceView(vToken, true); } /** @@ -248,16 +246,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return price The bounded debt price */ function getBoundedDebtPriceView(address vToken) external view returns (uint256) { - (uint256 spot, address asset) = _getSpotPrice(vToken); - - if (!whitelistedAssets[asset]) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - - if (state.protectedPriceEnabled) { - return _getProtectedDebtPrice(spot, state); - } - return spot; + return _getBoundedPriceView(vToken, false); } // ----- State update (called before view price reads to populate transient cache) ----- @@ -271,14 +260,19 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param vToken vToken address */ function updateProtectionState(address vToken) external { - (uint256 spot, address asset) = _fetchAndCacheSpot(vToken); + address asset = _getUnderlyingAsset(vToken); + uint256 spot = _fetchSpotPriceFromOracle(asset); - if (!whitelistedAssets[asset]) return; + if (!_isWhitelisted(asset)) return; MarketProtectionState storage state = marketProtection[asset]; _updateWindow(state, spot, asset); _checkAndTriggerProtection(state, spot, thresholds[asset], asset); + + // Cache both final bounded prices for subsequent view reads + _setCachedPrice(asset, true, _resolvePrice(spot, state, true)); + _setCachedPrice(asset, false, _resolvePrice(spot, state, false)); } // ----- Keeper functions ----- @@ -293,15 +287,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function updateMinPrice(address asset, uint128 newMin) external { _checkAccessAllowed("updateMinPrice(address,uint128)"); - ensureNonzeroAddress(asset); - - uint256 currentSpot = RESILIENT_ORACLE.getPrice(asset); - if (uint256(newMin) > currentSpot) revert InvalidMinPrice(asset, newMin, currentSpot); - - MarketProtectionState storage state = marketProtection[asset]; - uint128 oldMin = state.minPrice; - state.minPrice = newMin; - emit MinPriceUpdated(asset, oldMin, newMin); + _updatePrice(asset, newMin, true); } /** @@ -314,15 +300,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function updateMaxPrice(address asset, uint128 newMax) external { _checkAccessAllowed("updateMaxPrice(address,uint128)"); - ensureNonzeroAddress(asset); - - uint256 currentSpot = RESILIENT_ORACLE.getPrice(asset); - if (uint256(newMax) < currentSpot) revert InvalidMaxPrice(asset, newMax, currentSpot); - - MarketProtectionState storage state = marketProtection[asset]; - uint128 oldMax = state.maxPrice; - state.maxPrice = newMax; - emit MaxPriceUpdated(asset, oldMax, newMax); + _updatePrice(asset, newMax, false); } /** @@ -387,7 +365,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { ensureNonzeroAddress(asset); if (marketProtection[asset].minPrice != 0) revert MarketAlreadyInitialized(asset); - if (minPrice == 0 || maxPrice == 0 || minPrice > maxPrice) revert InvalidPriceRange(minPrice, maxPrice); + if (minPrice == 0 || maxPrice == 0 || minPrice >= maxPrice) revert InvalidPriceRange(minPrice, maxPrice); if (threshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(threshold, MIN_THRESHOLD); if (threshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(threshold, MAX_THRESHOLD); @@ -395,13 +373,14 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { minPrice: minPrice, maxPrice: maxPrice, protectedPriceEnabled: false, + isWhitelisted: true, protectionEnabledAt: 0, cooldownPeriod: cooldownPeriod }); thresholds[asset] = threshold; exitThresholds[asset] = threshold / 2; - whitelistedAssets[asset] = true; + allAssets.push(asset); emit ProtectionInitialized(asset, minPrice, maxPrice, cooldownPeriod, threshold); emit WhitelistUpdated(asset, true); @@ -410,39 +389,39 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Sets the cooldown period for an asset * @param asset The underlying asset address - * @param cooldown The new cooldown period in seconds + * @param newCooldown The new cooldown period in seconds * @custom:access Only Governance * @custom:event CooldownPeriodSet */ - function setCooldownPeriod(address asset, uint64 cooldown) external { + function setCooldownPeriod(address asset, uint64 newCooldown) external { _checkAccessAllowed("setCooldownPeriod(address,uint64)"); ensureNonzeroAddress(asset); + _ensureInitialized(asset); - MarketProtectionState storage state = marketProtection[asset]; - if (state.minPrice == 0) revert MarketNotInitialized(asset); + MarketProtectionState storage state = _ensureInitialized(asset); - uint64 oldCooldown = state.cooldownPeriod; - state.cooldownPeriod = cooldown; - emit CooldownPeriodSet(asset, oldCooldown, cooldown); + emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown); + state.cooldownPeriod = newCooldown; } /** * @notice Sets the entry trigger threshold for an asset * @param asset The underlying asset address - * @param threshold The new threshold (mantissa). Must be > 5%. + * @param newThreshold The new threshold (mantissa). Must be > 5%. * @custom:access Only Governance * @custom:error ThresholdBelowMinimum if threshold is below 5% * @custom:event ThresholdSet */ - function setThreshold(address asset, uint256 threshold) external { + function setThreshold(address asset, uint256 newThreshold) external { _checkAccessAllowed("setThreshold(address,uint256)"); ensureNonzeroAddress(asset); - if (threshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(threshold, MIN_THRESHOLD); - if (threshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(threshold, MAX_THRESHOLD); + _ensureInitialized(asset); - uint256 oldThreshold = thresholds[asset]; - thresholds[asset] = threshold; - emit ThresholdSet(asset, oldThreshold, threshold); + if (newThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newThreshold, MIN_THRESHOLD); + if (newThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newThreshold, MAX_THRESHOLD); + + emit ThresholdSet(asset, thresholds[asset], newThreshold); + thresholds[asset] = newThreshold; } /** @@ -455,6 +434,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function setExitThreshold(address asset, uint256 exitThreshold) external { _checkAccessAllowed("setExitThreshold(address,uint256)"); ensureNonzeroAddress(asset); + _ensureInitialized(asset); + ensureNonzeroValue(exitThreshold); uint256 oldExitThreshold = exitThresholds[asset]; @@ -472,8 +453,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function setWhitelisted(address asset, bool whitelisted) external { _checkAccessAllowed("setWhitelisted(address,bool)"); ensureNonzeroAddress(asset); + _ensureInitialized(asset); - whitelistedAssets[asset] = whitelisted; + marketProtection[asset].isWhitelisted = whitelisted; emit WhitelistUpdated(asset, whitelisted); } @@ -485,7 +467,29 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return True if the asset is whitelisted */ function isWhitelisted(address asset) external view returns (bool) { - return whitelistedAssets[asset]; + return _isWhitelisted(asset); + } + + /** + * @notice Returns all currently whitelisted asset addresses + * @dev Iterates the append-only allAssets array and filters by isWhitelisted. + * Gas-free for off-chain callers. + * @return result Array of whitelisted asset addresses + */ + function getWhitelistedAssets() external view returns (address[] memory) { + uint256 len = allAssets.length; + uint256 count; + for (uint256 i; i < len; ++i) { + if (_isWhitelisted(allAssets[i])) ++count; + } + address[] memory result = new address[](count); + uint256 idx; + for (uint256 i; i < len; ++i) { + if (_isWhitelisted(allAssets[i])) { + result[idx++] = allAssets[i]; + } + } + return result; } /** @@ -508,15 +512,145 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function canExitProtection(address asset) external view returns (bool) { MarketProtectionState storage state = marketProtection[asset]; - if (!state.protectedPriceEnabled) return false; - if (block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod)) return false; - if (state.minPrice == 0) return false; + if ( + !state.protectedPriceEnabled || + block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod) || + state.minPrice == 0 + ) { + return false; + } return _getWindowRangeRatio(state) < exitThresholds[asset]; } + /** + * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband + * from the keeper's proposed window values + * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads. + * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE) + * @param assets Array of asset addresses to check + * @param proposedMins Keeper's off-chain window minimum prices + * @param proposedMaxs Keeper's off-chain window maximum prices + * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset + * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset + */ + function checkWindowDrift( + address[] calldata assets, + uint128[] calldata proposedMins, + uint128[] calldata proposedMaxs + ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) { + uint256 len = assets.length; + needsMinUpdate = new bool[](len); + needsMaxUpdate = new bool[](len); + + for (uint256 i; i < len; ++i) { + MarketProtectionState storage state = marketProtection[assets[i]]; + needsMinUpdate[i] = _exceedsDeadband(state.minPrice, proposedMins[i]); + needsMaxUpdate[i] = _exceedsDeadband(state.maxPrice, proposedMaxs[i]); + } + } + // ----- Internal functions ----- + function _updatePrice(address asset, uint128 newPrice, bool isMinPrice) internal { + ensureNonzeroAddress(asset); + + MarketProtectionState storage state = _ensureInitialized(asset); + + uint256 currentSpot = _fetchSpotPriceFromOracle(asset); + if (isMinPrice) { + if (uint256(newPrice) > currentSpot) revert InvalidMinPrice(asset, newPrice, currentSpot); + _setMinPrice(state, asset, newPrice); + } else { + if (uint256(newPrice) < currentSpot) revert InvalidMaxPrice(asset, newPrice, currentSpot); + _setMaxPrice(state, asset, newPrice); + } + } + + /** + * @dev Shared non-view logic for getBoundedCollateralPrice and getBoundedDebtPrice. + * Fetches spot, updates window, checks trigger, and returns the resolved price. + * @param vToken vToken address + * @param isCollateral True for collateral pricing (min), false for debt pricing (max) + * @return price The bounded price + */ + function _getBoundedPrice(address vToken, bool isCollateral) internal returns (uint256) { + address asset = _getUnderlyingAsset(vToken); + uint256 spot = _fetchSpotPriceFromOracle(asset); + + if (!_isWhitelisted(asset)) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + _updateWindow(state, spot, asset); + _checkAndTriggerProtection(state, spot, thresholds[asset], asset); + + uint256 price = _resolvePrice(spot, state, isCollateral); + _setCachedPrice(asset, isCollateral, price); + return price; + } + + /** + * @dev Shared view logic for getBoundedCollateralPriceView and getBoundedDebtPriceView. + * Checks transient cache first for an early return; on miss, fetches from oracle + * and computes the resolved price without state mutations. + * @param vToken vToken address + * @param isCollateral True for collateral pricing (min), false for debt pricing (max) + * @return price The bounded price + */ + function _getBoundedPriceView(address vToken, bool isCollateral) internal view returns (uint256) { + address asset = _getUnderlyingAsset(vToken); + + // Early return if final price was cached by a prior call in this tx + uint256 cached = _getCachedPrice(asset, isCollateral); + if (cached != 0) return cached; + + // Cache miss — fetch from oracle and compute without state mutations + uint256 spot = _fetchSpotPriceFromOracle(asset); + if (!_isWhitelisted(asset)) return spot; + + MarketProtectionState storage state = marketProtection[asset]; + return _resolvePrice(spot, state, isCollateral); + } + + /** + * @dev Resolves the final bounded price based on protection state and price type. + * @param spot The current spot price + * @param state The market protection state + * @param isCollateral True for collateral pricing (min), false for debt pricing (max) + * @return price The resolved price + */ + function _resolvePrice( + uint256 spot, + MarketProtectionState storage state, + bool isCollateral + ) internal view returns (uint256) { + if (!state.protectedPriceEnabled) return spot; + + if (isCollateral) { + return _getProtectedCollateralPrice(spot, state); + } + return _getProtectedDebtPrice(spot, state); + } + + /** + * @dev Reverts if the market has not been initialized via initializeProtection + * @param asset The underlying asset address + * @return state The market protection state storage pointer + */ + function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) { + state = marketProtection[asset]; + if (state.minPrice == 0) revert MarketNotInitialized(asset); + } + + /** + * @dev Checks if an asset is whitelisted for bounded pricing + * @param asset The underlying asset address + * @return True if the asset is whitelisted + */ + function _isWhitelisted(address asset) internal view returns (bool) { + return marketProtection[asset].isWhitelisted; + } + /** * @dev Computes the current window range ratio used for exit checks. * Formula: \((maxPrice - minPrice) / minPrice\), scaled by `EXP_SCALE`. @@ -529,29 +663,25 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @dev Fetches the spot price from ResilientOracle and caches it in transient storage - * @param vToken vToken address - * @return spot The spot price - * @return asset The underlying asset address + * @dev Reads a cached final price from transient storage + * @param asset The underlying asset address + * @param isCollateral True for collateral price, false for debt price + * @return The cached price, or 0 on cache miss */ - function _fetchAndCacheSpot(address vToken) internal returns (uint256 spot, address asset) { - spot = RESILIENT_ORACLE.getUnderlyingPrice(vToken); - asset = VBep20Interface(vToken).underlying(); - Transient.cachePrice(PRICE_CACHE_SLOT, asset, spot); + function _getCachedPrice(address asset, bool isCollateral) internal view returns (uint256) { + bytes32 slot = isCollateral ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; + return Transient.readCachedPrice(slot, asset); } /** - * @dev Reads the spot price from transient cache, falling back to ResilientOracle on miss. - * Used by view functions to avoid redundant oracle calls when updateProtectionState - * has already been called in the same transaction. - * @param vToken vToken address - * @return spot The spot price + * @dev Writes a final price to transient storage + * @param asset The underlying asset address + * @param isCollateral True for collateral price, false for debt price + * @param price The resolved price to cache */ - function _getSpotPrice(address vToken) internal view returns (uint256 spot, address asset) { - asset = VBep20Interface(vToken).underlying(); - uint256 cached = Transient.readCachedPrice(PRICE_CACHE_SLOT, asset); - if (cached != 0) return (cached, asset); - spot = RESILIENT_ORACLE.getUnderlyingPrice(vToken); + function _setCachedPrice(address asset, bool isCollateral, uint256 price) internal { + bytes32 slot = isCollateral ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; + Transient.cachePrice(slot, asset, price); } /** @@ -562,17 +692,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function _updateWindow(MarketProtectionState storage state, uint256 spot, address asset) internal { uint128 spotU128 = _safeToUint128(spot); - bool expanded; if (spotU128 < state.minPrice) { - state.minPrice = spotU128; - expanded = true; + _setMinPrice(state, asset, spotU128); } if (spotU128 > state.maxPrice) { - state.maxPrice = spotU128; - expanded = true; - } - if (expanded) { - emit WindowExpanded(asset, state.minPrice, state.maxPrice); + _setMaxPrice(state, asset, spotU128); } } @@ -644,6 +768,42 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { return (spot > upperBound || spot < lowerBound); } + /** + * @dev Sets the minimum price in the window and emits MinPriceUpdated + * @param state The market protection state + * @param asset The underlying asset address (for event emission) + * @param newMin The new minimum price + */ + function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal { + uint128 oldMin = state.minPrice; + state.minPrice = newMin; + emit MinPriceUpdated(asset, oldMin, newMin); + } + + /** + * @dev Sets the maximum price in the window and emits MaxPriceUpdated + * @param state The market protection state + * @param asset The underlying asset address (for event emission) + * @param newMax The new maximum price + */ + function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal { + uint128 oldMax = state.maxPrice; + state.maxPrice = newMax; + emit MaxPriceUpdated(asset, oldMax, newMax); + } + + /** + * @dev Returns true if the absolute drift between onChain and proposed exceeds KEEPER_DEADBAND + * @param onChain The current on-chain price + * @param proposed The keeper's proposed price + * @return True if drift exceeds deadband + */ + function _exceedsDeadband(uint128 onChain, uint128 proposed) internal pure returns (bool) { + if (onChain == 0 || proposed == 0) return false; + uint256 diff = onChain > proposed ? uint256(onChain - proposed) : uint256(proposed - onChain); + return (diff * EXP_SCALE) / uint256(onChain) > KEEPER_DEADBAND; + } + /** * @dev Safely casts a uint256 to uint128, reverting on overflow * @param value The value to cast @@ -653,4 +813,23 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { if (value > type(uint128).max) revert PriceExceedsUint128(value); return uint128(value); } + + /** + * @dev This function returns the underlying asset of a vToken + * @param vToken vToken address + * @return asset underlying asset address + */ + function _getUnderlyingAsset(address vToken) private view notNullAddress(vToken) returns (address asset) { + if (vToken == nativeMarket) { + asset = NATIVE_TOKEN_ADDR; + } else if (vToken == vai) { + asset = vai; + } else { + asset = VBep20Interface(vToken).underlying(); + } + } + + function _fetchSpotPriceFromOracle(address asset) internal view returns (uint256) { + return RESILIENT_ORACLE.getPrice(asset); + } } diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index e5bc509d..5932a651 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -61,6 +61,7 @@ interface IDeviationBoundedOracle { uint128 minPrice, uint128 maxPrice, bool protectedPriceEnabled, + bool isWhitelisted, uint64 protectionEnabledAt, uint64 cooldownPeriod ); @@ -68,4 +69,12 @@ interface IDeviationBoundedOracle { function thresholds(address asset) external view returns (uint256); function exitThresholds(address asset) external view returns (uint256); + + function getWhitelistedAssets() external view returns (address[] memory); + + function checkWindowDrift( + address[] calldata assets, + uint128[] calldata proposedMins, + uint128[] calldata proposedMaxs + ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate); } From 185175c29ac5a45899cd45b84db8021f4f9883f6 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Thu, 2 Apr 2026 13:50:41 +0530 Subject: [PATCH 03/30] feat: add Claude workflow including rules and skills for testing and Solidity style --- .claude/rules/solidity-style.md | 145 +++++++++++++++++++++++++ .claude/rules/testing.md | 36 +++++++ .claude/skills/feature/SKILL.md | 103 ++++++++++++++++++ .claude/skills/test/SKILL.md | 186 ++++++++++++++++++++++++++++++++ CLAUDE.md | 134 +++++++++++++++++++++++ 5 files changed, 604 insertions(+) create mode 100644 .claude/rules/solidity-style.md create mode 100644 .claude/rules/testing.md create mode 100644 .claude/skills/feature/SKILL.md create mode 100644 .claude/skills/test/SKILL.md create mode 100644 CLAUDE.md diff --git a/.claude/rules/solidity-style.md b/.claude/rules/solidity-style.md new file mode 100644 index 00000000..55701016 --- /dev/null +++ b/.claude/rules/solidity-style.md @@ -0,0 +1,145 @@ +--- +description: Solidity coding standards for all contract and interface files +globs: contracts/**/*.sol +--- + +# Solidity Style Rules + +## Contract Layout (top -> bottom) + +1. Constants (`public constant`) +2. Immutables (`public immutable` or `internal immutable`) +3. State variables (`public` for auto-getters where possible; `internal` for structs -- see Function Visibility) +4. Events +5. Errors (custom errors only -- **no `require` with strings**) +6. Modifiers +7. Constructor / `initialize` +8. `receive` / `fallback` +9. Functions (ordered by visibility, see below) + +--- + +## Function Ordering + +Within the functions section, order by visibility: + +`external` -> `public` -> `internal` -> `private` + +Within each visibility group: + +1. ACM / access-gated (e.g. `onlyOwner`, `_checkAccessAllowed`) first +2. Permissionless second + +Within each access level: + +1. State-changing +2. `view` +3. `pure` + +--- + +## Function Visibility + +- **No `public` functions** -- Use `internal` helper + `external` wrapper instead. + - **Exception:** Inherited/overridden functions from OZ or other base contracts (e.g. `getPrice()`, `initialize()`). +- State variables **should** be `public` (auto-getter). Define the corresponding getter signature in the interface. + - **Exception:** Struct state variables -- Solidity `public` structs generate flattened return values (one value per field), not a full struct return. Use `internal` storage + explicit `external` getter that returns the struct from `memory`. + - **Exception:** Array state variables -- Solidity `public` array auto-getters only allow index-based access. Keep the array `public` (index-based access via auto-getter), but also add an explicit `external` getter that returns the full array. + +--- + +## Constants & Immutables + +- Constants in contracts **must** be `public constant` (auto-getter). +- Constants in `library` contracts **must** be `internal constant` (Solidity restriction -- libraries cannot have `public` state). +- Contract addresses that will never change (e.g. Venus, OZ dependencies) **must** be `immutable` or `constant` -- never stored in regular state variables. +- Upgradeable contracts **may** have a `constructor` but **only** to set `immutable` variables. All other initialisation goes in `initialize()`. + +--- + +## NatSpec + +**Comment style:** + +- **Multiline** NatSpec (2+ tags or long descriptions) -> use `/** ... */` block comments. +- **Single-line** NatSpec (one short tag) -> use `///` inline comments. + +**Required on all `external` and `public` functions** and their interface declarations: + +- `@notice` -- what the function does +- `@param` -- each parameter +- `@return` -- each return value +- `@custom:error` -- each custom error the function can revert with +- `@custom:event` -- each event the function can emit + +**Required on all `internal` functions:** + +- `@notice` -- what the function does (brief is fine) +- `@param` -- each parameter +- `@return` -- each return value +- `@custom:error` -- each custom error the function can revert with (integrators of the calling `external` function inherit these) + +**Error attribution rule:** + +- `external`/`public` functions document **only** errors thrown directly in their own body. +- Errors originating from `internal` helpers are documented on those `internal` functions instead. +- **Interface declarations** may include the full list of possible errors (direct + internal) for integrator convenience. Only include errors added by the feature contract -- no need to document errors from imported OZ or ACM base contracts. + +--- + +## Caching + +- **Cache everything** -- Never SLOAD or external-call the same value twice. Cache in local variables. +- Copy storage structs to `memory` at function entry when reading multiple fields. +- Cache `msg.sender`, `block.timestamp`, array lengths, and repeated mapping lookups. + +--- + +## Errors & Events Placement + +- **Custom errors only** -- never `require(condition, "string")`. +- For contracts **around ~500 lines or fewer**: define errors and events in the contract itself. +- For contracts **over ~600 lines**: move **all** errors and events (existing ones included) to the interface -- not just new ones. This keeps the contract focused on logic only. +- Prefix errors with the contract/interface name context (e.g. `OracleNotEnabled`, `InvalidBoundRatio`). + +--- + +## Security + +- **CEI pattern** -- Always follow Checks-Effects-Interactions order. Update all state before making any external calls. +- **SafeERC20** -- Always use `SafeERC20` for token transfers. For approvals always use `forceApprove` (never raw `.approve()`). +- **Zero address validation** -- Always validate against `address(0)` for all address parameters in constructors and `initialize()`. + +--- + +## Events + +- Setter functions **must** emit events logging both the old and new value. +- If the old value is only needed for the event (not for any logic), emit **before** writing storage to avoid an unnecessary cache variable. This is safe for ACM-guarded setters since they are access-controlled and carry no re-entrancy risk: + ```solidity + // preferred -- emit before write, no cache needed + emit ValueUpdated(storedValue, newValue); + storedValue = newValue; + ``` +- If the old value is also needed for logic, cache it first: + ```solidity + // cache when old value is used in logic too + uint256 oldValue = storedValue; + storedValue = newValue; + emit ValueUpdated(oldValue, newValue); + ``` + +--- + +## General Style + +- **DRY** -- If the same logic is used in multiple places, extract it into a shared `internal` function and call it from all the relevant `external` functions. Never duplicate logic. +- Use named return variables only when it improves readability; otherwise use explicit `return`. +- Use `uint256` over `uint` -- always explicit bit width. +- Avoid magic numbers -- define named constants. +- One contract per file; filename matches contract name. +- Upgradeable contracts **must** declare a storage gap as the last state variable. The gap size should be `50` minus the number of storage slots already declared in that contract, so the total always sums to 50: + ```solidity + // e.g. contract declares 3 storage variables -> gap = 47 + uint256[47] private __gap; + ``` diff --git a/.claude/rules/testing.md b/.claude/rules/testing.md new file mode 100644 index 00000000..c71ee637 --- /dev/null +++ b/.claude/rules/testing.md @@ -0,0 +1,36 @@ +--- +description: Rules for when and how to write or update tests +globs: test/**/*.ts +--- + +# Testing Rules + +## When to Write Tests + +- During **feature implementation**, tests are written only on explicit request -- do not auto-generate tests while building contracts. +- Once implementation is complete (e.g. during fixes, reviews, or audits), tests are expected and should be written when asked. +- Once tests exist and code changes are made later: make the code change first, then immediately ask the user if you should update the tests before touching them. _(Also in CLAUDE.md so this rule is always in context.)_ +- Write tests against **intended behaviour**, not against what the code currently does. If a test fails, ask the user whether the behaviour is correct or the code has a bug -- never silently adjust a test to make it pass. + +--- + +## Assertions + +- **Always exact** -- `expect(actual).to.equal(expected)`. Weak assertions like `expect(balance).to.be.gt(0)` when the expected value is known are not acceptable. +- Use `gt` / `lt` only when the result is genuinely variable (e.g. a loss scenario). Even then, compute the expected value and assert it exactly or near-exactly. +- `closeTo` / approximate assertions only when rounding genuinely prevents an exact comparison -- never as a shortcut. + +--- + +## Events + +- Always assert the primary function-specific event -- not just underlying `Transfer` / `Approval`. +- Use `.to.emit(contract, "EventName").withArgs(...)` with all arguments verified. + +--- + +## Mocking + +- Prefer the real code path. Only mock external dependencies (oracles, external protocols) when there is no alternative. +- Use `@defi-wonderland/smock` for mocking external contracts. Prefer `smock.mock` — use `smock.fake` only when `smock.mock` cannot be used (e.g. the contract has no deployable artifact). +- Never mock internal contract behaviour -- test it directly. diff --git a/.claude/skills/feature/SKILL.md b/.claude/skills/feature/SKILL.md new file mode 100644 index 00000000..d252c60a --- /dev/null +++ b/.claude/skills/feature/SKILL.md @@ -0,0 +1,103 @@ +--- +name: feature +description: Start or resume feature development workflow -- restores context, creates feature doc, creates task plan, implements contracts, updates feature docs +argument-hint: +--- + +# Feature Development Workflow + +Working on feature: **$ARGUMENTS** + +## Execution Order + +1. **Read research** -- Read all files in `research/$ARGUMENTS/` if they exist +2. **Create feature doc** -- Write `feature-docs/$ARGUMENTS.md` by synthesising the research docs (see below) +3. **Create task plan** -- Write `.task_plan.md` -- primarily informed by the feature doc; may also reference research docs directly for additional detail +4. **Implement** -- Write contracts and interfaces following Solidity style rules (see `.claude/rules/solidity-style.md`) +5. **Update feature doc** -- Ongoing throughout implementation: log progress, decisions made, and any design changes +6. **Tests** -- Only when explicitly asked + +If `feature-docs/$ARGUMENTS.md` already exists, read it first to restore context, then continue from where work left off. + +--- + +## Feature Doc (`feature-docs/$ARGUMENTS.md`) + +The feature doc is the **single source of truth** for the feature. Create it before the task plan by synthesising the research docs. Keep it short and concise — capture only what is essential, not a full rewrite of the research. + +It should capture: + +- **What needs to be done** -- scope and goal of the feature +- **Where to make changes** -- which contracts, interfaces, and files are involved +- **How to make changes** -- implementation approach; if the research doc prescribes a specific approach follow it, otherwise use a subagent to analyse the codebase and determine the best approach before writing this section +- **Key design decisions** and **why** they were made +- **Trade-offs and gotchas** -- anything worth watching out for + +During implementation, keep this doc updated with actual progress and any decisions that deviate from the original plan. All design decisions go here — if something changes, update this doc. Research docs are input only: used once to create the initial feature doc and never updated after that. + +--- + +## Task Planning (`.task_plan.md`) + +Always create `.task_plan.md` at the project root before starting implementation. This file: + +- Contains the execution plan with phases and checklist +- Tracks progress, errors, and current status +- Is **not tracked by git** -- purely a working file +- Persists across sessions for the same feature -- append, don't overwrite + +--- + +## Research (`research/`) + +Research docs in `research/$ARGUMENTS/` feed the initial feature doc and are not touched after that. They can be generated by Claude during a research phase or pasted in directly by the user. They may contain: + +- **Design docs** -- architecture, interface design, flow diagrams +- **Implementation docs** -- step-by-step implementation details +- **Reference material** -- relevant protocol docs, external references +- **Analysis** -- security considerations, gas analysis, comparisons + +**Important**: Research docs (especially implementation docs) may contain code snippets -- treat these as pseudo-code for inspiration only, NOT as source of truth. Always write correct, bug-free logic yourself. If you see a better approach than what is described, always present it to the user -- explain what it is and why it is better -- and ask whether to use it instead. + +--- + +## File Structure + +New oracle contracts follow this layout: + +``` +contracts/ + ├── interfaces/IMyOracle.sol # Interface first + └── oracles/MyOracle.sol # Implementation + +test/ + └── MyOracle.ts # Unit tests (only when asked) + +deploy/ + └── NN-deploy-my-oracle.ts # Hardhat-deploy script + +feature-docs/ + └── $ARGUMENTS.md # Feature doc (git-tracked) + +research/ + └── $ARGUMENTS/ # Research input (NOT git-tracked) +``` + +--- + +## Subagent Strategy + +During active development, if asked something mid-work (explain code, find usages, compare approaches), use a subagent to handle it. This keeps the main context window clean — delegate the exploration, return only the answer. + +--- + +## Operational Rules + +1. **Ask freely** -- If anything is unclear or ambiguous, ask the user before proceeding. Never assume. +2. **Read before decide** -- Before major decisions, re-read the feature doc and plan file. +3. **No landmines** -- Find root causes, no temporary fixes. Leave no hidden hazards in the code. +4. **2-Action Rule** -- After every 2 search/browse operations, IMMEDIATELY save key findings to files. +5. **Update after act** -- After completing any phase: mark status, log errors, note files modified. +6. **Log ALL errors** -- Every error goes in the plan file. +7. **Never repeat failures** -- `if action_failed: next_action != same_action`. Track attempts, mutate approach. +8. **3-Strike Protocol** -- After 3 failed attempts at the same problem, escalate to user. diff --git a/.claude/skills/test/SKILL.md b/.claude/skills/test/SKILL.md new file mode 100644 index 00000000..58a40bf0 --- /dev/null +++ b/.claude/skills/test/SKILL.md @@ -0,0 +1,186 @@ +--- +name: test +description: Write Hardhat/TypeScript unit and fork tests for an oracle contract — reads the contract, studies existing test patterns, generates a comprehensive test file +argument-hint: +--- + +# Test Skill + +Write Hardhat tests for: **$ARGUMENTS** + +Follow all rules in `.claude/rules/testing.md` throughout. + +--- + +## Workflow + +Read the contract, its interface, and existing tests. Use subagents when needed. Draft a plan covering what to test and which paths to cover, present it to the user, and only proceed once confirmed. + +The guidance below applies to whichever test type the user requests. + +--- + +## Unit Tests + +One test file per contract in `test/`. The structure below is a reference — substitute actual contract names, addresses, and constructor args for the contract under test. + +```typescript +import { smock } from "@defi-wonderland/smock"; +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { BigNumberish } from "ethers"; +import { ethers, upgrades } from "hardhat"; + +import { AccessControlManager, ChainlinkOracle, MockV3Aggregator, ResilientOracle } from "../typechain-types"; + +// Helper: wire a fixed price for `asset` through a real Chainlink feed → ChainlinkOracle → ResilientOracle. +// Returns the MockV3Aggregator so callers can update the price later with `feed.updateAnswer(newPrice)`. +async function setAssetPrice( + resilientOracle: ResilientOracle, + chainlinkOracle: ChainlinkOracle, + asset: string, + price: BigNumberish, + maxStalePeriod = 60 * 60, +): Promise { + const feed = await (await ethers.getContractFactory("MockV3Aggregator")).deploy(8, price); + await chainlinkOracle.setTokenConfig({ asset, feed: feed.address, maxStalePeriod }); + await resilientOracle.setTokenConfig({ + asset, + oracles: [chainlinkOracle.address, ethers.constants.AddressZero, ethers.constants.AddressZero], + enableFlagsForOracles: [true, false, false], + cachingEnabled: false, + }); + return feed; +} + +describe("", async () => { + const fixture = async () => { + const [deployer, user] = await ethers.getSigners(); + + // ACM is an external dependency — mock it and allow all calls + const acm = await smock.mock("AccessControlManager"); + acm.isAllowedToCall.returns(true); + + // Real ChainlinkOracle + const ChainlinkOracleFactory = await ethers.getContractFactory("ChainlinkOracle"); + const chainlinkOracle = await upgrades.deployProxy(ChainlinkOracleFactory, [acm.address]); + + // Real ResilientOracle — pass nativeMarket, vai, boundValidator as needed + const ResilientOracleFactory = await ethers.getContractFactory("ResilientOracle"); + const resilientOracle = await upgrades.deployProxy(ResilientOracleFactory, [acm.address], { + constructorArgs: [nativeMarket, vai, boundValidator], + }); + + // Wire a price: feed returned for later updates via feed.updateAnswer(newPrice) + const feed = await setAssetPrice(resilientOracle, chainlinkOracle, asset.address, /* 8-decimal price */ BigNumber.from("100000000")); + + // deploy contract under test + const Factory = await ethers.getContractFactory(""); + const contract = await Factory.deploy(resilientOracle.address, ...); + + return { contract, resilientOracle, chainlinkOracle, feed, acm, deployer, user }; + }; + + let contract: ; + let feed: MockV3Aggregator; + + beforeEach(async () => { + ({ contract, feed, resilientOracle, chainlinkOracle, acm, deployer, user } = await loadFixture(fixture)); + }); + + // ──────────────────────────────────────────────────────────────────────── + // Section Name + // ──────────────────────────────────────────────────────────────────────── + + describe("getPrice", async () => { + it("should return correct price for valid asset", async () => { + // ... + }); + }); +}); +``` + +**Ordering:** Full path test first -- one comprehensive happy path test asserting every important value (return values, state, events). This is the canonical reference for how the feature behaves and makes manual review easy. Focused tests come after -- isolate a specific behaviour or edge case, with a comment explaining what is skipped and why: + +```typescript +// Full getPrice path covered in "should return correct price for valid asset". +// This test focuses on staleness check only -- price calculation assertions skipped. +``` + +**Patterns:** + +- **Fixture**: Use `loadFixture(fixture)` in `beforeEach` for snapshot isolation. +- **Mocks**: Use `smock.mock("IInterface")` for external dependencies (fall back to `smock.fake` only when no artifact exists); configure return values with `mock.functionName.returns(value)`. +- **Signers**: Use `contract.connect(signer).method()` to call as a specific address. +- **Reverts**: `await expect(tx).to.be.revertedWithCustomError(contract, "ErrorName")` -- never string-based. +- **Events**: `await expect(tx).to.emit(contract, "EventName").withArgs(arg1, arg2)`. +- **Time**: `await time.increase(seconds)` or `await time.setNextBlockTimestamp(ts)` from `@nomicfoundation/hardhat-network-helpers`. +- **Prices**: Always use real `ResilientOracle` + real `ChainlinkOracle` + `MockV3Aggregator`. Use the `setAssetPrice` helper (defined at the top of the file) to wire a price for an asset. To change a price mid-test: `await feed.updateAnswer(newPrice)` (8-decimal format). + +**Don't:** + +- Test OZ/base contract internals (Ownable, AccessControl, Initializable). +- Create new mocks if existing ones in `test/` suffice. +- Duplicate revert paths already tested in another file. +- Add fuzz tests unless explicitly asked. + +--- + +## Fork Tests + +Fork tests live in `test/fork/`. Run with `FORK=true FORKED_NETWORK=`. + +- Deploy the new contract inside the fork test itself — do not rely on a live deployment. +- Use real mainnet addresses for already-deployed contracts (oracles, resilientOracle, ACM) so live state is part of the test. +- Mirror the unit test flow but validate calculations against real on-chain data. +- Import shared helpers from `test/fork/utils.ts` (addresses, signers, impersonation helpers). + +```typescript +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import { expect } from "chai"; +import { ethers } from "hardhat"; + +// Use live mainnet addresses — no mocks +const RESILIENT_ORACLE = "0x"; +const ACM = "0x"; + +describe(" fork tests", () => { + const fixture = async () => { + const [deployer] = await ethers.getSigners(); + + const resilientOracle = await ethers.getContractAt("ResilientOracle", RESILIENT_ORACLE); + + const Factory = await ethers.getContractFactory(""); + const contract = await Factory.deploy(resilientOracle.address, ...); + + return { contract, resilientOracle, deployer }; + }; + + let contract: ; + + beforeEach(async () => { + ({ contract, resilientOracle, deployer } = await loadFixture(fixture)); + }); + + it("returns correct price for on mainnet", async () => { + const price = await contract.getPrice(ASSET_ADDRESS); + // Assert against known on-chain value or a reasonable range + expect(price).to.be.gt(0); + }); +}); +``` + +--- + +## Verify + +Run `npx hardhat test test/.ts` and fix any failures before reporting to the user. + +--- + +## Post-deployment Changes + +This applies when a contract is already deployed in production and a subsequent PR introduces new functionality or changes — not the initial implementation PR. + +- Update the existing unit test file for the affected contract. +- Create a new focused test file covering all scenarios introduced or affected by the change. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000..d5459b88 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,134 @@ +# CLAUDE.md + +Venus Protocol Oracle — Solidity smart contract project using Hardhat. + +This is a DeFi protocol handling real funds. Always write clean, secure code — never apply quick patches or workarounds without understanding all side effects. Verify the impact of every change across the codebase. Every task deserves the same level of rigour; nothing should be treated as low priority or left at low quality. Never assume — if in doubt, ask and confirm before proceeding. + +--- + +## Package Manager + +Use **yarn** — never use npm. + +```bash +yarn install # install dependencies +``` + +--- + +## Common Commands + +```bash +yarn compile # compile contracts (regular + zksync) +yarn build # full build (tsc + hardhat compile + copy artifacts) +yarn test # compile + run all tests +npx hardhat test # run a specific test file +yarn lint # ESLint + Prettier + Solhint check +yarn prettier # auto-format code +yarn docgen # generate contract docs +``` + +### Fork Tests + +```bash +# Requires FORK=true + FORKED_NETWORK + ARCHIVE_NODE_ in .env +FORK=true FORKED_NETWORK=bscmainnet npx hardhat test test/fork/.ts +``` + +### Deploying + +```bash +yarn deploy:testnet # deploy to BSC testnet +yarn configure:testnet # configure on BSC testnet +npx hardhat --network deploy --tags # targeted deploy +yarn verify # Etherscan verification +``` + +--- + +## File Structure + +``` +contracts/ + ├── interfaces/ # All contract interfaces + ├── lib/ # Shared libraries + ├── oracles/ # Individual oracle implementations + │ └── common/ # Shared oracle base contracts + ├── test/ # Test-only contracts (mocks) + ├── DeviationBoundedOracle.sol + ├── ReferenceOracle.sol + └── ResilientOracle.sol + +test/ + ├── fork/ # Fork-based integration tests (FORK=true) + ├── utils/ # Test helpers + └── .ts # Unit tests per oracle (mirrors contracts/oracles/) + +deploy/ # Hardhat-deploy scripts (numbered, run in order) +deployments/ # Hardhat-deploy artifacts per network (git-tracked) +networks/ # Network-specific deployment addresses (mainnet.json) +helpers/ # TypeScript deployment helpers +artifacts/ # Compiled ABIs & artifacts (NOT git-tracked) +``` + +--- + +## Tests + +If tests exist and code changes are made: make the code change first, then immediately ask the user if you should update the tests before touching them. + +--- + +## Architecture + +### Oracle System + +The core is `ResilientOracle.sol` — aggregates prices from up to 3 configured sources (MAIN, PIVOT, FALLBACK) per asset with `BoundValidator` deviation checks. Individual oracle contracts fetch prices from external sources (Chainlink, Binance, staking protocols, etc.). + +### Key Contracts + +- **`ResilientOracle.sol`** — Main entry point; routes price requests, applies bound validation +- **`BoundValidator.sol`** — Validates price deviation ratio between two oracle sources +- **`DeviationBoundedOracle.sol`** — Wraps an oracle and reverts if price deviates beyond threshold vs a reference +- **`ReferenceOracle.sol`** — Simple oracle wrapper for reference price comparison +- **`contracts/oracles/`** — All individual oracle implementations (Chainlink, Binance, OneJump, ERC4626, Pendle, LST/LRT oracles, etc.) + +All oracle contracts implement `OracleInterface` (`getPrice(address asset)`). + +### Supported Networks + +Mainnets: `bscmainnet`, `ethereum`, `arbitrumone`, `opmainnet`, `opbnbmainnet`, `zksyncmainnet`, `basemainnet`, `unichainmainnet` + +Testnets: `bsctestnet`, `sepolia`, `arbitrumsepolia`, `opsepolia`, `opbnbtestnet`, `zksyncsepolia`, `basesepolia`, `unichainsepolia` + +ZkSync uses a separate config: `hardhat.config.zksync.ts` + +--- + +## Environment + +Requires archive node URLs in `.env` for fork tests (see `.env.example`): + +``` +ARCHIVE_NODE_bscmainnet=https://... +ARCHIVE_NODE_ethereum=https://... +``` + +--- + +## Conventions + +- Solidity `^0.8.25`, OpenZeppelin upgradeable contracts (UUPS pattern) +- Tests use `@defi-wonderland/smock` for mocking and `loadFixture` for snapshot isolation +- Commit messages follow conventional commits (enforced by commitlint + husky) +- Prettier: 120 char width, double quotes (single quotes for Solidity), sorted imports +- Solhint enforces Solidity style (`.solhint.json`) +- Deploy scripts are numbered and tagged — use `--tags` to deploy selectively + +--- + +## Venus Source Code + +- **Remote**: https://github.com/VenusProtocol (use `gh` for CLI access) +- **Deployed addresses**: [venus-protocol-documentation](https://github.com/VenusProtocol/venus-protocol-documentation) +- **Related repos**: `venus-protocol`, `isolated-pools`, `vips`, `governance-contracts` From f2c4df5d26d144bd769a8ebaa06b11fa945ca92a Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Fri, 3 Apr 2026 01:45:07 +0530 Subject: [PATCH 04/30] refactor: improve code flow and structure, add dual-price API, and move events/errors to interface --- contracts/DeviationBoundedOracle.sol | 798 ++++++++---------- .../interfaces/IDeviationBoundedOracle.sol | 384 ++++++++- 2 files changed, 720 insertions(+), 462 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 056bde11..a4e590b3 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -31,22 +31,6 @@ import { Transient } from "./lib/Transient.sol"; * updateProtectionState is called before the view price reads. */ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { - /// @notice Per-market protection state tracking the min/max price window - struct MarketProtectionState { - /// @notice Lowest price observed in the current window (packed with maxPrice in one slot) - uint128 minPrice; - /// @notice Highest price observed in the current window - uint128 maxPrice; - /// @notice Whether protection mode is currently active - bool protectedPriceEnabled; - /// @notice Whether this market is whitelisted for bounded pricing - bool isWhitelisted; - /// @notice Timestamp of the last protection trigger — reset on every trigger - uint64 protectionEnabledAt; - /// @notice Minimum time protection stays active after last trigger - uint64 cooldownPeriod; - } - /// @notice Minimum allowed threshold value (5%) to account for keeper deadband uint256 public constant MIN_THRESHOLD = 5e16; @@ -85,91 +69,14 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /// and can serve as any underlying asset of a market that supports native tokens address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB; - /// @notice Per-market protection state - mapping(address => MarketProtectionState) public marketProtection; - - /// @notice Per-market entry trigger threshold (mantissa, e.g. 0.1667e18 = 16.67%) - mapping(address => uint256) public thresholds; - - /// @notice Per-market exit threshold (mantissa, default = threshold/2 for hysteresis) - mapping(address => uint256) public exitThresholds; + /// @notice Per-asset protection state + mapping(address => MarketProtectionState) public assetProtectionConfig; /// @notice Append-only array of all assets ever initialized, used for enumeration - address[] internal allAssets; - - /// @notice Emitted when protection is initialized for an asset - event ProtectionInitialized( - address indexed asset, - uint128 minPrice, - uint128 maxPrice, - uint64 cooldownPeriod, - uint256 threshold - ); - - /// @notice Emitted when protection mode is triggered for an asset - event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice); - - /// @notice Emitted when protection mode is disabled for an asset - event ProtectionDisabled(address indexed asset); - - /// @notice Emitted when the keeper updates the minimum price for an asset - event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin); - - /// @notice Emitted when the keeper updates the maximum price for an asset - event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax); - - /// @notice Emitted when the entry threshold is updated for an asset - event ThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold); - - /// @notice Emitted when the exit threshold is updated for an asset - event ExitThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold); - - /// @notice Emitted when the cooldown period is updated for an asset - event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown); - - /// @notice Emitted when an asset's whitelist status changes - event WhitelistUpdated(address indexed asset, bool whitelisted); - - /// @notice Thrown when trying to initialize protection for an asset that is not initialized - error MarketNotInitialized(address asset); - - /// @notice Thrown when trying to initialize an already initialized market - error MarketAlreadyInitialized(address asset); - - /// @notice Thrown when trying to disable protection that is not active - error ProtectionNotActive(address asset); - - /// @notice Thrown when trying to disable protection before cooldown has elapsed - error CooldownNotElapsed(address asset, uint64 protectionEnabledAt, uint64 cooldownPeriod); - - /// @notice Thrown when trying to disable protection before price range has converged - error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 exitThreshold); - - /// @notice Thrown when keeper tries to set minPrice above current spot - error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot); - - /// @notice Thrown when keeper tries to set maxPrice below current spot - error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot); - - /// @notice Thrown when threshold is set below the minimum allowed value - error ThresholdBelowMinimum(uint256 threshold, uint256 minimum); - - /// @notice Thrown when threshold is set above the maximum allowed value - error ThresholdAboveMaximum(uint256 threshold, uint256 maximum); - - /// @notice Thrown when minPrice >= maxPrice during initialization - error InvalidPriceRange(uint128 minPrice, uint128 maxPrice); - - /// @notice Thrown when a price exceeds uint128 max - error PriceExceedsUint128(uint256 price); + address[] public allAssets; - /** - * @notice Checks whether an address is null or not - */ - modifier notNullAddress(address someone) { - if (someone == address(0)) revert("can't be zero address"); - _; - } + /// @notice Storage gap for upgrades + uint256[48] private __gap; /** * @notice Constructor for the implementation contract. Sets immutable variables. @@ -178,11 +85,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain). * @custom:oz-upgrades-unsafe-allow constructor */ - constructor( - ResilientOracleInterface _resilientOracle, - address nativeMarketAddress, - address vaiAddress - ) notNullAddress(address(_resilientOracle)) notNullAddress(nativeMarketAddress) { + constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) { + ensureNonzeroAddress(address(_resilientOracle)); + ensureNonzeroAddress(nativeMarketAddress); RESILIENT_ORACLE = _resilientOracle; nativeMarket = nativeMarketAddress; vai = vaiAddress; @@ -205,10 +110,13 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * and returns the conservative (lower) price when protection is active. * Used by keepers or direct callers who want atomic update + read. * @param vToken vToken address - * @return price The bounded collateral price + * @return collateralPrice The bounded collateral price + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold */ - function getBoundedCollateralPrice(address vToken) external returns (uint256) { - return _getBoundedPrice(vToken, true); + function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) { + (collateralPrice, ) = _updateAndGetBoundedPrices(vToken); } /** @@ -217,10 +125,45 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * and returns the conservative (higher) price when protection is active. * Used by keepers or direct callers who want atomic update + read. * @param vToken vToken address - * @return price The bounded debt price + * @return debtPrice The bounded debt price + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ + function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) { + (, debtPrice) = _updateAndGetBoundedPrices(vToken); + } + + /** + * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state + * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger, + * and returns both conservative prices in a single call. + * @param vToken vToken address + * @return collateralPrice The bounded collateral price + * @return debtPrice The bounded debt price + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ + function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) { + return _updateAndGetBoundedPrices(vToken); + } + + /** + * @notice Fetches the spot price, updates the protection window, and caches the resolved + * bounded prices in transient storage for the duration of the transaction. + * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before + * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / + * getBoundedDebtPriceView within the same transaction will read from the transient cache + * instead of querying ResilientOracle again, keeping those functions as `view` and + * avoiding redundant oracle calls. + * @param vToken vToken address + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold */ - function getBoundedDebtPrice(address vToken) external returns (uint256) { - return _getBoundedPrice(vToken, false); + function updateProtectionState(address vToken) external { + _updateAndGetBoundedPrices(vToken); } // ----- View price functions (read stored/cached state only) ----- @@ -231,10 +174,10 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * in the same transaction). Falls back to ResilientOracle on cache miss. * Returns min(spot, windowMin) when protection is active, spot otherwise. * @param vToken vToken address - * @return price The bounded collateral price + * @return collateralPrice The bounded collateral price */ - function getBoundedCollateralPriceView(address vToken) external view returns (uint256) { - return _getBoundedPriceView(vToken, true); + function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) { + (collateralPrice, ) = _computeBoundedPrices(vToken); } /** @@ -243,36 +186,21 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * in the same transaction). Falls back to ResilientOracle on cache miss. * Returns max(spot, windowMax) when protection is active, spot otherwise. * @param vToken vToken address - * @return price The bounded debt price + * @return debtPrice The bounded debt price */ - function getBoundedDebtPriceView(address vToken) external view returns (uint256) { - return _getBoundedPriceView(vToken, false); + function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) { + (, debtPrice) = _computeBoundedPrices(vToken); } - // ----- State update (called before view price reads to populate transient cache) ----- - /** - * @notice Updates the protection state for a given vToken - * @dev Fetches spot price from ResilientOracle, caches it in transient storage, - * expands the price window if spot is a new extreme, and triggers protection - * if the deviation threshold is exceeded. Called by PolicyFacet before liquidity - * calculations so that subsequent view price reads are gas-efficient. + * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant) + * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. * @param vToken vToken address + * @return collateralPrice The bounded collateral price + * @return debtPrice The bounded debt price */ - function updateProtectionState(address vToken) external { - address asset = _getUnderlyingAsset(vToken); - uint256 spot = _fetchSpotPriceFromOracle(asset); - - if (!_isWhitelisted(asset)) return; - - MarketProtectionState storage state = marketProtection[asset]; - - _updateWindow(state, spot, asset); - _checkAndTriggerProtection(state, spot, thresholds[asset], asset); - - // Cache both final bounded prices for subsequent view reads - _setCachedPrice(asset, true, _resolvePrice(spot, state, true)); - _setCachedPrice(asset, false, _resolvePrice(spot, state, false)); + function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) { + return _computeBoundedPrices(vToken); } // ----- Keeper functions ----- @@ -284,10 +212,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address * @param newMin The new minimum price * @custom:access Only authorized keeper addresses + * @custom:event MinPriceUpdated */ function updateMinPrice(address asset, uint128 newMin) external { _checkAccessAllowed("updateMinPrice(address,uint128)"); - _updatePrice(asset, newMin, true); + _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN); } /** @@ -297,10 +226,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address * @param newMax The new maximum price * @custom:access Only authorized keeper addresses + * @custom:event MaxPriceUpdated */ function updateMaxPrice(address asset, uint128 newMax) external { _checkAccessAllowed("updateMaxPrice(address,uint128)"); - _updatePrice(asset, newMax, false); + _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX); } /** @@ -314,25 +244,26 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @custom:error ProtectionNotActive if protection is not currently active * @custom:error CooldownNotElapsed if cooldown period has not elapsed * @custom:error PriceRangeNotConverged if window range is still above exit threshold + * @custom:event ProtectionDisabled */ - function disableProtection(address asset) external { - _checkAccessAllowed("disableProtection(address)"); + function disableActiveProtection(address asset) external { + _checkAccessAllowed("disableActiveProtection(address)"); - MarketProtectionState storage state = marketProtection[asset]; + MarketProtectionState storage state = assetProtectionConfig[asset]; - if (!state.protectedPriceEnabled) revert ProtectionNotActive(asset); + if (!state.isProtectionModeActive) revert ProtectionNotActive(asset); - if (block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod)) { - revert CooldownNotElapsed(asset, state.protectionEnabledAt, state.cooldownPeriod); + if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) { + revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod); } // exit protection mode if price range has converged below exit threshold - uint256 rangeRatio = _getWindowRangeRatio(state); - if (rangeRatio >= exitThresholds[asset]) { - revert PriceRangeNotConverged(asset, rangeRatio, exitThresholds[asset]); + uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice); + if (rangeRatio >= state.resetThreshold) { + revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold); } - state.protectedPriceEnabled = false; + state.isProtectionModeActive = false; emit ProtectionDisabled(asset); } @@ -340,49 +271,57 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Initializes protection for a new asset - * @dev Sets the initial min/max window, cooldown period, threshold, exit threshold, - * and whitelists the asset. Can only be called once per asset. + * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window, + * confirming the oracle is live for this asset before it is listed. Both bounds start at + * spot so the window expands naturally as prices move. Can only be called once per asset. * @param asset The underlying asset address - * @param minPrice Initial minimum price for the window - * @param maxPrice Initial maximum price for the window * @param cooldownPeriod Minimum time protection stays active after last trigger - * @param threshold Deviation trigger threshold (mantissa). Must be > 5%. + * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. + * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. * @custom:access Only Governance * @custom:error MarketAlreadyInitialized if the asset has already been initialized - * @custom:error InvalidPriceRange if minPrice >= maxPrice or either is zero - * @custom:error ThresholdBelowMinimum if threshold is below 5% + * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% + * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold + * @custom:error VAINotAllowed if asset is the VAI token + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event ProtectionInitialized * @custom:event WhitelistUpdated */ - function initializeProtection( + function setTokenConfig( address asset, - uint128 minPrice, - uint128 maxPrice, uint64 cooldownPeriod, - uint256 threshold + uint256 triggerThreshold, + uint256 resetThreshold ) external { - _checkAccessAllowed("initializeProtection(address,uint128,uint128,uint64,uint256)"); + _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256)"); ensureNonzeroAddress(asset); - - if (marketProtection[asset].minPrice != 0) revert MarketAlreadyInitialized(asset); - if (minPrice == 0 || maxPrice == 0 || minPrice >= maxPrice) revert InvalidPriceRange(minPrice, maxPrice); - if (threshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(threshold, MIN_THRESHOLD); - if (threshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(threshold, MAX_THRESHOLD); - - marketProtection[asset] = MarketProtectionState({ - minPrice: minPrice, - maxPrice: maxPrice, - protectedPriceEnabled: false, - isWhitelisted: true, - protectionEnabledAt: 0, - cooldownPeriod: cooldownPeriod + ensureNonzeroValue(cooldownPeriod); + ensureNonzeroValue(triggerThreshold); + ensureNonzeroValue(resetThreshold); + if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset); + if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD); + if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD); + if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold); + if (asset == vai) revert VAINotAllowed(); + + uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset)); + + assetProtectionConfig[asset] = MarketProtectionState({ + minPrice: spotU128, + maxPrice: spotU128, + isProtectionModeActive: false, + isBoundedPricingEnabled: true, + lastProtectionTriggeredAt: 0, + cooldownPeriod: cooldownPeriod, + asset: asset, + triggerThreshold: uint128(triggerThreshold), + resetThreshold: uint128(resetThreshold) }); - thresholds[asset] = threshold; - exitThresholds[asset] = threshold / 2; allAssets.push(asset); - emit ProtectionInitialized(asset, minPrice, maxPrice, cooldownPeriod, threshold); + emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold); emit WhitelistUpdated(asset, true); } @@ -396,111 +335,116 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function setCooldownPeriod(address asset, uint64 newCooldown) external { _checkAccessAllowed("setCooldownPeriod(address,uint64)"); ensureNonzeroAddress(asset); - _ensureInitialized(asset); + ensureNonzeroValue(newCooldown); MarketProtectionState storage state = _ensureInitialized(asset); - emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown); state.cooldownPeriod = newCooldown; } /** - * @notice Sets the entry trigger threshold for an asset + * @notice Sets the trigger and reset thresholds for an asset * @param asset The underlying asset address - * @param newThreshold The new threshold (mantissa). Must be > 5%. + * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold. + * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold. * @custom:access Only Governance - * @custom:error ThresholdBelowMinimum if threshold is below 5% - * @custom:event ThresholdSet - */ - function setThreshold(address asset, uint256 newThreshold) external { - _checkAccessAllowed("setThreshold(address,uint256)"); + * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50% + * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold + * @custom:event TriggerThresholdSet if the trigger threshold changed + * @custom:event ResetThresholdSet if the reset threshold changed + */ + function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external { + _checkAccessAllowed("setThresholds(address,uint256,uint256)"); ensureNonzeroAddress(asset); - _ensureInitialized(asset); - - if (newThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newThreshold, MIN_THRESHOLD); - if (newThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newThreshold, MAX_THRESHOLD); + ensureNonzeroValue(newTriggerThreshold); + ensureNonzeroValue(newResetThreshold); + if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD); + if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD); + if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold); + MarketProtectionState storage state = _ensureInitialized(asset); - emit ThresholdSet(asset, thresholds[asset], newThreshold); - thresholds[asset] = newThreshold; + if (newTriggerThreshold != state.triggerThreshold) { + emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold); + state.triggerThreshold = uint128(newTriggerThreshold); + } + if (newResetThreshold != state.resetThreshold) { + emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold); + state.resetThreshold = uint128(newResetThreshold); + } } /** - * @notice Sets the exit threshold for an asset + * @notice Sets whether an asset is enabled for bounded pricing * @param asset The underlying asset address - * @param exitThreshold The new exit threshold (mantissa) + * @param enabled Whether bounded pricing should be enabled for the asset * @custom:access Only Governance - * @custom:event ExitThresholdSet + * @custom:event WhitelistUpdated */ - function setExitThreshold(address asset, uint256 exitThreshold) external { - _checkAccessAllowed("setExitThreshold(address,uint256)"); + function setAssetBoundedPricingEnabled(address asset, bool enabled) external { + _checkAccessAllowed("setAssetBoundedPricingEnabled(address,bool)"); ensureNonzeroAddress(asset); - _ensureInitialized(asset); - ensureNonzeroValue(exitThreshold); + MarketProtectionState storage state = _ensureInitialized(asset); + + if (!enabled && state.isProtectionModeActive) { + revert ProtectionActive(asset); + } - uint256 oldExitThreshold = exitThresholds[asset]; - exitThresholds[asset] = exitThreshold; - emit ExitThresholdSet(asset, oldExitThreshold, exitThreshold); + state.isBoundedPricingEnabled = enabled; + emit WhitelistUpdated(asset, enabled); } + // ----- View helpers ----- + /** - * @notice Sets whether an asset is whitelisted for bounded pricing - * @param asset The underlying asset address - * @param whitelisted Whether the asset should be whitelisted - * @custom:access Only Governance - * @custom:event WhitelistUpdated + * @notice Returns all asset addresses that have ever been initialized + * @return Array of all initialized asset addresses */ - function setWhitelisted(address asset, bool whitelisted) external { - _checkAccessAllowed("setWhitelisted(address,bool)"); - ensureNonzeroAddress(asset); - _ensureInitialized(asset); - - marketProtection[asset].isWhitelisted = whitelisted; - emit WhitelistUpdated(asset, whitelisted); + function getInitializedAssets() external view returns (address[] memory) { + return allAssets; } - // ----- View helpers ----- - /** * @notice Checks if an asset is whitelisted for bounded pricing * @param asset The underlying asset address * @return True if the asset is whitelisted */ - function isWhitelisted(address asset) external view returns (bool) { - return _isWhitelisted(asset); + function isBoundedPricingEnabled(address asset) external view returns (bool) { + return assetProtectionConfig[asset].isBoundedPricingEnabled; + } + + /** + * @notice Checks if protection is currently active for an asset + * @param asset The underlying asset address + * @return True if protection mode is active + */ + function isProtectionActive(address asset) external view returns (bool) { + return assetProtectionConfig[asset].isProtectionModeActive; } /** * @notice Returns all currently whitelisted asset addresses - * @dev Iterates the append-only allAssets array and filters by isWhitelisted. + * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. * Gas-free for off-chain callers. * @return result Array of whitelisted asset addresses */ - function getWhitelistedAssets() external view returns (address[] memory) { + function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) { uint256 len = allAssets.length; + address[] memory temp = new address[](len); uint256 count; for (uint256 i; i < len; ++i) { - if (_isWhitelisted(allAssets[i])) ++count; + if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) { + temp[count++] = allAssets[i]; + } } address[] memory result = new address[](count); - uint256 idx; - for (uint256 i; i < len; ++i) { - if (_isWhitelisted(allAssets[i])) { - result[idx++] = allAssets[i]; - } + for (uint256 i; i < count; ++i) { + result[i] = temp[i]; } return result; } - /** - * @notice Checks if protection is currently active for an asset - * @param asset The underlying asset address - * @return True if protection mode is active - */ - function isProtected(address asset) external view returns (bool) { - return marketProtection[asset].protectedPriceEnabled; - } - /** * @notice Checks if protection can be exited for an asset * @dev Returns true when both conditions are met: @@ -510,17 +454,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @return True if protection can be disabled */ function canExitProtection(address asset) external view returns (bool) { - MarketProtectionState storage state = marketProtection[asset]; - - if ( - !state.protectedPriceEnabled || - block.timestamp < uint256(state.protectionEnabledAt) + uint256(state.cooldownPeriod) || - state.minPrice == 0 - ) { - return false; - } - - return _getWindowRangeRatio(state) < exitThresholds[asset]; + MarketProtectionState storage state = assetProtectionConfig[asset]; + return + state.isProtectionModeActive && + block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) && + _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold; } /** @@ -533,155 +471,80 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param proposedMaxs Keeper's off-chain window maximum prices * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset + * @custom:error InvalidArrayLength if the input array lengths do not match */ - function checkWindowDrift( + function checkAndGetWindowDrift( address[] calldata assets, uint128[] calldata proposedMins, uint128[] calldata proposedMaxs ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) { uint256 len = assets.length; + if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength(); + needsMinUpdate = new bool[](len); needsMaxUpdate = new bool[](len); for (uint256 i; i < len; ++i) { - MarketProtectionState storage state = marketProtection[assets[i]]; - needsMinUpdate[i] = _exceedsDeadband(state.minPrice, proposedMins[i]); - needsMaxUpdate[i] = _exceedsDeadband(state.maxPrice, proposedMaxs[i]); + MarketProtectionState storage state = assetProtectionConfig[assets[i]]; + needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]); + needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]); } } // ----- Internal functions ----- - function _updatePrice(address asset, uint128 newPrice, bool isMinPrice) internal { + /** + * @notice Validates and applies a keeper-provided min or max price update + * @param asset The underlying asset address + * @param newPrice The new price value to set + * @param boundType Whether this is a MIN or MAX bound update + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error ZeroPriceNotAllowed if newPrice is zero + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice + * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice + */ + function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal { ensureNonzeroAddress(asset); - + if (newPrice == 0) revert ZeroPriceNotAllowed(); MarketProtectionState storage state = _ensureInitialized(asset); - uint256 currentSpot = _fetchSpotPriceFromOracle(asset); - if (isMinPrice) { - if (uint256(newPrice) > currentSpot) revert InvalidMinPrice(asset, newPrice, currentSpot); + uint256 currentSpot = _fetchSpotPrice(asset); + if (boundType == PriceBoundType.MIN) { + if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot) + revert InvalidMinPrice(asset, newPrice, currentSpot); _setMinPrice(state, asset, newPrice); - } else { - if (uint256(newPrice) < currentSpot) revert InvalidMaxPrice(asset, newPrice, currentSpot); + } else if (boundType == PriceBoundType.MAX) { + if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot) + revert InvalidMaxPrice(asset, newPrice, currentSpot); _setMaxPrice(state, asset, newPrice); } } /** - * @dev Shared non-view logic for getBoundedCollateralPrice and getBoundedDebtPrice. - * Fetches spot, updates window, checks trigger, and returns the resolved price. + * @notice Shared non-view logic for all bounded price functions. + * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices. * @param vToken vToken address - * @param isCollateral True for collateral pricing (min), false for debt pricing (max) - * @return price The bounded price + * @return minPrice The bounded lower (collateral) price + * @return maxPrice The bounded upper (debt) price */ - function _getBoundedPrice(address vToken, bool isCollateral) internal returns (uint256) { + function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) { address asset = _getUnderlyingAsset(vToken); - uint256 spot = _fetchSpotPriceFromOracle(asset); - - if (!_isWhitelisted(asset)) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - _updateWindow(state, spot, asset); - _checkAndTriggerProtection(state, spot, thresholds[asset], asset); - - uint256 price = _resolvePrice(spot, state, isCollateral); - _setCachedPrice(asset, isCollateral, price); - return price; - } - - /** - * @dev Shared view logic for getBoundedCollateralPriceView and getBoundedDebtPriceView. - * Checks transient cache first for an early return; on miss, fetches from oracle - * and computes the resolved price without state mutations. - * @param vToken vToken address - * @param isCollateral True for collateral pricing (min), false for debt pricing (max) - * @return price The bounded price - */ - function _getBoundedPriceView(address vToken, bool isCollateral) internal view returns (uint256) { - address asset = _getUnderlyingAsset(vToken); - - // Early return if final price was cached by a prior call in this tx - uint256 cached = _getCachedPrice(asset, isCollateral); - if (cached != 0) return cached; - - // Cache miss — fetch from oracle and compute without state mutations - uint256 spot = _fetchSpotPriceFromOracle(asset); - if (!_isWhitelisted(asset)) return spot; - - MarketProtectionState storage state = marketProtection[asset]; - return _resolvePrice(spot, state, isCollateral); - } - - /** - * @dev Resolves the final bounded price based on protection state and price type. - * @param spot The current spot price - * @param state The market protection state - * @param isCollateral True for collateral pricing (min), false for debt pricing (max) - * @return price The resolved price - */ - function _resolvePrice( - uint256 spot, - MarketProtectionState storage state, - bool isCollateral - ) internal view returns (uint256) { - if (!state.protectedPriceEnabled) return spot; - - if (isCollateral) { - return _getProtectedCollateralPrice(spot, state); + MarketProtectionState storage state = assetProtectionConfig[asset]; + uint256 spot = _fetchSpotPrice(asset); + if (!state.isBoundedPricingEnabled) { + _setCachedPrices(asset, spot, spot); + return (spot, spot); } - return _getProtectedDebtPrice(spot, state); - } - - /** - * @dev Reverts if the market has not been initialized via initializeProtection - * @param asset The underlying asset address - * @return state The market protection state storage pointer - */ - function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) { - state = marketProtection[asset]; - if (state.minPrice == 0) revert MarketNotInitialized(asset); - } - - /** - * @dev Checks if an asset is whitelisted for bounded pricing - * @param asset The underlying asset address - * @return True if the asset is whitelisted - */ - function _isWhitelisted(address asset) internal view returns (bool) { - return marketProtection[asset].isWhitelisted; - } - - /** - * @dev Computes the current window range ratio used for exit checks. - * Formula: \((maxPrice - minPrice) / minPrice\), scaled by `EXP_SCALE`. - * @param state The market protection state - * @return rangeRatio The scaled range ratio \(((max - min) * EXP_SCALE) / min\) - */ - function _getWindowRangeRatio(MarketProtectionState storage state) internal view returns (uint256) { - uint256 range = uint256(state.maxPrice) - uint256(state.minPrice); - return (range * EXP_SCALE) / uint256(state.minPrice); - } - - /** - * @dev Reads a cached final price from transient storage - * @param asset The underlying asset address - * @param isCollateral True for collateral price, false for debt price - * @return The cached price, or 0 on cache miss - */ - function _getCachedPrice(address asset, bool isCollateral) internal view returns (uint256) { - bytes32 slot = isCollateral ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; - return Transient.readCachedPrice(slot, asset); - } - - /** - * @dev Writes a final price to transient storage - * @param asset The underlying asset address - * @param isCollateral True for collateral price, false for debt price - * @param price The resolved price to cache - */ - function _setCachedPrice(address asset, bool isCollateral, uint256 price) internal { - bytes32 slot = isCollateral ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; - Transient.cachePrice(slot, asset, price); + _expandPriceWindow(state, spot, asset); + _checkAndTriggerProtection(state, spot, asset); + (minPrice, maxPrice) = _resolveBoundedPrices( + state.isProtectionModeActive, + spot, + uint256(state.minPrice), + uint256(state.maxPrice) + ); + _setCachedPrices(asset, minPrice, maxPrice); } /** @@ -690,7 +553,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param spot The current spot price * @param asset The underlying asset address (for event emission) */ - function _updateWindow(MarketProtectionState storage state, uint256 spot, address asset) internal { + function _expandPriceWindow(MarketProtectionState storage state, uint256 spot, address asset) internal { uint128 spotU128 = _safeToUint128(spot); if (spotU128 < state.minPrice) { _setMinPrice(state, asset, spotU128); @@ -701,73 +564,124 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @dev Returns the conservative collateral price while protection is active. - * Collateral pricing uses `min(spot, windowMin)` to avoid over-valuing collateral. + * @dev Checks if the spot price has deviated beyond the threshold and triggers protection + * @param state The market protection state * @param spot The current spot price - * @param state The market protection state (read-only) - * @return price The bounded collateral price + * @param asset The underlying asset address (for event emission) */ - function _getProtectedCollateralPrice( - uint256 spot, - MarketProtectionState storage state - ) internal view returns (uint256) { - uint256 minPrice = uint256(state.minPrice); - return spot < minPrice ? spot : minPrice; + function _checkAndTriggerProtection(MarketProtectionState storage state, uint256 spot, address asset) internal { + if (state.isProtectionModeActive) return; + + if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) { + state.isProtectionModeActive = true; + state.lastProtectionTriggeredAt = uint64(block.timestamp); + emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); + } } /** - * @dev Returns the conservative debt price while protection is active. - * Debt pricing uses `max(spot, windowMax)` to avoid under-valuing debt. + * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag. + * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax). + * When protection is inactive: both return spot. + * @param protectionActive Whether the market protection window is currently active * @param spot The current spot price - * @param state The market protection state (read-only) - * @return price The bounded debt price + * @param windowMin The lower bound of the price window + * @param windowMax The upper bound of the price window + * @return minPrice The resolved lower-bound (collateral) price + * @return maxPrice The resolved upper-bound (debt) price */ - function _getProtectedDebtPrice(uint256 spot, MarketProtectionState storage state) internal view returns (uint256) { - uint256 maxPrice = uint256(state.maxPrice); - return spot > maxPrice ? spot : maxPrice; + function _resolveBoundedPrices( + bool protectionActive, + uint256 spot, + uint256 windowMin, + uint256 windowMax + ) internal pure returns (uint256, uint256) { + if (!protectionActive) return (spot, spot); + return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax); } /** - * @dev Checks if the spot price has deviated beyond the threshold and triggers protection - * @param state The market protection state - * @param spot The current spot price - * @param threshold The deviation threshold (mantissa) - * @param asset The underlying asset address (for event emission) + * @notice Shared view logic for all bounded price view functions. + * Checks transient cache first for an early return; on miss, fetches from oracle + * and computes both prices without state mutations. + * @param vToken vToken address + * @return minPrice The bounded lower (collateral) price + * @return maxPrice The bounded upper (debt) price + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) */ - function _checkAndTriggerProtection( - MarketProtectionState storage state, - uint256 spot, - uint256 threshold, - address asset - ) internal { - if (threshold == 0) return; - - if (_isDeviationTriggered(spot, state, threshold)) { - state.protectedPriceEnabled = true; - state.protectionEnabledAt = uint64(block.timestamp); - emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); - } + function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) { + address asset = _getUnderlyingAsset(vToken); + + // Early return if both prices were cached by a prior updateProtectionState call in this tx + minPrice = _getCachedPrice(asset, PriceBoundType.MIN); + maxPrice = _getCachedPrice(asset, PriceBoundType.MAX); + if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice); + + // Cache miss — fetch from oracle and compute without state mutations + uint256 spot = _fetchSpotPrice(asset); + MarketProtectionState storage state = assetProtectionConfig[asset]; + if (!state.isBoundedPricingEnabled) return (spot, spot); + + // Mirror _expandPriceWindow logic: compute what the window would be after expansion + uint128 spotU128 = _safeToUint128(spot); + uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice; + uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice; + + bool shouldProtect = state.isProtectionModeActive || + _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold); + + (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128)); + } + + /** + * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE. + * Formula: \((maxPrice - minPrice) / minPrice\), scaled by `EXP_SCALE`. + * Used to measure how much the window has converged -- compared against `resetThreshold` + * to determine whether the price window is tight enough to exit protection mode. + * @param minPrice The minimum price in the window + * @param maxPrice The maximum price in the window + * @return The scaled bound ratio \(((max - min) * EXP_SCALE) / min\) + */ + function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) { + uint256 range = uint256(maxPrice) - uint256(minPrice); + return (range * EXP_SCALE) / uint256(minPrice); } /** - * @dev Checks if spot price has deviated beyond the threshold from window bounds - * Pump detection: spot > minPrice * (1 + threshold) + * @notice Checks if the spot price has deviated beyond the threshold from the window bounds + * @dev Pump detection: spot > minPrice * (1 + threshold) * Crash detection: spot < maxPrice * (1 - threshold) * @param spot The current spot price - * @param state The market protection state + * @param minPrice The minimum price in the window + * @param maxPrice The maximum price in the window * @param threshold The deviation threshold (mantissa) * @return True if deviation is triggered */ - function _isDeviationTriggered( + function _exceedsDeviationThreshold( uint256 spot, - MarketProtectionState storage state, + uint128 minPrice, + uint128 maxPrice, uint256 threshold - ) internal view returns (bool) { - uint256 upperBound = (uint256(state.minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE; - uint256 lowerBound = (uint256(state.maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE; + ) internal pure returns (bool) { + uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE; + uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE; return (spot > upperBound || spot < lowerBound); } + /** + * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND + * @param currentPrice The current on-chain price + * @param proposedPrice The keeper's proposed price + * @return True if drift exceeds deadband + */ + function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) { + if (currentPrice == 0 || proposedPrice == 0) return false; + uint256 diff = currentPrice > proposedPrice + ? uint256(currentPrice - proposedPrice) + : uint256(proposedPrice - currentPrice); + return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND; + } + /** * @dev Sets the minimum price in the window and emits MinPriceUpdated * @param state The market protection state @@ -775,9 +689,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param newMin The new minimum price */ function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal { - uint128 oldMin = state.minPrice; + emit MinPriceUpdated(asset, state.minPrice, newMin); state.minPrice = newMin; - emit MinPriceUpdated(asset, oldMin, newMin); } /** @@ -787,31 +700,30 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param newMax The new maximum price */ function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal { - uint128 oldMax = state.maxPrice; + emit MaxPriceUpdated(asset, state.maxPrice, newMax); state.maxPrice = newMax; - emit MaxPriceUpdated(asset, oldMax, newMax); } /** - * @dev Returns true if the absolute drift between onChain and proposed exceeds KEEPER_DEADBAND - * @param onChain The current on-chain price - * @param proposed The keeper's proposed price - * @return True if drift exceeds deadband + * @dev Writes both lower and upper bounded prices to transient storage + * @param asset The underlying asset address + * @param minPrice The resolved lower (collateral) price to cache + * @param maxPrice The resolved upper (debt) price to cache */ - function _exceedsDeadband(uint128 onChain, uint128 proposed) internal pure returns (bool) { - if (onChain == 0 || proposed == 0) return false; - uint256 diff = onChain > proposed ? uint256(onChain - proposed) : uint256(proposed - onChain); - return (diff * EXP_SCALE) / uint256(onChain) > KEEPER_DEADBAND; + function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal { + Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice); + Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice); } /** - * @dev Safely casts a uint256 to uint128, reverting on overflow - * @param value The value to cast - * @return The value as uint128 + * @dev Reads a cached final price from transient storage + * @param asset The underlying asset address + * @param boundType MIN for collateral price, MAX for debt price + * @return The cached price, or 0 on cache miss */ - function _safeToUint128(uint256 value) internal pure returns (uint128) { - if (value > type(uint128).max) revert PriceExceedsUint128(value); - return uint128(value); + function _getCachedPrice(address asset, PriceBoundType boundType) internal view returns (uint256) { + bytes32 slot = boundType == PriceBoundType.MIN ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; + return Transient.readCachedPrice(slot, asset); } /** @@ -819,7 +731,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param vToken vToken address * @return asset underlying asset address */ - function _getUnderlyingAsset(address vToken) private view notNullAddress(vToken) returns (address asset) { + function _getUnderlyingAsset(address vToken) private view returns (address asset) { + ensureNonzeroAddress(vToken); if (vToken == nativeMarket) { asset = NATIVE_TOKEN_ADDR; } else if (vToken == vai) { @@ -829,7 +742,32 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } } - function _fetchSpotPriceFromOracle(address asset) internal view returns (uint256) { + /** + * @dev Reverts if the market has not been initialized via setTokenConfig + * @param asset The underlying asset address + * @return state The market protection state storage pointer + */ + function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) { + state = assetProtectionConfig[asset]; + if (state.asset == address(0)) revert MarketNotInitialized(asset); + } + + /** + * @notice Fetches the current spot price for an asset from the ResilientOracle + * @param asset The underlying asset address + * @return The current spot price + */ + function _fetchSpotPrice(address asset) internal view returns (uint256) { return RESILIENT_ORACLE.getPrice(asset); } + + /** + * @dev Safely casts a uint256 to uint128, reverting on overflow + * @param value The value to cast + * @return The value as uint128 + */ + function _safeToUint128(uint256 value) internal pure returns (uint128) { + if (value > type(uint128).max) revert PriceExceedsUint128(value); + return uint128(value); + } } diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index 5932a651..2b90e16b 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -2,57 +2,331 @@ pragma solidity ^0.8.25; interface IDeviationBoundedOracle { - // --- Non-view price functions (update window + trigger protection) --- + // --- Enums --- - function getBoundedCollateralPrice(address vToken) external returns (uint256); + /// @notice Identifies whether a price bound is a minimum or maximum + enum PriceBoundType { + MIN, + MAX + } - function getBoundedDebtPrice(address vToken) external returns (uint256); + // --- Structs --- - // --- View price functions (read stored/cached state only) --- + /// @notice Per-asset protection state tracking the min/max price window + struct MarketProtectionState { + /// @notice Lowest price observed in the current window (packed with maxPrice in one slot) + uint128 minPrice; + /// @notice Highest price observed in the current window + uint128 maxPrice; + /// @notice Whether protection mode is currently active + bool isProtectionModeActive; + /// @notice Whether this market is whitelisted for bounded pricing + bool isBoundedPricingEnabled; + /// @notice Timestamp of the last protection trigger — reset on every trigger + uint64 lastProtectionTriggeredAt; + /// @notice Minimum time protection stays active after last trigger + uint64 cooldownPeriod; + /// @notice The underlying asset address, used to verify initialization + address asset; + /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold + uint128 triggerThreshold; + /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled + uint128 resetThreshold; + } + + // --- Events --- + + /// @notice Emitted when protection is initialized for an asset + event ProtectionInitialized( + address indexed asset, + uint128 minPrice, + uint128 maxPrice, + uint64 cooldownPeriod, + uint256 triggerThreshold + ); + + /// @notice Emitted when protection mode is triggered for an asset + event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice); + + /// @notice Emitted when protection mode is disabled for an asset + event ProtectionDisabled(address indexed asset); + + /// @notice Emitted when the keeper updates the minimum price for an asset + event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin); + + /// @notice Emitted when the keeper updates the maximum price for an asset + event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax); + + /// @notice Emitted when the entry threshold is updated for an asset + event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold); + + /// @notice Emitted when the exit threshold is updated for an asset + event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold); + + /// @notice Emitted when the cooldown period is updated for an asset + event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown); + + /// @notice Emitted when an asset's whitelist status changes + event WhitelistUpdated(address indexed asset, bool whitelisted); + + // --- Errors --- + + /// @notice Thrown when trying to initialize protection for an asset that is not initialized + error MarketNotInitialized(address asset); + + /// @notice Thrown when trying to initialize an already initialized market + error MarketAlreadyInitialized(address asset); + + /// @notice Thrown when trying to disable protection that is not active + error ProtectionNotActive(address asset); + + /// @notice Thrown when trying to disable protection before cooldown has elapsed + error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod); + + /// @notice Thrown when trying to disable protection before price range has converged + error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold); + + /// @notice Thrown when keeper tries to set minPrice above current spot + error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot); + + /// @notice Thrown when keeper tries to set maxPrice below current spot + error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot); + + /// @notice Thrown when threshold is set below the minimum allowed value + error ThresholdBelowMinimum(uint256 threshold, uint256 minimum); + + /// @notice Thrown when threshold is set above the maximum allowed value + error ThresholdAboveMaximum(uint256 threshold, uint256 maximum); + + /// @notice Thrown when a price exceeds uint128 max + error PriceExceedsUint128(uint256 price); - function getBoundedCollateralPriceView(address vToken) external view returns (uint256); + /// @notice Thrown when a zero address is provided where a non-zero address is required + error ZeroAddressNotAllowed(); - function getBoundedDebtPriceView(address vToken) external view returns (uint256); + /// @notice Thrown when a zero price is provided where a non-zero price is required + error ZeroPriceNotAllowed(); - // --- State update (called before view price reads to populate transient cache) --- + /// @notice Thrown when trying to initialize protection for VAI + error VAINotAllowed(); + /// @notice Thrown when trying to update for an asset with active protection + error ProtectionActive(address asset); + + /// @notice Thrown when the lengths of the arrays are not equal + error InvalidArrayLength(); + + /// @notice Thrown when the exit threshold is set above the deviation threshold + error InvalidResetThreshold(uint256 resetThreshold); + + // --- Non-view price functions (update window + trigger protection) --- + + /** + * @notice Gets the bounded collateral price for a given vToken, updating protection state + * @param vToken vToken address + * @return collateralPrice The bounded collateral price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ + function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice); + + /** + * @notice Gets the bounded debt price for a given vToken, updating protection state + * @param vToken vToken address + * @return debtPrice The bounded debt price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ + function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice); + + /** + * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state + * @param vToken vToken address + * @return collateralPrice The bounded collateral price + * @return debtPrice The bounded debt price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ + function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice); + + // --- State update (call before view price reads to populate transient cache) --- + + /** + * @notice Updates the protection state for a given vToken, caching the resolved price + * @dev Called by PolicyFacet before liquidity calculations so subsequent view price + * reads in the same transaction are served from transient storage. + * @param vToken vToken address + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + * @custom:event MinPriceUpdated if a new window minimum is recorded + * @custom:event MaxPriceUpdated if a new window maximum is recorded + * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold + */ function updateProtectionState(address vToken) external; + // --- View price functions (read stored/cached state only) --- + + /** + * @notice Gets the bounded collateral price for a given vToken (view variant) + * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @param vToken vToken address + * @return price The bounded collateral price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) + */ + function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price); + + /** + * @notice Gets the bounded debt price for a given vToken (view variant) + * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @param vToken vToken address + * @return price The bounded debt price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) + */ + function getBoundedDebtPriceView(address vToken) external view returns (uint256 price); + + /** + * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant) + * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @param vToken vToken address + * @return collateralPrice The bounded collateral price + * @return debtPrice The bounded debt price + * @custom:error ZeroAddressNotAllowed if vToken is the zero address + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) + */ + function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice); + // --- Keeper functions --- + /** + * @notice Updates the minimum price in the rolling window for a given asset + * @param asset The underlying asset address + * @param newMin The new minimum price; must be at or below the current spot and below maxPrice + * @custom:access Only authorized keeper addresses + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error ZeroPriceNotAllowed if newMin is zero + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice + * @custom:event MinPriceUpdated + */ function updateMinPrice(address asset, uint128 newMin) external; + /** + * @notice Updates the maximum price in the rolling window for a given asset + * @param asset The underlying asset address + * @param newMax The new maximum price; must be at or above the current spot and above minPrice + * @custom:access Only authorized keeper addresses + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error ZeroPriceNotAllowed if newMax is zero + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice + * @custom:event MaxPriceUpdated + */ function updateMaxPrice(address asset, uint128 newMax) external; - function disableProtection(address asset) external; + /** + * @notice Disables protection mode for a given asset once conditions are met + * @param asset The underlying asset address + * @custom:access Only authorized monitor/keeper addresses + * @custom:error ProtectionNotActive if protection is not currently active + * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger + * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold + * @custom:event ProtectionDisabled + */ + function disableActiveProtection(address asset) external; // --- Admin functions (governance-gated) --- - function initializeProtection( + /** + * @notice Initializes protection parameters for a new asset and whitelists it + * @dev Seeds the initial min/max window from the current ResilientOracle spot price, + * confirming the oracle is live for this asset before it is listed. + * @param asset The underlying asset address + * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds + * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. + * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. + * @custom:access Only Governance + * @custom:error MarketAlreadyInitialized if the asset has already been initialized + * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% + * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold + * @custom:error VAINotAllowed if asset is the VAI token + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + * @custom:event ProtectionInitialized + * @custom:event WhitelistUpdated + */ + function setTokenConfig( address asset, - uint128 minPrice, - uint128 maxPrice, uint64 cooldownPeriod, - uint256 threshold + uint256 triggerThreshold, + uint256 resetThreshold ) external; - function setCooldownPeriod(address asset, uint64 cooldown) external; + /** + * @notice Sets the cooldown period for an asset + * @param asset The underlying asset address + * @param newCooldown The new cooldown period in seconds; must be non-zero + * @custom:access Only Governance + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:event CooldownPeriodSet + */ + function setCooldownPeriod(address asset, uint64 newCooldown) external; - function setThreshold(address asset, uint256 threshold) external; + /** + * @notice Sets the trigger and reset thresholds for an asset + * @param asset The underlying asset address + * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold. + * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold. + * @custom:access Only Governance + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50% + * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold + * @custom:event TriggerThresholdSet if the trigger threshold changed + * @custom:event ResetThresholdSet if the reset threshold changed + */ + function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external; - function setExitThreshold(address asset, uint256 exitThreshold) external; - - function setWhitelisted(address asset, bool whitelisted) external; + /** + * @notice Sets whether bounded pricing is enabled for an asset + * @param asset The underlying asset address + * @param enabled Whether bounded pricing should be enabled for the asset + * @custom:access Only Governance + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error ProtectionActive if trying to disable an asset while protection is active + * @custom:event WhitelistUpdated + */ + function setAssetBoundedPricingEnabled(address asset, bool enabled) external; // --- View helpers --- - function isWhitelisted(address asset) external view returns (bool); - - function isProtected(address asset) external view returns (bool); - - function canExitProtection(address asset) external view returns (bool); - - function marketProtection( + /** + * @notice Returns the full protection state for an asset + * @param asset The underlying asset address + * @return minPrice Lowest price observed in the current window + * @return maxPrice Highest price observed in the current window + * @return isProtectionModeActive Whether protection mode is currently active + * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing + * @return lastProtectionTriggeredAt Timestamp of the last protection trigger + * @return cooldownPeriod Minimum time protection stays active after last trigger + * @return assetAddr The underlying asset address stored in the struct + * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection + * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled + */ + function assetProtectionConfig( address asset ) external @@ -60,19 +334,65 @@ interface IDeviationBoundedOracle { returns ( uint128 minPrice, uint128 maxPrice, - bool protectedPriceEnabled, - bool isWhitelisted, - uint64 protectionEnabledAt, - uint64 cooldownPeriod + bool isProtectionModeActive, + bool isBoundedPricingEnabled, + uint64 lastProtectionTriggeredAt, + uint64 cooldownPeriod, + address assetAddr, + uint128 triggerThreshold, + uint128 resetThreshold ); - function thresholds(address asset) external view returns (uint256); + /** + * @notice Checks if an asset is whitelisted for bounded pricing + * @param asset The underlying asset address + * @return True if the asset is whitelisted + */ + function isBoundedPricingEnabled(address asset) external view returns (bool); + + /** + * @notice Checks if protection is currently active for an asset + * @param asset The underlying asset address + * @return True if protection mode is active + */ + function isProtectionActive(address asset) external view returns (bool); + + /** + * @notice Checks if protection can be exited for a given asset + * @param asset The underlying asset address + * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold + */ + function canExitProtection(address asset) external view returns (bool); + + /** + * @notice Returns the initialized asset at the given index (auto-generated array getter) + * @param index Array index + * @return The asset address at the given index + */ + function allAssets(uint256 index) external view returns (address); - function exitThresholds(address asset) external view returns (uint256); + /** + * @notice Returns all currently whitelisted asset addresses + * @return result Array of whitelisted asset addresses + */ + function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result); - function getWhitelistedAssets() external view returns (address[] memory); + /** + * @notice Returns all asset addresses that have ever been initialized + * @return Array of all initialized asset addresses + */ + function getInitializedAssets() external view returns (address[] memory); - function checkWindowDrift( + /** + * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband + * @param assets Array of asset addresses to check + * @param proposedMins Keeper's proposed window minimum prices + * @param proposedMaxs Keeper's proposed window maximum prices + * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset + * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset + * @custom:error InvalidArrayLength if the input array lengths do not match + */ + function checkAndGetWindowDrift( address[] calldata assets, uint128[] calldata proposedMins, uint128[] calldata proposedMaxs From 7a18054ef0d8744e6d02b4bb86bb72a4a93de417 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Fri, 3 Apr 2026 11:47:58 +0530 Subject: [PATCH 05/30] chore: minor cleanups --- contracts/DeviationBoundedOracle.sol | 43 +++++++++--------- .../interfaces/IDeviationBoundedOracle.sol | 45 +++++++------------ 2 files changed, 36 insertions(+), 52 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index a4e590b3..7bf020a1 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -241,30 +241,30 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * 2. Price range has converged below the exit threshold * @param asset The underlying asset address * @custom:access Only authorized monitor/keeper addresses - * @custom:error ProtectionNotActive if protection is not currently active + * @custom:error ProtectedPriceInactive if protection is not currently active * @custom:error CooldownNotElapsed if cooldown period has not elapsed * @custom:error PriceRangeNotConverged if window range is still above exit threshold - * @custom:event ProtectionDisabled + * @custom:event ProtectedPriceDisabled */ function disableActiveProtection(address asset) external { _checkAccessAllowed("disableActiveProtection(address)"); MarketProtectionState storage state = assetProtectionConfig[asset]; - if (!state.isProtectionModeActive) revert ProtectionNotActive(asset); + if (!state.isProtectedPriceActive) revert ProtectedPriceInactive(asset); if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) { revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod); } - // exit protection mode if price range has converged below exit threshold + // exit protected price if price range has converged below exit threshold uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice); if (rangeRatio >= state.resetThreshold) { revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold); } - state.isProtectionModeActive = false; - emit ProtectionDisabled(asset); + state.isProtectedPriceActive = false; + emit ProtectedPriceDisabled(asset); } // ----- Admin functions (governance-gated) ----- @@ -286,7 +286,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @custom:error VAINotAllowed if asset is the VAI token * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event ProtectionInitialized - * @custom:event WhitelistUpdated + * @custom:event BoundedPricingWhitelistUpdated */ function setTokenConfig( address asset, @@ -310,7 +310,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { assetProtectionConfig[asset] = MarketProtectionState({ minPrice: spotU128, maxPrice: spotU128, - isProtectionModeActive: false, + isProtectedPriceActive: false, isBoundedPricingEnabled: true, lastProtectionTriggeredAt: 0, cooldownPeriod: cooldownPeriod, @@ -322,7 +322,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { allAssets.push(asset); emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold); - emit WhitelistUpdated(asset, true); + emit BoundedPricingWhitelistUpdated(asset, true); } /** @@ -379,7 +379,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address * @param enabled Whether bounded pricing should be enabled for the asset * @custom:access Only Governance - * @custom:event WhitelistUpdated + * @custom:event BoundedPricingWhitelistUpdated */ function setAssetBoundedPricingEnabled(address asset, bool enabled) external { _checkAccessAllowed("setAssetBoundedPricingEnabled(address,bool)"); @@ -387,12 +387,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { MarketProtectionState storage state = _ensureInitialized(asset); - if (!enabled && state.isProtectionModeActive) { - revert ProtectionActive(asset); + if (!enabled && state.isProtectedPriceActive) { + revert ProtectedPriceActive(asset); } state.isBoundedPricingEnabled = enabled; - emit WhitelistUpdated(asset, enabled); + emit BoundedPricingWhitelistUpdated(asset, enabled); } // ----- View helpers ----- @@ -417,10 +417,10 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Checks if protection is currently active for an asset * @param asset The underlying asset address - * @return True if protection mode is active + * @return True if protected price is active */ - function isProtectionActive(address asset) external view returns (bool) { - return assetProtectionConfig[asset].isProtectionModeActive; + function isProtectedPriceActive(address asset) external view returns (bool) { + return assetProtectionConfig[asset].isProtectedPriceActive; } /** @@ -456,7 +456,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function canExitProtection(address asset) external view returns (bool) { MarketProtectionState storage state = assetProtectionConfig[asset]; return - state.isProtectionModeActive && + state.isProtectedPriceActive && block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) && _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold; } @@ -498,7 +498,6 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address * @param newPrice The new price value to set * @param boundType Whether this is a MIN or MAX bound update - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error ZeroPriceNotAllowed if newPrice is zero * @custom:error MarketNotInitialized if the asset has not been initialized * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice @@ -539,7 +538,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { _expandPriceWindow(state, spot, asset); _checkAndTriggerProtection(state, spot, asset); (minPrice, maxPrice) = _resolveBoundedPrices( - state.isProtectionModeActive, + state.isProtectedPriceActive, spot, uint256(state.minPrice), uint256(state.maxPrice) @@ -570,10 +569,10 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address (for event emission) */ function _checkAndTriggerProtection(MarketProtectionState storage state, uint256 spot, address asset) internal { - if (state.isProtectionModeActive) return; + if (state.isProtectedPriceActive) return; if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) { - state.isProtectionModeActive = true; + state.isProtectedPriceActive = true; state.lastProtectionTriggeredAt = uint64(block.timestamp); emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); } @@ -627,7 +626,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice; uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice; - bool shouldProtect = state.isProtectionModeActive || + bool shouldProtect = state.isProtectedPriceActive || _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold); (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128)); diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index 2b90e16b..0672c716 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -18,8 +18,8 @@ interface IDeviationBoundedOracle { uint128 minPrice; /// @notice Highest price observed in the current window uint128 maxPrice; - /// @notice Whether protection mode is currently active - bool isProtectionModeActive; + /// @notice Whether protected price is currently active + bool isProtectedPriceActive; /// @notice Whether this market is whitelisted for bounded pricing bool isBoundedPricingEnabled; /// @notice Timestamp of the last protection trigger — reset on every trigger @@ -49,7 +49,7 @@ interface IDeviationBoundedOracle { event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice); /// @notice Emitted when protection mode is disabled for an asset - event ProtectionDisabled(address indexed asset); + event ProtectedPriceDisabled(address indexed asset); /// @notice Emitted when the keeper updates the minimum price for an asset event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin); @@ -67,7 +67,7 @@ interface IDeviationBoundedOracle { event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown); /// @notice Emitted when an asset's whitelist status changes - event WhitelistUpdated(address indexed asset, bool whitelisted); + event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted); // --- Errors --- @@ -78,7 +78,7 @@ interface IDeviationBoundedOracle { error MarketAlreadyInitialized(address asset); /// @notice Thrown when trying to disable protection that is not active - error ProtectionNotActive(address asset); + error ProtectedPriceInactive(address asset); /// @notice Thrown when trying to disable protection before cooldown has elapsed error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod); @@ -101,9 +101,6 @@ interface IDeviationBoundedOracle { /// @notice Thrown when a price exceeds uint128 max error PriceExceedsUint128(uint256 price); - /// @notice Thrown when a zero address is provided where a non-zero address is required - error ZeroAddressNotAllowed(); - /// @notice Thrown when a zero price is provided where a non-zero price is required error ZeroPriceNotAllowed(); @@ -111,7 +108,7 @@ interface IDeviationBoundedOracle { error VAINotAllowed(); /// @notice Thrown when trying to update for an asset with active protection - error ProtectionActive(address asset); + error ProtectedPriceActive(address asset); /// @notice Thrown when the lengths of the arrays are not equal error InvalidArrayLength(); @@ -125,7 +122,6 @@ interface IDeviationBoundedOracle { * @notice Gets the bounded collateral price for a given vToken, updating protection state * @param vToken vToken address * @return collateralPrice The bounded collateral price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event MinPriceUpdated if a new window minimum is recorded * @custom:event MaxPriceUpdated if a new window maximum is recorded @@ -137,7 +133,6 @@ interface IDeviationBoundedOracle { * @notice Gets the bounded debt price for a given vToken, updating protection state * @param vToken vToken address * @return debtPrice The bounded debt price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event MinPriceUpdated if a new window minimum is recorded * @custom:event MaxPriceUpdated if a new window maximum is recorded @@ -150,7 +145,6 @@ interface IDeviationBoundedOracle { * @param vToken vToken address * @return collateralPrice The bounded collateral price * @return debtPrice The bounded debt price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event MinPriceUpdated if a new window minimum is recorded * @custom:event MaxPriceUpdated if a new window maximum is recorded @@ -165,7 +159,6 @@ interface IDeviationBoundedOracle { * @dev Called by PolicyFacet before liquidity calculations so subsequent view price * reads in the same transaction are served from transient storage. * @param vToken vToken address - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event MinPriceUpdated if a new window minimum is recorded * @custom:event MaxPriceUpdated if a new window maximum is recorded @@ -180,7 +173,6 @@ interface IDeviationBoundedOracle { * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. * @param vToken vToken address * @return price The bounded collateral price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) */ function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price); @@ -190,7 +182,6 @@ interface IDeviationBoundedOracle { * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. * @param vToken vToken address * @return price The bounded debt price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) */ function getBoundedDebtPriceView(address vToken) external view returns (uint256 price); @@ -201,7 +192,6 @@ interface IDeviationBoundedOracle { * @param vToken vToken address * @return collateralPrice The bounded collateral price * @return debtPrice The bounded debt price - * @custom:error ZeroAddressNotAllowed if vToken is the zero address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) */ function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice); @@ -213,7 +203,6 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @param newMin The new minimum price; must be at or below the current spot and below maxPrice * @custom:access Only authorized keeper addresses - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error ZeroPriceNotAllowed if newMin is zero * @custom:error MarketNotInitialized if the asset has not been initialized * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice @@ -226,7 +215,6 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @param newMax The new maximum price; must be at or above the current spot and above minPrice * @custom:access Only authorized keeper addresses - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error ZeroPriceNotAllowed if newMax is zero * @custom:error MarketNotInitialized if the asset has not been initialized * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice @@ -238,10 +226,10 @@ interface IDeviationBoundedOracle { * @notice Disables protection mode for a given asset once conditions are met * @param asset The underlying asset address * @custom:access Only authorized monitor/keeper addresses - * @custom:error ProtectionNotActive if protection is not currently active + * @custom:error ProtectedPriceInactive if protection is not currently active * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold - * @custom:event ProtectionDisabled + * @custom:event ProtectedPriceDisabled */ function disableActiveProtection(address asset) external; @@ -263,7 +251,7 @@ interface IDeviationBoundedOracle { * @custom:error VAINotAllowed if asset is the VAI token * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event ProtectionInitialized - * @custom:event WhitelistUpdated + * @custom:event BoundedPricingWhitelistUpdated */ function setTokenConfig( address asset, @@ -277,7 +265,6 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @param newCooldown The new cooldown period in seconds; must be non-zero * @custom:access Only Governance - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error MarketNotInitialized if the asset has not been initialized * @custom:event CooldownPeriodSet */ @@ -289,7 +276,6 @@ interface IDeviationBoundedOracle { * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold. * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold. * @custom:access Only Governance - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error MarketNotInitialized if the asset has not been initialized * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5% * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50% @@ -304,10 +290,9 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @param enabled Whether bounded pricing should be enabled for the asset * @custom:access Only Governance - * @custom:error ZeroAddressNotAllowed if asset is the zero address * @custom:error MarketNotInitialized if the asset has not been initialized - * @custom:error ProtectionActive if trying to disable an asset while protection is active - * @custom:event WhitelistUpdated + * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active + * @custom:event BoundedPricingWhitelistUpdated */ function setAssetBoundedPricingEnabled(address asset, bool enabled) external; @@ -318,7 +303,7 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @return minPrice Lowest price observed in the current window * @return maxPrice Highest price observed in the current window - * @return isProtectionModeActive Whether protection mode is currently active + * @return isProtectedPriceActive Whether protected price is currently active * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing * @return lastProtectionTriggeredAt Timestamp of the last protection trigger * @return cooldownPeriod Minimum time protection stays active after last trigger @@ -334,7 +319,7 @@ interface IDeviationBoundedOracle { returns ( uint128 minPrice, uint128 maxPrice, - bool isProtectionModeActive, + bool isProtectedPriceActive, bool isBoundedPricingEnabled, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod, @@ -353,9 +338,9 @@ interface IDeviationBoundedOracle { /** * @notice Checks if protection is currently active for an asset * @param asset The underlying asset address - * @return True if protection mode is active + * @return True if protected price is active */ - function isProtectionActive(address asset) external view returns (bool); + function isProtectedPriceActive(address asset) external view returns (bool); /** * @notice Checks if protection can be exited for a given asset From 590fdf0853983abe8eb38b657f3aca0d214bc61b Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 6 Apr 2026 19:01:54 +0530 Subject: [PATCH 06/30] feat: add tests --- contracts/DeviationBoundedOracle.sol | 22 +- .../test/DeviationBoundedOracleCaller.sol | 57 + scripts/checkGuardianAccess.ts | 48 + test/DeviationBoundedOracle.ts | 1554 +++++++++++++++++ test/DeviationBoundedOracleE2E.ts | 952 ++++++++++ 5 files changed, 2625 insertions(+), 8 deletions(-) create mode 100644 contracts/test/DeviationBoundedOracleCaller.sol create mode 100644 scripts/checkGuardianAccess.ts create mode 100644 test/DeviationBoundedOracle.ts create mode 100644 test/DeviationBoundedOracleE2E.ts diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 7bf020a1..aba5b9c3 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -88,6 +88,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) { ensureNonzeroAddress(address(_resilientOracle)); ensureNonzeroAddress(nativeMarketAddress); + ensureNonzeroAddress(vaiAddress); RESILIENT_ORACLE = _resilientOracle; nativeMarket = nativeMarketAddress; vai = vaiAddress; @@ -529,8 +530,14 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) { address asset = _getUnderlyingAsset(vToken); - MarketProtectionState storage state = assetProtectionConfig[asset]; + + // Early return if both prices were cached by a prior updateProtectionState call in this tx + (minPrice, maxPrice) = _getCachedPrices(asset); + if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice); + + // return early if failure from resilient oracle to prevent cold SLOAD uint256 spot = _fetchSpotPrice(asset); + MarketProtectionState storage state = assetProtectionConfig[asset]; if (!state.isBoundedPricingEnabled) { _setCachedPrices(asset, spot, spot); return (spot, spot); @@ -612,8 +619,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { address asset = _getUnderlyingAsset(vToken); // Early return if both prices were cached by a prior updateProtectionState call in this tx - minPrice = _getCachedPrice(asset, PriceBoundType.MIN); - maxPrice = _getCachedPrice(asset, PriceBoundType.MAX); + (minPrice, maxPrice) = _getCachedPrices(asset); if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice); // Cache miss — fetch from oracle and compute without state mutations @@ -717,12 +723,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @dev Reads a cached final price from transient storage * @param asset The underlying asset address - * @param boundType MIN for collateral price, MAX for debt price - * @return The cached price, or 0 on cache miss + * @return minPrice The cached minimum price, or 0 on cache miss + * @return maxPrice The cached maximum price, or 0 on cache miss */ - function _getCachedPrice(address asset, PriceBoundType boundType) internal view returns (uint256) { - bytes32 slot = boundType == PriceBoundType.MIN ? COLLATERAL_PRICE_CACHE_SLOT : DEBT_PRICE_CACHE_SLOT; - return Transient.readCachedPrice(slot, asset); + function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) { + minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset); + maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset); } /** diff --git a/contracts/test/DeviationBoundedOracleCaller.sol b/contracts/test/DeviationBoundedOracleCaller.sol new file mode 100644 index 00000000..548090b6 --- /dev/null +++ b/contracts/test/DeviationBoundedOracleCaller.sol @@ -0,0 +1,57 @@ +// SPDX-License-Identifier: BSD-3-Clause +pragma solidity 0.8.25; + +import { IDeviationBoundedOracle } from "../interfaces/IDeviationBoundedOracle.sol"; + +/// @notice Test helper that batches DeviationBoundedOracle calls in a single transaction +/// so transient storage (tstore/tload) cache can be tested. +contract DeviationBoundedOracleCaller { + IDeviationBoundedOracle public immutable oracle; + + constructor(address _oracle) { + oracle = IDeviationBoundedOracle(_oracle); + } + + function updateAndGetCollateralPrice(address vToken) external returns (uint256) { + oracle.updateProtectionState(vToken); + return oracle.getBoundedCollateralPriceView(vToken); + } + + function updateAndGetDebtPrice(address vToken) external returns (uint256) { + oracle.updateProtectionState(vToken); + return oracle.getBoundedDebtPriceView(vToken); + } + + function updateAndGetBothPrices(address vToken) external returns (uint256 collateral, uint256 debt) { + oracle.updateProtectionState(vToken); + collateral = oracle.getBoundedCollateralPriceView(vToken); + debt = oracle.getBoundedDebtPriceView(vToken); + } + + function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) { + collateral = oracle.getBoundedCollateralPriceView(vToken); + debt = oracle.getBoundedDebtPriceView(vToken); + } + + function updateThenNonViewCollateral(address vToken) external returns (uint256) { + oracle.updateProtectionState(vToken); + return oracle.getBoundedCollateralPrice(vToken); + } + + function twoConsecutiveNonViewCollateral(address vToken) external returns (uint256 first, uint256 second) { + first = oracle.getBoundedCollateralPrice(vToken); + second = oracle.getBoundedCollateralPrice(vToken); + } + + /// @notice Non-view wrapper so smock records oracle calls made by the view functions. + function getViewPricesWithoutUpdateNonView(address vToken) external returns (uint256 collateral, uint256 debt) { + collateral = oracle.getBoundedCollateralPriceView(vToken); + debt = oracle.getBoundedDebtPriceView(vToken); + } + + /// @notice Calls updateProtectionState on vTokenA, then getBoundedCollateralPriceView on vTokenB. + function updateAViewB(address vTokenA, address vTokenB) external returns (uint256) { + oracle.updateProtectionState(vTokenA); + return oracle.getBoundedCollateralPriceView(vTokenB); + } +} diff --git a/scripts/checkGuardianAccess.ts b/scripts/checkGuardianAccess.ts new file mode 100644 index 00000000..3f5ca7f0 --- /dev/null +++ b/scripts/checkGuardianAccess.ts @@ -0,0 +1,48 @@ +import { ethers } from "hardhat"; + +const RESILIENT_ORACLE = "0xDe564a4C887d5ad315a19a96DC81991c98b12182"; +const ACM = "0x526159A92A82afE5327d37Ef446b68FD9a5cA914"; + +const ACCOUNTS = { + Guardian: "0x751Aa759cfBB6CE71A43b48e40e1cCcFC66Ba4aa", + "Normal Timelock": "0x093565Bc20AA326F4209eBaF3a26089272627613", + "Fasttrack Timelock": "0x32f71c95BC8F9d996f89c642f1a84d06B2484AE9", + "Critical Timelock": "0xbfbc79D4198963e4a66270F3EfB1fdA0F382E49c", +}; + +const ACM_ABI = [ + "function hasRole(bytes32 role, address account) external view returns (bool)", +]; + +const FUNCTIONS = [ + "setTokenConfig(TokenConfig)", + "setOracle(address,address,uint8)", + "enableOracle(address,uint8,bool)", + "pause()", + "unpause()", +]; + +async function main() { + const acm = new ethers.Contract(ACM, ACM_ABI, ethers.provider); + + console.log(`ResilientOracle: ${RESILIENT_ORACLE}`); + console.log(`ACM: ${ACM}\n`); + + for (const [name, address] of Object.entries(ACCOUNTS)) { + console.log(`--- ${name} (${address}) ---`); + for (const fn of FUNCTIONS) { + // Replicate ACM logic: role = keccak256(abi.encodePacked(callingContract, functionSig)) + const role = ethers.utils.keccak256( + ethers.utils.solidityPack(["address", "string"], [RESILIENT_ORACLE, fn]), + ); + const allowed = await acm.hasRole(role, address); + console.log(` ${allowed ? "✅" : "❌"} ${fn}`); + } + console.log(); + } +} + +main().catch(err => { + console.error(err); + process.exit(1); +}); diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts new file mode 100644 index 00000000..7ea4ed98 --- /dev/null +++ b/test/DeviationBoundedOracle.ts @@ -0,0 +1,1554 @@ +import { FakeContract, smock } from "@defi-wonderland/smock"; +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import chai from "chai"; +import { BigNumber, constants } from "ethers"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers, upgrades } from "hardhat"; + +import { + AccessControlManager, + DeviationBoundedOracle, + DeviationBoundedOracle__factory, + ResilientOracle, + VBEP20Harness, +} from "../typechain-types"; +import { addr0000 } from "./utils/data"; +import { makeVToken } from "./utils/makeVToken"; + +const { expect } = chai; +chai.use(smock.matchers); + +const EXP_SCALE = parseUnits("1", 18); +const MIN_THRESHOLD = parseUnits("0.05", 18); // 5% +const MAX_THRESHOLD = parseUnits("0.5", 18); // 50% +const KEEPER_DEADBAND = parseUnits("0.05", 18); // 5% +const DEFAULT_THRESHOLD = parseUnits("0.2", 18); // 20% +const DEFAULT_RESET_THRESHOLD = parseUnits("0.1", 18); // 10% +const DEFAULT_COOLDOWN = 3600; // 1 hour +const SPOT_PRICE = parseUnits("1", 18); // 1e18 +const MIN_PRICE = parseUnits("0.9", 18); +const MAX_PRICE = parseUnits("1.1", 18); +const NATIVE_TOKEN_ADDR = "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"; + +describe("DeviationBoundedOracle", () => { + let admin: SignerWithAddress; + let someone: SignerWithAddress; + let resilientOracle: FakeContract; + let acm: FakeContract; + let oracle: DeviationBoundedOracle; + let oracleFactory: DeviationBoundedOracle__factory; + let vTokenA: VBEP20Harness; + let vTokenB: VBEP20Harness; + let assetA: string; + let assetB: string; + let nativeMarket: VBEP20Harness; + let vaiToken: VBEP20Harness; + + // Basic init: min=max=spot (SPOT_PRICE = 1e18) + const initAsset = async ( + asset: string, + cooldown: number = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + ) => { + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + }; + + // Init + widen window via keeper updates (for price-bounding tests that need min=0.9, max=1.1) + const initAssetWithWindow = async ( + asset: string, + minPrice: BigNumber = MIN_PRICE, + maxPrice: BigNumber = MAX_PRICE, + cooldown: number = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + ) => { + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.updateMinPrice(asset, minPrice); + await oracle.updateMaxPrice(asset, maxPrice); + }; + + before(async () => { + [admin, someone] = await ethers.getSigners(); + oracleFactory = await ethers.getContractFactory("DeviationBoundedOracle", admin); + resilientOracle = await smock.fake("ResilientOracle"); + acm = await smock.fake("AccessControlManager"); + acm.isAllowedToCall.returns(true); + + vTokenA = await makeVToken({ name: "vTokenA", symbol: "vTKA" }, { name: "TokenA", symbol: "TKA", decimals: 18 }); + vTokenB = await makeVToken({ name: "vTokenB", symbol: "vTKB" }, { name: "TokenB", symbol: "TKB", decimals: 18 }); + nativeMarket = await makeVToken( + { name: "vNative", symbol: "vNAT" }, + { name: "Native", symbol: "NAT", decimals: 18 }, + ); + vaiToken = await makeVToken({ name: "vVAI", symbol: "vVAI" }, { name: "VAI", symbol: "VAI", decimals: 18 }); + assetA = await vTokenA.underlying(); + assetB = await vTokenB.underlying(); + }); + + beforeEach(async () => { + acm.isAllowedToCall.returns(true); + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.returns(SPOT_PRICE); + + oracle = await upgrades.deployProxy(oracleFactory, [acm.address], { + constructorArgs: [resilientOracle.address, nativeMarket.address, await vaiToken.underlying()], + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 1. Constructor + // ──────────────────────────────────────────────────────────────────────── + + describe("constructor", () => { + it("sets immutables correctly", async () => { + expect(await oracle.RESILIENT_ORACLE()).to.equal(resilientOracle.address); + expect(await oracle.nativeMarket()).to.equal(nativeMarket.address); + expect(await oracle.vai()).to.equal(await vaiToken.underlying()); + }); + + it("reverts when _resilientOracle is zero address", async () => { + await expect( + upgrades.deployProxy(oracleFactory, [acm.address], { + constructorArgs: [addr0000, nativeMarket.address, await vaiToken.underlying()], + }), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("reverts when nativeMarketAddress is zero address", async () => { + await expect( + upgrades.deployProxy(oracleFactory, [acm.address], { + constructorArgs: [resilientOracle.address, addr0000, await vaiToken.underlying()], + }), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 2. Initialize + // ──────────────────────────────────────────────────────────────────────── + + describe("initialize", () => { + it("sets access control manager", async () => { + expect(await oracle.accessControlManager()).to.equal(acm.address); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 3. setTokenConfig + // ──────────────────────────────────────────────────────────────────────── + + describe("setTokenConfig", () => { + describe("happy path", () => { + it("sets all struct fields, emits events, updates asset lists", async () => { + const tx = await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + + // Verify struct fields via public getter + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(SPOT_PRICE); + expect(state.maxPrice).to.equal(SPOT_PRICE); + expect(state.isProtectedPriceActive).to.equal(false); + expect(state.isBoundedPricingEnabled).to.equal(true); + expect(state.lastProtectionTriggeredAt).to.equal(0); + expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); + expect(state.asset).to.equal(assetA); + expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); + expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + + // Verify events + await expect(tx) + .to.emit(oracle, "ProtectionInitialized") + .withArgs(assetA, SPOT_PRICE, SPOT_PRICE, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + + // Verify in getInitializedAssets + const initialized = await oracle.getInitializedAssets(); + expect(initialized).to.include(assetA); + + // Verify in getAllBoundedPricingEnabledAssets + const whitelisted = await oracle.getAllBoundedPricingEnabledAssets(); + expect(whitelisted).to.include(assetA); + }); + }); + + describe("revert branches", () => { + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when asset is zero address", async () => { + await expect( + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("reverts when already initialized", async () => { + await initAsset(assetA); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + }); + + it("reverts when threshold < MIN_THRESHOLD", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); + }); + + it("reverts when threshold > MAX_THRESHOLD", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); + }); + + it("reverts when resetThreshold >= triggerThreshold", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); + }); + + it("reverts when asset is VAI", async () => { + const vaiAddr = await vaiToken.underlying(); + await expect( + oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); + }); + + it("reverts when cooldownPeriod is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("reverts when triggerThreshold is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("reverts when resetThreshold is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("reverts when re-initializing after de-whitelist", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + }); + + it("reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { + const overflowPrice = BigNumber.from(2).pow(128); + resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + }); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 4. setCooldownPeriod + // ──────────────────────────────────────────────────────────────────────── + + describe("setCooldownPeriod", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("updates cooldownPeriod and emits event", async () => { + const newCooldown = 7200; + const tx = await oracle.setCooldownPeriod(assetA, newCooldown); + await expect(tx).to.emit(oracle, "CooldownPeriodSet").withArgs(assetA, DEFAULT_COOLDOWN, newCooldown); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cooldownPeriod).to.equal(newCooldown); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect(oracle.setCooldownPeriod(assetA, 7200)).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when asset is zero address", async () => { + await expect(oracle.setCooldownPeriod(addr0000, 7200)).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("reverts when not initialized", async () => { + await expect(oracle.setCooldownPeriod(assetB, 7200)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("reverts when new cooldown is zero", async () => { + await expect(oracle.setCooldownPeriod(assetA, 0)).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 5. setThresholds + // ──────────────────────────────────────────────────────────────────────── + + describe("setThresholds", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("updates both thresholds and emits both events", async () => { + const newTrigger = parseUnits("0.25", 18); + const newReset = parseUnits("0.12", 18); + const tx = await oracle.setThresholds(assetA, newTrigger, newReset); + await expect(tx).to.emit(oracle, "TriggerThresholdSet").withArgs(assetA, DEFAULT_THRESHOLD, newTrigger); + await expect(tx).to.emit(oracle, "ResetThresholdSet").withArgs(assetA, DEFAULT_RESET_THRESHOLD, newReset); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.triggerThreshold).to.equal(newTrigger); + expect(state.resetThreshold).to.equal(newReset); + }); + + it("only emits TriggerThresholdSet when only trigger changes", async () => { + const newTrigger = parseUnits("0.25", 18); + const tx = await oracle.setThresholds(assetA, newTrigger, DEFAULT_RESET_THRESHOLD); + await expect(tx).to.emit(oracle, "TriggerThresholdSet").withArgs(assetA, DEFAULT_THRESHOLD, newTrigger); + await expect(tx).to.not.emit(oracle, "ResetThresholdSet"); + }); + + it("only emits ResetThresholdSet when only reset changes", async () => { + const newReset = parseUnits("0.08", 18); + const tx = await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, newReset); + await expect(tx).to.not.emit(oracle, "TriggerThresholdSet"); + await expect(tx).to.emit(oracle, "ResetThresholdSet").withArgs(assetA, DEFAULT_RESET_THRESHOLD, newReset); + }); + + it("emits no events when neither changes", async () => { + const tx = await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + await expect(tx).to.not.emit(oracle, "TriggerThresholdSet"); + await expect(tx).to.not.emit(oracle, "ResetThresholdSet"); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect( + oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when asset is zero address", async () => { + await expect( + oracle.setThresholds(addr0000, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("reverts when not initialized", async () => { + await expect( + oracle.setThresholds(assetB, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketNotInitialized"); + }); + + it("reverts when trigger below MIN_THRESHOLD", async () => { + await expect( + oracle.setThresholds(assetA, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); + }); + + it("reverts when trigger above MAX_THRESHOLD", async () => { + await expect( + oracle.setThresholds(assetA, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); + }); + + it("reverts when reset >= trigger (InvalidResetThreshold)", async () => { + await expect(oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD)).to.be.revertedWithCustomError( + oracle, + "InvalidResetThreshold", + ); + }); + + it("reverts when triggerThreshold is zero", async () => { + await expect(oracle.setThresholds(assetA, 0, DEFAULT_RESET_THRESHOLD)).to.be.revertedWithCustomError( + oracle, + "ZeroValueNotAllowed", + ); + }); + + it("reverts when resetThreshold is zero", async () => { + await expect(oracle.setThresholds(assetA, DEFAULT_THRESHOLD, 0)).to.be.revertedWithCustomError( + oracle, + "ZeroValueNotAllowed", + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 6. setAssetBoundedPricingEnabled + // ──────────────────────────────────────────────────────────────────────── + + describe("setAssetBoundedPricingEnabled", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("disables bounded pricing and emits event", async () => { + const tx = await oracle.setAssetBoundedPricingEnabled(assetA, false); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, false); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + }); + + it("enables bounded pricing and emits event", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const tx = await oracle.setAssetBoundedPricingEnabled(assetA, true); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + }); + + it("setAssetBoundedPricingEnabled(true) on already-enabled succeeds", async () => { + const tx = await oracle.setAssetBoundedPricingEnabled(assetA, true); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect(oracle.setAssetBoundedPricingEnabled(assetA, false)).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("reverts when asset is zero address", async () => { + await expect(oracle.setAssetBoundedPricingEnabled(addr0000, true)).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("reverts when not initialized", async () => { + await expect(oracle.setAssetBoundedPricingEnabled(assetB, true)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("reverts when disabling with active protection", async () => { + await initAssetWithWindow(assetB); + + // Trigger protection via pump: spot > MIN_PRICE * 1.2 = 1.08 + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetB).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenB.address); + expect(await oracle.isProtectedPriceActive(assetB)).to.equal(true); + + await expect(oracle.setAssetBoundedPricingEnabled(assetB, false)).to.be.revertedWithCustomError( + oracle, + "ProtectedPriceActive", + ); + }); + + it("price functions return spot after disabling bounded pricing", async () => { + await initAssetWithWindow(assetB); + // Set a pump spot that would trigger bounded pricing + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetB).returns(pumpSpot); + + // View detects deviation → returns bounded (MIN_PRICE) + expect(await oracle.getBoundedCollateralPriceView(vTokenB.address)).to.equal(MIN_PRICE); + + // Disable bounded pricing (protection not yet stored active, so this succeeds) + await oracle.setAssetBoundedPricingEnabled(assetB, false); + + // Same pump spot, but now returns raw spot — not bounded + expect(await oracle.getBoundedCollateralPriceView(vTokenB.address)).to.equal(pumpSpot); + expect(await oracle.getBoundedDebtPriceView(vTokenB.address)).to.equal(pumpSpot); + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenB.address); + expect(collateral).to.equal(pumpSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 7. updateMinPrice + // ──────────────────────────────────────────────────────────────────────── + + describe("updateMinPrice", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("updates minPrice and emits event", async () => { + const newMin = parseUnits("0.85", 18); + const tx = await oracle.updateMinPrice(assetA, newMin); + await expect(tx).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, newMin); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(newMin); + }); + + it("allows setting price within keeper deadband (not enforced on-chain)", async () => { + // newMin close to current MIN_PRICE (within 5% deadband) + const newMin = MIN_PRICE.sub(MIN_PRICE.mul(3).div(100)); // 3% below current min + await expect(oracle.updateMinPrice(assetA, newMin)).to.not.be.reverted; + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect(oracle.updateMinPrice(assetA, parseUnits("0.85", 18))).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("reverts when asset is zero address", async () => { + await expect(oracle.updateMinPrice(addr0000, parseUnits("0.85", 18))).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("reverts when price is zero", async () => { + await expect(oracle.updateMinPrice(assetA, 0)).to.be.revertedWithCustomError(oracle, "ZeroPriceNotAllowed"); + }); + + it("reverts when not initialized", async () => { + await expect(oracle.updateMinPrice(assetB, parseUnits("0.85", 18))).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("reverts when newMin > currentSpot", async () => { + const aboveSpot = SPOT_PRICE.add(1); + await expect(oracle.updateMinPrice(assetA, aboveSpot)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + }); + + it("reverts when newMin >= maxPrice", async () => { + await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 8. updateMaxPrice + // ──────────────────────────────────────────────────────────────────────── + + describe("updateMaxPrice", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("updates maxPrice and emits event", async () => { + const newMax = parseUnits("1.15", 18); + const tx = await oracle.updateMaxPrice(assetA, newMax); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, newMax); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.maxPrice).to.equal(newMax); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect(oracle.updateMaxPrice(assetA, parseUnits("1.15", 18))).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("reverts when asset is zero address", async () => { + await expect(oracle.updateMaxPrice(addr0000, parseUnits("1.15", 18))).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("reverts when price is zero", async () => { + await expect(oracle.updateMaxPrice(assetA, 0)).to.be.revertedWithCustomError(oracle, "ZeroPriceNotAllowed"); + }); + + it("reverts when not initialized", async () => { + await expect(oracle.updateMaxPrice(assetB, parseUnits("1.15", 18))).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("reverts when newMax < currentSpot", async () => { + const belowSpot = SPOT_PRICE.sub(1); + await expect(oracle.updateMaxPrice(assetA, belowSpot)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + }); + + it("reverts when newMax <= minPrice", async () => { + await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 9. disableActiveProtection + // ──────────────────────────────────────────────────────────────────────── + + describe("disableActiveProtection", () => { + it("disables protection after governance raises reset threshold", async () => { + await initAssetWithWindow(assetA); + + // Trigger via pump: pumpSpot > MIN_PRICE * 1.2 = 1.08 + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Wait cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Post-trigger: min=0.9, max=pumpSpot (~1.08). Range exceeds default reset threshold (10%). + // Governance raises reset threshold above current range to allow disable. + const stateAfter = await oracle.assetProtectionConfig(assetA); + const range = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + const newResetThreshold = range.add(parseUnits("0.001", 18)); + + // resetThreshold must remain < triggerThreshold; raise triggerThreshold first if needed + const currentTrigger = stateAfter.triggerThreshold; + if (newResetThreshold.gte(currentTrigger)) { + await oracle.setThresholds(assetA, newResetThreshold.add(parseUnits("0.01", 18)), newResetThreshold); + } else { + await oracle.setThresholds(assetA, currentTrigger, newResetThreshold); + } + + const tx = await oracle.disableActiveProtection(assetA); + await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("prices revert to spot after disableActiveProtection", async () => { + await initAssetWithWindow(assetA); + + // Trigger via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // During protection: collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE (bounded) + const boundedCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(boundedCollateral).to.equal(MIN_PRICE); + + // Disable protection + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + const stateAfter = await oracle.assetProtectionConfig(assetA); + const range = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const currentTrigger = stateAfter.triggerThreshold; + if (newReset.gte(currentTrigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, currentTrigger, newReset); + } + await oracle.disableActiveProtection(assetA); + + // After disable: set spot back to normal + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Should return spot, not bounded price + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(collateral).to.equal(SPOT_PRICE); + expect(debt).to.equal(SPOT_PRICE); + }); + + it("reverts when caller is unauthorized", async () => { + await initAsset(assetA); + acm.isAllowedToCall.returns(false); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when protection is not active", async () => { + await initAsset(assetA); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "ProtectedPriceInactive", + ); + }); + + it("reverts when cooldown has not elapsed", async () => { + await initAssetWithWindow(assetA); + // Trigger protection + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + }); + + it("reverts when range not converged", async () => { + await initAssetWithWindow(assetA); + // Trigger protection + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Wait cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Range still wide -> reverts + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + }); + + it("reverts when rangeRatio exactly at resetThreshold (uses >=)", async () => { + await initAssetWithWindow(assetA); + + // Trigger + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Compute current range ratio and set resetThreshold exactly equal to it + const stateAfter = await oracle.assetProtectionConfig(assetA); + const rangeRatio = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + + // Raise triggerThreshold if needed so we can set resetThreshold = rangeRatio + const currentTrigger = stateAfter.triggerThreshold; + if (rangeRatio.gte(currentTrigger)) { + await oracle.setThresholds(assetA, rangeRatio.add(parseUnits("0.01", 18)), rangeRatio); + } else { + await oracle.setThresholds(assetA, currentTrigger, rangeRatio); + } + + // Set resetThreshold = rangeRatio (exactly equal, should revert since >=) + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + }); + + it("succeeds when rangeRatio at resetThreshold - 1 wei", async () => { + await initAssetWithWindow(assetA); + + // Trigger + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Set resetThreshold = rangeRatio + 1 (should succeed) + const stateAfter = await oracle.assetProtectionConfig(assetA); + const rangeRatio = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + + // Raise triggerThreshold if needed + const currentTrigger = stateAfter.triggerThreshold; + if (rangeRatio.add(1).gte(currentTrigger)) { + await oracle.setThresholds(assetA, rangeRatio.add(parseUnits("0.01", 18)), rangeRatio.add(1)); + } else { + await oracle.setThresholds(assetA, currentTrigger, rangeRatio.add(1)); + } + + await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 10. getBoundedCollateralPrice + // ──────────────────────────────────────────────────────────────────────── + + describe("getBoundedCollateralPrice", () => { + beforeEach(async () => { + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("returns spot when not whitelisted", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(SPOT_PRICE); + // Verify oracle was called + expect(resilientOracle.getPrice).to.have.been.calledWith(assetA); + }); + + it("returns spot when whitelisted, no deviation", async () => { + await initAssetWithWindow(assetA); + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(SPOT_PRICE); + }); + + it("expands window when spot < minPrice", async () => { + await initAssetWithWindow(assetA); + const lowSpot = MIN_PRICE.sub(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, lowSpot); + }); + + it("expands window when spot > maxPrice", async () => { + await initAssetWithWindow(assetA); + const highSpot = MAX_PRICE.add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, highSpot); + }); + + it("triggers protection on pump and returns minPrice (exact arithmetic)", async () => { + await initAssetWithWindow(assetA); + // upperBound = MIN_PRICE * (1 + threshold) = 0.9 * 1.2 = 1.08 + const upperBound = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const pumpSpot = upperBound.add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + // Verify state + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Read bounded price after trigger (protection already active, no re-trigger) + // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + const boundedPrice = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(boundedPrice).to.equal(MIN_PRICE); + }); + + it("triggers protection on crash and returns spot (exact arithmetic)", async () => { + // Use a tight window so crashSpot falls below localMin, causing window expansion + const localMin = parseUnits("0.995", 18); + const localMax = parseUnits("1.005", 18); + await initAssetWithWindow(assetA, localMin, localMax); + + // lowerBound = localMax * (1 - threshold) = 1.005 * 0.8 = 0.804 + const lowerBound = localMax.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const crashSpot = lowerBound.sub(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + // After expansion, min = crashSpot (since crashSpot < localMin). + // collateral = min(crashSpot, crashSpot) = crashSpot + const boundedPrice = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(boundedPrice).to.equal(crashSpot); + }); + + it("expands window min and max while protection is already active", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Spot drops below min — window should expand downward despite protection being active + const lowSpot = parseUnits("0.8", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); + const tx1 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx1).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, lowSpot); + await expect(tx1).to.not.emit(oracle, "ProtectionTriggered"); + + // Spot rises above current max — window should expand upward + const stateAfterMin = await oracle.assetProtectionConfig(assetA); + const highSpot = stateAfterMin.maxPrice.add(parseUnits("0.5", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); + const tx2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx2).to.emit(oracle, "MaxPriceUpdated"); + await expect(tx2).to.not.emit(oracle, "ProtectionTriggered"); + }); + + it("returns spot for uninitialized asset (setTokenConfig never called)", async () => { + // assetA is NOT initialized — isBoundedPricingEnabled defaults to false + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(SPOT_PRICE); + + const debtPrice = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(debtPrice).to.equal(SPOT_PRICE); + + // Views also pass through to spot + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.getBoundedDebtPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("reverts when vToken is zero address", async () => { + await initAsset(assetA); + await expect(oracle.getBoundedCollateralPrice(addr0000)).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("resolves native market to NATIVE_TOKEN_ADDR", async () => { + const nativeAsset = NATIVE_TOKEN_ADDR; + resilientOracle.getPrice.whenCalledWith(nativeAsset).returns(SPOT_PRICE); + await initAssetWithWindow(nativeAsset); + const price = await oracle.callStatic.getBoundedCollateralPrice(nativeMarket.address); + expect(price).to.equal(SPOT_PRICE); + }); + + it("reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { + await initAsset(assetA); + const overflowPrice = BigNumber.from(2).pow(128); + resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.be.revertedWithCustomError( + oracle, + "PriceExceedsUint128", + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 11. getBoundedDebtPrice + // ──────────────────────────────────────────────────────────────────────── + + describe("getBoundedDebtPrice", () => { + beforeEach(async () => { + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("returns spot when not whitelisted", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const price = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(price).to.equal(SPOT_PRICE); + }); + + it("returns spot when no deviation", async () => { + await initAssetWithWindow(assetA); + const price = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(price).to.equal(SPOT_PRICE); + }); + + it("returns spot on pump trigger (spot > max after expansion)", async () => { + // Use a tight window so pumpSpot exceeds localMax, causing window expansion + const localMin = parseUnits("0.995", 18); + const localMax = parseUnits("1.005", 18); + await initAssetWithWindow(assetA, localMin, localMax); + + // upperBound = 0.995 * 1.2 = 1.194 + const upperBound = localMin.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const pumpSpot = upperBound.add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + await oracle.getBoundedDebtPrice(vTokenA.address); + // After expansion max = pumpSpot (since pumpSpot > localMax). + // debt = max(pumpSpot, pumpSpot) = pumpSpot + const price = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(price).to.equal(pumpSpot); + }); + + it("returns maxPrice on crash trigger (spot < max)", async () => { + await initAssetWithWindow(assetA); + // lowerBound = MAX_PRICE * (1 - threshold) = 1.1 * 0.8 = 0.88 + const lowerBound = MAX_PRICE.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const crashSpot = lowerBound.sub(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + + await oracle.getBoundedDebtPrice(vTokenA.address); + // After expansion, min = crashSpot. debt = max(spot, max). + // crashSpot < MAX_PRICE, so max(crashSpot, MAX_PRICE) = MAX_PRICE + const price = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(price).to.equal(MAX_PRICE); + }); + + it("reverts when vToken is zero address", async () => { + await initAsset(assetA); + await expect(oracle.getBoundedDebtPrice(addr0000)).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 12. getBoundedPrices + // ──────────────────────────────────────────────────────────────────────── + + describe("getBoundedPrices", () => { + beforeEach(async () => { + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("returns (spot, spot) when not whitelisted", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const [collateral, debt] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(collateral).to.equal(SPOT_PRICE); + expect(debt).to.equal(SPOT_PRICE); + }); + + it("returns (spot, spot) when whitelisted, no deviation", async () => { + await initAssetWithWindow(assetA); + const [collateral, debt] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(collateral).to.equal(SPOT_PRICE); + expect(debt).to.equal(SPOT_PRICE); + }); + + it("returns (minPrice, maxPrice) when protection active (pump scenario)", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + // After expansion max = pumpSpot (since pumpSpot > MAX_PRICE), debt = max(pumpSpot, pumpSpot) = pumpSpot + const stateAfter = await oracle.assetProtectionConfig(assetA); + const [collateral, debt] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(collateral).to.equal(MIN_PRICE); + expect(debt).to.equal(stateAfter.maxPrice); + }); + + it("both values match individual getBoundedCollateralPrice and getBoundedDebtPrice", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const collateralPrice = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debtPrice = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + const [collateral, debt] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + + expect(collateral).to.equal(collateralPrice); + expect(debt).to.equal(debtPrice); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 13. View price functions (getBoundedCollateralPriceView, getBoundedDebtPriceView) + // ──────────────────────────────────────────────────────────────────────── + + describe("view price functions", () => { + beforeEach(async () => { + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("returns spot when not whitelisted", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.getBoundedDebtPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("returns spot when no protection and no deviation", async () => { + await initAssetWithWindow(assetA); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.getBoundedDebtPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("returns bounded price when protection is stored active", async () => { + await initAssetWithWindow(assetA); + // Trigger protection first: pumpSpot > MIN_PRICE * 1.2 = 1.08 + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // View should return bounded prices + // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + // debt = max(pumpSpot, max). After expansion max = pumpSpot, so pumpSpot. + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(await oracle.getBoundedDebtPriceView(vTokenA.address)).to.equal(stateAfter.maxPrice); + }); + + it("simulated trigger: returns bounded price without state mutation", async () => { + await initAssetWithWindow(assetA); + // Spot exceeds deviation threshold but protection has NOT been triggered yet + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + // View should detect deviation and return bounded price + // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + + // Verify isProtectedPriceActive is still false (no state mutation) + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("view and non-view return identical prices when protection is active (pump)", async () => { + await initAssetWithWindow(assetA); + // Trigger protection via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Read from non-view (callStatic) and view + const nonViewCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const nonViewDebt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + const viewCollateral = await oracle.getBoundedCollateralPriceView(vTokenA.address); + const viewDebt = await oracle.getBoundedDebtPriceView(vTokenA.address); + + expect(nonViewCollateral).to.equal(viewCollateral); + expect(nonViewDebt).to.equal(viewDebt); + }); + + it("view and non-view return identical prices when protection is active (crash)", async () => { + const localMin = parseUnits("0.995", 18); + const localMax = parseUnits("1.005", 18); + await initAssetWithWindow(assetA, localMin, localMax); + + // Trigger protection via crash + const lowerBound = localMax.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const crashSpot = lowerBound.sub(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + const nonViewCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const nonViewDebt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + const viewCollateral = await oracle.getBoundedCollateralPriceView(vTokenA.address); + const viewDebt = await oracle.getBoundedDebtPriceView(vTokenA.address); + + expect(nonViewCollateral).to.equal(viewCollateral); + expect(nonViewDebt).to.equal(viewDebt); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 14. getBoundedPricesView + // ──────────────────────────────────────────────────────────────────────── + + describe("getBoundedPricesView", () => { + beforeEach(async () => { + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("returns same as individual view functions", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const collateralView = await oracle.getBoundedCollateralPriceView(vTokenA.address); + const debtView = await oracle.getBoundedDebtPriceView(vTokenA.address); + const [collateral, debt] = await oracle.getBoundedPricesView(vTokenA.address); + + expect(collateral).to.equal(collateralView); + expect(debt).to.equal(debtView); + }); + + it("works with cache (after updateProtectionState)", async () => { + await initAssetWithWindow(assetA); + + // Deploy the caller helper to test transient cache within the same tx + const callerFactory = await ethers.getContractFactory("DeviationBoundedOracleCaller", admin); + const caller = await callerFactory.deploy(oracle.address); + + // Trigger protection first so bounded prices differ from spot + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Use caller to updateProtectionState then read view within same tx + const [collateral, debt] = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + + // Should match view prices + const collateralView = await oracle.getBoundedCollateralPriceView(vTokenA.address); + const debtView = await oracle.getBoundedDebtPriceView(vTokenA.address); + expect(collateral).to.equal(collateralView); + expect(debt).to.equal(debtView); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 15. updateProtectionState + // ──────────────────────────────────────────────────────────────────────── + + describe("updateProtectionState", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("expands window and triggers protection for whitelisted asset", async () => { + // pumpSpot > MIN_PRICE * 1.2 = 1.08 + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + const tx = await oracle.updateProtectionState(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("is a no-op for non-whitelisted asset", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + // Should not revert + await expect(oracle.updateProtectionState(vTokenA.address)).to.not.be.reverted; + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { + const overflowPrice = BigNumber.from(2).pow(128); + resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); + await expect(oracle.updateProtectionState(vTokenA.address)).to.be.revertedWithCustomError( + oracle, + "PriceExceedsUint128", + ); + }); + + it("expands window without triggering protection", async () => { + // Use 30% threshold so spot=1.15 expands max but stays under upperBound (0.9 * 1.3 = 1.17) + await initAssetWithWindow(assetB, MIN_PRICE, MAX_PRICE, DEFAULT_COOLDOWN, parseUnits("0.3", 18), DEFAULT_RESET_THRESHOLD); + + const spot = parseUnits("1.15", 18); + resilientOracle.getPrice.whenCalledWith(assetB).returns(spot); + + const tx = await oracle.updateProtectionState(vTokenB.address); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetB, MAX_PRICE, spot); + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + }); + + it("triggers protection without expanding window", async () => { + // Wide window [0.8, 1.3] — spot=1.0 is inside, no expansion needed + // But upperBound = 0.8 * 1.2 = 0.96 → spot 1.0 > 0.96 → triggers + await initAssetWithWindow(assetB, parseUnits("0.8", 18), parseUnits("1.3", 18)); + + resilientOracle.getPrice.whenCalledWith(assetB).returns(SPOT_PRICE); + + const tx = await oracle.updateProtectionState(vTokenB.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + await expect(tx).to.not.emit(oracle, "MinPriceUpdated"); + await expect(tx).to.not.emit(oracle, "MaxPriceUpdated"); + expect(await oracle.isProtectedPriceActive(assetB)).to.equal(true); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 16. isBoundedPricingEnabled + // ──────────────────────────────────────────────────────────────────────── + + describe("isBoundedPricingEnabled", () => { + it("returns true for enabled asset", async () => { + await initAsset(assetA); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + }); + + it("returns false for disabled asset", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + }); + + it("returns false for uninitialized asset", async () => { + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 17. isProtectedPriceActive + // ──────────────────────────────────────────────────────────────────────── + + describe("isProtectedPriceActive", () => { + it("returns true when protection is active", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("returns false when protection is not active", async () => { + await initAsset(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("returns false for uninitialized asset", async () => { + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 18. canExitProtection + // ──────────────────────────────────────────────────────────────────────── + + describe("canExitProtection", () => { + it("returns false when protection is not active", async () => { + await initAsset(assetA); + expect(await oracle.canExitProtection(assetA)).to.equal(false); + }); + + it("returns false for uninitialized asset", async () => { + expect(await oracle.canExitProtection(assetA)).to.equal(false); + }); + + it("returns false before cooldown elapsed", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.canExitProtection(assetA)).to.equal(false); + }); + + it("returns false when range not converged (cooldown elapsed but range wide)", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Range is wide after pump expansion + expect(await oracle.canExitProtection(assetA)).to.equal(false); + }); + + it("returns true when cooldown elapsed and range converged", async () => { + await initAssetWithWindow(assetA); + + // Trigger + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Raise reset threshold so range < resetThreshold + const stateAfter = await oracle.assetProtectionConfig(assetA); + const rangeRatio = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + const newReset = rangeRatio.add(parseUnits("0.001", 18)); + + // Raise triggerThreshold if needed so we can set resetThreshold + const currentTrigger = stateAfter.triggerThreshold; + if (newReset.gte(currentTrigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, currentTrigger, newReset); + } + expect(await oracle.canExitProtection(assetA)).to.equal(true); + }); + + it("returns false when rangeRatio exactly at resetThreshold (boundary precision)", async () => { + await initAssetWithWindow(assetA); + + // Trigger + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Set reset threshold exactly at range ratio + const stateAfter = await oracle.assetProtectionConfig(assetA); + const rangeRatio = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + + // Raise triggerThreshold if needed + const currentTrigger = stateAfter.triggerThreshold; + if (rangeRatio.gte(currentTrigger)) { + await oracle.setThresholds(assetA, rangeRatio.add(parseUnits("0.01", 18)), rangeRatio); + } else { + await oracle.setThresholds(assetA, currentTrigger, rangeRatio); + } + // Uses < so exactly equal -> false + expect(await oracle.canExitProtection(assetA)).to.equal(false); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 19. getInitializedAssets + // ──────────────────────────────────────────────────────────────────────── + + describe("getInitializedAssets", () => { + it("returns all initialized assets", async () => { + await initAsset(assetA); + await initAsset(assetB); + const initialized = await oracle.getInitializedAssets(); + expect(initialized).to.include(assetA); + expect(initialized).to.include(assetB); + expect(initialized.length).to.equal(2); + }); + + it("includes de-whitelisted assets", async () => { + await initAsset(assetA); + await initAsset(assetB); + await oracle.setAssetBoundedPricingEnabled(assetB, false); + + const initialized = await oracle.getInitializedAssets(); + expect(initialized.length).to.equal(2); + expect(initialized).to.include(assetA); + expect(initialized).to.include(assetB); + }); + + it("returns empty when none", async () => { + const initialized = await oracle.getInitializedAssets(); + expect(initialized.length).to.equal(0); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 20. getAllBoundedPricingEnabledAssets + // ──────────────────────────────────────────────────────────────────────── + + describe("getAllBoundedPricingEnabledAssets", () => { + it("returns correct filtered array", async () => { + await initAsset(assetA); + await initAsset(assetB); + const whitelisted = await oracle.getAllBoundedPricingEnabledAssets(); + expect(whitelisted).to.include(assetA); + expect(whitelisted).to.include(assetB); + expect(whitelisted.length).to.equal(2); + }); + + it("returns empty when none whitelisted", async () => { + const whitelisted = await oracle.getAllBoundedPricingEnabledAssets(); + expect(whitelisted.length).to.equal(0); + }); + + it("filters correctly after partial de-whitelist", async () => { + // Init 3 assets, de-whitelist middle one + const vTokenC = await makeVToken( + { name: "vTokenC", symbol: "vTKC" }, + { name: "TokenC", symbol: "TKC", decimals: 18 }, + ); + const assetC = await vTokenC.underlying(); + + await initAsset(assetA); + await initAsset(assetB); + await initAsset(assetC); + + await oracle.setAssetBoundedPricingEnabled(assetB, false); + + const whitelisted = await oracle.getAllBoundedPricingEnabledAssets(); + expect(whitelisted.length).to.equal(2); + expect(whitelisted[0]).to.equal(assetA); + expect(whitelisted[1]).to.equal(assetC); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 21. checkAndGetWindowDrift + // ──────────────────────────────────────────────────────────────────────── + + describe("checkAndGetWindowDrift", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + }); + + it("returns true when drift > KEEPER_DEADBAND", async () => { + // Proposed min 11% below current -> drift > 5% + const proposedMin = MIN_PRICE.mul(89).div(100); + const proposedMax = MAX_PRICE.mul(111).div(100); + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( + [assetA], + [proposedMin], + [proposedMax], + ); + expect(needsMinUpdate[0]).to.equal(true); + expect(needsMaxUpdate[0]).to.equal(true); + }); + + it("returns false when drift <= KEEPER_DEADBAND", async () => { + // Proposed within 3% of current + const proposedMin = MIN_PRICE.mul(97).div(100); + const proposedMax = MAX_PRICE.mul(103).div(100); + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( + [assetA], + [proposedMin], + [proposedMax], + ); + expect(needsMinUpdate[0]).to.equal(false); + expect(needsMaxUpdate[0]).to.equal(false); + }); + + it("returns false when both prices equal (drift = 0)", async () => { + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( + [assetA], + [MIN_PRICE], + [MAX_PRICE], + ); + expect(needsMinUpdate[0]).to.equal(false); + expect(needsMaxUpdate[0]).to.equal(false); + }); + + it("returns false when current or proposed price is zero", async () => { + // Uninitialized asset has minPrice=0, maxPrice=0 + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( + [assetB], + [parseUnits("1", 18)], + [parseUnits("1.2", 18)], + ); + expect(needsMinUpdate[0]).to.equal(false); + expect(needsMaxUpdate[0]).to.equal(false); + }); + + it("returns false when drift exactly at KEEPER_DEADBAND (strict >)", async () => { + // drift = |current - proposed| * 1e18 / current = KEEPER_DEADBAND exactly + // proposed = MIN_PRICE * (1 - 0.05) = 0.9 * 0.95 = 0.855 + const proposedMin = MIN_PRICE.mul(EXP_SCALE.sub(KEEPER_DEADBAND)).div(EXP_SCALE); + const [needsMinUpdate] = await oracle.checkAndGetWindowDrift([assetA], [proposedMin], [MAX_PRICE]); + expect(needsMinUpdate[0]).to.equal(false); + }); + + it("returns true when drift at KEEPER_DEADBAND + 1 wei", async () => { + const proposedMin = MIN_PRICE.mul(EXP_SCALE.sub(KEEPER_DEADBAND)).div(EXP_SCALE).sub(1); + const [needsMinUpdate] = await oracle.checkAndGetWindowDrift([assetA], [proposedMin], [MAX_PRICE]); + expect(needsMinUpdate[0]).to.equal(true); + }); + + it("covers both drift directions: proposed above and below on-chain", async () => { + // Proposed ABOVE on-chain (proposedPrice > currentPrice) + const proposedMinAbove = MIN_PRICE.mul(106).div(100); + const [needsMinAbove] = await oracle.checkAndGetWindowDrift([assetA], [proposedMinAbove], [MAX_PRICE]); + expect(needsMinAbove[0]).to.equal(true); + + // Proposed BELOW on-chain (proposedPrice < currentPrice) + const proposedMinBelow = MIN_PRICE.mul(94).div(100); + const [needsMinBelow] = await oracle.checkAndGetWindowDrift([assetA], [proposedMinBelow], [MAX_PRICE]); + expect(needsMinBelow[0]).to.equal(true); + }); + + it("returns [false, false] for uninitialized asset with non-zero proposed values", async () => { + const uninitAsset = someone.address; // random address, not initialized + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( + [uninitAsset], + [parseUnits("1", 18)], + [parseUnits("1.2", 18)], + ); + expect(needsMinUpdate[0]).to.equal(false); + expect(needsMaxUpdate[0]).to.equal(false); + }); + + it("reverts when array lengths mismatch", async () => { + await expect( + oracle.checkAndGetWindowDrift([assetA], [MIN_PRICE, MIN_PRICE], [MAX_PRICE]), + ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // 22. assetProtectionConfig getter + // ──────────────────────────────────────────────────────────────────────── + + describe("assetProtectionConfig getter", () => { + it("returns all struct fields correctly", async () => { + await initAsset(assetA); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(SPOT_PRICE); + expect(state.maxPrice).to.equal(SPOT_PRICE); + expect(state.isProtectedPriceActive).to.equal(false); + expect(state.isBoundedPricingEnabled).to.equal(true); + expect(state.lastProtectionTriggeredAt).to.equal(0); + expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); + expect(state.asset).to.equal(assetA); + expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); + expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + }); + }); +}); diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts new file mode 100644 index 00000000..fe4520c1 --- /dev/null +++ b/test/DeviationBoundedOracleE2E.ts @@ -0,0 +1,952 @@ +import { FakeContract, smock } from "@defi-wonderland/smock"; +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import chai from "chai"; +import { BigNumber } from "ethers"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers, upgrades } from "hardhat"; + +import { + AccessControlManager, + DeviationBoundedOracle, + DeviationBoundedOracleCaller, + DeviationBoundedOracle__factory, + ResilientOracle, + VBEP20Harness, +} from "../typechain-types"; +import { makeVToken } from "./utils/makeVToken"; + +const { expect } = chai; +chai.use(smock.matchers); + +const EXP_SCALE = parseUnits("1", 18); +const DEFAULT_THRESHOLD = parseUnits("0.2", 18); // 20% +const DEFAULT_RESET_THRESHOLD = parseUnits("0.1", 18); // 10% +const DEFAULT_COOLDOWN = 3600; +const SPOT_PRICE = parseUnits("1", 18); +const MIN_PRICE = parseUnits("0.9", 18); +const MAX_PRICE = parseUnits("1.1", 18); +const KEEPER_DEADBAND = parseUnits("0.05", 18); + +describe("DeviationBoundedOracle E2E", () => { + let admin: SignerWithAddress; + let resilientOracle: FakeContract; + let acm: FakeContract; + let oracle: DeviationBoundedOracle; + let oracleFactory: DeviationBoundedOracle__factory; + let caller: DeviationBoundedOracleCaller; + let vTokenA: VBEP20Harness; + let vTokenB: VBEP20Harness; + let assetA: string; + let assetB: string; + let nativeMarket: VBEP20Harness; + let vaiToken: VBEP20Harness; + + before(async () => { + [admin] = await ethers.getSigners(); + oracleFactory = await ethers.getContractFactory("DeviationBoundedOracle", admin); + resilientOracle = await smock.fake("ResilientOracle"); + acm = await smock.fake("AccessControlManager"); + acm.isAllowedToCall.returns(true); + + vTokenA = await makeVToken( + { name: "vTokenA_E2E", symbol: "vTKA_E" }, + { name: "TokenA_E2E", symbol: "TKA_E", decimals: 18 }, + ); + vTokenB = await makeVToken( + { name: "vTokenB_E2E", symbol: "vTKB_E" }, + { name: "TokenB_E2E", symbol: "TKB_E", decimals: 18 }, + ); + nativeMarket = await makeVToken( + { name: "vNative_E2E", symbol: "vNAT_E" }, + { name: "Native_E2E", symbol: "NAT_E", decimals: 18 }, + ); + vaiToken = await makeVToken( + { name: "vVAI_E2E", symbol: "vVAI_E" }, + { name: "VAI_E2E", symbol: "VAI_E", decimals: 18 }, + ); + assetA = await vTokenA.underlying(); + assetB = await vTokenB.underlying(); + }); + + beforeEach(async () => { + acm.isAllowedToCall.returns(true); + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.returns(SPOT_PRICE); + + oracle = await upgrades.deployProxy(oracleFactory, [acm.address], { + constructorArgs: [resilientOracle.address, nativeMarket.address, await vaiToken.underlying()], + }); + + const CallerFactory = await ethers.getContractFactory("DeviationBoundedOracleCaller", admin); + caller = await CallerFactory.deploy(oracle.address); + }); + + // Helper: initialize asset and set a specific min/max window via keeper updates + const initAssetWithWindow = async ( + asset: string, + minPrice: BigNumber = MIN_PRICE, + maxPrice: BigNumber = MAX_PRICE, + cooldown: number = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + ) => { + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.updateMinPrice(asset, minPrice); + await oracle.updateMaxPrice(asset, maxPrice); + }; + + // Helper: trigger protection via pump on an asset with window + const triggerPump = async ( + asset: string, + vToken: VBEP20Harness, + minPrice: BigNumber = MIN_PRICE, + threshold: BigNumber = DEFAULT_THRESHOLD, + ): Promise => { + const pumpSpot = minPrice.mul(EXP_SCALE.add(threshold)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(asset).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vToken.address); + return pumpSpot; + }; + + // Helper: disable protection by raising reset threshold above current range + const disableProtection = async (asset: string) => { + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const state = await oracle.assetProtectionConfig(asset); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = rangeRatio.add(1); + const newTrigger = newReset.add(parseUnits("0.01", 18)); + + await oracle.setThresholds(asset, newTrigger, newReset); + await oracle.disableActiveProtection(asset); + }; + + // ──────────────────────────────────────────────────────────────────────── + // E2E-1. updateProtectionState → View Price Functions (transient cache) + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-1: updateProtectionState → view price functions (transient cache)", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("1a: cache hit, no protection — view returns cached spot", async () => { + // updateAndGetBothPrices calls updateProtectionState then views in same tx + const tx = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(tx.collateral).to.equal(SPOT_PRICE); + expect(tx.debt).to.equal(SPOT_PRICE); + }); + + it("1b: cache hit, protection already active — view returns bounded prices", async () => { + // Trigger protection in prior tx + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Now updateProtectionState → view in same tx + // Protection already active, _checkAndTriggerProtection returns early. + // Cached collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + // Cached debt = max(pumpSpot, maxPrice_after_expansion) = pumpSpot (since max was expanded) + const stateAfter = await oracle.assetProtectionConfig(assetA); + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(MIN_PRICE); + expect(result.debt).to.equal(stateAfter.maxPrice); + }); + + it("1c: cache hit, protection triggered + window expanded in same call", async () => { + // Spot drops far below MIN_PRICE — triggers protection in same updateProtectionState call + const crashSpot = parseUnits("0.7", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + + // After expansion: newMin = crashSpot = 0.7, MAX_PRICE unchanged = 1.1 + // crashSpot < MAX_PRICE*(1-threshold) = 1.1 * 0.8 = 0.88 → 0.7 < 0.88 → triggers + // collateral = min(crashSpot, newMin) = min(0.7, 0.7) = 0.7 + // debt = max(crashSpot, MAX_PRICE) = max(0.7, 1.1) = 1.1 + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(crashSpot); + expect(result.debt).to.equal(MAX_PRICE); + + // Execute to verify state mutation + await caller.updateAndGetBothPrices(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.minPrice).to.equal(crashSpot); + }); + + it("1d: cache miss, no deviation — view fetches fresh, returns spot", async () => { + // Call view without prior updateProtectionState → no cache → fresh oracle fetch + const result = await caller.getViewPricesWithoutUpdate(vTokenA.address); + expect(result.collateral).to.equal(SPOT_PRICE); + expect(result.debt).to.equal(SPOT_PRICE); + }); + + it("1e: cache miss, exceeds deviation — simulated trigger returns bounded price", async () => { + // pumpSpot = MIN_PRICE * (1 + threshold) + 1 = 0.9 * 1.2 + 1wei = 1.08e18 + 1 + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + // View without update → simulated trigger + const result = await caller.getViewPricesWithoutUpdate(vTokenA.address); + // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE + expect(result.collateral).to.equal(MIN_PRICE); + // pumpSpot ≈ 1.08, MAX_PRICE = 1.1 → max(1.08, 1.1) = 1.1 + expect(result.debt).to.equal(MAX_PRICE); + + // Verify no state mutation + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("1f: per-asset cache isolation — update A, view B has no cache", async () => { + const specialSpot = parseUnits("2", 18); + // Set spot for B before init so setTokenConfig seeds min=max=2.0 + resilientOracle.getPrice.whenCalledWith(assetB).returns(specialSpot); + await initAssetWithWindow(assetB, parseUnits("1.95", 18), parseUnits("2.05", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Update assetA, then view assetB — B should fetch fresh from oracle + const collateralA = await caller.callStatic.updateAndGetCollateralPrice(vTokenA.address); + expect(collateralA).to.equal(SPOT_PRICE); + + // View B independently (no cache) + const resultB = await caller.getViewPricesWithoutUpdate(vTokenB.address); + expect(resultB.collateral).to.equal(specialSpot); + }); + + it("1g: non-whitelisted — updateProtectionState caches (spot, spot), views return cached spot", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const specialSpot = parseUnits("1.5", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(specialSpot); + + // updateProtectionState fetches spot and caches (spot, spot); views return from cache + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(specialSpot); + expect(result.debt).to.equal(specialSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-2. Protection Disabled → Extreme Price Move + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-2: protection disabled → extreme price move", () => { + it("2a: non-view re-triggers after disable", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Disable protection (raise reset threshold to allow) + await disableProtection(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // Extreme price move — another pump + // After disable, window: min=0.9, max=pumpSpot (~1.08) + // New pump must exceed upperBound = 0.9 * 1.2 = 1.08 + // Use 1.2 — well above threshold + const newPumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(newPumpSpot); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Returns conservative price: min(1.2, 0.9) = 0.9 + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(MIN_PRICE); + }); + + it("2b: view simulates trigger after disable", async () => { + await initAssetWithWindow(assetA); + + // Trigger + disable + await triggerPump(assetA, vTokenA); + await disableProtection(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // Extreme price move — 1.2 exceeds upperBound 1.08 + const newPumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(newPumpSpot); + + // View simulates trigger — returns bounded price even though isProtectedPriceActive is false + const collateral = await oracle.getBoundedCollateralPriceView(vTokenA.address); + expect(collateral).to.equal(MIN_PRICE); + + // isProtectedPriceActive still false (view doesn't mutate) + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("2c: lastProtectionTriggeredAt is fresh after re-trigger", async () => { + await initAssetWithWindow(assetA); + + // Trigger + await triggerPump(assetA, vTokenA); + const firstState = await oracle.assetProtectionConfig(assetA); + const firstTriggerTime = firstState.lastProtectionTriggeredAt; + + // Disable + await disableProtection(assetA); + + // Re-trigger with 1.2 + const newPumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(newPumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const secondState = await oracle.assetProtectionConfig(assetA); + expect(secondState.lastProtectionTriggeredAt).to.be.gt(firstTriggerTime); + }); + + it("2d: repeated trigger → disable → trigger cycle", async () => { + await initAssetWithWindow(assetA); + + for (let cycle = 0; cycle < 3; cycle++) { + // Use triggerPump which computes minimal pumpSpot from current threshold + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Disable (may raise thresholds to allow exit), then restore to defaults + await disableProtection(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // Restore thresholds to defaults using single setThresholds call + await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + } + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-3. Threshold Update Effects on Prices + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-3: threshold update effects on prices", () => { + // Spot = 1.15 — triggers at 20% (upperBound = 0.9*1.2 = 1.08) but not at 30% (0.9*1.3 = 1.17) + const spot = parseUnits("1.15", 18); + + it("3a: lowering threshold triggers previously-safe asset", async () => { + // Initialize with 30% threshold → upperBound = 0.9 * 1.3 = 1.17 + const highThreshold = parseUnits("0.3", 18); + const resetThreshold = parseUnits("0.15", 18); + await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold); + await oracle.updateMinPrice(assetA, MIN_PRICE); + await oracle.updateMaxPrice(assetA, MAX_PRICE); + resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); + + // Spot 1.15 < 1.17 → no trigger at 30% + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // Lower trigger threshold to 20%, keep reset at current value + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, state.resetThreshold); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("3b: raising threshold prevents trigger", async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); + + // Raise trigger threshold to 30%, keep reset at current value + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); + + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // Verify spot is returned + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(spot); + }); + + it("3c: view reflects threshold change immediately", async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); + + // At 20% threshold → upperBound = 1.08, spot 1.15 > 1.08 → view returns bounded + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + + // Raise to 30% → upperBound = 1.17, spot 1.15 < 1.17 → view returns spot + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(spot); + }); + + it("3d: reset threshold interaction with disableActiveProtection", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Current range is wide, reset threshold is 10% — too low to disable + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + + // Raise reset threshold to allow disable via setThresholds + const state = await oracle.assetProtectionConfig(assetA); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = rangeRatio.add(parseUnits("0.001", 18)); + const newTrigger = newReset.add(parseUnits("0.01", 18)); + + await oracle.setThresholds(assetA, newTrigger, newReset); + await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-4. Protection Already Active — No Re-trigger, Window Still Expands + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-4: no re-trigger when active, window still expands", () => { + it("4a: no re-trigger — lastProtectionTriggeredAt unchanged, no event", async () => { + await initAssetWithWindow(assetA); + + // Trigger + const pumpSpot = await triggerPump(assetA, vTokenA); + const stateAfterTrigger = await oracle.assetProtectionConfig(assetA); + const triggerTime = stateAfterTrigger.lastProtectionTriggeredAt; + + // Move price even further — should NOT re-trigger + const biggerPump = pumpSpot.add(parseUnits("0.5", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(biggerPump); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.lastProtectionTriggeredAt).to.equal(triggerTime); + }); + + it("4b: window expands during active protection", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + // Drop below min → min expands + const lowSpot = parseUnits("0.8", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); + const tx1 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx1).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, lowSpot); + + // Rise above current max → max expands + const stateAfterMin = await oracle.assetProtectionConfig(assetA); + const highSpot = stateAfterMin.maxPrice.add(parseUnits("0.5", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); + const tx2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx2).to.emit(oracle, "MaxPriceUpdated"); + + // No re-trigger events + await expect(tx1).to.not.emit(oracle, "ProtectionTriggered"); + await expect(tx2).to.not.emit(oracle, "ProtectionTriggered"); + }); + + it("4c: bounded prices reflect expanded window", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + // Expand min downward + const lowSpot = parseUnits("0.8", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Now collateral should use new min (0.8), not old min (0.9) + // spot = 0.8, min = 0.8 → collateral = min(0.8, 0.8) = 0.8 + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(lowSpot); + + // Put spot back between new min and max + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const collateralMid = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + // spot=1.0, min=0.8 → collateral = min(1.0, 0.8) = 0.8 + expect(collateralMid).to.equal(lowSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-5. Keeper During Protection + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-5: keeper updates during protection", () => { + it("5a: keeper updates succeed during active protection", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + await expect(oracle.updateMinPrice(assetA, parseUnits("0.85", 18))).to.not.be.reverted; + await expect(oracle.updateMaxPrice(assetA, parseUnits("1.15", 18))).to.not.be.reverted; + }); + + it("5b: keeper update succeeds after disable", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await disableProtection(assetA); + + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + await expect(oracle.updateMinPrice(assetA, parseUnits("0.85", 18))).to.not.be.reverted; + await expect(oracle.updateMaxPrice(assetA, parseUnits("1.15", 18))).to.not.be.reverted; + }); + + it("5c: keeper min update during protection affects bounded prices", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Keeper lowers min during active protection + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const newMin = parseUnits("0.85", 18); + await oracle.updateMinPrice(assetA, newMin); + + // Bounded collateral should now use new min: min(1.0, 0.85) = 0.85 + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(collateral).to.equal(newMin); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-6. Collateral vs Debt Price Divergence Under Protection + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-6: collateral vs debt price divergence under protection", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + // Trigger protection + await triggerPump(assetA, vTokenA); + }); + + it("6a: spot between min and max — collateral = MIN_PRICE, debt = maxPrice", async () => { + // Set spot to 1.0 (between 0.9 and expanded max) + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + + // Protected: collateral = min(1.0, 0.9) = 0.9 + expect(collateral).to.equal(MIN_PRICE); + // Protected: debt = max(1.0, expandedMax). expandedMax > 1.0 → expandedMax + const state = await oracle.assetProtectionConfig(assetA); + expect(debt).to.equal(state.maxPrice); + expect(collateral).to.not.equal(debt); + }); + + it("6b: spot below min — collateral = spot, debt = maxPrice", async () => { + const lowSpot = parseUnits("0.8", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); + + // First call expands min to 0.8 + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + + // min(0.8, 0.8) = 0.8 + expect(collateral).to.equal(lowSpot); + // max(0.8, expandedMax) = expandedMax + const state = await oracle.assetProtectionConfig(assetA); + expect(debt).to.equal(state.maxPrice); + }); + + it("6c: spot above max — collateral = MIN_PRICE, debt = spot", async () => { + // Spot above the already-expanded max + const state = await oracle.assetProtectionConfig(assetA); + const highSpot = state.maxPrice.add(parseUnits("0.5", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); + + // First call expands max + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + + // collateral = min(highSpot, MIN_PRICE) = MIN_PRICE + expect(collateral).to.equal(MIN_PRICE); + // max was expanded to highSpot. debt = max(highSpot, highSpot) = highSpot + expect(debt).to.equal(highSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-7. Multiple Assets Independence + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-7: multiple assets independence", () => { + it("7a: trigger on one, other unaffected", async () => { + await initAssetWithWindow(assetA); + await initAssetWithWindow(assetB); + + // Trigger protection on A with pump spot > upperBound (0.9 * 1.2 = 1.08) + const pumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + resilientOracle.getPrice.whenCalledWith(assetB).returns(SPOT_PRICE); + + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + + // B returns spot unprotected + const priceB = await oracle.callStatic.getBoundedCollateralPrice(vTokenB.address); + expect(priceB).to.equal(SPOT_PRICE); + + // Keeper can still update B bounds + await expect(oracle.updateMinPrice(assetB, parseUnits("0.85", 18))).to.not.be.reverted; + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-8. setAssetBoundedPricingEnabled Round-Trip + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-8: setAssetBoundedPricingEnabled round-trip", () => { + it("8a: disable returns spot, re-enable resumes bounded pricing", async () => { + await initAssetWithWindow(assetA); + + // Set pump spot that would trigger: 1.2 > upperBound 1.08 + const pumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + // Disable bounded pricing → returns spot (not bounded) + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const priceDisabled = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(priceDisabled).to.equal(pumpSpot); + + // Re-enable → bounded pricing resumes with existing window + await oracle.setAssetBoundedPricingEnabled(assetA, true); + // View with simulated trigger returns bounded price: min(1.2, 0.9) = 0.9 + const priceReEnabled = await oracle.getBoundedCollateralPriceView(vTokenA.address); + expect(priceReEnabled).to.equal(MIN_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-10. Multiple Sequential Calls in Same Transaction + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-10: multiple sequential calls in same transaction", () => { + it("10a: two consecutive non-view calls — second reflects updated window", async () => { + await initAssetWithWindow(assetA); + + // Pump spot > upperBound (1.08): use 1.2 + const pumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + // Both calls in same tx via caller + const result = await caller.callStatic.twoConsecutiveNonViewCollateral(vTokenA.address); + + // First call: triggers protection, collateral = min(1.2, 0.9) = 0.9 + expect(result.first).to.equal(MIN_PRICE); + // Second call: protection already active, no re-trigger. Same spot, same window. + // collateral = min(1.2, 0.9) = 0.9 + expect(result.second).to.equal(MIN_PRICE); + }); + + it("10b: updateProtectionState then non-view — non-view reads from cache", async () => { + await initAssetWithWindow(assetA); + + // Pump spot > upperBound (1.08): use 1.2 + const pumpSpot = parseUnits("1.2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + + // updateProtectionState caches, then non-view reads from cache + const result = await caller.callStatic.updateThenNonViewCollateral(vTokenA.address); + // collateral = min(1.2, 0.9) = 0.9 + expect(result).to.equal(MIN_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-11. Atomic Window Expansion + Protection Trigger + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-11: atomic window expansion + protection trigger", () => { + it("11a: spot jumps far above maxPrice — only pump triggers, not crash", async () => { + await initAssetWithWindow(assetA); + + // Spot jumps to 2.0 — far above MAX_PRICE (1.1) + const bigPump = parseUnits("2", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(bigPump); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Window expansion: max → 2.0 (spot > old max 1.1) + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, bigPump); + + // Protection triggered (pump: spot 2.0 > MIN_PRICE * 1.2 = 1.08) + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-12. Boundary Precision Tests + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-12: boundary precision tests", () => { + it("12a: deviation threshold strict inequality — exact boundary does NOT trigger", async () => { + await initAssetWithWindow(assetA); + + // upperBound = MIN_PRICE * (1 + threshold) = 0.9 * 1.2 = 1.08e18 + const upperBound = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE); + resilientOracle.getPrice.whenCalledWith(assetA).returns(upperBound); + + // Exact boundary → should NOT trigger (uses > not >=) + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + // boundary + 1 → triggers + resilientOracle.getPrice.whenCalledWith(assetA).returns(upperBound.add(1)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("12b: reset threshold strict inequality — exact value reverts, minus 1 succeeds", async () => { + await initAssetWithWindow(assetA); + + // Trigger + await triggerPump(assetA, vTokenA); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const state = await oracle.assetProtectionConfig(assetA); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + + // Set resetThreshold = rangeRatio via setThresholds → disableActiveProtection reverts (>=) + const triggerThreshold = rangeRatio.add(parseUnits("0.01", 18)); + await oracle.setThresholds(assetA, triggerThreshold, rangeRatio); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + + // Set resetThreshold = rangeRatio + 1 → succeeds + if (rangeRatio.add(1).lt(triggerThreshold)) { + await oracle.setThresholds(assetA, triggerThreshold, rangeRatio.add(1)); + await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + } + }); + + it("12c: deadband strict inequality — exact value returns false, +1 returns true", async () => { + await initAssetWithWindow(assetA); + + // proposedMin such that drift = exactly KEEPER_DEADBAND (5%) + // drift = |current - proposed| * 1e18 / current = KEEPER_DEADBAND + // proposed = current * (1e18 - KEEPER_DEADBAND) / 1e18 = 0.9 * 0.95 = 0.855 + const proposedMinExact = MIN_PRICE.mul(EXP_SCALE.sub(KEEPER_DEADBAND)).div(EXP_SCALE); + + const [needsMinExact] = await oracle.checkAndGetWindowDrift([assetA], [proposedMinExact], [MAX_PRICE]); + expect(needsMinExact[0]).to.equal(false); + + // proposed - 1 → drift slightly above deadband + const proposedMinPlusOne = proposedMinExact.sub(1); + const [needsMinPlus] = await oracle.checkAndGetWindowDrift([assetA], [proposedMinPlusOne], [MAX_PRICE]); + expect(needsMinPlus[0]).to.equal(true); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-13. Transient Cache Call-Count Verification + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-13: transient cache call-count verification", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("13a: cache hit — update + both views makes only 1 oracle call", async () => { + await caller.updateAndGetBothPrices(vTokenA.address); + + // updateProtectionState fetches spot once; both views read from transient cache + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + + it("13b: cache miss — views without update make 2 oracle calls", async () => { + // Non-view wrapper so smock records the calls + await caller.getViewPricesWithoutUpdateNonView(vTokenA.address); + + // No prior updateProtectionState → cache empty → each view fetches independently + expect(resilientOracle.getPrice).to.have.callCount(2); + }); + + it("13c: non-view after update uses cache — update + non-view makes 1 oracle call", async () => { + await caller.updateThenNonViewCollateral(vTokenA.address); + + // updateProtectionState fetches once and caches; getBoundedCollateralPrice reads from cache + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + + it("13d: two consecutive non-view calls — 1 oracle call (second reads cache)", async () => { + await caller.twoConsecutiveNonViewCollateral(vTokenA.address); + + // First getBoundedCollateralPrice fetches and caches; second reads from cache + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + + it("13e: per-asset cache isolation — update A, view B still calls oracle", async () => { + const spotB = parseUnits("2", 18); + // Set spot for B before init so setTokenConfig seeds and keeper updates succeed + resilientOracle.getPrice.whenCalledWith(assetB).returns(SPOT_PRICE); + await initAssetWithWindow(assetB); + + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + resilientOracle.getPrice.whenCalledWith(assetB).returns(spotB); + + // updateProtectionState(A) caches A's prices; view(B) has no cache → fetches fresh + await caller.updateAViewB(vTokenA.address, vTokenB.address); + + // 1 call for A (update), 1 call for B (cache miss view) = 2 total + expect(resilientOracle.getPrice).to.have.callCount(2); + }); + + it("13f: cache hit under active protection — still only 1 oracle call", async () => { + // Trigger protection in prior tx + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Reset call tracking after setup + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + await caller.updateAndGetBothPrices(vTokenA.address); + + // Even under active protection, updateProtectionState caches both prices → views use cache + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + + it("13g: non-whitelisted — update fetches+caches, views read cache = 1 oracle call", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + await caller.updateAndGetBothPrices(vTokenA.address); + + // updateProtectionState fetches spot and caches (spot, spot). Views read from cache. + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-14. getBoundedPrices Dual-Price API + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-14: getBoundedPrices dual-price API", () => { + it("14a: updateProtectionState → getBoundedPricesView returns both cached prices", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Set a spot between min and max + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // updateProtectionState caches, then getBoundedPricesView reads cache + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + const state = await oracle.assetProtectionConfig(assetA); + + // collateral = min(spot, minPrice) = min(1.0, 0.9) = 0.9 + expect(result.collateral).to.equal(MIN_PRICE); + // debt = max(spot, maxPrice) = maxPrice (expanded) + expect(result.debt).to.equal(state.maxPrice); + }); + + it("14b: getBoundedPrices (non-view) returns same as individual functions", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + await triggerPump(assetA, vTokenA); + + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Get prices via individual functions + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + + // Get prices via dual API + const result = await oracle.callStatic.getBoundedPrices(vTokenA.address); + + expect(result.collateralPrice).to.equal(collateral); + expect(result.debtPrice).to.equal(debt); + }); + + it("14c: getBoundedPricesView matches individual view functions", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection so prices diverge + await triggerPump(assetA, vTokenA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Get prices via individual view functions + const collateral = await oracle.getBoundedCollateralPriceView(vTokenA.address); + const debt = await oracle.getBoundedDebtPriceView(vTokenA.address); + + // Get prices via dual view API + const result = await oracle.getBoundedPricesView(vTokenA.address); + + expect(result.collateralPrice).to.equal(collateral); + expect(result.debtPrice).to.equal(debt); + }); + }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-15. Keeper Updates During Active Protection + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-15: keeper updates during active protection", () => { + it("15a: trigger → keeper updates min → bounded collateral reflects new min", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Spot is between min and max + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Verify collateral = MIN_PRICE before keeper update + const collateralBefore = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(collateralBefore).to.equal(MIN_PRICE); + + // Keeper lowers min + const newMin = parseUnits("0.85", 18); + await oracle.updateMinPrice(assetA, newMin); + + // Bounded collateral now uses new min: min(1.0, 0.85) = 0.85 + const collateralAfter = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(collateralAfter).to.equal(newMin); + }); + + it("15b: trigger → keeper updates max → bounded debt reflects new max", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + // Record original max + const stateBefore = await oracle.assetProtectionConfig(assetA); + const originalMax = stateBefore.maxPrice; + + // Spot is between min and max + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + // Verify debt = originalMax before keeper update + const debtBefore = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(debtBefore).to.equal(originalMax); + + // Keeper raises max + const newMax = originalMax.add(parseUnits("0.1", 18)); + await oracle.updateMaxPrice(assetA, newMax); + + // Bounded debt now uses new max: max(1.0, newMax) = newMax + const debtAfter = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(debtAfter).to.equal(newMax); + }); + }); +}); From 5be0f8b482e7e908f56803e26793a4c04dd021bc Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 8 Apr 2026 00:04:36 +0530 Subject: [PATCH 07/30] feat: deployment scripts and fork tests --- deploy/28-deploy-deviation-bounded-oracle.ts | 59 + test/fork/DeviationBoundedOracle.ts | 1420 ++++++++++++++++++ 2 files changed, 1479 insertions(+) create mode 100644 deploy/28-deploy-deviation-bounded-oracle.ts create mode 100644 test/fork/DeviationBoundedOracle.ts diff --git a/deploy/28-deploy-deviation-bounded-oracle.ts b/deploy/28-deploy-deviation-bounded-oracle.ts new file mode 100644 index 00000000..6febf337 --- /dev/null +++ b/deploy/28-deploy-deviation-bounded-oracle.ts @@ -0,0 +1,59 @@ +import hre from "hardhat"; +import { DeployFunction } from "hardhat-deploy/dist/types"; +import { HardhatRuntimeEnvironment } from "hardhat/types"; + +import { ADDRESSES } from "../helpers/deploymentConfig"; + +const func: DeployFunction = async function ({ + getNamedAccounts, + deployments, + network, +}: HardhatRuntimeEnvironment) { + const { deploy } = deployments; + const { deployer } = await getNamedAccounts(); + + const accessControlManagerAddress = ADDRESSES[network.name].acm; + + const proxyOwnerAddress = network.live ? ADDRESSES[network.name].timelock : deployer; + const vbnbAddress = ADDRESSES[network.name].vBNBAddress; + const vaiAddress = ADDRESSES[network.name].VAIAddress; + const timelock = ADDRESSES[network.name].timelock; + + const resilientOracle = await hre.ethers.getContract("ResilientOracle"); + + const defaultProxyAdmin = await hre.artifacts.readArtifact( + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol:ProxyAdmin", + ); + + await deploy("DeviationBoundedOracle", { + from: deployer, + log: true, + deterministicDeployment: false, + skipIfAlreadyDeployed: true, + args: [resilientOracle.address, vbnbAddress, vaiAddress], + proxy: { + owner: proxyOwnerAddress, + proxyContract: "OptimizedTransparentUpgradeableProxy", + execute: { + methodName: "initialize", + args: [accessControlManagerAddress], + }, + viaAdminContract: { + name: "DefaultProxyAdmin", + artifact: defaultProxyAdmin, + }, + }, + }); + + const deviationBoundedOracle = await hre.ethers.getContract("DeviationBoundedOracle"); + const owner = await deviationBoundedOracle.owner(); + + if (owner === deployer) { + await deviationBoundedOracle.transferOwnership(timelock); + console.log(`Ownership of DeviationBoundedOracle transferred from deployer to Timelock (${timelock})`); + } +}; + +export default func; +func.tags = ["deploy-deviation-bounded-oracle"]; +func.dependencies = ["deploy"]; diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts new file mode 100644 index 00000000..e7eab825 --- /dev/null +++ b/test/fork/DeviationBoundedOracle.ts @@ -0,0 +1,1420 @@ +import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; +import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; +import chai from "chai"; +import { BigNumber } from "ethers"; +import { parseUnits } from "ethers/lib/utils"; +import { ethers, upgrades } from "hardhat"; + +import { ADDRESSES } from "../../helpers/deploymentConfig"; +import { + DeviationBoundedOracle, + DeviationBoundedOracleCaller, + IAccessControlManagerV8, + MockSimpleOracle, + VBep20Interface, +} from "../../typechain-types"; +import { addr0000 } from "../utils/data"; +import { forking, initMainnetUser } from "./utils"; + +const { expect } = chai; + +const FORK: boolean = process.env.FORK === "true"; +const FORKED_NETWORK: string = process.env.FORKED_NETWORK || ""; + +const EXP_SCALE = parseUnits("1", 18); +const MIN_THRESHOLD = parseUnits("0.05", 18); +const MAX_THRESHOLD = parseUnits("0.5", 18); +const KEEPER_DEADBAND = parseUnits("0.05", 18); +const DEFAULT_THRESHOLD = parseUnits("0.2", 18); +const DEFAULT_RESET_THRESHOLD = parseUnits("0.1", 18); +const DEFAULT_COOLDOWN = 3600; +const SPOT_PRICE = parseUnits("1", 18); +const MIN_PRICE = parseUnits("0.9", 18); +const MAX_PRICE = parseUnits("1.1", 18); +const NATIVE_TOKEN_ADDR = "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB"; + +// Real BSC mainnet vToken addresses +const VETH_ADDRESS = "0xf508fCD89b8bd15579dc79A6827cB4686A3592c8"; +const VBTC_ADDRESS = "0x882C173bC7Ff3b7786CA16dfeD3DFFfb9Ee7847B"; + +if (FORK && FORKED_NETWORK === "bscmainnet") { + const { + acm: ACM_ADDRESS, + timelock: TIMELOCK_ADDRESS, + vBNBAddress: VBNB_ADDRESS, + VAIAddress: VAI_ADDRESS, + } = ADDRESSES[FORKED_NETWORK]; + + forking(90924377, () => { + let admin: SignerWithAddress; + let someone: SignerWithAddress; + let timelockSigner: SignerWithAddress; + let mockOracle: MockSimpleOracle; + let acm: IAccessControlManagerV8; + let oracle: DeviationBoundedOracle; + let caller: DeviationBoundedOracleCaller; + let vTokenA: VBep20Interface; // vETH + let vTokenB: VBep20Interface; // vBTC + let assetA: string; // WETH underlying + let assetB: string; // BTCB underlying + + const fixture = async () => { + const [deployer, other] = await ethers.getSigners(); + + // Impersonate the real BSC mainnet timelock + const impersonatedTimelock = await initMainnetUser(TIMELOCK_ADDRESS, parseUnits("100")); + + // Get real on-chain ACM + const acmContract = ( + await ethers.getContractAt("IAccessControlManagerV8", ACM_ADDRESS, impersonatedTimelock) + ); + + // Get real on-chain vTokens + const vETH = await ethers.getContractAt("VBep20Interface", VETH_ADDRESS); + const vBTC = await ethers.getContractAt("VBep20Interface", VBTC_ADDRESS); + const underlyingA = await vETH.underlying(); + const underlyingB = await vBTC.underlying(); + + // Deploy MockSimpleOracle (fresh — replaces ResilientOracle for price control) + const MockOracleFactory = await ethers.getContractFactory("MockSimpleOracle"); + const mockOracleDeployed = await MockOracleFactory.deploy(); + + // Set default prices for all test assets + await mockOracleDeployed.setPrice(underlyingA, SPOT_PRICE); + await mockOracleDeployed.setPrice(underlyingB, SPOT_PRICE); + await mockOracleDeployed.setPrice(NATIVE_TOKEN_ADDR, SPOT_PRICE); + await mockOracleDeployed.setPrice(VAI_ADDRESS, SPOT_PRICE); + + // Deploy DeviationBoundedOracle as upgradeable proxy + const OracleFactory = await ethers.getContractFactory("DeviationBoundedOracle", deployer); + const oracleDeployed = await upgrades.deployProxy(OracleFactory, [acmContract.address], { + constructorArgs: [mockOracleDeployed.address, VBNB_ADDRESS, VAI_ADDRESS], + }); + + // Impersonated timelock grants all DBO permissions to deployer via real ACM + const DBO_FUNCTIONS = [ + "setTokenConfig(address,uint64,uint256,uint256)", + "setCooldownPeriod(address,uint64)", + "setThresholds(address,uint256,uint256)", + "setAssetBoundedPricingEnabled(address,bool)", + "updateMinPrice(address,uint128)", + "updateMaxPrice(address,uint128)", + "disableActiveProtection(address)", + ]; + for (const fn of DBO_FUNCTIONS) { + await acmContract.giveCallPermission(oracleDeployed.address, fn, deployer.address); + } + + // Deploy caller as normal contract + const CallerFactory = await ethers.getContractFactory("DeviationBoundedOracleCaller", deployer); + const callerDeployed = await CallerFactory.deploy(oracleDeployed.address); + + return { + mockOracle: mockOracleDeployed, + acm: acmContract, + oracle: oracleDeployed, + caller: callerDeployed, + admin: deployer, + someone: other, + timelockSigner: impersonatedTimelock, + vTokenA: vETH, + vTokenB: vBTC, + assetA: underlyingA, + assetB: underlyingB, + }; + }; + + beforeEach(async () => { + ({ mockOracle, acm, oracle, caller, admin, someone, timelockSigner, vTokenA, vTokenB, assetA, assetB } = + await loadFixture(fixture)); + }); + + // ── Helpers ─────────────────────────────────────────────────────────── + + const initAsset = async ( + asset: string, + cooldown: number = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + ) => { + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + }; + + const initAssetWithWindow = async ( + asset: string, + minPrice: BigNumber = MIN_PRICE, + maxPrice: BigNumber = MAX_PRICE, + cooldown: number = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + ) => { + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.updateMinPrice(asset, minPrice); + await oracle.updateMaxPrice(asset, maxPrice); + }; + + const triggerPump = async ( + asset: string, + vToken: VBep20Interface, + minPrice: BigNumber = MIN_PRICE, + threshold: BigNumber = DEFAULT_THRESHOLD, + ): Promise => { + const pumpSpot = minPrice.mul(EXP_SCALE.add(threshold)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(asset, pumpSpot); + await oracle.getBoundedCollateralPrice(vToken.address); + return pumpSpot; + }; + + const disableProtection = async (asset: string) => { + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const state = await oracle.assetProtectionConfig(asset); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = rangeRatio.add(1); + const newTrigger = newReset.add(parseUnits("0.01", 18)); + + await oracle.setThresholds(asset, newTrigger, newReset); + await oracle.disableActiveProtection(asset); + }; + + // ──────────────────────────────────────────────────────────────────── + // 1. Constructor + // ──────────────────────────────────────────────────────────────────── + + describe("1. constructor", () => { + it("1.1 sets immutables correctly", async () => { + expect(await oracle.RESILIENT_ORACLE()).to.equal(mockOracle.address); + expect(await oracle.nativeMarket()).to.equal(VBNB_ADDRESS); + expect(await oracle.vai()).to.equal(VAI_ADDRESS); + }); + + it("1.2 reverts when _resilientOracle is zero address", async () => { + const Factory = await ethers.getContractFactory("DeviationBoundedOracle"); + await expect( + upgrades.deployProxy(Factory, [acm.address], { + constructorArgs: [addr0000, VBNB_ADDRESS, VAI_ADDRESS], + }), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("1.3 reverts when nativeMarketAddress is zero address", async () => { + const Factory = await ethers.getContractFactory("DeviationBoundedOracle"); + await expect( + upgrades.deployProxy(Factory, [acm.address], { + constructorArgs: [mockOracle.address, addr0000, VAI_ADDRESS], + }), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 2. Initialize + // ──────────────────────────────────────────────────────────────────── + + describe("2. initialize", () => { + it("2.1 sets access control manager", async () => { + expect(ethers.utils.getAddress(await oracle.accessControlManager())).to.equal( + ethers.utils.getAddress(acm.address), + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 3. setTokenConfig + // ──────────────────────────────────────────────────────────────────── + + describe("3. setTokenConfig", () => { + describe("happy path", () => { + it("3.1 sets all struct fields, emits events, updates asset lists", async () => { + const tx = await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(SPOT_PRICE); + expect(state.maxPrice).to.equal(SPOT_PRICE); + expect(state.isProtectedPriceActive).to.equal(false); + expect(state.isBoundedPricingEnabled).to.equal(true); + expect(state.lastProtectionTriggeredAt).to.equal(0); + expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); + expect(state.asset).to.equal(assetA); + expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); + expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + + await expect(tx) + .to.emit(oracle, "ProtectionInitialized") + .withArgs(assetA, SPOT_PRICE, SPOT_PRICE, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + + expect(await oracle.getInitializedAssets()).to.include(assetA); + expect(await oracle.getAllBoundedPricingEnabledAssets()).to.include(assetA); + }); + }); + + describe("revert branches", () => { + it("3.2 reverts when caller is unauthorized", async () => { + await expect( + oracle + .connect(someone) + .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("3.3 reverts when asset is zero address", async () => { + await expect( + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("3.4 reverts when already initialized", async () => { + await initAsset(assetA); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + }); + + it("3.5 reverts when threshold < MIN_THRESHOLD", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); + }); + + it("3.6 reverts when threshold > MAX_THRESHOLD", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); + }); + + it("3.7 reverts when resetThreshold >= triggerThreshold", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); + }); + + it("3.8 reverts when asset is VAI", async () => { + await expect( + oracle.setTokenConfig(VAI_ADDRESS, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); + }); + + it("3.9 reverts when cooldownPeriod is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("3.10 reverts when triggerThreshold is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("3.11 reverts when resetThreshold is zero", async () => { + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0), + ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + + it("3.12 reverts when re-initializing after de-whitelist", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + }); + + it("3.13 reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { + const overflowPrice = BigNumber.from(2).pow(128); + await mockOracle.setPrice(assetA, overflowPrice); + await expect( + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + }); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 4. setCooldownPeriod + // ──────────────────────────────────────────────────────────────────── + + describe("4. setCooldownPeriod", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("4.1 updates cooldownPeriod and emits event", async () => { + const tx = await oracle.setCooldownPeriod(assetA, 7200); + await expect(tx).to.emit(oracle, "CooldownPeriodSet").withArgs(assetA, DEFAULT_COOLDOWN, 7200); + expect((await oracle.assetProtectionConfig(assetA)).cooldownPeriod).to.equal(7200); + }); + + it("4.2 reverts when caller is unauthorized", async () => { + await expect(oracle.connect(someone).setCooldownPeriod(assetA, 7200)).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("4.3 reverts when asset is zero address", async () => { + await expect(oracle.setCooldownPeriod(addr0000, 7200)).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); + }); + + it("4.4 reverts when not initialized", async () => { + await expect(oracle.setCooldownPeriod(assetB, 7200)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("4.5 reverts when new cooldown is zero", async () => { + await expect(oracle.setCooldownPeriod(assetA, 0)).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 5. setThresholds + // ──────────────────────────────────────────────────────────────────── + + describe("5. setThresholds", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("5.1 updates both thresholds and emits both events", async () => { + const newTrigger = parseUnits("0.25", 18); + const newReset = parseUnits("0.12", 18); + const tx = await oracle.setThresholds(assetA, newTrigger, newReset); + await expect(tx).to.emit(oracle, "TriggerThresholdSet").withArgs(assetA, DEFAULT_THRESHOLD, newTrigger); + await expect(tx).to.emit(oracle, "ResetThresholdSet").withArgs(assetA, DEFAULT_RESET_THRESHOLD, newReset); + }); + + it("5.2 only emits TriggerThresholdSet when only trigger changes", async () => { + const tx = await oracle.setThresholds(assetA, parseUnits("0.25", 18), DEFAULT_RESET_THRESHOLD); + await expect(tx).to.emit(oracle, "TriggerThresholdSet"); + await expect(tx).to.not.emit(oracle, "ResetThresholdSet"); + }); + + it("5.3 only emits ResetThresholdSet when only reset changes", async () => { + const tx = await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, parseUnits("0.08", 18)); + await expect(tx).to.not.emit(oracle, "TriggerThresholdSet"); + await expect(tx).to.emit(oracle, "ResetThresholdSet"); + }); + + it("5.4 emits no events when neither changes", async () => { + const tx = await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + await expect(tx).to.not.emit(oracle, "TriggerThresholdSet"); + await expect(tx).to.not.emit(oracle, "ResetThresholdSet"); + }); + + it("5.5 reverts when caller is unauthorized", async () => { + await expect( + oracle.connect(someone).setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("5.6 reverts when not initialized", async () => { + await expect( + oracle.setThresholds(assetB, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "MarketNotInitialized"); + }); + + it("5.7 reverts when trigger below MIN_THRESHOLD", async () => { + await expect( + oracle.setThresholds(assetA, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); + }); + + it("5.8 reverts when trigger above MAX_THRESHOLD", async () => { + await expect( + oracle.setThresholds(assetA, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); + }); + + it("5.9 reverts when reset >= trigger", async () => { + await expect(oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD)).to.be.revertedWithCustomError( + oracle, + "InvalidResetThreshold", + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 6. setAssetBoundedPricingEnabled + // ──────────────────────────────────────────────────────────────────── + + describe("6. setAssetBoundedPricingEnabled", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("6.1 disables bounded pricing and emits event", async () => { + const tx = await oracle.setAssetBoundedPricingEnabled(assetA, false); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, false); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + }); + + it("6.2 enables bounded pricing and emits event", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const tx = await oracle.setAssetBoundedPricingEnabled(assetA, true); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + }); + + it("6.3 reverts when caller is unauthorized", async () => { + await expect( + oracle.connect(someone).setAssetBoundedPricingEnabled(assetA, false), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("6.4 reverts when not initialized", async () => { + await expect(oracle.setAssetBoundedPricingEnabled(assetB, true)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + + it("6.5 reverts when disabling with active protection", async () => { + await initAssetWithWindow(assetB); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetB, pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenB.address); + + await expect(oracle.setAssetBoundedPricingEnabled(assetB, false)).to.be.revertedWithCustomError( + oracle, + "ProtectedPriceActive", + ); + }); + + it("6.6 price functions return spot after disabling", async () => { + await initAssetWithWindow(assetB); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetB, pumpSpot); + + expect(await oracle.getBoundedCollateralPriceView(vTokenB.address)).to.equal(MIN_PRICE); + await oracle.setAssetBoundedPricingEnabled(assetB, false); + expect(await oracle.getBoundedCollateralPriceView(vTokenB.address)).to.equal(pumpSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 7. updateMinPrice + // ──────────────────────────────────────────────────────────────────── + + describe("7. updateMinPrice", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + }); + + it("7.1 updates minPrice and emits event", async () => { + const newMin = parseUnits("0.85", 18); + const tx = await oracle.updateMinPrice(assetA, newMin); + await expect(tx).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, newMin); + }); + + it("7.2 reverts when caller is unauthorized", async () => { + await expect( + oracle.connect(someone).updateMinPrice(assetA, parseUnits("0.85", 18)), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("7.3 reverts when newMin > currentSpot", async () => { + await expect(oracle.updateMinPrice(assetA, SPOT_PRICE.add(1))).to.be.revertedWithCustomError( + oracle, + "InvalidMinPrice", + ); + }); + + it("7.4 reverts when newMin >= maxPrice", async () => { + await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 8. updateMaxPrice + // ──────────────────────────────────────────────────────────────────── + + describe("8. updateMaxPrice", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + }); + + it("8.1 updates maxPrice and emits event", async () => { + const tx = await oracle.updateMaxPrice(assetA, parseUnits("1.15", 18)); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, parseUnits("1.15", 18)); + }); + + it("8.2 reverts when caller is unauthorized", async () => { + await expect( + oracle.connect(someone).updateMaxPrice(assetA, parseUnits("1.15", 18)), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("8.3 reverts when newMax < currentSpot", async () => { + await expect(oracle.updateMaxPrice(assetA, SPOT_PRICE.sub(1))).to.be.revertedWithCustomError( + oracle, + "InvalidMaxPrice", + ); + }); + + it("8.4 reverts when newMax <= minPrice", async () => { + await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 9. disableActiveProtection + // ──────────────────────────────────────────────────────────────────── + + describe("9. disableActiveProtection", () => { + it("9.1 disables protection after governance raises reset threshold", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const state = await oracle.assetProtectionConfig(assetA); + const range = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const trigger = state.triggerThreshold; + if (newReset.gte(trigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, trigger, newReset); + } + + const tx = await oracle.disableActiveProtection(assetA); + await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("9.2 prices revert to spot after disable", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + + await disableProtection(assetA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("9.3 reverts when caller is unauthorized", async () => { + await initAsset(assetA); + await expect(oracle.connect(someone).disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("9.4 reverts when protection is not active", async () => { + await initAsset(assetA); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "ProtectedPriceInactive", + ); + }); + + it("9.5 reverts when cooldown has not elapsed", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + }); + + it("9.6 reverts when range not converged", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 10. getBoundedCollateralPrice + // ──────────────────────────────────────────────────────────────────── + + describe("10. getBoundedCollateralPrice", () => { + it("10.1 returns spot when not whitelisted", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("10.2 returns spot when whitelisted, no deviation", async () => { + await initAssetWithWindow(assetA); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("10.3 expands window when spot < minPrice", async () => { + await initAssetWithWindow(assetA); + const lowSpot = MIN_PRICE.sub(1); + await mockOracle.setPrice(assetA, lowSpot); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)) + .to.emit(oracle, "MinPriceUpdated") + .withArgs(assetA, MIN_PRICE, lowSpot); + }); + + it("10.4 expands window when spot > maxPrice", async () => { + await initAssetWithWindow(assetA); + await mockOracle.setPrice(assetA, MAX_PRICE.add(1)); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)) + .to.emit(oracle, "MaxPriceUpdated") + .withArgs(assetA, MAX_PRICE, MAX_PRICE.add(1)); + }); + + it("10.5 triggers protection on pump and returns minPrice", async () => { + await initAssetWithWindow(assetA); + const upperBound = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE); + await mockOracle.setPrice(assetA, upperBound.add(1)); + + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + }); + + it("10.6 triggers protection on crash and returns spot", async () => { + const localMin = parseUnits("0.995", 18); + const localMax = parseUnits("1.005", 18); + await initAssetWithWindow(assetA, localMin, localMax); + + const lowerBound = localMax.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const crashSpot = lowerBound.sub(1); + await mockOracle.setPrice(assetA, crashSpot); + + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(crashSpot); + }); + + it("10.7 returns spot for uninitialized asset", async () => { + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("10.8 resolves native market to NATIVE_TOKEN_ADDR", async () => { + await initAssetWithWindow(NATIVE_TOKEN_ADDR); + expect(await oracle.callStatic.getBoundedCollateralPrice(VBNB_ADDRESS)).to.equal(SPOT_PRICE); + }); + + it("10.9 reverts with PriceExceedsUint128", async () => { + await initAsset(assetA); + await mockOracle.setPrice(assetA, BigNumber.from(2).pow(128)); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.be.revertedWithCustomError( + oracle, + "PriceExceedsUint128", + ); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 11. getBoundedDebtPrice + // ──────────────────────────────────────────────────────────────────── + + describe("11. getBoundedDebtPrice", () => { + it("11.1 returns spot when no deviation", async () => { + await initAssetWithWindow(assetA); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("11.2 returns maxPrice on crash trigger", async () => { + await initAssetWithWindow(assetA); + const lowerBound = MAX_PRICE.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + await mockOracle.setPrice(assetA, lowerBound.sub(1)); + await oracle.getBoundedDebtPrice(vTokenA.address); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(MAX_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 12. getBoundedPrices + // ──────────────────────────────────────────────────────────────────── + + describe("12. getBoundedPrices", () => { + it("12.1 returns (spot, spot) when no deviation", async () => { + await initAssetWithWindow(assetA); + const [c, d] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(c).to.equal(SPOT_PRICE); + expect(d).to.equal(SPOT_PRICE); + }); + + it("12.2 matches individual functions when protected", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + const [c, d] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(c).to.equal(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)); + expect(d).to.equal(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 13. View price functions + // ──────────────────────────────────────────────────────────────────── + + describe("13. view price functions", () => { + it("13.1 returns spot when no deviation", async () => { + await initAssetWithWindow(assetA); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.getBoundedDebtPriceView(vTokenA.address)).to.equal(SPOT_PRICE); + }); + + it("13.2 simulated trigger without state mutation", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetA, pumpSpot); + + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("13.3 view and non-view return identical prices (pump)", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( + await oracle.getBoundedCollateralPriceView(vTokenA.address), + ); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + await oracle.getBoundedDebtPriceView(vTokenA.address), + ); + }); + + it("13.4 view and non-view return identical prices (crash)", async () => { + const localMin = parseUnits("0.995", 18); + const localMax = parseUnits("1.005", 18); + await initAssetWithWindow(assetA, localMin, localMax); + + const lowerBound = localMax.mul(EXP_SCALE.sub(DEFAULT_THRESHOLD)).div(EXP_SCALE); + const crashSpot = lowerBound.sub(1); + await mockOracle.setPrice(assetA, crashSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( + await oracle.getBoundedCollateralPriceView(vTokenA.address), + ); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + await oracle.getBoundedDebtPriceView(vTokenA.address), + ); + }); + + it("13.5 view and non-view return identical prices (no deviation)", async () => { + await initAssetWithWindow(assetA); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( + await oracle.getBoundedCollateralPriceView(vTokenA.address), + ); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + await oracle.getBoundedDebtPriceView(vTokenA.address), + ); + }); + + it("13.6 view and non-view return identical prices (not whitelisted)", async () => { + await initAsset(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( + await oracle.getBoundedCollateralPriceView(vTokenA.address), + ); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + await oracle.getBoundedDebtPriceView(vTokenA.address), + ); + }); + + it("13.7 view and non-view return identical prices (uninitialized asset)", async () => { + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( + await oracle.getBoundedCollateralPriceView(vTokenA.address), + ); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + await oracle.getBoundedDebtPriceView(vTokenA.address), + ); + }); + + it("13.8 getBoundedPrices matches getBoundedPricesView (protection active)", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const [nonViewC, nonViewD] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + const [viewC, viewD] = await oracle.getBoundedPricesView(vTokenA.address); + expect(nonViewC).to.equal(viewC); + expect(nonViewD).to.equal(viewD); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 14-15. getBoundedPricesView & updateProtectionState + // ──────────────────────────────────────────────────────────────────── + + describe("14. getBoundedPricesView", () => { + it("14.1 matches individual view functions", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + const [c, d] = await oracle.getBoundedPricesView(vTokenA.address); + expect(c).to.equal(await oracle.getBoundedCollateralPriceView(vTokenA.address)); + expect(d).to.equal(await oracle.getBoundedDebtPriceView(vTokenA.address)); + }); + }); + + describe("15. updateProtectionState", () => { + it("15.1 triggers protection for whitelisted asset", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetA, pumpSpot); + + await expect(oracle.updateProtectionState(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("15.2 is a no-op for non-whitelisted asset", async () => { + await initAssetWithWindow(assetA); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + await expect(oracle.updateProtectionState(vTokenA.address)).to.not.be.reverted; + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 16-18. Simple getters + // ──────────────────────────────────────────────────────────────────── + + describe("16. isBoundedPricingEnabled", () => { + it("16.1 returns true for enabled, false for disabled/uninitialized", async () => { + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + await initAsset(assetA); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + await oracle.setAssetBoundedPricingEnabled(assetA, false); + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(false); + }); + }); + + describe("17. isProtectedPriceActive", () => { + it("17.1 returns true when active, false otherwise", async () => { + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + }); + + describe("18. canExitProtection", () => { + it("18.1 returns false before cooldown, true after cooldown + converged range", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + expect(await oracle.canExitProtection(assetA)).to.equal(false); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + expect(await oracle.canExitProtection(assetA)).to.equal(false); // range still wide + + const state = await oracle.assetProtectionConfig(assetA); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = rangeRatio.add(parseUnits("0.001", 18)); + if (newReset.gte(state.triggerThreshold)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, state.triggerThreshold, newReset); + } + expect(await oracle.canExitProtection(assetA)).to.equal(true); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 19-22. Enumeration, Drift, Config Getter + // ──────────────────────────────────────────────────────────────────── + + describe("19. getInitializedAssets & getAllBoundedPricingEnabledAssets", () => { + it("19.1 tracks initialized and whitelisted assets", async () => { + expect(await oracle.getInitializedAssets()).to.have.length(0); + await initAsset(assetA); + await initAsset(assetB); + expect(await oracle.getInitializedAssets()).to.have.length(2); + expect(await oracle.getAllBoundedPricingEnabledAssets()).to.have.length(2); + + await oracle.setAssetBoundedPricingEnabled(assetB, false); + expect(await oracle.getInitializedAssets()).to.have.length(2); + expect(await oracle.getAllBoundedPricingEnabledAssets()).to.have.length(1); + }); + }); + + describe("20. checkAndGetWindowDrift", () => { + it("20.1 detects drift beyond deadband", async () => { + await initAssetWithWindow(assetA); + const [needsMin] = await oracle.checkAndGetWindowDrift([assetA], [MIN_PRICE.mul(89).div(100)], [MAX_PRICE]); + expect(needsMin[0]).to.equal(true); + + const [noMin] = await oracle.checkAndGetWindowDrift([assetA], [MIN_PRICE], [MAX_PRICE]); + expect(noMin[0]).to.equal(false); + }); + + it("20.2 reverts when array lengths mismatch", async () => { + await expect( + oracle.checkAndGetWindowDrift([assetA], [MIN_PRICE, MIN_PRICE], [MAX_PRICE]), + ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + }); + }); + + describe("21. assetProtectionConfig getter", () => { + it("21.1 returns all struct fields correctly", async () => { + await initAsset(assetA); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(SPOT_PRICE); + expect(state.maxPrice).to.equal(SPOT_PRICE); + expect(state.isProtectedPriceActive).to.equal(false); + expect(state.isBoundedPricingEnabled).to.equal(true); + expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); + expect(state.asset).to.equal(assetA); + expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); + expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 22. Transient Cache + // ──────────────────────────────────────────────────────────────────── + + describe("22. transient cache", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + }); + + it("22.1 cache hit, no protection -- view returns cached spot", async () => { + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(SPOT_PRICE); + expect(result.debt).to.equal(SPOT_PRICE); + }); + + it("22.2 cache hit, protection active", async () => { + await triggerPump(assetA, vTokenA); + const state = await oracle.assetProtectionConfig(assetA); + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(MIN_PRICE); + expect(result.debt).to.equal(state.maxPrice); + }); + + it("22.3 protection triggered + window expanded in same call", async () => { + const crashSpot = parseUnits("0.7", 18); + await mockOracle.setPrice(assetA, crashSpot); + + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(crashSpot); + expect(result.debt).to.equal(MAX_PRICE); + + await caller.updateAndGetBothPrices(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("22.4 cache miss -- view fetches fresh", async () => { + const result = await caller.getViewPricesWithoutUpdate(vTokenA.address); + expect(result.collateral).to.equal(SPOT_PRICE); + }); + + it("22.5 cache miss, deviation -- simulated trigger", async () => { + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetA, pumpSpot); + + const result = await caller.getViewPricesWithoutUpdate(vTokenA.address); + expect(result.collateral).to.equal(MIN_PRICE); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("22.6 per-asset cache isolation", async () => { + const specialSpot = parseUnits("2", 18); + await mockOracle.setPrice(assetB, specialSpot); + await initAssetWithWindow(assetB, parseUnits("1.95", 18), parseUnits("2.05", 18)); + + const collateralA = await caller.callStatic.updateAndGetCollateralPrice(vTokenA.address); + expect(collateralA).to.equal(SPOT_PRICE); + + const resultB = await caller.getViewPricesWithoutUpdate(vTokenB.address); + expect(resultB.collateral).to.equal(specialSpot); + }); + + it("22.7 non-whitelisted caches (spot, spot)", async () => { + await oracle.setAssetBoundedPricingEnabled(assetA, false); + const specialSpot = parseUnits("1.5", 18); + await mockOracle.setPrice(assetA, specialSpot); + + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(specialSpot); + expect(result.debt).to.equal(specialSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 23. Re-trigger After Disable + // ──────────────────────────────────────────────────────────────────── + + describe("23. re-trigger after disable", () => { + it("23.1 non-view re-triggers", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await disableProtection(assetA); + + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + }); + + it("23.2 view simulates trigger after disable", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await disableProtection(assetA); + + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("23.3 lastProtectionTriggeredAt is fresh", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + const firstTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + await disableProtection(assetA); + + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.be.gt(firstTime); + }); + + it("23.4 repeated trigger -> disable -> trigger cycle", async () => { + await initAssetWithWindow(assetA); + for (let i = 0; i < 3; i++) { + await triggerPump(assetA, vTokenA); + await disableProtection(assetA); + await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + } + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 24. Threshold Effects + // ──────────────────────────────────────────────────────────────────── + + describe("24. threshold effects", () => { + const spot = parseUnits("1.15", 18); + + it("24.1 lowering threshold triggers protection", async () => { + await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, parseUnits("0.3", 18), parseUnits("0.15", 18)); + await oracle.updateMinPrice(assetA, MIN_PRICE); + await oracle.updateMaxPrice(assetA, MAX_PRICE); + await mockOracle.setPrice(assetA, spot); + + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, state.resetThreshold); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); + }); + + it("24.2 raising threshold prevents protection", async () => { + await initAssetWithWindow(assetA); + await mockOracle.setPrice(assetA, spot); + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); + + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + }); + + it("24.3 view reflects threshold change immediately", async () => { + await initAssetWithWindow(assetA); + await mockOracle.setPrice(assetA, spot); + + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + + const state = await oracle.assetProtectionConfig(assetA); + await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(spot); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 25. No Re-trigger When Active + // ──────────────────────────────────────────────────────────────────── + + describe("25. no re-trigger, window expands", () => { + it("25.1 no re-trigger, timestamp unchanged", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = await triggerPump(assetA, vTokenA); + const triggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + await mockOracle.setPrice(assetA, pumpSpot.add(parseUnits("0.5", 18))); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(triggerTime); + }); + + it("25.2 window expands during protection", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + const lowSpot = parseUnits("0.8", 18); + await mockOracle.setPrice(assetA, lowSpot); + await expect(oracle.getBoundedCollateralPrice(vTokenA.address)) + .to.emit(oracle, "MinPriceUpdated") + .withArgs(assetA, MIN_PRICE, lowSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 26. Keeper Updates During Protection + // ──────────────────────────────────────────────────────────────────── + + describe("26. keeper updates during protection", () => { + it("26.1 keeper updates succeed during active protection", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + await expect(oracle.updateMinPrice(assetA, parseUnits("0.85", 18))).to.not.be.reverted; + await expect(oracle.updateMaxPrice(assetA, parseUnits("1.15", 18))).to.not.be.reverted; + }); + + it("26.2 keeper min update affects bounded collateral", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const newMin = parseUnits("0.85", 18); + await oracle.updateMinPrice(assetA, newMin); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(newMin); + }); + + it("26.3 keeper max update affects bounded debt", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + const originalMax = (await oracle.assetProtectionConfig(assetA)).maxPrice; + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const newMax = originalMax.add(parseUnits("0.1", 18)); + await oracle.updateMaxPrice(assetA, newMax); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(newMax); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 27. Collateral vs Debt Divergence + // ──────────────────────────────────────────────────────────────────── + + describe("27. collateral vs debt divergence", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + }); + + it("27.1 spot between min and max", async () => { + await mockOracle.setPrice(assetA, SPOT_PRICE); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal( + (await oracle.assetProtectionConfig(assetA)).maxPrice, + ); + }); + + it("27.2 spot below min", async () => { + const lowSpot = parseUnits("0.8", 18); + await mockOracle.setPrice(assetA, lowSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(lowSpot); + }); + + it("27.3 spot above max", async () => { + const state = await oracle.assetProtectionConfig(assetA); + const highSpot = state.maxPrice.add(parseUnits("0.5", 18)); + await mockOracle.setPrice(assetA, highSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(highSpot); + }); + + it("27.4 price normalizes but protection still active -- bounded pricing still applies", async () => { + await mockOracle.setPrice(assetA, SPOT_PRICE); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + const state = await oracle.assetProtectionConfig(assetA); + + // Protection is time-gated, not price-gated + expect(collateral).to.equal(MIN_PRICE); + expect(debt).to.equal(state.maxPrice); + expect(collateral).to.not.equal(SPOT_PRICE); + expect(debt).to.not.equal(SPOT_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 28. Multiple Assets Independence + // ──────────────────────────────────────────────────────────────────── + + describe("28. multiple assets independence", () => { + it("28.1 trigger on one, other unaffected", async () => { + await initAssetWithWindow(assetA); + await initAssetWithWindow(assetB); + + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenB.address)).to.equal(SPOT_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 29. Whitelist Round-Trip + // ──────────────────────────────────────────────────────────────────── + + describe("29. whitelist round-trip", () => { + it("29.1 disable returns spot, re-enable resumes bounded pricing", async () => { + await initAssetWithWindow(assetA); + const pumpSpot = parseUnits("1.2", 18); + await mockOracle.setPrice(assetA, pumpSpot); + + await oracle.setAssetBoundedPricingEnabled(assetA, false); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(pumpSpot); + + await oracle.setAssetBoundedPricingEnabled(assetA, true); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 30. Sequential Calls in Same Tx + // ──────────────────────────────────────────────────────────────────── + + describe("30. sequential calls in same tx", () => { + it("30.1 two consecutive non-view calls", async () => { + await initAssetWithWindow(assetA); + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + + const result = await caller.callStatic.twoConsecutiveNonViewCollateral(vTokenA.address); + expect(result.first).to.equal(MIN_PRICE); + expect(result.second).to.equal(MIN_PRICE); + }); + + it("30.2 updateProtectionState then non-view reads cache", async () => { + await initAssetWithWindow(assetA); + await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); + expect(await caller.callStatic.updateThenNonViewCollateral(vTokenA.address)).to.equal(MIN_PRICE); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 31. Atomic Expansion + Trigger + // ──────────────────────────────────────────────────────────────────── + + describe("31. atomic expansion + trigger", () => { + it("31.1 spot jumps far above maxPrice", async () => { + await initAssetWithWindow(assetA); + const bigPump = parseUnits("2", 18); + await mockOracle.setPrice(assetA, bigPump); + + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, bigPump); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 32. Boundary Precision + // ──────────────────────────────────────────────────────────────────── + + describe("32. boundary precision", () => { + it("32.1 exact boundary does NOT trigger, +1 triggers", async () => { + await initAssetWithWindow(assetA); + const upperBound = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE); + + await mockOracle.setPrice(assetA, upperBound); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + + await mockOracle.setPrice(assetA, upperBound.add(1)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + }); + + it("32.2 reset threshold strict inequality", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const state = await oracle.assetProtectionConfig(assetA); + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const trigger = rangeRatio.add(parseUnits("0.01", 18)); + + await oracle.setThresholds(assetA, trigger, rangeRatio); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + oracle, + "PriceRangeNotConverged", + ); + + if (rangeRatio.add(1).lt(trigger)) { + await oracle.setThresholds(assetA, trigger, rangeRatio.add(1)); + await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + } + }); + + it("32.3 deadband strict inequality", async () => { + await initAssetWithWindow(assetA); + const exact = MIN_PRICE.mul(EXP_SCALE.sub(KEEPER_DEADBAND)).div(EXP_SCALE); + + const [noUpdate] = await oracle.checkAndGetWindowDrift([assetA], [exact], [MAX_PRICE]); + expect(noUpdate[0]).to.equal(false); + + const [yesUpdate] = await oracle.checkAndGetWindowDrift([assetA], [exact.sub(1)], [MAX_PRICE]); + expect(yesUpdate[0]).to.equal(true); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 33. Dual-Price API + // ──────────────────────────────────────────────────────────────────── + + describe("33. dual-price API", () => { + it("33.1 updateProtectionState -> getBoundedPricesView returns cached", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + const state = await oracle.assetProtectionConfig(assetA); + expect(result.collateral).to.equal(MIN_PRICE); + expect(result.debt).to.equal(state.maxPrice); + }); + + it("33.2 getBoundedPrices matches individual functions", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const [c, d] = await oracle.callStatic.getBoundedPrices(vTokenA.address); + expect(c).to.equal(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)); + expect(d).to.equal(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)); + }); + + it("33.3 getBoundedPricesView matches individual views", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await mockOracle.setPrice(assetA, SPOT_PRICE); + + const [c, d] = await oracle.getBoundedPricesView(vTokenA.address); + expect(c).to.equal(await oracle.getBoundedCollateralPriceView(vTokenA.address)); + expect(d).to.equal(await oracle.getBoundedDebtPriceView(vTokenA.address)); + }); + }); + }); +} From 1af785bf880371cfc71f822603bec3a8a923deb3 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 8 Apr 2026 19:54:47 +0530 Subject: [PATCH 08/30] refactor: eliminate redundant storage reads and implicit returns in DeviationBoundedOracle --- contracts/DeviationBoundedOracle.sol | 46 +++++++++++++------ .../test/DeviationBoundedOracleCaller.sol | 10 ++-- deploy/28-deploy-deviation-bounded-oracle.ts | 6 +-- hardhat.config.ts | 10 ++++ scripts/checkGuardianAccess.ts | 8 +--- test/DeviationBoundedOracle.ts | 24 +++++----- test/DeviationBoundedOracleE2E.ts | 8 ++-- test/fork/DeviationBoundedOracle.ts | 6 ++- 8 files changed, 71 insertions(+), 47 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index aba5b9c3..f64c54f7 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -249,6 +249,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function disableActiveProtection(address asset) external { _checkAccessAllowed("disableActiveProtection(address)"); + ensureNonzeroAddress(asset); + _ensureInitialized(asset); MarketProtectionState storage state = assetProtectionConfig[asset]; @@ -392,6 +394,15 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { revert ProtectedPriceActive(asset); } + if (state.isBoundedPricingEnabled == enabled) return; + + // reset the window if re-enabling + if (enabled) { + uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset)); + state.minPrice = spotU128; + state.maxPrice = spotU128; + } + state.isBoundedPricingEnabled = enabled; emit BoundedPricingWhitelistUpdated(asset, enabled); } @@ -542,14 +553,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { _setCachedPrices(asset, spot, spot); return (spot, spot); } - _expandPriceWindow(state, spot, asset); - _checkAndTriggerProtection(state, spot, asset); - (minPrice, maxPrice) = _resolveBoundedPrices( - state.isProtectedPriceActive, - spot, - uint256(state.minPrice), - uint256(state.maxPrice) - ); + (uint128 updatedMin, uint128 updatedMax) = _expandPriceWindow(state, spot, asset); + bool protectionActive = _checkAndTriggerProtection(state, spot, asset); + (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax)); _setCachedPrices(asset, minPrice, maxPrice); } @@ -559,14 +565,23 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param spot The current spot price * @param asset The underlying asset address (for event emission) */ - function _expandPriceWindow(MarketProtectionState storage state, uint256 spot, address asset) internal { + function _expandPriceWindow( + MarketProtectionState storage state, + uint256 spot, + address asset + ) internal returns (uint128, uint128) { uint128 spotU128 = _safeToUint128(spot); - if (spotU128 < state.minPrice) { + uint128 currentMin = state.minPrice; + uint128 currentMax = state.maxPrice; + if (spotU128 < currentMin) { _setMinPrice(state, asset, spotU128); + currentMin = spotU128; } - if (spotU128 > state.maxPrice) { + if (spotU128 > currentMax) { _setMaxPrice(state, asset, spotU128); + currentMax = spotU128; } + return (currentMin, currentMax); } /** @@ -575,13 +590,18 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param spot The current spot price * @param asset The underlying asset address (for event emission) */ - function _checkAndTriggerProtection(MarketProtectionState storage state, uint256 spot, address asset) internal { - if (state.isProtectedPriceActive) return; + function _checkAndTriggerProtection( + MarketProtectionState storage state, + uint256 spot, + address asset + ) internal returns (bool triggered) { + if (state.isProtectedPriceActive) return true; if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) { state.isProtectedPriceActive = true; state.lastProtectionTriggeredAt = uint64(block.timestamp); emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); + return true; } } diff --git a/contracts/test/DeviationBoundedOracleCaller.sol b/contracts/test/DeviationBoundedOracleCaller.sol index 548090b6..691032fb 100644 --- a/contracts/test/DeviationBoundedOracleCaller.sol +++ b/contracts/test/DeviationBoundedOracleCaller.sol @@ -28,11 +28,6 @@ contract DeviationBoundedOracleCaller { debt = oracle.getBoundedDebtPriceView(vToken); } - function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) { - collateral = oracle.getBoundedCollateralPriceView(vToken); - debt = oracle.getBoundedDebtPriceView(vToken); - } - function updateThenNonViewCollateral(address vToken) external returns (uint256) { oracle.updateProtectionState(vToken); return oracle.getBoundedCollateralPrice(vToken); @@ -54,4 +49,9 @@ contract DeviationBoundedOracleCaller { oracle.updateProtectionState(vTokenA); return oracle.getBoundedCollateralPriceView(vTokenB); } + + function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) { + collateral = oracle.getBoundedCollateralPriceView(vToken); + debt = oracle.getBoundedDebtPriceView(vToken); + } } diff --git a/deploy/28-deploy-deviation-bounded-oracle.ts b/deploy/28-deploy-deviation-bounded-oracle.ts index 6febf337..b174a60f 100644 --- a/deploy/28-deploy-deviation-bounded-oracle.ts +++ b/deploy/28-deploy-deviation-bounded-oracle.ts @@ -4,11 +4,7 @@ import { HardhatRuntimeEnvironment } from "hardhat/types"; import { ADDRESSES } from "../helpers/deploymentConfig"; -const func: DeployFunction = async function ({ - getNamedAccounts, - deployments, - network, -}: HardhatRuntimeEnvironment) { +const func: DeployFunction = async function ({ getNamedAccounts, deployments, network }: HardhatRuntimeEnvironment) { const { deploy } = deployments; const { deployer } = await getNamedAccounts(); diff --git a/hardhat.config.ts b/hardhat.config.ts index 70a88519..b9337e0d 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -41,6 +41,16 @@ function isFork() { }, live: false, saveDeployments: false, + chains: { + 56: { + hardforkHistory: { + berlin: 0, + london: 13_000_000, + shanghai: 39_539_137, + cancun: 40_790_075, + }, + }, + }, } : { allowUnlimitedContractSize: true, diff --git a/scripts/checkGuardianAccess.ts b/scripts/checkGuardianAccess.ts index 3f5ca7f0..8c3f574c 100644 --- a/scripts/checkGuardianAccess.ts +++ b/scripts/checkGuardianAccess.ts @@ -10,9 +10,7 @@ const ACCOUNTS = { "Critical Timelock": "0xbfbc79D4198963e4a66270F3EfB1fdA0F382E49c", }; -const ACM_ABI = [ - "function hasRole(bytes32 role, address account) external view returns (bool)", -]; +const ACM_ABI = ["function hasRole(bytes32 role, address account) external view returns (bool)"]; const FUNCTIONS = [ "setTokenConfig(TokenConfig)", @@ -32,9 +30,7 @@ async function main() { console.log(`--- ${name} (${address}) ---`); for (const fn of FUNCTIONS) { // Replicate ACM logic: role = keccak256(abi.encodePacked(callingContract, functionSig)) - const role = ethers.utils.keccak256( - ethers.utils.solidityPack(["address", "string"], [RESILIENT_ORACLE, fn]), - ); + const role = ethers.utils.keccak256(ethers.utils.solidityPack(["address", "string"], [RESILIENT_ORACLE, fn])); const allowed = await acm.hasRole(role, address); console.log(` ${allowed ? "✅" : "❌"} ${fn}`); } diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 7ea4ed98..e9d73dda 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -410,9 +410,9 @@ describe("DeviationBoundedOracle", () => { expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); }); - it("setAssetBoundedPricingEnabled(true) on already-enabled succeeds", async () => { + it("setAssetBoundedPricingEnabled(true) on already-enabled is a no-op", async () => { const tx = await oracle.setAssetBoundedPricingEnabled(assetA, true); - await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + await expect(tx).to.not.emit(oracle, "BoundedPricingWhitelistUpdated"); }); it("reverts when caller is unauthorized", async () => { @@ -681,10 +681,7 @@ describe("DeviationBoundedOracle", () => { resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); }); it("reverts when range not converged", async () => { @@ -1202,7 +1199,14 @@ describe("DeviationBoundedOracle", () => { it("expands window without triggering protection", async () => { // Use 30% threshold so spot=1.15 expands max but stays under upperBound (0.9 * 1.3 = 1.17) - await initAssetWithWindow(assetB, MIN_PRICE, MAX_PRICE, DEFAULT_COOLDOWN, parseUnits("0.3", 18), DEFAULT_RESET_THRESHOLD); + await initAssetWithWindow( + assetB, + MIN_PRICE, + MAX_PRICE, + DEFAULT_COOLDOWN, + parseUnits("0.3", 18), + DEFAULT_RESET_THRESHOLD, + ); const spot = parseUnits("1.15", 18); resilientOracle.getPrice.whenCalledWith(assetB).returns(spot); @@ -1467,11 +1471,7 @@ describe("DeviationBoundedOracle", () => { }); it("returns false when both prices equal (drift = 0)", async () => { - const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift( - [assetA], - [MIN_PRICE], - [MAX_PRICE], - ); + const [needsMinUpdate, needsMaxUpdate] = await oracle.checkAndGetWindowDrift([assetA], [MIN_PRICE], [MAX_PRICE]); expect(needsMinUpdate[0]).to.equal(false); expect(needsMaxUpdate[0]).to.equal(false); }); diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index fe4520c1..053b1326 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -604,7 +604,7 @@ describe("DeviationBoundedOracle E2E", () => { // ──────────────────────────────────────────────────────────────────────── describe("E2E-8: setAssetBoundedPricingEnabled round-trip", () => { - it("8a: disable returns spot, re-enable resumes bounded pricing", async () => { + it("8a: disable returns spot, re-enable resets window to current spot", async () => { await initAssetWithWindow(assetA); // Set pump spot that would trigger: 1.2 > upperBound 1.08 @@ -616,11 +616,11 @@ describe("DeviationBoundedOracle E2E", () => { const priceDisabled = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); expect(priceDisabled).to.equal(pumpSpot); - // Re-enable → bounded pricing resumes with existing window + // Re-enable → window resets to current spot (min=max=pumpSpot) await oracle.setAssetBoundedPricingEnabled(assetA, true); - // View with simulated trigger returns bounded price: min(1.2, 0.9) = 0.9 + // Fresh window at pumpSpot, no deviation → returns spot const priceReEnabled = await oracle.getBoundedCollateralPriceView(vTokenA.address); - expect(priceReEnabled).to.equal(MIN_PRICE); + expect(priceReEnabled).to.equal(pumpSpot); }); }); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index e7eab825..4062a5d6 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -696,6 +696,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("10.7 returns spot for uninitialized asset", async () => { expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(SPOT_PRICE); }); it("10.8 resolves native market to NATIVE_TOKEN_ADDR", async () => { @@ -1277,7 +1278,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // ──────────────────────────────────────────────────────────────────── describe("29. whitelist round-trip", () => { - it("29.1 disable returns spot, re-enable resumes bounded pricing", async () => { + it("29.1 disable returns spot, re-enable resets window to current spot", async () => { await initAssetWithWindow(assetA); const pumpSpot = parseUnits("1.2", 18); await mockOracle.setPrice(assetA, pumpSpot); @@ -1285,8 +1286,9 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await oracle.setAssetBoundedPricingEnabled(assetA, false); expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(pumpSpot); + // Re-enable resets window to current spot (min=max=pumpSpot), no deviation await oracle.setAssetBoundedPricingEnabled(assetA, true); - expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); + expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(pumpSpot); }); }); From 58ce852156a93eb10405aa82063a91e4e54808a2 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Fri, 10 Apr 2026 17:29:13 +0530 Subject: [PATCH 09/30] feat: add setTokenConfigs batch function, rename protection state fields, and fix NatSpec --- contracts/DeviationBoundedOracle.sol | 170 ++++++--- .../interfaces/IDeviationBoundedOracle.sol | 44 ++- test/DeviationBoundedOracle.ts | 327 ++++++++++++++--- test/DeviationBoundedOracleE2E.ts | 238 ++++++++++--- test/fork/DeviationBoundedOracle.ts | 336 +++++++++++++++--- 5 files changed, 898 insertions(+), 217 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index f64c54f7..c15d153a 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -1,5 +1,4 @@ // SPDX-License-Identifier: BSD-3-Clause -// SPDX-FileCopyrightText: 2024 Venus pragma solidity 0.8.25; import { VBep20Interface } from "./interfaces/VBep20Interface.sol"; @@ -247,14 +246,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @custom:error PriceRangeNotConverged if window range is still above exit threshold * @custom:event ProtectedPriceDisabled */ - function disableActiveProtection(address asset) external { - _checkAccessAllowed("disableActiveProtection(address)"); + function disableActiveProtectedPrice(address asset) external { + _checkAccessAllowed("disableActiveProtectedPrice(address)"); ensureNonzeroAddress(asset); - _ensureInitialized(asset); - - MarketProtectionState storage state = assetProtectionConfig[asset]; + MarketProtectionState storage state = _ensureInitialized(asset); - if (!state.isProtectedPriceActive) revert ProtectedPriceInactive(asset); + if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset); if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) { revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod); @@ -266,7 +263,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold); } - state.isProtectedPriceActive = false; + state.currentlyUsingProtectedPrice = false; + state.lastProtectionTriggeredAt = 0; emit ProtectedPriceDisabled(asset); } @@ -274,20 +272,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Initializes protection for a new asset - * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window, - * confirming the oracle is live for this asset before it is listed. Both bounds start at - * spot so the window expands naturally as prices move. Can only be called once per asset. * @param asset The underlying asset address * @param cooldownPeriod Minimum time protection stays active after last trigger * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. + * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization * @custom:access Only Governance - * @custom:error MarketAlreadyInitialized if the asset has already been initialized - * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% - * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% - * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold - * @custom:error VAINotAllowed if asset is the VAI token - * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event ProtectionInitialized * @custom:event BoundedPricingWhitelistUpdated */ @@ -295,37 +285,51 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { address asset, uint64 cooldownPeriod, uint256 triggerThreshold, - uint256 resetThreshold + uint256 resetThreshold, + bool enableBoundedPricing ) external { - _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256)"); - ensureNonzeroAddress(asset); - ensureNonzeroValue(cooldownPeriod); - ensureNonzeroValue(triggerThreshold); - ensureNonzeroValue(resetThreshold); - if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset); - if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD); - if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD); - if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold); - if (asset == vai) revert VAINotAllowed(); - - uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset)); - - assetProtectionConfig[asset] = MarketProtectionState({ - minPrice: spotU128, - maxPrice: spotU128, - isProtectedPriceActive: false, - isBoundedPricingEnabled: true, - lastProtectionTriggeredAt: 0, - cooldownPeriod: cooldownPeriod, - asset: asset, - triggerThreshold: uint128(triggerThreshold), - resetThreshold: uint128(resetThreshold) - }); + _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256,bool)"); + _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing); + } - allAssets.push(asset); + /** + * @notice Batch-initializes protection for multiple assets in a single transaction + * @param assets Array of underlying asset addresses + * @param cooldownPeriods Array of cooldown periods (seconds) + * @param triggerThresholds Array of trigger thresholds (mantissa) + * @param resetThresholds Array of reset thresholds (mantissa) + * @param enableBoundedPricings Array of whether to enable bounded pricing per asset + * @custom:access Only Governance + * @custom:error InvalidArrayLength if array lengths do not match + * @custom:event ProtectionInitialized for each asset + * @custom:event BoundedPricingWhitelistUpdated for each asset + */ + function setTokenConfigs( + address[] calldata assets, + uint64[] calldata cooldownPeriods, + uint256[] calldata triggerThresholds, + uint256[] calldata resetThresholds, + bool[] calldata enableBoundedPricings + ) external { + _checkAccessAllowed("setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])"); + uint256 len = assets.length; + if ( + len == 0 || + len != cooldownPeriods.length || + len != triggerThresholds.length || + len != resetThresholds.length || + len != enableBoundedPricings.length + ) revert InvalidArrayLength(); - emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold); - emit BoundedPricingWhitelistUpdated(asset, true); + for (uint256 i; i < len; ++i) { + _setTokenConfig( + assets[i], + cooldownPeriods[i], + triggerThresholds[i], + resetThresholds[i], + enableBoundedPricings[i] + ); + } } /** @@ -382,6 +386,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param asset The underlying asset address * @param enabled Whether bounded pricing should be enabled for the asset * @custom:access Only Governance + * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active * @custom:event BoundedPricingWhitelistUpdated */ function setAssetBoundedPricingEnabled(address asset, bool enabled) external { @@ -390,7 +395,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { MarketProtectionState storage state = _ensureInitialized(asset); - if (!enabled && state.isProtectedPriceActive) { + if (!enabled && state.currentlyUsingProtectedPrice) { revert ProtectedPriceActive(asset); } @@ -427,12 +432,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @notice Checks if protection is currently active for an asset + * @notice Checks if the asset is currently using the protected (bounded) price * @param asset The underlying asset address - * @return True if protected price is active + * @return True if the asset is currently using the protected price instead of spot */ - function isProtectedPriceActive(address asset) external view returns (bool) { - return assetProtectionConfig[asset].isProtectedPriceActive; + function currentlyUsingProtectedPrice(address asset) external view returns (bool) { + return assetProtectionConfig[asset].currentlyUsingProtectedPrice; } /** @@ -468,7 +473,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { function canExitProtection(address asset) external view returns (bool) { MarketProtectionState storage state = assetProtectionConfig[asset]; return - state.isProtectedPriceActive && + state.currentlyUsingProtectedPrice && block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) && _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold; } @@ -505,6 +510,60 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { // ----- Internal functions ----- + /** + * @notice Initializes protection parameters and price window for a single asset + * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window, + * confirming the oracle is live for this asset before it is listed. Both bounds start at + * spot so the window expands naturally as prices move. Can only be called once per asset. + * @param asset The underlying asset address + * @param cooldownPeriod Minimum time protection stays active after last trigger + * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. + * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. + * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization + * @custom:error MarketAlreadyInitialized if the asset has already been initialized + * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% + * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold + * @custom:error VAINotAllowed if asset is the VAI token + * @custom:error PriceExceedsUint128 if the spot price overflows uint128 + */ + function _setTokenConfig( + address asset, + uint64 cooldownPeriod, + uint256 triggerThreshold, + uint256 resetThreshold, + bool enableBoundedPricing + ) internal { + ensureNonzeroAddress(asset); + ensureNonzeroValue(cooldownPeriod); + ensureNonzeroValue(triggerThreshold); + ensureNonzeroValue(resetThreshold); + if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset); + if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD); + if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD); + if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold); + if (asset == vai) revert VAINotAllowed(); + + uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset)); + + assetProtectionConfig[asset] = MarketProtectionState({ + minPrice: spotU128, + maxPrice: spotU128, + currentlyUsingProtectedPrice: false, + isBoundedPricingEnabled: enableBoundedPricing, + lastProtectionTriggeredAt: 0, + cooldownPeriod: cooldownPeriod, + asset: asset, + triggerThreshold: uint128(triggerThreshold), + resetThreshold: uint128(resetThreshold) + }); + + allAssets.push(asset); + + emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold); + emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing); + } + /** * @notice Validates and applies a keeper-provided min or max price update * @param asset The underlying asset address @@ -595,14 +654,15 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint256 spot, address asset ) internal returns (bool triggered) { - if (state.isProtectedPriceActive) return true; - if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) { - state.isProtectedPriceActive = true; state.lastProtectionTriggeredAt = uint64(block.timestamp); + if (!state.currentlyUsingProtectedPrice) { + state.currentlyUsingProtectedPrice = true; + } emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); return true; } + if (state.currentlyUsingProtectedPrice) return true; } /** @@ -652,7 +712,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice; uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice; - bool shouldProtect = state.isProtectedPriceActive || + bool shouldProtect = state.currentlyUsingProtectedPrice || _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold); (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128)); diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index 0672c716..a6f2fa23 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: BSD-3-Clause -pragma solidity ^0.8.25; +pragma solidity 0.8.25; interface IDeviationBoundedOracle { // --- Enums --- @@ -18,8 +18,8 @@ interface IDeviationBoundedOracle { uint128 minPrice; /// @notice Highest price observed in the current window uint128 maxPrice; - /// @notice Whether protected price is currently active - bool isProtectedPriceActive; + /// @notice Whether protected price is currently being used + bool currentlyUsingProtectedPrice; /// @notice Whether this market is whitelisted for bounded pricing bool isBoundedPricingEnabled; /// @notice Timestamp of the last protection trigger — reset on every trigger @@ -231,18 +231,19 @@ interface IDeviationBoundedOracle { * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold * @custom:event ProtectedPriceDisabled */ - function disableActiveProtection(address asset) external; + function disableActiveProtectedPrice(address asset) external; // --- Admin functions (governance-gated) --- /** - * @notice Initializes protection parameters for a new asset and whitelists it + * @notice Initializes protection parameters for a new asset * @dev Seeds the initial min/max window from the current ResilientOracle spot price, * confirming the oracle is live for this asset before it is listed. * @param asset The underlying asset address * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. + * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization * @custom:access Only Governance * @custom:error MarketAlreadyInitialized if the asset has already been initialized * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% @@ -257,7 +258,28 @@ interface IDeviationBoundedOracle { address asset, uint64 cooldownPeriod, uint256 triggerThreshold, - uint256 resetThreshold + uint256 resetThreshold, + bool enableBoundedPricing + ) external; + + /** + * @notice Batch-initializes protection parameters for multiple assets in a single transaction + * @param assets Array of underlying asset addresses + * @param cooldownPeriods Array of cooldown periods (seconds) + * @param triggerThresholds Array of trigger thresholds (mantissa) + * @param resetThresholds Array of reset thresholds (mantissa) + * @param enableBoundedPricings Array of whether to enable bounded pricing per asset + * @custom:access Only Governance + * @custom:error InvalidArrayLength if array lengths do not match + * @custom:event ProtectionInitialized for each asset + * @custom:event BoundedPricingWhitelistUpdated for each asset + */ + function setTokenConfigs( + address[] calldata assets, + uint64[] calldata cooldownPeriods, + uint256[] calldata triggerThresholds, + uint256[] calldata resetThresholds, + bool[] calldata enableBoundedPricings ) external; /** @@ -303,7 +325,7 @@ interface IDeviationBoundedOracle { * @param asset The underlying asset address * @return minPrice Lowest price observed in the current window * @return maxPrice Highest price observed in the current window - * @return isProtectedPriceActive Whether protected price is currently active + * @return currentlyUsingProtectedPrice Whether protected price is currently active * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing * @return lastProtectionTriggeredAt Timestamp of the last protection trigger * @return cooldownPeriod Minimum time protection stays active after last trigger @@ -319,7 +341,7 @@ interface IDeviationBoundedOracle { returns ( uint128 minPrice, uint128 maxPrice, - bool isProtectedPriceActive, + bool currentlyUsingProtectedPrice, bool isBoundedPricingEnabled, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod, @@ -336,11 +358,11 @@ interface IDeviationBoundedOracle { function isBoundedPricingEnabled(address asset) external view returns (bool); /** - * @notice Checks if protection is currently active for an asset + * @notice Checks if the asset is currently using the protected (bounded) price * @param asset The underlying asset address - * @return True if protected price is active + * @return True if the asset is currently using the protected price instead of spot */ - function isProtectedPriceActive(address asset) external view returns (bool); + function currentlyUsingProtectedPrice(address asset) external view returns (bool); /** * @notice Checks if protection can be exited for a given asset diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index e9d73dda..fba4bcba 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -51,7 +51,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); }; // Init + widen window via keeper updates (for price-bounding tests that need min=0.9, max=1.1) @@ -63,7 +63,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -141,13 +141,19 @@ describe("DeviationBoundedOracle", () => { describe("setTokenConfig", () => { describe("happy path", () => { it("sets all struct fields, emits events, updates asset lists", async () => { - const tx = await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + const tx = await oracle.setTokenConfig( + assetA, + DEFAULT_COOLDOWN, + DEFAULT_THRESHOLD, + DEFAULT_RESET_THRESHOLD, + true, + ); // Verify struct fields via public getter const state = await oracle.assetProtectionConfig(assetA); expect(state.minPrice).to.equal(SPOT_PRICE); expect(state.maxPrice).to.equal(SPOT_PRICE); - expect(state.isProtectedPriceActive).to.equal(false); + expect(state.currentlyUsingProtectedPrice).to.equal(false); expect(state.isBoundedPricingEnabled).to.equal(true); expect(state.lastProtectionTriggeredAt).to.equal(0); expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); @@ -169,69 +175,89 @@ describe("DeviationBoundedOracle", () => { const whitelisted = await oracle.getAllBoundedPricingEnabledAssets(); expect(whitelisted).to.include(assetA); }); + + it("initializes with bounded pricing disabled when enableBoundedPricing is false", async () => { + const tx = await oracle.setTokenConfig( + assetA, + DEFAULT_COOLDOWN, + DEFAULT_THRESHOLD, + DEFAULT_RESET_THRESHOLD, + false, + ); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.isBoundedPricingEnabled).to.equal(false); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, false); + + // Price functions return spot (not bounded) even with deviation + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(price).to.equal(pumpSpot); + }); }); describe("revert branches", () => { it("reverts when caller is unauthorized", async () => { acm.isAllowedToCall.returns(false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when asset is zero address", async () => { await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); }); it("reverts when already initialized", async () => { await initAsset(assetA); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); it("reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("reverts when asset is VAI", async () => { const vaiAddr = await vaiToken.underlying(); await expect( - oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); }); it("reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); @@ -239,7 +265,7 @@ describe("DeviationBoundedOracle", () => { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); @@ -247,12 +273,115 @@ describe("DeviationBoundedOracle", () => { const overflowPrice = BigNumber.from(2).pow(128); resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); }); }); }); + // ──────────────────────────────────────────────────────────────────────── + // 3b. setTokenConfigs (batch) + // ──────────────────────────────────────────────────────────────────────── + + describe("setTokenConfigs (batch)", () => { + it("batch-initializes multiple assets, verifies structs and events", async () => { + const tx = await oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, true], + ); + + // Verify both assets initialized + const stateA = await oracle.assetProtectionConfig(assetA); + expect(stateA.asset).to.equal(assetA); + expect(stateA.isBoundedPricingEnabled).to.equal(true); + expect(stateA.minPrice).to.equal(SPOT_PRICE); + + const stateB = await oracle.assetProtectionConfig(assetB); + expect(stateB.asset).to.equal(assetB); + expect(stateB.isBoundedPricingEnabled).to.equal(true); + + // Verify events for both + await expect(tx) + .to.emit(oracle, "ProtectionInitialized") + .withArgs(assetA, SPOT_PRICE, SPOT_PRICE, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD); + await expect(tx) + .to.emit(oracle, "ProtectionInitialized") + .withArgs(assetB, SPOT_PRICE, SPOT_PRICE, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetB, true); + + const initialized = await oracle.getInitializedAssets(); + expect(initialized.length).to.equal(2); + }); + + it("batch with mixed enableBoundedPricing values", async () => { + await oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, false], + ); + + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + expect(await oracle.isBoundedPricingEnabled(assetB)).to.equal(false); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect( + oracle.setTokenConfigs([assetA], [DEFAULT_COOLDOWN], [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true]), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when array lengths mismatch", async () => { + await expect( + oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD], + [true], + ), + ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + }); + + it("reverts when one asset in batch is invalid (entire tx reverts)", async () => { + await expect( + oracle.setTokenConfigs( + [assetA, addr0000], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, true], + ), + ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + }); + + it("reverts when one asset is already initialized", async () => { + await initAsset(assetA); + await expect( + oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, true], + ), + ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + }); + + it("succeeds with empty arrays (no-op)", async () => { + await expect(oracle.setTokenConfigs([], [], [], [], [])).to.be.revertedWithCustomError( + oracle, + "InvalidArrayLength", + ); + }); + }); + // ──────────────────────────────────────────────────────────────────────── // 4. setCooldownPeriod // ──────────────────────────────────────────────────────────────────────── @@ -444,7 +573,7 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetB).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenB.address); - expect(await oracle.isProtectedPriceActive(assetB)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetB)).to.equal(true); await expect(oracle.setAssetBoundedPricingEnabled(assetB, false)).to.be.revertedWithCustomError( oracle, @@ -587,10 +716,10 @@ describe("DeviationBoundedOracle", () => { }); // ──────────────────────────────────────────────────────────────────────── - // 9. disableActiveProtection + // 9. disableActiveProtectedPrice // ──────────────────────────────────────────────────────────────────────── - describe("disableActiveProtection", () => { + describe("disableActiveProtectedPrice", () => { it("disables protection after governance raises reset threshold", async () => { await initAssetWithWindow(assetA); @@ -598,7 +727,7 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Wait cooldown await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); @@ -618,19 +747,19 @@ describe("DeviationBoundedOracle", () => { await oracle.setThresholds(assetA, currentTrigger, newResetThreshold); } - const tx = await oracle.disableActiveProtection(assetA); + const tx = await oracle.disableActiveProtectedPrice(assetA); await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); - it("prices revert to spot after disableActiveProtection", async () => { + it("prices revert to spot after disableActiveProtectedPrice", async () => { await initAssetWithWindow(assetA); // Trigger via pump const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // During protection: collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE (bounded) const boundedCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); @@ -648,7 +777,12 @@ describe("DeviationBoundedOracle", () => { } else { await oracle.setThresholds(assetA, currentTrigger, newReset); } - await oracle.disableActiveProtection(assetA); + await oracle.disableActiveProtectedPrice(assetA); + + // Verify lastProtectionTriggeredAt is reset to 0 on disable + const stateDisabled = await oracle.assetProtectionConfig(assetA); + expect(stateDisabled.lastProtectionTriggeredAt).to.equal(0); + expect(stateDisabled.currentlyUsingProtectedPrice).to.equal(false); // After disable: set spot back to normal resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); @@ -663,12 +797,12 @@ describe("DeviationBoundedOracle", () => { it("reverts when caller is unauthorized", async () => { await initAsset(assetA); acm.isAllowedToCall.returns(false); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError(oracle, "Unauthorized"); + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when protection is not active", async () => { await initAsset(assetA); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "ProtectedPriceInactive", ); @@ -681,7 +815,10 @@ describe("DeviationBoundedOracle", () => { resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); }); it("reverts when range not converged", async () => { @@ -696,7 +833,7 @@ describe("DeviationBoundedOracle", () => { await ethers.provider.send("evm_mine", []); // Range still wide -> reverts - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); @@ -726,7 +863,7 @@ describe("DeviationBoundedOracle", () => { } // Set resetThreshold = rangeRatio (exactly equal, should revert since >=) - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); @@ -755,7 +892,7 @@ describe("DeviationBoundedOracle", () => { await oracle.setThresholds(assetA, currentTrigger, rangeRatio.add(1)); } - await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; }); }); @@ -810,7 +947,7 @@ describe("DeviationBoundedOracle", () => { await expect(tx).to.emit(oracle, "ProtectionTriggered"); // Verify state - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Read bounded price after trigger (protection already active, no re-trigger) // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE @@ -845,22 +982,22 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); - // Spot drops below min — window should expand downward despite protection being active + // Spot drops below min — window expands downward, deviation still exceeded so event re-emitted const lowSpot = parseUnits("0.8", 18); resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); const tx1 = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx1).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, lowSpot); - await expect(tx1).to.not.emit(oracle, "ProtectionTriggered"); + await expect(tx1).to.emit(oracle, "ProtectionTriggered"); - // Spot rises above current max — window should expand upward + // Spot rises above current max — window expands upward, deviation still exceeded const stateAfterMin = await oracle.assetProtectionConfig(assetA); const highSpot = stateAfterMin.maxPrice.add(parseUnits("0.5", 18)); resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); const tx2 = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx2).to.emit(oracle, "MaxPriceUpdated"); - await expect(tx2).to.not.emit(oracle, "ProtectionTriggered"); + await expect(tx2).to.emit(oracle, "ProtectionTriggered"); }); it("returns spot for uninitialized asset (setTokenConfig never called)", async () => { @@ -994,7 +1131,7 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE // After expansion max = pumpSpot (since pumpSpot > MAX_PRICE), debt = max(pumpSpot, pumpSpot) = pumpSpot @@ -1049,7 +1186,7 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // View should return bounded prices // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE @@ -1069,8 +1206,8 @@ describe("DeviationBoundedOracle", () => { // collateral = min(pumpSpot, MIN_PRICE) = MIN_PRICE expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); - // Verify isProtectedPriceActive is still false (no state mutation) - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + // Verify currentlyUsingProtectedPrice is still false (no state mutation) + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("view and non-view return identical prices when protection is active (pump)", async () => { @@ -1079,7 +1216,7 @@ describe("DeviationBoundedOracle", () => { const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Read from non-view (callStatic) and view const nonViewCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); @@ -1101,7 +1238,7 @@ describe("DeviationBoundedOracle", () => { const crashSpot = lowerBound.sub(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); const nonViewCollateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); const nonViewDebt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); @@ -1178,14 +1315,14 @@ describe("DeviationBoundedOracle", () => { const tx = await oracle.updateProtectionState(vTokenA.address); await expect(tx).to.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("is a no-op for non-whitelisted asset", async () => { await oracle.setAssetBoundedPricingEnabled(assetA, false); // Should not revert await expect(oracle.updateProtectionState(vTokenA.address)).to.not.be.reverted; - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { @@ -1214,7 +1351,7 @@ describe("DeviationBoundedOracle", () => { const tx = await oracle.updateProtectionState(vTokenB.address); await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetB, MAX_PRICE, spot); await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetB)).to.equal(false); }); it("triggers protection without expanding window", async () => { @@ -1228,7 +1365,7 @@ describe("DeviationBoundedOracle", () => { await expect(tx).to.emit(oracle, "ProtectionTriggered"); await expect(tx).to.not.emit(oracle, "MinPriceUpdated"); await expect(tx).to.not.emit(oracle, "MaxPriceUpdated"); - expect(await oracle.isProtectedPriceActive(assetB)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetB)).to.equal(true); }); }); @@ -1254,25 +1391,25 @@ describe("DeviationBoundedOracle", () => { }); // ──────────────────────────────────────────────────────────────────────── - // 17. isProtectedPriceActive + // 17. currentlyUsingProtectedPrice // ──────────────────────────────────────────────────────────────────────── - describe("isProtectedPriceActive", () => { + describe("currentlyUsingProtectedPrice", () => { it("returns true when protection is active", async () => { await initAssetWithWindow(assetA); const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("returns false when protection is not active", async () => { await initAsset(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("returns false for uninitialized asset", async () => { - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); }); @@ -1542,7 +1679,7 @@ describe("DeviationBoundedOracle", () => { const state = await oracle.assetProtectionConfig(assetA); expect(state.minPrice).to.equal(SPOT_PRICE); expect(state.maxPrice).to.equal(SPOT_PRICE); - expect(state.isProtectedPriceActive).to.equal(false); + expect(state.currentlyUsingProtectedPrice).to.equal(false); expect(state.isBoundedPricingEnabled).to.equal(true); expect(state.lastProtectionTriggeredAt).to.equal(0); expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); @@ -1551,4 +1688,88 @@ describe("DeviationBoundedOracle", () => { expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); }); }); + + // ──────────────────────────────────────────────────────────────────────── + // 23. Volatile price extends protection period + // ──────────────────────────────────────────────────────────────────────── + + describe("volatile price extends protection period", () => { + it("continued deviation updates lastProtectionTriggeredAt, extending cooldown", async () => { + await initAssetWithWindow(assetA); + + // 1. Trigger protection + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const state1 = await oracle.assetProtectionConfig(assetA); + const firstTriggerTime = state1.lastProtectionTriggeredAt; + + // 2. Advance time by half cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // 3. Another deviating price → updates lastProtectionTriggeredAt + const biggerPump = pumpSpot.add(parseUnits("0.2", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(biggerPump); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + const state2 = await oracle.assetProtectionConfig(assetA); + expect(state2.lastProtectionTriggeredAt).to.be.gt(firstTriggerTime); + + // 4. Advance time by half cooldown again (total = cooldown from initial trigger, + // but only half from the latest update) + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // 5. Try disable → should revert because cooldown restarted from the second trigger + const stateBeforeDisable = await oracle.assetProtectionConfig(assetA); + const range = stateBeforeDisable.maxPrice + .sub(stateBeforeDisable.minPrice) + .mul(EXP_SCALE) + .div(stateBeforeDisable.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const trigger = stateBeforeDisable.triggerThreshold; + if (newReset.gte(trigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, trigger, newReset); + } + + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + + // 6. Advance remaining half cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + // 7. Now disable succeeds + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + }); + + it("protection period does NOT extend when price returns within threshold", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + const pumpSpot2 = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot2); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const state1 = await oracle.assetProtectionConfig(assetA); + const triggerTime = state1.lastProtectionTriggeredAt; + + // Set price back within threshold + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Should NOT emit ProtectionTriggered, timestamp unchanged + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + const state2 = await oracle.assetProtectionConfig(assetA); + expect(state2.lastProtectionTriggeredAt).to.equal(triggerTime); + + // Protection still active (time-gated) + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + }); + }); }); diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 053b1326..18b43c72 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -90,7 +90,7 @@ describe("DeviationBoundedOracle E2E", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -119,7 +119,7 @@ describe("DeviationBoundedOracle E2E", () => { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(asset, newTrigger, newReset); - await oracle.disableActiveProtection(asset); + await oracle.disableActiveProtectedPrice(asset); }; // ──────────────────────────────────────────────────────────────────────── @@ -142,7 +142,7 @@ describe("DeviationBoundedOracle E2E", () => { it("1b: cache hit, protection already active — view returns bounded prices", async () => { // Trigger protection in prior tx await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Now updateProtectionState → view in same tx // Protection already active, _checkAndTriggerProtection returns early. @@ -169,7 +169,7 @@ describe("DeviationBoundedOracle E2E", () => { // Execute to verify state mutation await caller.updateAndGetBothPrices(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); const stateAfter = await oracle.assetProtectionConfig(assetA); expect(stateAfter.minPrice).to.equal(crashSpot); }); @@ -194,7 +194,7 @@ describe("DeviationBoundedOracle E2E", () => { expect(result.debt).to.equal(MAX_PRICE); // Verify no state mutation - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("1f: per-asset cache isolation — update A, view B has no cache", async () => { @@ -235,11 +235,11 @@ describe("DeviationBoundedOracle E2E", () => { // Trigger protection await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Disable protection (raise reset threshold to allow) await disableProtection(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // Extreme price move — another pump // After disable, window: min=0.9, max=pumpSpot (~1.08) @@ -250,7 +250,7 @@ describe("DeviationBoundedOracle E2E", () => { const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx).to.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Returns conservative price: min(1.2, 0.9) = 0.9 const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); @@ -263,18 +263,18 @@ describe("DeviationBoundedOracle E2E", () => { // Trigger + disable await triggerPump(assetA, vTokenA); await disableProtection(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // Extreme price move — 1.2 exceeds upperBound 1.08 const newPumpSpot = parseUnits("1.2", 18); resilientOracle.getPrice.whenCalledWith(assetA).returns(newPumpSpot); - // View simulates trigger — returns bounded price even though isProtectedPriceActive is false + // View simulates trigger — returns bounded price even though currentlyUsingProtectedPrice is false const collateral = await oracle.getBoundedCollateralPriceView(vTokenA.address); expect(collateral).to.equal(MIN_PRICE); - // isProtectedPriceActive still false (view doesn't mutate) - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + // currentlyUsingProtectedPrice still false (view doesn't mutate) + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("2c: lastProtectionTriggeredAt is fresh after re-trigger", async () => { @@ -303,11 +303,11 @@ describe("DeviationBoundedOracle E2E", () => { for (let cycle = 0; cycle < 3; cycle++) { // Use triggerPump which computes minimal pumpSpot from current threshold await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Disable (may raise thresholds to allow exit), then restore to defaults await disableProtection(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // Restore thresholds to defaults using single setThresholds call await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); @@ -327,14 +327,14 @@ describe("DeviationBoundedOracle E2E", () => { // Initialize with 30% threshold → upperBound = 0.9 * 1.3 = 1.17 const highThreshold = parseUnits("0.3", 18); const resetThreshold = parseUnits("0.15", 18); - await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold); + await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold, true); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); // Spot 1.15 < 1.17 → no trigger at 30% await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // Lower trigger threshold to 20%, keep reset at current value const state = await oracle.assetProtectionConfig(assetA); @@ -342,7 +342,7 @@ describe("DeviationBoundedOracle E2E", () => { const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx).to.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("3b: raising threshold prevents trigger", async () => { @@ -354,7 +354,7 @@ describe("DeviationBoundedOracle E2E", () => { await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // Verify spot is returned const price = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); @@ -374,18 +374,18 @@ describe("DeviationBoundedOracle E2E", () => { expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(spot); }); - it("3d: reset threshold interaction with disableActiveProtection", async () => { + it("3d: reset threshold interaction with disableActiveProtectedPrice", async () => { await initAssetWithWindow(assetA); // Trigger protection await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); await ethers.provider.send("evm_mine", []); // Current range is wide, reset threshold is 10% — too low to disable - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); @@ -397,7 +397,7 @@ describe("DeviationBoundedOracle E2E", () => { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, newTrigger, newReset); - await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; }); }); @@ -406,7 +406,7 @@ describe("DeviationBoundedOracle E2E", () => { // ──────────────────────────────────────────────────────────────────────── describe("E2E-4: no re-trigger when active, window still expands", () => { - it("4a: no re-trigger — lastProtectionTriggeredAt unchanged, no event", async () => { + it("4a: continued deviation updates lastProtectionTriggeredAt and re-emits event", async () => { await initAssetWithWindow(assetA); // Trigger @@ -414,37 +414,35 @@ describe("DeviationBoundedOracle E2E", () => { const stateAfterTrigger = await oracle.assetProtectionConfig(assetA); const triggerTime = stateAfterTrigger.lastProtectionTriggeredAt; - // Move price even further — should NOT re-trigger + // Move price even further — deviation still exceeded, so event re-emitted and timestamp updated const biggerPump = pumpSpot.add(parseUnits("0.5", 18)); resilientOracle.getPrice.whenCalledWith(assetA).returns(biggerPump); const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); - await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); const stateAfter = await oracle.assetProtectionConfig(assetA); - expect(stateAfter.lastProtectionTriggeredAt).to.equal(triggerTime); + expect(stateAfter.lastProtectionTriggeredAt).to.be.gte(triggerTime); }); - it("4b: window expands during active protection", async () => { + it("4b: window expands during active protection, deviation re-emits event", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - // Drop below min → min expands + // Drop below min → min expands, deviation exceeded → event re-emitted const lowSpot = parseUnits("0.8", 18); resilientOracle.getPrice.whenCalledWith(assetA).returns(lowSpot); const tx1 = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx1).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, lowSpot); + await expect(tx1).to.emit(oracle, "ProtectionTriggered"); - // Rise above current max → max expands + // Rise above current max → max expands, deviation exceeded → event re-emitted const stateAfterMin = await oracle.assetProtectionConfig(assetA); const highSpot = stateAfterMin.maxPrice.add(parseUnits("0.5", 18)); resilientOracle.getPrice.whenCalledWith(assetA).returns(highSpot); const tx2 = await oracle.getBoundedCollateralPrice(vTokenA.address); await expect(tx2).to.emit(oracle, "MaxPriceUpdated"); - - // No re-trigger events - await expect(tx1).to.not.emit(oracle, "ProtectionTriggered"); - await expect(tx2).to.not.emit(oracle, "ProtectionTriggered"); + await expect(tx2).to.emit(oracle, "ProtectionTriggered"); }); it("4c: bounded prices reflect expanded window", async () => { @@ -477,7 +475,7 @@ describe("DeviationBoundedOracle E2E", () => { it("5a: keeper updates succeed during active protection", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); await expect(oracle.updateMinPrice(assetA, parseUnits("0.85", 18))).to.not.be.reverted; @@ -497,7 +495,7 @@ describe("DeviationBoundedOracle E2E", () => { it("5c: keeper min update during protection affects bounded prices", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Keeper lowers min during active protection resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); @@ -587,8 +585,8 @@ describe("DeviationBoundedOracle E2E", () => { resilientOracle.getPrice.whenCalledWith(assetB).returns(SPOT_PRICE); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); - expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetB)).to.equal(false); // B returns spot unprotected const priceB = await oracle.callStatic.getBoundedCollateralPrice(vTokenB.address); @@ -679,7 +677,7 @@ describe("DeviationBoundedOracle E2E", () => { // Protection triggered (pump: spot 2.0 > MIN_PRICE * 1.2 = 1.08) await expect(tx).to.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); }); @@ -697,12 +695,12 @@ describe("DeviationBoundedOracle E2E", () => { // Exact boundary → should NOT trigger (uses > not >=) await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); // boundary + 1 → triggers resilientOracle.getPrice.whenCalledWith(assetA).returns(upperBound.add(1)); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("12b: reset threshold strict inequality — exact value reverts, minus 1 succeeds", async () => { @@ -717,10 +715,10 @@ describe("DeviationBoundedOracle E2E", () => { const state = await oracle.assetProtectionConfig(assetA); const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); - // Set resetThreshold = rangeRatio via setThresholds → disableActiveProtection reverts (>=) + // Set resetThreshold = rangeRatio via setThresholds → disableActiveProtectedPrice reverts (>=) const triggerThreshold = rangeRatio.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, triggerThreshold, rangeRatio); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); @@ -728,7 +726,7 @@ describe("DeviationBoundedOracle E2E", () => { // Set resetThreshold = rangeRatio + 1 → succeeds if (rangeRatio.add(1).lt(triggerThreshold)) { await oracle.setThresholds(assetA, triggerThreshold, rangeRatio.add(1)); - await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; } }); @@ -810,7 +808,7 @@ describe("DeviationBoundedOracle E2E", () => { it("13f: cache hit under active protection — still only 1 oracle call", async () => { // Trigger protection in prior tx await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Reset call tracking after setup resilientOracle.getPrice.reset(); @@ -845,7 +843,7 @@ describe("DeviationBoundedOracle E2E", () => { // Trigger protection await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Set a spot between min and max resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); @@ -906,7 +904,7 @@ describe("DeviationBoundedOracle E2E", () => { it("15a: trigger → keeper updates min → bounded collateral reflects new min", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Spot is between min and max resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); @@ -927,7 +925,7 @@ describe("DeviationBoundedOracle E2E", () => { it("15b: trigger → keeper updates max → bounded debt reflects new max", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); // Record original max const stateBefore = await oracle.assetProtectionConfig(assetA); @@ -949,4 +947,150 @@ describe("DeviationBoundedOracle E2E", () => { expect(debtAfter).to.equal(newMax); }); }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-16. Volatile Price Extends Protection Period + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-16: volatile price extends protection period", () => { + it("16a: continued deviation extends cooldown, blocks early disable", async () => { + await initAssetWithWindow(assetA); + + // Trigger protection + const pumpSpot = await triggerPump(assetA, vTokenA); + const firstTriggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + // Advance half cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Another deviating price → updates lastProtectionTriggeredAt + const biggerPump = pumpSpot.add(parseUnits("0.2", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(biggerPump); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + const secondTriggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + expect(secondTriggerTime).to.be.gt(firstTriggerTime); + + // Advance half cooldown again — total = cooldown from initial but only half from latest + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Raise reset threshold so range check passes, but cooldown should block + const state = await oracle.assetProtectionConfig(assetA); + const range = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const trigger = state.triggerThreshold; + if (newReset.gte(trigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, trigger, newReset); + } + + // Disable should revert — cooldown restarted from second trigger + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + + // Advance remaining half cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + // Now disable succeeds + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + }); + + it("16b: price normalizes — no event, timestamp unchanged, protection still active", async () => { + await initAssetWithWindow(assetA); + + await triggerPump(assetA, vTokenA); + const triggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + // Price returns within threshold + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(triggerTime); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Bounded pricing still applies + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + expect(collateral).to.equal(MIN_PRICE); + }); + + it("16c: full volatile cycle — repeated spikes extend protection, normalization in between, final disable", async () => { + await initAssetWithWindow(assetA); + + // ── Cycle 1: initial trigger ── + const pumpSpot1 = await triggerPump(assetA, vTokenA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + const trigger1 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + // Price normalizes mid-cycle — protection still active, timestamp unchanged + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 4]); + await ethers.provider.send("evm_mine", []); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const txNorm1 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txNorm1).to.not.emit(oracle, "ProtectionTriggered"); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Bounded pricing still applies despite normal spot + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + + // ── Cycle 2: second spike extends cooldown (keep within window to avoid exceeding MAX_THRESHOLD) ── + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 4]); + await ethers.provider.send("evm_mine", []); + const pumpSpot2 = pumpSpot1.add(parseUnits("0.05", 18)); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot2); + const txSpike2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txSpike2).to.emit(oracle, "ProtectionTriggered"); + const trigger2 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + expect(trigger2).to.be.gt(trigger1); + + // Try disable after original cooldown elapsed but not after second trigger + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + // Raise reset threshold so range check passes + const stateM = await oracle.assetProtectionConfig(assetA); + const rangeM = stateM.maxPrice.sub(stateM.minPrice).mul(EXP_SCALE).div(stateM.minPrice); + const newResetM = rangeM.add(parseUnits("0.001", 18)); + const triggerM = stateM.triggerThreshold; + if (newResetM.gte(triggerM)) { + await oracle.setThresholds(assetA, newResetM.add(parseUnits("0.01", 18)), newResetM); + } else { + await oracle.setThresholds(assetA, triggerM, newResetM); + } + + // Disable fails — cooldown restarted from second spike + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + + // Price normalizes again — still protected + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + const txNorm2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txNorm2).to.not.emit(oracle, "ProtectionTriggered"); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + + // ── Final: wait full cooldown from last spike, disable succeeds ── + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN]); + await ethers.provider.send("evm_mine", []); + + await oracle.disableActiveProtectedPrice(assetA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(0); + + // Spot prices returned after disable + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(collateral).to.equal(SPOT_PRICE); + expect(debt).to.equal(SPOT_PRICE); + }); + }); }); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 4062a5d6..0237a367 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -93,13 +93,14 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // Impersonated timelock grants all DBO permissions to deployer via real ACM const DBO_FUNCTIONS = [ - "setTokenConfig(address,uint64,uint256,uint256)", + "setTokenConfig(address,uint64,uint256,uint256,bool)", + "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])", "setCooldownPeriod(address,uint64)", "setThresholds(address,uint256,uint256)", "setAssetBoundedPricingEnabled(address,bool)", "updateMinPrice(address,uint128)", "updateMaxPrice(address,uint128)", - "disableActiveProtection(address)", + "disableActiveProtectedPrice(address)", ]; for (const fn of DBO_FUNCTIONS) { await acmContract.giveCallPermission(oracleDeployed.address, fn, deployer.address); @@ -137,7 +138,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); }; const initAssetWithWindow = async ( @@ -148,7 +149,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -175,7 +176,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(asset, newTrigger, newReset); - await oracle.disableActiveProtection(asset); + await oracle.disableActiveProtectedPrice(asset); }; // ──────────────────────────────────────────────────────────────────── @@ -227,12 +228,18 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { describe("3. setTokenConfig", () => { describe("happy path", () => { it("3.1 sets all struct fields, emits events, updates asset lists", async () => { - const tx = await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); + const tx = await oracle.setTokenConfig( + assetA, + DEFAULT_COOLDOWN, + DEFAULT_THRESHOLD, + DEFAULT_RESET_THRESHOLD, + true, + ); const state = await oracle.assetProtectionConfig(assetA); expect(state.minPrice).to.equal(SPOT_PRICE); expect(state.maxPrice).to.equal(SPOT_PRICE); - expect(state.isProtectedPriceActive).to.equal(false); + expect(state.currentlyUsingProtectedPrice).to.equal(false); expect(state.isBoundedPricingEnabled).to.equal(true); expect(state.lastProtectionTriggeredAt).to.equal(0); expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); @@ -255,62 +262,62 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await expect( oracle .connect(someone) - .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("3.3 reverts when asset is zero address", async () => { await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); }); it("3.4 reverts when already initialized", async () => { await initAsset(assetA); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); it("3.5 reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("3.6 reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("3.7 reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("3.8 reverts when asset is VAI", async () => { await expect( - oracle.setTokenConfig(VAI_ADDRESS, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(VAI_ADDRESS, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); }); it("3.9 reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.10 reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.11 reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); @@ -318,7 +325,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); @@ -326,7 +333,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const overflowPrice = BigNumber.from(2).pow(128); await mockOracle.setPrice(assetA, overflowPrice); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); }); }); @@ -564,10 +571,10 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); // ──────────────────────────────────────────────────────────────────── - // 9. disableActiveProtection + // 9. disableActiveProtectedPrice // ──────────────────────────────────────────────────────────────────── - describe("9. disableActiveProtection", () => { + describe("9. disableActiveProtectedPrice", () => { it("9.1 disables protection after governance raises reset threshold", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); @@ -585,9 +592,9 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await oracle.setThresholds(assetA, trigger, newReset); } - const tx = await oracle.disableActiveProtection(assetA); + const tx = await oracle.disableActiveProtectedPrice(assetA); await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("9.2 prices revert to spot after disable", async () => { @@ -596,6 +603,12 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); await disableProtection(assetA); + + // Verify lastProtectionTriggeredAt is reset to 0 on disable + const stateDisabled = await oracle.assetProtectionConfig(assetA); + expect(stateDisabled.lastProtectionTriggeredAt).to.equal(0); + expect(stateDisabled.currentlyUsingProtectedPrice).to.equal(false); + await mockOracle.setPrice(assetA, SPOT_PRICE); expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); @@ -604,7 +617,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("9.3 reverts when caller is unauthorized", async () => { await initAsset(assetA); - await expect(oracle.connect(someone).disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.connect(someone).disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "Unauthorized", ); @@ -612,7 +625,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("9.4 reverts when protection is not active", async () => { await initAsset(assetA); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "ProtectedPriceInactive", ); @@ -621,7 +634,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("9.5 reverts when cooldown has not elapsed", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "CooldownNotElapsed", ); @@ -632,7 +645,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await triggerPump(assetA, vTokenA); await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); await ethers.provider.send("evm_mine", []); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); @@ -772,7 +785,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await mockOracle.setPrice(assetA, pumpSpot); expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("13.3 view and non-view return identical prices (pump)", async () => { @@ -796,7 +809,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const crashSpot = lowerBound.sub(1); await mockOracle.setPrice(assetA, crashSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal( await oracle.getBoundedCollateralPriceView(vTokenA.address), @@ -872,14 +885,14 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await mockOracle.setPrice(assetA, pumpSpot); await expect(oracle.updateProtectionState(vTokenA.address)).to.emit(oracle, "ProtectionTriggered"); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("15.2 is a no-op for non-whitelisted asset", async () => { await initAssetWithWindow(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); await expect(oracle.updateProtectionState(vTokenA.address)).to.not.be.reverted; - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); }); @@ -897,12 +910,12 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); }); - describe("17. isProtectedPriceActive", () => { + describe("17. currentlyUsingProtectedPrice", () => { it("17.1 returns true when active, false otherwise", async () => { - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); }); @@ -969,7 +982,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const state = await oracle.assetProtectionConfig(assetA); expect(state.minPrice).to.equal(SPOT_PRICE); expect(state.maxPrice).to.equal(SPOT_PRICE); - expect(state.isProtectedPriceActive).to.equal(false); + expect(state.currentlyUsingProtectedPrice).to.equal(false); expect(state.isBoundedPricingEnabled).to.equal(true); expect(state.cooldownPeriod).to.equal(DEFAULT_COOLDOWN); expect(state.asset).to.equal(assetA); @@ -1010,7 +1023,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(result.debt).to.equal(MAX_PRICE); await caller.updateAndGetBothPrices(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("22.4 cache miss -- view fetches fresh", async () => { @@ -1024,7 +1037,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const result = await caller.getViewPricesWithoutUpdate(vTokenA.address); expect(result.collateral).to.equal(MIN_PRICE); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("22.6 per-asset cache isolation", async () => { @@ -1072,7 +1085,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(MIN_PRICE); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("23.3 lastProtectionTriggeredAt is fresh", async () => { @@ -1104,13 +1117,13 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const spot = parseUnits("1.15", 18); it("24.1 lowering threshold triggers protection", async () => { - await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, parseUnits("0.3", 18), parseUnits("0.15", 18)); + await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, parseUnits("0.3", 18), parseUnits("0.15", 18), true); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); await mockOracle.setPrice(assetA, spot); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); const state = await oracle.assetProtectionConfig(assetA); await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, state.resetThreshold); @@ -1124,7 +1137,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await oracle.setThresholds(assetA, parseUnits("0.3", 18), state.resetThreshold); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); it("24.3 view reflects threshold change immediately", async () => { @@ -1144,15 +1157,15 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // ──────────────────────────────────────────────────────────────────── describe("25. no re-trigger, window expands", () => { - it("25.1 no re-trigger, timestamp unchanged", async () => { + it("25.1 continued deviation updates timestamp and re-emits event", async () => { await initAssetWithWindow(assetA); const pumpSpot = await triggerPump(assetA, vTokenA); const triggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; await mockOracle.setPrice(assetA, pumpSpot.add(parseUnits("0.5", 18))); const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); - await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); - expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(triggerTime); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.be.gte(triggerTime); }); it("25.2 window expands during protection", async () => { @@ -1241,7 +1254,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("27.4 price normalizes but protection still active -- bounded pricing still applies", async () => { await mockOracle.setPrice(assetA, SPOT_PRICE); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); @@ -1267,8 +1280,8 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await mockOracle.setPrice(assetA, parseUnits("1.2", 18)); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); - expect(await oracle.isProtectedPriceActive(assetB)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetB)).to.equal(false); expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenB.address)).to.equal(SPOT_PRICE); }); }); @@ -1340,11 +1353,11 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await mockOracle.setPrice(assetA, upperBound); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(false); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); await mockOracle.setPrice(assetA, upperBound.add(1)); await oracle.getBoundedCollateralPrice(vTokenA.address); - expect(await oracle.isProtectedPriceActive(assetA)).to.equal(true); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); it("32.2 reset threshold strict inequality", async () => { @@ -1359,14 +1372,14 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const trigger = rangeRatio.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, trigger, rangeRatio); - await expect(oracle.disableActiveProtection(assetA)).to.be.revertedWithCustomError( + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( oracle, "PriceRangeNotConverged", ); if (rangeRatio.add(1).lt(trigger)) { await oracle.setThresholds(assetA, trigger, rangeRatio.add(1)); - await expect(oracle.disableActiveProtection(assetA)).to.not.be.reverted; + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; } }); @@ -1418,5 +1431,226 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(d).to.equal(await oracle.getBoundedDebtPriceView(vTokenA.address)); }); }); + + // ──────────────────────────────────────────────────────────────────── + // 34. setTokenConfigs (batch) + // ──────────────────────────────────────────────────────────────────── + + describe("34. setTokenConfigs (batch)", () => { + it("34.1 batch-initializes multiple assets", async () => { + const tx = await oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, true], + ); + + const stateA = await oracle.assetProtectionConfig(assetA); + expect(stateA.asset).to.equal(assetA); + expect(stateA.isBoundedPricingEnabled).to.equal(true); + + const stateB = await oracle.assetProtectionConfig(assetB); + expect(stateB.asset).to.equal(assetB); + + await expect(tx).to.emit(oracle, "ProtectionInitialized"); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, true); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetB, true); + + expect(await oracle.getInitializedAssets()).to.have.length(2); + }); + + it("34.2 batch with mixed enableBoundedPricing values", async () => { + await oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], + [true, false], + ); + + expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); + expect(await oracle.isBoundedPricingEnabled(assetB)).to.equal(false); + }); + + it("34.3 reverts when caller is unauthorized", async () => { + await expect( + oracle + .connect(someone) + .setTokenConfigs([assetA], [DEFAULT_COOLDOWN], [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true]), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("34.4 reverts when array lengths mismatch", async () => { + await expect( + oracle.setTokenConfigs( + [assetA, assetB], + [DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD], + [true], + ), + ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 35. setTokenConfig with enableBoundedPricing=false + // ──────────────────────────────────────────────────────────────────── + + describe("35. setTokenConfig with enableBoundedPricing=false", () => { + it("35.1 initializes with bounded pricing disabled", async () => { + const tx = await oracle.setTokenConfig( + assetA, + DEFAULT_COOLDOWN, + DEFAULT_THRESHOLD, + DEFAULT_RESET_THRESHOLD, + false, + ); + + expect((await oracle.assetProtectionConfig(assetA)).isBoundedPricingEnabled).to.equal(false); + await expect(tx).to.emit(oracle, "BoundedPricingWhitelistUpdated").withArgs(assetA, false); + + // Pump spot — returns spot (not bounded) since disabled + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetA, pumpSpot); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(pumpSpot); + }); + }); + + // ──────────────────────────────────────────────────────────────────── + // 36. Volatile price extends protection period + // ──────────────────────────────────────────────────────────────────── + + describe("36. volatile price extends protection period", () => { + it("36.1 continued deviation extends cooldown, blocks early disable", async () => { + await initAssetWithWindow(assetA); + + const pumpSpot = await triggerPump(assetA, vTokenA); + const firstTriggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + // Advance half cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Another deviating price + await mockOracle.setPrice(assetA, pumpSpot.add(parseUnits("0.2", 18))); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + const secondTriggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + expect(secondTriggerTime).to.be.gt(firstTriggerTime); + + // Advance half cooldown (total = cooldown from initial, half from latest) + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Raise reset threshold + const state = await oracle.assetProtectionConfig(assetA); + const range = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const trigger = state.triggerThreshold; + if (newReset.gte(trigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, trigger, newReset); + } + + // Should revert — cooldown restarted + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + + // Advance remaining + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + }); + + it("36.2 price normalizes — no event, timestamp unchanged, protection still active", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + const triggerTime = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + await mockOracle.setPrice(assetA, SPOT_PRICE); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + + await expect(tx).to.not.emit(oracle, "ProtectionTriggered"); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(triggerTime); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Bounded pricing still applies + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + }); + + it("36.3 full volatile cycle — repeated spikes extend protection, normalization in between, final disable", async () => { + await initAssetWithWindow(assetA); + + // ── Cycle 1: initial trigger ── + const pumpSpot1 = await triggerPump(assetA, vTokenA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + const trigger1 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + // Price normalizes mid-cycle — protection still active + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 4]); + await ethers.provider.send("evm_mine", []); + await mockOracle.setPrice(assetA, SPOT_PRICE); + const txNorm1 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txNorm1).to.not.emit(oracle, "ProtectionTriggered"); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + + // ── Cycle 2: second spike extends cooldown (keep within window to avoid exceeding MAX_THRESHOLD) ── + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 4]); + await ethers.provider.send("evm_mine", []); + const pumpSpot2 = pumpSpot1.add(parseUnits("0.05", 18)); + await mockOracle.setPrice(assetA, pumpSpot2); + const txSpike2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txSpike2).to.emit(oracle, "ProtectionTriggered"); + const trigger2 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + expect(trigger2).to.be.gt(trigger1); + + // Try disable after original cooldown elapsed but not after second trigger + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + const stateM = await oracle.assetProtectionConfig(assetA); + const rangeM = stateM.maxPrice.sub(stateM.minPrice).mul(EXP_SCALE).div(stateM.minPrice); + const newResetM = rangeM.add(parseUnits("0.001", 18)); + const triggerM = stateM.triggerThreshold; + if (newResetM.gte(triggerM)) { + await oracle.setThresholds(assetA, newResetM.add(parseUnits("0.01", 18)), newResetM); + } else { + await oracle.setThresholds(assetA, triggerM, newResetM); + } + + // Disable fails — cooldown restarted from second spike + await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + oracle, + "CooldownNotElapsed", + ); + + // Price normalizes again — still protected + await mockOracle.setPrice(assetA, SPOT_PRICE); + const txNorm2 = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(txNorm2).to.not.emit(oracle, "ProtectionTriggered"); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(MIN_PRICE); + + // ── Final: wait full cooldown from last spike, disable succeeds ── + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN]); + await ethers.provider.send("evm_mine", []); + + await oracle.disableActiveProtectedPrice(assetA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(0); + + // Spot prices returned after disable + expect(await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address)).to.equal(SPOT_PRICE); + expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(SPOT_PRICE); + }); + }); }); } From da67dc68e77613394d249aaa7ba5a0eeab9fbfcb Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 13 Apr 2026 16:02:47 +0530 Subject: [PATCH 10/30] refactor: rename disableActiveProtectedPrice to exitProtectionMode and allow zero vaiAddress --- contracts/DeviationBoundedOracle.sol | 9 ++-- .../interfaces/IDeviationBoundedOracle.sol | 4 +- test/DeviationBoundedOracle.ts | 41 +++++----------- test/DeviationBoundedOracleE2E.ts | 34 +++++-------- test/fork/DeviationBoundedOracle.ts | 48 ++++++------------- 5 files changed, 45 insertions(+), 91 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index c15d153a..92c0ca5c 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -81,13 +81,12 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @notice Constructor for the implementation contract. Sets immutable variables. * @param _resilientOracle Address of the ResilientOracle contract * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address) - * @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain). + * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain. * @custom:oz-upgrades-unsafe-allow constructor */ constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) { ensureNonzeroAddress(address(_resilientOracle)); ensureNonzeroAddress(nativeMarketAddress); - ensureNonzeroAddress(vaiAddress); RESILIENT_ORACLE = _resilientOracle; nativeMarket = nativeMarketAddress; vai = vaiAddress; @@ -234,7 +233,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @notice Disables protection mode for a given asset + * @notice Exits protection mode for a given asset * @dev Called by the keeper/monitor after confirming price has normalised. * Enforces two conditions on-chain: * 1. Cooldown period has elapsed since the last trigger @@ -246,8 +245,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @custom:error PriceRangeNotConverged if window range is still above exit threshold * @custom:event ProtectedPriceDisabled */ - function disableActiveProtectedPrice(address asset) external { - _checkAccessAllowed("disableActiveProtectedPrice(address)"); + function exitProtectionMode(address asset) external { + _checkAccessAllowed("exitProtectionMode(address)"); ensureNonzeroAddress(asset); MarketProtectionState storage state = _ensureInitialized(asset); diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index a6f2fa23..2fbc6efc 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -223,7 +223,7 @@ interface IDeviationBoundedOracle { function updateMaxPrice(address asset, uint128 newMax) external; /** - * @notice Disables protection mode for a given asset once conditions are met + * @notice Exits protection mode for a given asset once conditions are met * @param asset The underlying asset address * @custom:access Only authorized monitor/keeper addresses * @custom:error ProtectedPriceInactive if protection is not currently active @@ -231,7 +231,7 @@ interface IDeviationBoundedOracle { * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold * @custom:event ProtectedPriceDisabled */ - function disableActiveProtectedPrice(address asset) external; + function exitProtectionMode(address asset) external; // --- Admin functions (governance-gated) --- diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index fba4bcba..58524bf8 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -716,10 +716,10 @@ describe("DeviationBoundedOracle", () => { }); // ──────────────────────────────────────────────────────────────────────── - // 9. disableActiveProtectedPrice + // 9. exitProtectionMode // ──────────────────────────────────────────────────────────────────────── - describe("disableActiveProtectedPrice", () => { + describe("exitProtectionMode", () => { it("disables protection after governance raises reset threshold", async () => { await initAssetWithWindow(assetA); @@ -747,12 +747,12 @@ describe("DeviationBoundedOracle", () => { await oracle.setThresholds(assetA, currentTrigger, newResetThreshold); } - const tx = await oracle.disableActiveProtectedPrice(assetA); + const tx = await oracle.exitProtectionMode(assetA); await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); - it("prices revert to spot after disableActiveProtectedPrice", async () => { + it("prices revert to spot after exitProtectionMode", async () => { await initAssetWithWindow(assetA); // Trigger via pump @@ -777,7 +777,7 @@ describe("DeviationBoundedOracle", () => { } else { await oracle.setThresholds(assetA, currentTrigger, newReset); } - await oracle.disableActiveProtectedPrice(assetA); + await oracle.exitProtectionMode(assetA); // Verify lastProtectionTriggeredAt is reset to 0 on disable const stateDisabled = await oracle.assetProtectionConfig(assetA); @@ -797,15 +797,12 @@ describe("DeviationBoundedOracle", () => { it("reverts when caller is unauthorized", async () => { await initAsset(assetA); acm.isAllowedToCall.returns(false); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError(oracle, "Unauthorized"); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when protection is not active", async () => { await initAsset(assetA); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "ProtectedPriceInactive", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "ProtectedPriceInactive"); }); it("reverts when cooldown has not elapsed", async () => { @@ -815,10 +812,7 @@ describe("DeviationBoundedOracle", () => { resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); await oracle.getBoundedCollateralPrice(vTokenA.address); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); }); it("reverts when range not converged", async () => { @@ -833,10 +827,7 @@ describe("DeviationBoundedOracle", () => { await ethers.provider.send("evm_mine", []); // Range still wide -> reverts - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); }); it("reverts when rangeRatio exactly at resetThreshold (uses >=)", async () => { @@ -863,10 +854,7 @@ describe("DeviationBoundedOracle", () => { } // Set resetThreshold = rangeRatio (exactly equal, should revert since >=) - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); }); it("succeeds when rangeRatio at resetThreshold - 1 wei", async () => { @@ -892,7 +880,7 @@ describe("DeviationBoundedOracle", () => { await oracle.setThresholds(assetA, currentTrigger, rangeRatio.add(1)); } - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; }); }); @@ -1736,17 +1724,14 @@ describe("DeviationBoundedOracle", () => { await oracle.setThresholds(assetA, trigger, newReset); } - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); // 6. Advance remaining half cooldown await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); await ethers.provider.send("evm_mine", []); // 7. Now disable succeeds - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; }); it("protection period does NOT extend when price returns within threshold", async () => { diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 18b43c72..951cf9d8 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -119,7 +119,7 @@ describe("DeviationBoundedOracle E2E", () => { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(asset, newTrigger, newReset); - await oracle.disableActiveProtectedPrice(asset); + await oracle.exitProtectionMode(asset); }; // ──────────────────────────────────────────────────────────────────────── @@ -374,7 +374,7 @@ describe("DeviationBoundedOracle E2E", () => { expect(await oracle.getBoundedCollateralPriceView(vTokenA.address)).to.equal(spot); }); - it("3d: reset threshold interaction with disableActiveProtectedPrice", async () => { + it("3d: reset threshold interaction with exitProtectionMode", async () => { await initAssetWithWindow(assetA); // Trigger protection @@ -385,10 +385,7 @@ describe("DeviationBoundedOracle E2E", () => { await ethers.provider.send("evm_mine", []); // Current range is wide, reset threshold is 10% — too low to disable - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); // Raise reset threshold to allow disable via setThresholds const state = await oracle.assetProtectionConfig(assetA); @@ -397,7 +394,7 @@ describe("DeviationBoundedOracle E2E", () => { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, newTrigger, newReset); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; }); }); @@ -715,18 +712,15 @@ describe("DeviationBoundedOracle E2E", () => { const state = await oracle.assetProtectionConfig(assetA); const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); - // Set resetThreshold = rangeRatio via setThresholds → disableActiveProtectedPrice reverts (>=) + // Set resetThreshold = rangeRatio via setThresholds → exitProtectionMode reverts (>=) const triggerThreshold = rangeRatio.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, triggerThreshold, rangeRatio); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); // Set resetThreshold = rangeRatio + 1 → succeeds if (rangeRatio.add(1).lt(triggerThreshold)) { await oracle.setThresholds(assetA, triggerThreshold, rangeRatio.add(1)); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; } }); @@ -989,17 +983,14 @@ describe("DeviationBoundedOracle E2E", () => { } // Disable should revert — cooldown restarted from second trigger - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); // Advance remaining half cooldown await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); await ethers.provider.send("evm_mine", []); // Now disable succeeds - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; }); it("16b: price normalizes — no event, timestamp unchanged, protection still active", async () => { @@ -1066,10 +1057,7 @@ describe("DeviationBoundedOracle E2E", () => { } // Disable fails — cooldown restarted from second spike - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); // Price normalizes again — still protected resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); @@ -1082,7 +1070,7 @@ describe("DeviationBoundedOracle E2E", () => { await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN]); await ethers.provider.send("evm_mine", []); - await oracle.disableActiveProtectedPrice(assetA); + await oracle.exitProtectionMode(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(0); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 0237a367..df00ca9e 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -100,7 +100,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { "setAssetBoundedPricingEnabled(address,bool)", "updateMinPrice(address,uint128)", "updateMaxPrice(address,uint128)", - "disableActiveProtectedPrice(address)", + "exitProtectionMode(address)", ]; for (const fn of DBO_FUNCTIONS) { await acmContract.giveCallPermission(oracleDeployed.address, fn, deployer.address); @@ -176,7 +176,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(asset, newTrigger, newReset); - await oracle.disableActiveProtectedPrice(asset); + await oracle.exitProtectionMode(asset); }; // ──────────────────────────────────────────────────────────────────── @@ -571,10 +571,10 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); // ──────────────────────────────────────────────────────────────────── - // 9. disableActiveProtectedPrice + // 9. exitProtectionMode // ──────────────────────────────────────────────────────────────────── - describe("9. disableActiveProtectedPrice", () => { + describe("9. exitProtectionMode", () => { it("9.1 disables protection after governance raises reset threshold", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); @@ -592,7 +592,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await oracle.setThresholds(assetA, trigger, newReset); } - const tx = await oracle.disableActiveProtectedPrice(assetA); + const tx = await oracle.exitProtectionMode(assetA); await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); @@ -617,7 +617,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("9.3 reverts when caller is unauthorized", async () => { await initAsset(assetA); - await expect(oracle.connect(someone).disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( + await expect(oracle.connect(someone).exitProtectionMode(assetA)).to.be.revertedWithCustomError( oracle, "Unauthorized", ); @@ -625,19 +625,13 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("9.4 reverts when protection is not active", async () => { await initAsset(assetA); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "ProtectedPriceInactive", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "ProtectedPriceInactive"); }); it("9.5 reverts when cooldown has not elapsed", async () => { await initAssetWithWindow(assetA); await triggerPump(assetA, vTokenA); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); }); it("9.6 reverts when range not converged", async () => { @@ -645,10 +639,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await triggerPump(assetA, vTokenA); await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); await ethers.provider.send("evm_mine", []); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); }); }); @@ -1372,14 +1363,11 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const trigger = rangeRatio.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, trigger, rangeRatio); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "PriceRangeNotConverged", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "PriceRangeNotConverged"); if (rangeRatio.add(1).lt(trigger)) { await oracle.setThresholds(assetA, trigger, rangeRatio.add(1)); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; } }); @@ -1557,16 +1545,13 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { } // Should revert — cooldown restarted - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); // Advance remaining await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); await ethers.provider.send("evm_mine", []); - await expect(oracle.disableActiveProtectedPrice(assetA)).to.not.be.reverted; + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; }); it("36.2 price normalizes — no event, timestamp unchanged, protection still active", async () => { @@ -1627,10 +1612,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { } // Disable fails — cooldown restarted from second spike - await expect(oracle.disableActiveProtectedPrice(assetA)).to.be.revertedWithCustomError( - oracle, - "CooldownNotElapsed", - ); + await expect(oracle.exitProtectionMode(assetA)).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); // Price normalizes again — still protected await mockOracle.setPrice(assetA, SPOT_PRICE); @@ -1643,7 +1625,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN]); await ethers.provider.send("evm_mine", []); - await oracle.disableActiveProtectedPrice(assetA); + await oracle.exitProtectionMode(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); expect((await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt).to.equal(0); From 9033f23708e7c1ce7064bc8012fcda279cc5cf4a Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 13 Apr 2026 17:50:22 +0530 Subject: [PATCH 11/30] fix: linting --- .eslinttsconfigrc | 1 + .solhint.json | 2 +- contracts/DeviationBoundedOracle.sol | 4 ++-- contracts/interfaces/IDeviationBoundedOracle.sol | 4 ++-- deploy/28-deploy-deviation-bounded-oracle.ts | 11 ++++++----- test/DeviationBoundedOracle.ts | 2 +- test/DeviationBoundedOracleE2E.ts | 2 +- test/fork/DeviationBoundedOracle.ts | 7 ++----- 8 files changed, 16 insertions(+), 17 deletions(-) diff --git a/.eslinttsconfigrc b/.eslinttsconfigrc index d90f6b7f..14929d01 100644 --- a/.eslinttsconfigrc +++ b/.eslinttsconfigrc @@ -6,6 +6,7 @@ "test", "tasks", "docgen-templates", + "scripts", "commitlint.config.js", "./hardhat.config.zksync.ts" ] diff --git a/.solhint.json b/.solhint.json index e9676e29..8d908045 100644 --- a/.solhint.json +++ b/.solhint.json @@ -10,6 +10,6 @@ "max-line-length": ["error", 175], "not-rely-on-time": "warn", "reason-string": ["warn", { "maxLength": 64 }], - "ordering": "error" + "ordering": "warn" } } diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 92c0ca5c..c4d7e3ef 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -243,7 +243,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @custom:error ProtectedPriceInactive if protection is not currently active * @custom:error CooldownNotElapsed if cooldown period has not elapsed * @custom:error PriceRangeNotConverged if window range is still above exit threshold - * @custom:event ProtectedPriceDisabled + * @custom:event ProtectionModeExited */ function exitProtectionMode(address asset) external { _checkAccessAllowed("exitProtectionMode(address)"); @@ -264,7 +264,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { state.currentlyUsingProtectedPrice = false; state.lastProtectionTriggeredAt = 0; - emit ProtectedPriceDisabled(asset); + emit ProtectionModeExited(asset); } // ----- Admin functions (governance-gated) ----- diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index 2fbc6efc..fd6298a9 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -49,7 +49,7 @@ interface IDeviationBoundedOracle { event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice); /// @notice Emitted when protection mode is disabled for an asset - event ProtectedPriceDisabled(address indexed asset); + event ProtectionModeExited(address indexed asset); /// @notice Emitted when the keeper updates the minimum price for an asset event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin); @@ -229,7 +229,7 @@ interface IDeviationBoundedOracle { * @custom:error ProtectedPriceInactive if protection is not currently active * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold - * @custom:event ProtectedPriceDisabled + * @custom:event ProtectionModeExited */ function exitProtectionMode(address asset) external; diff --git a/deploy/28-deploy-deviation-bounded-oracle.ts b/deploy/28-deploy-deviation-bounded-oracle.ts index b174a60f..d07a3ff6 100644 --- a/deploy/28-deploy-deviation-bounded-oracle.ts +++ b/deploy/28-deploy-deviation-bounded-oracle.ts @@ -1,4 +1,4 @@ -import hre from "hardhat"; +import hre, { ethers } from "hardhat"; import { DeployFunction } from "hardhat-deploy/dist/types"; import { HardhatRuntimeEnvironment } from "hardhat/types"; @@ -8,12 +8,13 @@ const func: DeployFunction = async function ({ getNamedAccounts, deployments, ne const { deploy } = deployments; const { deployer } = await getNamedAccounts(); - const accessControlManagerAddress = ADDRESSES[network.name].acm; + // Fallback placeholder addresses are used on the hardhat network where ADDRESSES is not defined + const accessControlManagerAddress = ADDRESSES[network.name]?.acm || "0x0000000000000000000000000000000000000001"; const proxyOwnerAddress = network.live ? ADDRESSES[network.name].timelock : deployer; - const vbnbAddress = ADDRESSES[network.name].vBNBAddress; - const vaiAddress = ADDRESSES[network.name].VAIAddress; - const timelock = ADDRESSES[network.name].timelock; + const vbnbAddress = ADDRESSES[network.name]?.vBNBAddress || "0x0000000000000000000000000000000000000001"; + const vaiAddress = ADDRESSES[network.name]?.VAIAddress || ethers.constants.AddressZero; + const timelock = ADDRESSES[network.name]?.timelock || "0x0000000000000000000000000000000000000001"; const resilientOracle = await hre.ethers.getContract("ResilientOracle"); diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 58524bf8..1e39308b 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -1,7 +1,7 @@ import { FakeContract, smock } from "@defi-wonderland/smock"; import type { SignerWithAddress } from "@nomiclabs/hardhat-ethers/dist/src/signer-with-address"; import chai from "chai"; -import { BigNumber, constants } from "ethers"; +import { BigNumber } from "ethers"; import { parseUnits } from "ethers/lib/utils"; import { ethers, upgrades } from "hardhat"; diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 951cf9d8..268568a9 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -300,7 +300,7 @@ describe("DeviationBoundedOracle E2E", () => { it("2d: repeated trigger → disable → trigger cycle", async () => { await initAssetWithWindow(assetA); - for (let cycle = 0; cycle < 3; cycle++) { + for (let cycle = 0; cycle < 3; cycle += 1) { // Use triggerPump which computes minimal pumpSpot from current threshold await triggerPump(assetA, vTokenA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index df00ca9e..4e20b11a 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -46,9 +46,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { } = ADDRESSES[FORKED_NETWORK]; forking(90924377, () => { - let admin: SignerWithAddress; let someone: SignerWithAddress; - let timelockSigner: SignerWithAddress; let mockOracle: MockSimpleOracle; let acm: IAccessControlManagerV8; let oracle: DeviationBoundedOracle; @@ -126,8 +124,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }; beforeEach(async () => { - ({ mockOracle, acm, oracle, caller, admin, someone, timelockSigner, vTokenA, vTokenB, assetA, assetB } = - await loadFixture(fixture)); + ({ mockOracle, acm, oracle, caller, someone, vTokenA, vTokenB, assetA, assetB } = await loadFixture(fixture)); }); // ── Helpers ─────────────────────────────────────────────────────────── @@ -1092,7 +1089,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { it("23.4 repeated trigger -> disable -> trigger cycle", async () => { await initAssetWithWindow(assetA); - for (let i = 0; i < 3; i++) { + for (let i = 0; i < 3; i += 1) { await triggerPump(assetA, vTokenA); await disableProtection(assetA); await oracle.setThresholds(assetA, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD); From 7ad77af9973b7e52e587020eb8ab38ed11f5d95f Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 13 Apr 2026 18:00:50 +0530 Subject: [PATCH 12/30] fix: test --- test/DeviationBoundedOracle.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 1e39308b..57055a97 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -748,7 +748,7 @@ describe("DeviationBoundedOracle", () => { } const tx = await oracle.exitProtectionMode(assetA); - await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); + await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); From 69b23a68513f2367c07b73863021ace58773302e Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 20 Apr 2026 19:17:13 +0530 Subject: [PATCH 13/30] fix: [M01] Reset Cooldown Only On Genuine Window Expansion --- contracts/DeviationBoundedOracle.sol | 27 +++++-- test/DeviationBoundedOracle.ts | 117 +++++++++++++++++++++++++++ test/fork/DeviationBoundedOracle.ts | 73 ++++++++++++++++- 3 files changed, 208 insertions(+), 9 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index c4d7e3ef..40f4bb71 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -611,8 +611,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { _setCachedPrices(asset, spot, spot); return (spot, spot); } - (uint128 updatedMin, uint128 updatedMax) = _expandPriceWindow(state, spot, asset); - bool protectionActive = _checkAndTriggerProtection(state, spot, asset); + (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset); + bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded); (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax)); _setCachedPrices(asset, minPrice, maxPrice); } @@ -627,35 +627,46 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { MarketProtectionState storage state, uint256 spot, address asset - ) internal returns (uint128, uint128) { + ) internal returns (uint128, uint128, bool) { uint128 spotU128 = _safeToUint128(spot); uint128 currentMin = state.minPrice; uint128 currentMax = state.maxPrice; + bool windowExpanded; if (spotU128 < currentMin) { _setMinPrice(state, asset, spotU128); currentMin = spotU128; + windowExpanded = true; } if (spotU128 > currentMax) { _setMaxPrice(state, asset, spotU128); currentMax = spotU128; + windowExpanded = true; } - return (currentMin, currentMax); + return (currentMin, currentMax, windowExpanded); } /** - * @dev Checks if the spot price has deviated beyond the threshold and triggers protection + * @dev Checks if the spot price has deviated beyond the threshold and triggers protection. + * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a + * genuine new extreme this update (windowExpanded == true). Recovery within the existing window + * keeps the cooldown ticking so `exitProtectionMode` remains reachable. * @param state The market protection state * @param spot The current spot price * @param asset The underlying asset address (for event emission) + * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call */ function _checkAndTriggerProtection( MarketProtectionState storage state, uint256 spot, - address asset + address asset, + bool windowExpanded ) internal returns (bool triggered) { if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) { - state.lastProtectionTriggeredAt = uint64(block.timestamp); - if (!state.currentlyUsingProtectedPrice) { + bool enteringProtection = !state.currentlyUsingProtectedPrice; + if (enteringProtection || windowExpanded) { + state.lastProtectionTriggeredAt = uint64(block.timestamp); + } + if (enteringProtection) { state.currentlyUsingProtectedPrice = true; } emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice); diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 57055a97..66a395e4 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -1757,4 +1757,121 @@ describe("DeviationBoundedOracle", () => { expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); }); }); + + // ──────────────────────────────────────────────────────────────────────── + // M01: cooldown reset only on first trigger or genuine window expansion + // ──────────────────────────────────────────────────────────────────────── + + describe("Cooldown reset only on genuine window expansion", () => { + it("recovery after a crash does NOT reset the cooldown", async () => { + await initAssetWithWindow(assetA); + + // Crash: spot below maxPrice * (1 - threshold) = 1.1 * 0.8 = 0.88 + const crashSpot = parseUnits("0.6", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const stateAfterCrash = await oracle.assetProtectionConfig(assetA); + const t0 = stateAfterCrash.lastProtectionTriggeredAt; + expect(stateAfterCrash.minPrice).to.equal(crashSpot); + expect(stateAfterCrash.currentlyUsingProtectedPrice).to.equal(true); + + // Advance halfway through cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Recovery: spot above minPrice * (1 + threshold) = 0.6 * 1.2 = 0.72, + // still within the existing window (no new low, no new high → windowExpanded = false). + // _exceedsDeviationThreshold returns true (recovery is misclassified as a pump), + // but the cooldown must NOT advance. + const recoverySpot = parseUnits("0.85", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(recoverySpot); + const tx = await oracle.getBoundedCollateralPrice(vTokenA.address); + await expect(tx).to.emit(oracle, "ProtectionTriggered"); + + const stateAfterRecovery = await oracle.assetProtectionConfig(assetA); + expect(stateAfterRecovery.lastProtectionTriggeredAt).to.equal(t0); + expect(stateAfterRecovery.minPrice).to.equal(crashSpot); + expect(stateAfterRecovery.maxPrice).to.equal(MAX_PRICE); + }); + + it("a deeper crash (new low) DOES reset the cooldown", async () => { + await initAssetWithWindow(assetA); + + const firstCrash = parseUnits("0.6", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(firstCrash); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const t0 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // New low: minPrice expands → windowExpanded = true → cooldown resets + const deeperCrash = parseUnits("0.5", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(deeperCrash); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.lastProtectionTriggeredAt).to.be.gt(t0); + expect(stateAfter.minPrice).to.equal(deeperCrash); + }); + + it("sustained pump within the existing window does NOT reset the cooldown", async () => { + await initAssetWithWindow(assetA); + + // Pump above maxPrice so the window expands on the first trigger + const firstPump = parseUnits("1.4", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(firstPump); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const stateAfterFirstPump = await oracle.assetProtectionConfig(assetA); + const t0 = stateAfterFirstPump.lastProtectionTriggeredAt; + expect(stateAfterFirstPump.maxPrice).to.equal(firstPump); + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // Still pump-classified (1.3 > 0.9 * 1.2 = 1.08) but no new high (1.3 < 1.4) + const sustainedPump = parseUnits("1.3", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(sustainedPump); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.lastProtectionTriggeredAt).to.equal(t0); + expect(stateAfter.maxPrice).to.equal(firstPump); + }); + + it("exitProtectionMode becomes reachable when recovery does not refresh the cooldown", async () => { + await initAssetWithWindow(assetA); + + // Mild crash: spot < 1.1 * 0.8 = 0.88, with the resulting window narrow enough + // (~29%) to fit under MAX_THRESHOLD = 50% when we later bump setThresholds. + const crashSpot = parseUnits("0.85", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(crashSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Recovery within the existing window but above the post-crash pump threshold + // (1.05 > 0.85 * 1.2 = 1.02). _exceedsDeviationThreshold returns true, + // but no new low / no new high → windowExpanded = false → cooldown must NOT advance. + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + resilientOracle.getPrice.whenCalledWith(assetA).returns(parseUnits("1.05", 18)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + // Finish the original cooldown window + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + // Bump resetThreshold above the current range (~29.4%) so the convergence check passes + const stateBeforeExit = await oracle.assetProtectionConfig(assetA); + const range = stateBeforeExit.maxPrice + .sub(stateBeforeExit.minPrice) + .mul(EXP_SCALE) + .div(stateBeforeExit.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const newTrigger = newReset.add(parseUnits("0.01", 18)); + await oracle.setThresholds(assetA, newTrigger, newReset); + + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + }); + }); }); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 4e20b11a..070f3dde 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -590,7 +590,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { } const tx = await oracle.exitProtectionMode(assetA); - await expect(tx).to.emit(oracle, "ProtectedPriceDisabled").withArgs(assetA); + await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); @@ -1631,5 +1631,76 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(await oracle.callStatic.getBoundedDebtPrice(vTokenA.address)).to.equal(SPOT_PRICE); }); }); + + // ──────────────────────────────────────────────────────────────────── + // 37. M01: cooldown reset only on genuine window expansion + // ──────────────────────────────────────────────────────────────────── + + describe("37. M01: cooldown reset only on genuine window expansion", () => { + it("37.1 recovery within the existing window does NOT refresh the cooldown — exitProtectionMode stays reachable", async () => { + await initAssetWithWindow(assetA); + + // Mild crash: spot < MAX_PRICE * (1 - threshold) = 1.1 * 0.8 = 0.88, + // and resulting range (~29%) stays under MAX_THRESHOLD = 50% so we can + // bump setThresholds at the end. + const crashSpot = parseUnits("0.85", 18); + await mockOracle.setPrice(assetA, crashSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const stateAfterCrash = await oracle.assetProtectionConfig(assetA); + const t0 = stateAfterCrash.lastProtectionTriggeredAt; + expect(stateAfterCrash.minPrice).to.equal(crashSpot); + expect(stateAfterCrash.currentlyUsingProtectedPrice).to.equal(true); + + // Recovery within the existing window but above the (post-crash) pump threshold + // (1.05 > 0.85 * 1.2 = 1.02). Pre-M01 this would have refreshed the cooldown. + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + await mockOracle.setPrice(assetA, parseUnits("1.05", 18)); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const stateAfterRecovery = await oracle.assetProtectionConfig(assetA); + expect(stateAfterRecovery.lastProtectionTriggeredAt).to.equal(t0); + expect(stateAfterRecovery.minPrice).to.equal(crashSpot); + expect(stateAfterRecovery.maxPrice).to.equal(MAX_PRICE); + + // Finish the original cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2 + 1]); + await ethers.provider.send("evm_mine", []); + + // Bump resetThreshold above the current range (~29.4%) so the convergence check passes + const range = stateAfterRecovery.maxPrice + .sub(stateAfterRecovery.minPrice) + .mul(EXP_SCALE) + .div(stateAfterRecovery.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const newTrigger = newReset.add(parseUnits("0.01", 18)); + await oracle.setThresholds(assetA, newTrigger, newReset); + + await expect(oracle.exitProtectionMode(assetA)).to.not.be.reverted; + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + }); + + it("37.2 a deeper crash (new low) DOES refresh the cooldown", async () => { + await initAssetWithWindow(assetA); + + const firstCrash = parseUnits("0.85", 18); + await mockOracle.setPrice(assetA, firstCrash); + await oracle.getBoundedCollateralPrice(vTokenA.address); + const t0 = (await oracle.assetProtectionConfig(assetA)).lastProtectionTriggeredAt; + + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN / 2]); + await ethers.provider.send("evm_mine", []); + + // New low: minPrice expands → windowExpanded = true → cooldown resets + const deeperCrash = parseUnits("0.8", 18); + await mockOracle.setPrice(assetA, deeperCrash); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.lastProtectionTriggeredAt).to.be.gt(t0); + expect(stateAfter.minPrice).to.equal(deeperCrash); + }); + }); }); } From 058d65182bb5a1bcc40e47e9d9d8893fe0402dc1 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Mon, 20 Apr 2026 19:18:09 +0530 Subject: [PATCH 14/30] fix: [I01] Use Helpers To Re-enable Protection State --- contracts/DeviationBoundedOracle.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 40f4bb71..954dd6e8 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -403,8 +403,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { // reset the window if re-enabling if (enabled) { uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset)); - state.minPrice = spotU128; - state.maxPrice = spotU128; + _setMinPrice(state, asset, spotU128); + _setMaxPrice(state, asset, spotU128); } state.isBoundedPricingEnabled = enabled; From f0de73dc3bc062c90cb5d5dc575f643f80571d67 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Tue, 21 Apr 2026 14:50:35 +0530 Subject: [PATCH 15/30] docs: [I02] Document updateProtectionState As Permissionless Entry Point --- contracts/DeviationBoundedOracle.sol | 2 ++ 1 file changed, 2 insertions(+) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 954dd6e8..355af3bf 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -156,6 +156,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * getBoundedDebtPriceView within the same transaction will read from the transient cache * instead of querying ResilientOracle again, keeping those functions as `view` and * avoiding redundant oracle calls. + * Permissionless: anyone can call this, both for gas optimisation and to ensure every + * caller in the same transaction reads the correct, up-to-date bounded price. * @param vToken vToken address * @custom:event MinPriceUpdated if a new window minimum is recorded * @custom:event MaxPriceUpdated if a new window maximum is recorded From 6939d4f101bb0f2f9b5f006bf484c3f18c5de6cf Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Thu, 23 Apr 2026 09:12:20 +0530 Subject: [PATCH 16/30] fix: [VLD-01] Add per-asset cachingEnabled flag defaulting to enabled --- contracts/DeviationBoundedOracle.sol | 70 ++++++-- .../interfaces/IDeviationBoundedOracle.sol | 44 ++++- test/DeviationBoundedOracle.ts | 139 +++++++++++++--- test/DeviationBoundedOracleE2E.ts | 4 +- test/fork/DeviationBoundedOracle.ts | 157 ++++++++++++++++-- 5 files changed, 350 insertions(+), 64 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 355af3bf..2aee436e 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -156,6 +156,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * getBoundedDebtPriceView within the same transaction will read from the transient cache * instead of querying ResilientOracle again, keeping those functions as `view` and * avoiding redundant oracle calls. + * The transient cache is only populated when the asset's `cachingEnabled` flag is `true`. + * When caching is disabled, view price reads fall through to live recomputation. * Permissionless: anyone can call this, both for gas optimisation and to ensure every * caller in the same transaction reads the correct, up-to-date bounded price. * @param vToken vToken address @@ -171,8 +173,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Gets the bounded collateral price for a given vToken (view variant) - * @dev Reads from transient cache first (populated by a prior updateProtectionState call - * in the same transaction). Falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true` + * (populated by a prior updateProtectionState call in the same transaction). Falls back + * to ResilientOracle on cache miss or when caching is disabled. * Returns min(spot, windowMin) when protection is active, spot otherwise. * @param vToken vToken address * @return collateralPrice The bounded collateral price @@ -183,8 +186,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Gets the bounded debt price for a given vToken (view variant) - * @dev Reads from transient cache first (populated by a prior updateProtectionState call - * in the same transaction). Falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true` + * (populated by a prior updateProtectionState call in the same transaction). Falls back + * to ResilientOracle on cache miss or when caching is disabled. * Returns max(spot, windowMax) when protection is active, spot otherwise. * @param vToken vToken address * @return debtPrice The bounded debt price @@ -195,7 +199,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant) - * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; + * falls back to ResilientOracle on cache miss or when caching is disabled. * @param vToken vToken address * @return collateralPrice The bounded collateral price * @return debtPrice The bounded debt price @@ -278,6 +283,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization + * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset * @custom:access Only Governance * @custom:event ProtectionInitialized * @custom:event BoundedPricingWhitelistUpdated @@ -287,10 +293,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint64 cooldownPeriod, uint256 triggerThreshold, uint256 resetThreshold, - bool enableBoundedPricing + bool enableBoundedPricing, + bool enableCaching ) external { - _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256,bool)"); - _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing); + _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256,bool,bool)"); + _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing, enableCaching); } /** @@ -300,6 +307,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param triggerThresholds Array of trigger thresholds (mantissa) * @param resetThresholds Array of reset thresholds (mantissa) * @param enableBoundedPricings Array of whether to enable bounded pricing per asset + * @param enableCachings Array of whether transient caching is enabled per asset * @custom:access Only Governance * @custom:error InvalidArrayLength if array lengths do not match * @custom:event ProtectionInitialized for each asset @@ -310,16 +318,18 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint64[] calldata cooldownPeriods, uint256[] calldata triggerThresholds, uint256[] calldata resetThresholds, - bool[] calldata enableBoundedPricings + bool[] calldata enableBoundedPricings, + bool[] calldata enableCachings ) external { - _checkAccessAllowed("setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])"); + _checkAccessAllowed("setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[],bool[])"); uint256 len = assets.length; if ( len == 0 || len != cooldownPeriods.length || len != triggerThresholds.length || len != resetThresholds.length || - len != enableBoundedPricings.length + len != enableBoundedPricings.length || + len != enableCachings.length ) revert InvalidArrayLength(); for (uint256 i; i < len; ++i) { @@ -328,7 +338,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { cooldownPeriods[i], triggerThresholds[i], resetThresholds[i], - enableBoundedPricings[i] + enableBoundedPricings[i], + enableCachings[i] ); } } @@ -413,6 +424,24 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { emit BoundedPricingWhitelistUpdated(asset, enabled); } + /** + * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset + * @dev When disabled, each view/non-view price call recomputes bounded prices from the + * live spot instead of reading or writing the transient slots. The initial value is + * set via the `enableCaching` argument of `setTokenConfig`. + * @param asset The underlying asset address + * @param enabled Whether transient caching is enabled for this asset + * @custom:access Only Governance + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:event CachingEnabledUpdated + */ + function setCachingEnabled(address asset, bool enabled) external { + _checkAccessAllowed("setCachingEnabled(address,bool)"); + MarketProtectionState storage state = _ensureInitialized(asset); + emit CachingEnabledUpdated(asset, state.cachingEnabled, enabled); + state.cachingEnabled = enabled; + } + // ----- View helpers ----- /** @@ -521,6 +550,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization + * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset * @custom:error MarketAlreadyInitialized if the asset has already been initialized * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% @@ -533,7 +563,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint64 cooldownPeriod, uint256 triggerThreshold, uint256 resetThreshold, - bool enableBoundedPricing + bool enableBoundedPricing, + bool enableCaching ) internal { ensureNonzeroAddress(asset); ensureNonzeroValue(cooldownPeriod); @@ -556,7 +587,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { cooldownPeriod: cooldownPeriod, asset: asset, triggerThreshold: uint128(triggerThreshold), - resetThreshold: uint128(resetThreshold) + resetThreshold: uint128(resetThreshold), + cachingEnabled: enableCaching }); allAssets.push(asset); @@ -802,23 +834,29 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @dev Writes both lower and upper bounded prices to transient storage + * @dev Writes both lower and upper bounded prices to transient storage. No-ops when the + * asset's `cachingEnabled` flag is `false`, so callers that disable caching always + * fall through to live recomputation on subsequent reads. * @param asset The underlying asset address * @param minPrice The resolved lower (collateral) price to cache * @param maxPrice The resolved upper (debt) price to cache */ function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal { + if (!assetProtectionConfig[asset].cachingEnabled) return; Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice); Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice); } /** - * @dev Reads a cached final price from transient storage + * @dev Reads a cached final price from transient storage. Returns `(0, 0)` when the + * asset's `cachingEnabled` flag is `false`, which callers already treat as a cache + * miss and handle via live recomputation. * @param asset The underlying asset address * @return minPrice The cached minimum price, or 0 on cache miss * @return maxPrice The cached maximum price, or 0 on cache miss */ function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) { + if (!assetProtectionConfig[asset].cachingEnabled) return (0, 0); minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset); maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset); } diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index fd6298a9..00c5606d 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -32,6 +32,8 @@ interface IDeviationBoundedOracle { uint128 triggerThreshold; /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled uint128 resetThreshold; + /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset + bool cachingEnabled; } // --- Events --- @@ -69,6 +71,9 @@ interface IDeviationBoundedOracle { /// @notice Emitted when an asset's whitelist status changes event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted); + /// @notice Emitted when the per-asset transient caching flag is toggled + event CachingEnabledUpdated(address indexed asset, bool oldEnabled, bool newEnabled); + // --- Errors --- /// @notice Thrown when trying to initialize protection for an asset that is not initialized @@ -155,9 +160,10 @@ interface IDeviationBoundedOracle { // --- State update (call before view price reads to populate transient cache) --- /** - * @notice Updates the protection state for a given vToken, caching the resolved price + * @notice Updates the protection state for a given vToken, caching the resolved collateral and debt prices * @dev Called by PolicyFacet before liquidity calculations so subsequent view price - * reads in the same transaction are served from transient storage. + * reads in the same transaction are served from transient storage. The transient + * cache is only populated when the asset's `cachingEnabled` flag is `true`. * @param vToken vToken address * @custom:error PriceExceedsUint128 if the spot price overflows uint128 * @custom:event MinPriceUpdated if a new window minimum is recorded @@ -170,7 +176,8 @@ interface IDeviationBoundedOracle { /** * @notice Gets the bounded collateral price for a given vToken (view variant) - * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; + * falls back to ResilientOracle on cache miss or when caching is disabled. * @param vToken vToken address * @return price The bounded collateral price * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) @@ -179,7 +186,8 @@ interface IDeviationBoundedOracle { /** * @notice Gets the bounded debt price for a given vToken (view variant) - * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; + * falls back to ResilientOracle on cache miss or when caching is disabled. * @param vToken vToken address * @return price The bounded debt price * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only) @@ -188,7 +196,8 @@ interface IDeviationBoundedOracle { /** * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant) - * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss. + * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; + * falls back to ResilientOracle on cache miss or when caching is disabled. * @param vToken vToken address * @return collateralPrice The bounded collateral price * @return debtPrice The bounded debt price @@ -244,6 +253,7 @@ interface IDeviationBoundedOracle { * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization + * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset * @custom:access Only Governance * @custom:error MarketAlreadyInitialized if the asset has already been initialized * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% @@ -259,7 +269,8 @@ interface IDeviationBoundedOracle { uint64 cooldownPeriod, uint256 triggerThreshold, uint256 resetThreshold, - bool enableBoundedPricing + bool enableBoundedPricing, + bool enableCaching ) external; /** @@ -269,6 +280,7 @@ interface IDeviationBoundedOracle { * @param triggerThresholds Array of trigger thresholds (mantissa) * @param resetThresholds Array of reset thresholds (mantissa) * @param enableBoundedPricings Array of whether to enable bounded pricing per asset + * @param enableCachings Array of whether transient caching is enabled per asset * @custom:access Only Governance * @custom:error InvalidArrayLength if array lengths do not match * @custom:event ProtectionInitialized for each asset @@ -279,7 +291,8 @@ interface IDeviationBoundedOracle { uint64[] calldata cooldownPeriods, uint256[] calldata triggerThresholds, uint256[] calldata resetThresholds, - bool[] calldata enableBoundedPricings + bool[] calldata enableBoundedPricings, + bool[] calldata enableCachings ) external; /** @@ -318,6 +331,19 @@ interface IDeviationBoundedOracle { */ function setAssetBoundedPricingEnabled(address asset, bool enabled) external; + /** + * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset + * @dev When disabled, each view/non-view price call recomputes bounded prices from the + * live spot instead of reading or writing the transient slots. The initial value is + * set via the `enableCaching` argument of `setTokenConfig`. + * @param asset The underlying asset address + * @param enabled Whether transient caching is enabled for this asset + * @custom:access Only Governance + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:event CachingEnabledUpdated + */ + function setCachingEnabled(address asset, bool enabled) external; + // --- View helpers --- /** @@ -332,6 +358,7 @@ interface IDeviationBoundedOracle { * @return assetAddr The underlying asset address stored in the struct * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled + * @return cachingEnabled Whether transient caching of the bounded pair is enabled for the asset */ function assetProtectionConfig( address asset @@ -347,7 +374,8 @@ interface IDeviationBoundedOracle { uint64 cooldownPeriod, address assetAddr, uint128 triggerThreshold, - uint128 resetThreshold + uint128 resetThreshold, + bool cachingEnabled ); /** diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 66a395e4..a6c0b8ff 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -51,7 +51,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); }; // Init + widen window via keeper updates (for price-bounding tests that need min=0.9, max=1.1) @@ -63,7 +63,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -147,6 +147,7 @@ describe("DeviationBoundedOracle", () => { DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, + true, ); // Verify struct fields via public getter @@ -160,6 +161,7 @@ describe("DeviationBoundedOracle", () => { expect(state.asset).to.equal(assetA); expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + expect(state.cachingEnabled).to.equal(true); // Verify events await expect(tx) @@ -183,6 +185,7 @@ describe("DeviationBoundedOracle", () => { DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, false, + true, ); const state = await oracle.assetProtectionConfig(assetA); @@ -201,63 +204,63 @@ describe("DeviationBoundedOracle", () => { it("reverts when caller is unauthorized", async () => { acm.isAllowedToCall.returns(false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when asset is zero address", async () => { await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); }); it("reverts when already initialized", async () => { await initAsset(assetA); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); it("reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("reverts when asset is VAI", async () => { const vaiAddr = await vaiToken.underlying(); await expect( - oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); }); it("reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); @@ -265,7 +268,7 @@ describe("DeviationBoundedOracle", () => { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); @@ -273,7 +276,7 @@ describe("DeviationBoundedOracle", () => { const overflowPrice = BigNumber.from(2).pow(128); resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); }); }); @@ -291,6 +294,7 @@ describe("DeviationBoundedOracle", () => { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, true], + [true, true], ); // Verify both assets initialized @@ -324,6 +328,7 @@ describe("DeviationBoundedOracle", () => { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, false], + [true, true], ); expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); @@ -333,7 +338,14 @@ describe("DeviationBoundedOracle", () => { it("reverts when caller is unauthorized", async () => { acm.isAllowedToCall.returns(false); await expect( - oracle.setTokenConfigs([assetA], [DEFAULT_COOLDOWN], [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true]), + oracle.setTokenConfigs( + [assetA], + [DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD], + [true], + [true], + ), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); @@ -345,6 +357,7 @@ describe("DeviationBoundedOracle", () => { [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true], + [true], ), ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); }); @@ -357,6 +370,7 @@ describe("DeviationBoundedOracle", () => { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, true], + [true, true], ), ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); }); @@ -370,12 +384,13 @@ describe("DeviationBoundedOracle", () => { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, true], + [true, true], ), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); it("succeeds with empty arrays (no-op)", async () => { - await expect(oracle.setTokenConfigs([], [], [], [], [])).to.be.revertedWithCustomError( + await expect(oracle.setTokenConfigs([], [], [], [], [], [])).to.be.revertedWithCustomError( oracle, "InvalidArrayLength", ); @@ -601,6 +616,43 @@ describe("DeviationBoundedOracle", () => { }); }); + // ──────────────────────────────────────────────────────────────────────── + // 6b. setCachingEnabled + // ──────────────────────────────────────────────────────────────────────── + + describe("setCachingEnabled", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("disables caching and emits CachingEnabledUpdated", async () => { + const tx = await oracle.setCachingEnabled(assetA, false); + await expect(tx).to.emit(oracle, "CachingEnabledUpdated").withArgs(assetA, true, false); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cachingEnabled).to.equal(false); + }); + + it("re-enables caching and emits CachingEnabledUpdated", async () => { + await oracle.setCachingEnabled(assetA, false); + const tx = await oracle.setCachingEnabled(assetA, true); + await expect(tx).to.emit(oracle, "CachingEnabledUpdated").withArgs(assetA, false, true); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cachingEnabled).to.equal(true); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect(oracle.setCachingEnabled(assetA, false)).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("reverts when asset has not been initialized", async () => { + await expect(oracle.setCachingEnabled(assetB, false)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + }); + // ──────────────────────────────────────────────────────────────────────── // 7. updateMinPrice // ──────────────────────────────────────────────────────────────────────── @@ -1357,6 +1409,56 @@ describe("DeviationBoundedOracle", () => { }); }); + // ──────────────────────────────────────────────────────────────────────── + // 15b. transient cache gating (DBO.cachingEnabled) + // ──────────────────────────────────────────────────────────────────────── + + describe("transient cache gating (DBO.cachingEnabled)", () => { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + let caller: any; + + beforeEach(async () => { + await initAssetWithWindow(assetA); + const callerFactory = await ethers.getContractFactory("DeviationBoundedOracleCaller", admin); + caller = await callerFactory.deploy(oracle.address); + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("view reads hit the cache when cachingEnabled is true (default)", async () => { + await caller.updateAndGetBothPrices(vTokenA.address); + + // updateProtectionState fetches the spot once; both view getters read from the + // transient cache and do not re-query the ResilientOracle. + expect(resilientOracle.getPrice).to.have.callCount(1); + }); + + it("view reads bypass the cache when cachingEnabled is false", async () => { + await oracle.setCachingEnabled(assetA, false); + resilientOracle.getPrice.reset(); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + + await caller.updateAndGetBothPrices(vTokenA.address); + + // updateProtectionState fetches once; each view getter recomputes and fetches again. + expect(resilientOracle.getPrice).to.have.callCount(3); + }); + + it("disabling caching mid-window does not serve stale prices from prior cache writes", async () => { + // Seed the cache first by running update with the original spot. + await caller.updateAndGetBothPrices(vTokenA.address); + + // Disable caching and change the spot — views must recompute with the new spot. + await oracle.setCachingEnabled(assetA, false); + const newSpot = parseUnits("1.05", 18); + resilientOracle.getPrice.whenCalledWith(assetA).returns(newSpot); + + const [collateral, debt] = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(collateral).to.equal(newSpot); + expect(debt).to.equal(newSpot); + }); + }); + // ──────────────────────────────────────────────────────────────────────── // 16. isBoundedPricingEnabled // ──────────────────────────────────────────────────────────────────────── @@ -1862,10 +1964,7 @@ describe("DeviationBoundedOracle", () => { // Bump resetThreshold above the current range (~29.4%) so the convergence check passes const stateBeforeExit = await oracle.assetProtectionConfig(assetA); - const range = stateBeforeExit.maxPrice - .sub(stateBeforeExit.minPrice) - .mul(EXP_SCALE) - .div(stateBeforeExit.minPrice); + const range = stateBeforeExit.maxPrice.sub(stateBeforeExit.minPrice).mul(EXP_SCALE).div(stateBeforeExit.minPrice); const newReset = range.add(parseUnits("0.001", 18)); const newTrigger = newReset.add(parseUnits("0.01", 18)); await oracle.setThresholds(assetA, newTrigger, newReset); diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 268568a9..d4c3e1f6 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -90,7 +90,7 @@ describe("DeviationBoundedOracle E2E", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -327,7 +327,7 @@ describe("DeviationBoundedOracle E2E", () => { // Initialize with 30% threshold → upperBound = 0.9 * 1.3 = 1.17 const highThreshold = parseUnits("0.3", 18); const resetThreshold = parseUnits("0.15", 18); - await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold, true); + await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold, true, true); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 070f3dde..aaf3650d 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -91,11 +91,12 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // Impersonated timelock grants all DBO permissions to deployer via real ACM const DBO_FUNCTIONS = [ - "setTokenConfig(address,uint64,uint256,uint256,bool)", - "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])", + "setTokenConfig(address,uint64,uint256,uint256,bool,bool)", + "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[],bool[])", "setCooldownPeriod(address,uint64)", "setThresholds(address,uint256,uint256)", "setAssetBoundedPricingEnabled(address,bool)", + "setCachingEnabled(address,bool)", "updateMinPrice(address,uint128)", "updateMaxPrice(address,uint128)", "exitProtectionMode(address)", @@ -135,7 +136,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); }; const initAssetWithWindow = async ( @@ -146,7 +147,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true); + await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -231,6 +232,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, + true, ); const state = await oracle.assetProtectionConfig(assetA); @@ -243,6 +245,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(state.asset).to.equal(assetA); expect(state.triggerThreshold).to.equal(DEFAULT_THRESHOLD); expect(state.resetThreshold).to.equal(DEFAULT_RESET_THRESHOLD); + expect(state.cachingEnabled).to.equal(true); await expect(tx) .to.emit(oracle, "ProtectionInitialized") @@ -259,62 +262,69 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await expect( oracle .connect(someone) - .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("3.3 reverts when asset is zero address", async () => { await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); }); it("3.4 reverts when already initialized", async () => { await initAsset(assetA); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); it("3.5 reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("3.6 reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("3.7 reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("3.8 reverts when asset is VAI", async () => { await expect( - oracle.setTokenConfig(VAI_ADDRESS, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig( + VAI_ADDRESS, + DEFAULT_COOLDOWN, + DEFAULT_THRESHOLD, + DEFAULT_RESET_THRESHOLD, + true, + true, + ), ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); }); it("3.9 reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.10 reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.11 reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true, true), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); @@ -322,7 +332,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); }); @@ -330,7 +340,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const overflowPrice = BigNumber.from(2).pow(128); await mockOracle.setPrice(assetA, overflowPrice); await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true), + oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); }); }); @@ -502,6 +512,50 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); }); + // ──────────────────────────────────────────────────────────────────── + // 6b. setCachingEnabled + // ──────────────────────────────────────────────────────────────────── + + describe("6b. setCachingEnabled", () => { + beforeEach(async () => { + await initAsset(assetA); + }); + + it("6b.1 defaults to true at asset initialization", async () => { + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cachingEnabled).to.equal(true); + }); + + it("6b.2 disables caching and emits CachingEnabledUpdated", async () => { + const tx = await oracle.setCachingEnabled(assetA, false); + await expect(tx).to.emit(oracle, "CachingEnabledUpdated").withArgs(assetA, true, false); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cachingEnabled).to.equal(false); + }); + + it("6b.3 re-enables caching and emits CachingEnabledUpdated", async () => { + await oracle.setCachingEnabled(assetA, false); + const tx = await oracle.setCachingEnabled(assetA, true); + await expect(tx).to.emit(oracle, "CachingEnabledUpdated").withArgs(assetA, false, true); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.cachingEnabled).to.equal(true); + }); + + it("6b.4 reverts when caller is unauthorized", async () => { + await expect(oracle.connect(someone).setCachingEnabled(assetA, false)).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); + }); + + it("6b.5 reverts when asset has not been initialized", async () => { + await expect(oracle.setCachingEnabled(assetB, false)).to.be.revertedWithCustomError( + oracle, + "MarketNotInitialized", + ); + }); + }); + // ──────────────────────────────────────────────────────────────────── // 7. updateMinPrice // ──────────────────────────────────────────────────────────────────── @@ -1051,6 +1105,55 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); }); + // ──────────────────────────────────────────────────────────────────── + // 22b. cachingEnabled gating (DBO-local flag) + // ──────────────────────────────────────────────────────────────────── + + describe("22b. cachingEnabled gating", () => { + beforeEach(async () => { + await initAssetWithWindow(assetA); + }); + + it("22b.1 cache hit when cachingEnabled is true (default), no protection", async () => { + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(SPOT_PRICE); + expect(result.debt).to.equal(SPOT_PRICE); + }); + + it("22b.2 views recompute from live spot when cachingEnabled is false", async () => { + // Seed the cache with the original spot, then disable caching. + await caller.updateAndGetBothPrices(vTokenA.address); + await oracle.setCachingEnabled(assetA, false); + + // Change the live spot — cache-disabled views must recompute from it. + const newSpot = parseUnits("1.05", 18); + await mockOracle.setPrice(assetA, newSpot); + + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(newSpot); + expect(result.debt).to.equal(newSpot); + }); + + it("22b.3 re-enabling caching restores cache-hit behaviour", async () => { + await oracle.setCachingEnabled(assetA, false); + await oracle.setCachingEnabled(assetA, true); + + const result = await caller.callStatic.updateAndGetBothPrices(vTokenA.address); + expect(result.collateral).to.equal(SPOT_PRICE); + expect(result.debt).to.equal(SPOT_PRICE); + }); + + it("22b.4 cachingEnabled is per-asset and does not leak across assets", async () => { + await initAssetWithWindow(assetB); + await oracle.setCachingEnabled(assetA, false); + + const stateA = await oracle.assetProtectionConfig(assetA); + const stateB = await oracle.assetProtectionConfig(assetB); + expect(stateA.cachingEnabled).to.equal(false); + expect(stateB.cachingEnabled).to.equal(true); + }); + }); + // ──────────────────────────────────────────────────────────────────── // 23. Re-trigger After Disable // ──────────────────────────────────────────────────────────────────── @@ -1105,7 +1208,14 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const spot = parseUnits("1.15", 18); it("24.1 lowering threshold triggers protection", async () => { - await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, parseUnits("0.3", 18), parseUnits("0.15", 18), true); + await oracle.setTokenConfig( + assetA, + DEFAULT_COOLDOWN, + parseUnits("0.3", 18), + parseUnits("0.15", 18), + true, + true, + ); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); await mockOracle.setPrice(assetA, spot); @@ -1429,6 +1539,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, true], + [true, true], ); const stateA = await oracle.assetProtectionConfig(assetA); @@ -1452,6 +1563,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], [true, false], + [true, true], ); expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); @@ -1462,7 +1574,14 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await expect( oracle .connect(someone) - .setTokenConfigs([assetA], [DEFAULT_COOLDOWN], [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true]), + .setTokenConfigs( + [assetA], + [DEFAULT_COOLDOWN], + [DEFAULT_THRESHOLD], + [DEFAULT_RESET_THRESHOLD], + [true], + [true], + ), ).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); @@ -1474,6 +1593,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { [DEFAULT_THRESHOLD], [DEFAULT_RESET_THRESHOLD], [true], + [true], ), ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); }); @@ -1491,6 +1611,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, false, + true, ); expect((await oracle.assetProtectionConfig(assetA)).isBoundedPricingEnabled).to.equal(false); From 7e469e3813a1eb4bfc34d153c140eea83343fceb Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 22 Apr 2026 17:50:47 +0530 Subject: [PATCH 17/30] docs: [VLD-05] Align IDeviationBoundedOracle NatSpec With Implementation --- contracts/DeviationBoundedOracle.sol | 2 +- contracts/interfaces/IDeviationBoundedOracle.sol | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 2aee436e..f13ddffb 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -150,7 +150,7 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Fetches the spot price, updates the protection window, and caches the resolved - * bounded prices in transient storage for the duration of the transaction. + * collateral and debt prices in transient storage for the duration of the transaction. * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / * getBoundedDebtPriceView within the same transaction will read from the transient cache diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index 00c5606d..eeda1a97 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -76,7 +76,7 @@ interface IDeviationBoundedOracle { // --- Errors --- - /// @notice Thrown when trying to initialize protection for an asset that is not initialized + /// @notice Thrown when trying to use or update protection for an asset that has not been initialized error MarketNotInitialized(address asset); /// @notice Thrown when trying to initialize an already initialized market @@ -112,13 +112,13 @@ interface IDeviationBoundedOracle { /// @notice Thrown when trying to initialize protection for VAI error VAINotAllowed(); - /// @notice Thrown when trying to update for an asset with active protection + /// @notice Thrown when trying to disable bounded pricing for an asset while protection is active error ProtectedPriceActive(address asset); /// @notice Thrown when the lengths of the arrays are not equal error InvalidArrayLength(); - /// @notice Thrown when the exit threshold is set above the deviation threshold + /// @notice Thrown when the exit threshold is set at or above the trigger threshold error InvalidResetThreshold(uint256 resetThreshold); // --- Non-view price functions (update window + trigger protection) --- From 2519e92aeb939a3077f2e2ea735f2e5d57f8b879 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 22 Apr 2026 17:54:59 +0530 Subject: [PATCH 18/30] docs: [VLD-06] Correct _exceedsDeviationThreshold @notice Description --- contracts/DeviationBoundedOracle.sol | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index f13ddffb..cac26b18 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -777,7 +777,9 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } /** - * @notice Checks if the spot price has deviated beyond the threshold from the window bounds + * @notice Checks whether the spot price has moved beyond the threshold relative to the + * opposite window bound — i.e. `spot > minPrice * (1 + threshold)` or + * `spot < maxPrice * (1 - threshold)`. * @dev Pump detection: spot > minPrice * (1 + threshold) * Crash detection: spot < maxPrice * (1 - threshold) * @param spot The current spot price From d328cd62f9fdb6b278add6686d36a18a368bd5b0 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Tue, 28 Apr 2026 17:08:40 +0530 Subject: [PATCH 19/30] fix: [S1] Align COLLATERAL_PRICE_CACHE_SLOT with canonical ERC-7201 derivation --- contracts/DeviationBoundedOracle.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index cac26b18..715c3db9 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -52,11 +52,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { address public immutable vai; /// @notice Transient storage slot for caching final collateral prices within a transaction - /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache - /// keccak256(abi.encode(uint256(keccak256("venus-protocol/oracle/DeviationBoundedOracle/cache")) - 1)) + /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache + /// keccak256(abi.encode(uint256(keccak256("venus-protocol/oracle/DeviationBoundedOracle/collateralCache")) - 1)) /// & ~bytes32(uint256(0xff)) bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT = - 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200; + 0x7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf7000; /// @notice Transient storage slot for caching final debt prices within a transaction /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache From 8563c8c71a2683cdb018dee5f86b6993ba3e84d2 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Tue, 28 Apr 2026 17:57:40 +0530 Subject: [PATCH 20/30] fix: Allow min == max == spot in keeper bound updates --- contracts/DeviationBoundedOracle.sol | 8 ++--- test/DeviationBoundedOracle.ts | 32 ++++++++++++++++--- test/DeviationBoundedOracleE2E.ts | 47 ++++++++++++++++++++++++++++ test/fork/DeviationBoundedOracle.ts | 36 ++++++++++++++++++--- 4 files changed, 111 insertions(+), 12 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 715c3db9..5807ada8 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -604,8 +604,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param boundType Whether this is a MIN or MAX bound update * @custom:error ZeroPriceNotAllowed if newPrice is zero * @custom:error MarketNotInitialized if the asset has not been initialized - * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice - * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice + * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is strictly above maxPrice + * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is strictly below minPrice */ function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal { ensureNonzeroAddress(asset); @@ -614,11 +614,11 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { uint256 currentSpot = _fetchSpotPrice(asset); if (boundType == PriceBoundType.MIN) { - if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot) + if (newPrice > state.maxPrice || uint256(newPrice) > currentSpot) revert InvalidMinPrice(asset, newPrice, currentSpot); _setMinPrice(state, asset, newPrice); } else if (boundType == PriceBoundType.MAX) { - if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot) + if (newPrice < state.minPrice || uint256(newPrice) < currentSpot) revert InvalidMaxPrice(asset, newPrice, currentSpot); _setMaxPrice(state, asset, newPrice); } diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index a6c0b8ff..206c1997 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -708,8 +708,20 @@ describe("DeviationBoundedOracle", () => { await expect(oracle.updateMinPrice(assetA, aboveSpot)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); }); - it("reverts when newMin >= maxPrice", async () => { - await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + it("reverts when newMin > maxPrice", async () => { + // Set spot above maxPrice so the spot constraint passes; the maxPrice check is what reverts + resilientOracle.getPrice.whenCalledWith(assetA).returns(MAX_PRICE.add(parseUnits("0.05", 18))); + const aboveMax = MAX_PRICE.add(1); + await expect(oracle.updateMinPrice(assetA, aboveMax)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + }); + + it("succeeds when newMin == maxPrice == spot (full convergence)", async () => { + // Spot equal to maxPrice so newMin = maxPrice = spot is valid under the relaxed semantics + resilientOracle.getPrice.whenCalledWith(assetA).returns(MAX_PRICE); + await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.not.be.reverted; + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(MAX_PRICE); + expect(state.maxPrice).to.equal(MAX_PRICE); }); }); @@ -762,8 +774,20 @@ describe("DeviationBoundedOracle", () => { await expect(oracle.updateMaxPrice(assetA, belowSpot)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); }); - it("reverts when newMax <= minPrice", async () => { - await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + it("reverts when newMax < minPrice", async () => { + // Set spot below minPrice so the spot constraint passes; the minPrice check is what reverts + resilientOracle.getPrice.whenCalledWith(assetA).returns(MIN_PRICE.sub(parseUnits("0.05", 18))); + const belowMin = MIN_PRICE.sub(1); + await expect(oracle.updateMaxPrice(assetA, belowMin)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + }); + + it("succeeds when newMax == minPrice == spot (full convergence)", async () => { + // Spot equal to minPrice so newMax = minPrice = spot is valid under the relaxed semantics + resilientOracle.getPrice.whenCalledWith(assetA).returns(MIN_PRICE); + await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.not.be.reverted; + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(MIN_PRICE); + expect(state.maxPrice).to.equal(MIN_PRICE); }); }); diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index d4c3e1f6..53d16146 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -1081,4 +1081,51 @@ describe("DeviationBoundedOracle E2E", () => { expect(debt).to.equal(SPOT_PRICE); }); }); + + // ──────────────────────────────────────────────────────────────────────── + // E2E-17. Keeper convergence path: trigger → min == max == spot → exitProtectionMode + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-17: keeper convergence to min == max == spot enables clean exit", () => { + it("17a: full convergence path — pump trigger, keeper converges window to spot, exit succeeds", async () => { + await initAssetWithWindow(assetA); + + // 1. Trigger protection via pump + const pumpSpot = await triggerPump(assetA, vTokenA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // 2. Spot stabilises somewhere inside the post-trigger window (between minPrice and maxPrice) + const stableSpot = MIN_PRICE.add(pumpSpot).div(2); + resilientOracle.getPrice.whenCalledWith(assetA).returns(stableSpot); + + // 3. Keeper converges the window: first set min = stableSpot (allowed; old maxPrice >= stableSpot) + await oracle.updateMinPrice(assetA, stableSpot); + let state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(stableSpot); + + // 4. Keeper sets max = stableSpot — newly allowed (newMax == minPrice == spot) + await oracle.updateMaxPrice(assetA, stableSpot); + state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(stableSpot); + expect(state.maxPrice).to.equal(stableSpot); + + // 5. Range ratio collapses to zero, satisfying the resetThreshold gate + const rangeRatio = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + expect(rangeRatio).to.equal(0); + + // 6. Cooldown elapses and exitProtectionMode succeeds without governance threshold gymnastics + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const tx = await oracle.exitProtectionMode(assetA); + await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + + // 7. Bounded prices fall back to spot once protection is cleared + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(collateral).to.equal(stableSpot); + expect(debt).to.equal(stableSpot); + }); + }); }); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index aaf3650d..91e1ef72 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -584,8 +584,22 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { ); }); - it("7.4 reverts when newMin >= maxPrice", async () => { - await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + it("7.4 reverts when newMin > maxPrice", async () => { + // Set spot above maxPrice so the spot constraint passes; the maxPrice check is what reverts + await mockOracle.setPrice(assetA, MAX_PRICE.add(parseUnits("0.05", 18))); + await expect(oracle.updateMinPrice(assetA, MAX_PRICE.add(1))).to.be.revertedWithCustomError( + oracle, + "InvalidMinPrice", + ); + }); + + it("7.5 succeeds when newMin == maxPrice == spot (full convergence)", async () => { + // Spot equal to maxPrice so newMin = maxPrice = spot is valid under the relaxed semantics + await mockOracle.setPrice(assetA, MAX_PRICE); + await expect(oracle.updateMinPrice(assetA, MAX_PRICE)).to.not.be.reverted; + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(MAX_PRICE); + expect(state.maxPrice).to.equal(MAX_PRICE); }); }); @@ -616,8 +630,22 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { ); }); - it("8.4 reverts when newMax <= minPrice", async () => { - await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.be.revertedWithCustomError(oracle, "InvalidMaxPrice"); + it("8.4 reverts when newMax < minPrice", async () => { + // Set spot below minPrice so the spot constraint passes; the minPrice check is what reverts + await mockOracle.setPrice(assetA, MIN_PRICE.sub(parseUnits("0.05", 18))); + await expect(oracle.updateMaxPrice(assetA, MIN_PRICE.sub(1))).to.be.revertedWithCustomError( + oracle, + "InvalidMaxPrice", + ); + }); + + it("8.5 succeeds when newMax == minPrice == spot (full convergence)", async () => { + // Spot equal to minPrice so newMax = minPrice = spot is valid under the relaxed semantics + await mockOracle.setPrice(assetA, MIN_PRICE); + await expect(oracle.updateMaxPrice(assetA, MIN_PRICE)).to.not.be.reverted; + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(MIN_PRICE); + expect(state.maxPrice).to.equal(MIN_PRICE); }); }); From f60318a3b9c16c023fa31b4cf78fefde22262383 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Wed, 29 Apr 2026 12:20:41 +0530 Subject: [PATCH 21/30] feat: Add syncPriceBoundsAndProtections batch entry point for keeper actions --- contracts/DeviationBoundedOracle.sol | 72 +++++++-- .../interfaces/IDeviationBoundedOracle.sol | 38 +++++ test/DeviationBoundedOracle.ts | 149 ++++++++++++++++++ test/DeviationBoundedOracleE2E.ts | 47 ++++++ test/fork/DeviationBoundedOracle.ts | 130 +++++++++++++++ 5 files changed, 420 insertions(+), 16 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index 5807ada8..a331d116 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -254,24 +254,34 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { */ function exitProtectionMode(address asset) external { _checkAccessAllowed("exitProtectionMode(address)"); - ensureNonzeroAddress(asset); - MarketProtectionState storage state = _ensureInitialized(asset); - - if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset); - - if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) { - revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod); - } + _exitProtectionMode(asset); + } - // exit protected price if price range has converged below exit threshold - uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice); - if (rangeRatio >= state.resetThreshold) { - revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold); + /** + * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check + * @dev Each item is processed in array order; any item revert rolls back the whole batch. + * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. + * Empty `actions` is a no-op success. + * @param actions The list of keeper actions to apply + * @custom:access Only authorized keeper addresses + * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value + * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited + */ + function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external { + _checkAccessAllowed("syncPriceBoundsAndProtections((address,uint8,uint256)[])"); + uint256 len = actions.length; + for (uint256 i; i < len; ++i) { + KeeperActionItem calldata item = actions[i]; + if (item.action == KeeperAction.SetMinPrice) { + _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MIN); + } else if (item.action == KeeperAction.SetMaxPrice) { + _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MAX); + } else if (item.action == KeeperAction.ExitProtectionMode) { + _exitProtectionMode(item.asset); + } else { + revert InvalidKeeperAction(uint8(item.action)); + } } - - state.currentlyUsingProtectedPrice = false; - state.lastProtectionTriggeredAt = 0; - emit ProtectionModeExited(asset); } // ----- Admin functions (governance-gated) ----- @@ -624,6 +634,36 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { } } + /** + * @notice Clears protection for an asset once cooldown has elapsed and the window has converged + * @dev Shared body of `exitProtectionMode` and the ExitProtectionMode branch of `syncPriceBoundsAndProtections`. + * Callers are responsible for ACM gating before invoking this helper. + * @param asset The underlying asset address + * @custom:error MarketNotInitialized if the asset has not been initialized + * @custom:error ProtectedPriceInactive if protection is not currently active + * @custom:error CooldownNotElapsed if cooldown period has not elapsed + * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold + */ + function _exitProtectionMode(address asset) internal { + ensureNonzeroAddress(asset); + MarketProtectionState storage state = _ensureInitialized(asset); + + if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset); + + if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) { + revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod); + } + + uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice); + if (rangeRatio >= state.resetThreshold) { + revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold); + } + + state.currentlyUsingProtectedPrice = false; + state.lastProtectionTriggeredAt = 0; + emit ProtectionModeExited(asset); + } + /** * @notice Shared non-view logic for all bounded price functions. * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices. diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index eeda1a97..d46ea8ea 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -10,6 +10,13 @@ interface IDeviationBoundedOracle { MAX } + /// @notice Identifies which keeper action a single syncPriceBoundsAndProtections item performs + enum KeeperAction { + SetMinPrice, + SetMaxPrice, + ExitProtectionMode + } + // --- Structs --- /// @notice Per-asset protection state tracking the min/max price window @@ -36,6 +43,14 @@ interface IDeviationBoundedOracle { bool cachingEnabled; } + /// @notice One item in an syncPriceBoundsAndProtections payload + /// @dev `value` is interpreted per-action: the new bound price for SetMinPrice / SetMaxPrice, ignored for ExitProtectionMode + struct KeeperActionItem { + address asset; + KeeperAction action; + uint256 value; + } + // --- Events --- /// @notice Emitted when protection is initialized for an asset @@ -121,6 +136,9 @@ interface IDeviationBoundedOracle { /// @notice Thrown when the exit threshold is set at or above the trigger threshold error InvalidResetThreshold(uint256 resetThreshold); + /// @notice Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value + error InvalidKeeperAction(uint8 action); + // --- Non-view price functions (update window + trigger protection) --- /** @@ -242,6 +260,26 @@ interface IDeviationBoundedOracle { */ function exitProtectionMode(address asset) external; + /** + * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check + * @dev Each item is processed in array order; any item revert rolls back the whole batch. + * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. + * Empty `actions` is a no-op success. + * @param actions The list of keeper actions to apply + * @custom:access Only authorized keeper addresses + * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value + * @custom:error PriceExceedsUint128 if a SetMin/SetMax item value overflows uint128 + * @custom:error ZeroPriceNotAllowed if a SetMin/SetMax item value is zero + * @custom:error MarketNotInitialized if any referenced asset has not been initialized + * @custom:error InvalidMinPrice if a SetMinPrice item violates the spot/maxPrice constraints + * @custom:error InvalidMaxPrice if a SetMaxPrice item violates the spot/minPrice constraints + * @custom:error ProtectedPriceInactive if an ExitProtectionMode item targets an asset whose protection is not active + * @custom:error CooldownNotElapsed if an ExitProtectionMode item is submitted before cooldown elapsed + * @custom:error PriceRangeNotConverged if an ExitProtectionMode item is submitted before window convergence + * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited + */ + function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external; + // --- Admin functions (governance-gated) --- /** diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index 206c1997..d0a2b881 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -960,6 +960,155 @@ describe("DeviationBoundedOracle", () => { }); }); + // ──────────────────────────────────────────────────────────────────────── + // 9b. syncPriceBoundsAndProtections (keeper batch) + // ──────────────────────────────────────────────────────────────────────── + + describe("syncPriceBoundsAndProtections", () => { + // KeeperAction enum: 0 = SetMinPrice, 1 = SetMaxPrice, 2 = ExitProtectionMode + const SetMinPrice = 0; + const SetMaxPrice = 1; + const ExitProtectionMode = 2; + + beforeEach(async () => { + await initAssetWithWindow(assetA); + resilientOracle.getPrice.whenCalledWith(assetA).returns(SPOT_PRICE); + }); + + it("reverts when caller is unauthorized", async () => { + acm.isAllowedToCall.returns(false); + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: parseUnits("0.85", 18) }]), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("succeeds with empty array (no-op)", async () => { + await expect(oracle.syncPriceBoundsAndProtections([])).to.not.be.reverted; + }); + + it("single SetMinPrice item updates the asset and emits MinPriceUpdated", async () => { + const newMin = parseUnits("0.85", 18); + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: newMin }]); + await expect(tx).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, newMin); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(newMin); + }); + + it("single SetMaxPrice item updates the asset and emits MaxPriceUpdated", async () => { + const newMax = parseUnits("1.15", 18); + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMaxPrice, value: newMax }]); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, newMax); + const state = await oracle.assetProtectionConfig(assetA); + expect(state.maxPrice).to.equal(newMax); + }); + + it("single ExitProtectionMode item clears protection and emits ProtectionModeExited", async () => { + // Pre-arm: pump trigger so protection is active + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Cooldown elapses; raise reset threshold above the range so exit gate passes + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + const stateAfter = await oracle.assetProtectionConfig(assetA); + const range = stateAfter.maxPrice.sub(stateAfter.minPrice).mul(EXP_SCALE).div(stateAfter.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const currentTrigger = stateAfter.triggerThreshold; + if (newReset.gte(currentTrigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, currentTrigger, newReset); + } + + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: ExitProtectionMode, value: 0 }]); + await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + }); + + it("mixed batch (SetMin, SetMax, Exit) converges and exits in one tx", async () => { + // Pre-arm: pump trigger + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Spot stabilises somewhere inside the post-trigger window + const stableSpot = MIN_PRICE.add(pumpSpot).div(2); + resilientOracle.getPrice.whenCalledWith(assetA).returns(stableSpot); + + // Wait out cooldown so the Exit action is admissible + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const tx = await oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: SetMinPrice, value: stableSpot }, + { asset: assetA, action: SetMaxPrice, value: stableSpot }, + { asset: assetA, action: ExitProtectionMode, value: 0 }, + ]); + + await expect(tx) + .to.emit(oracle, "MinPriceUpdated") + .and.to.emit(oracle, "MaxPriceUpdated") + .and.to.emit(oracle, "ProtectionModeExited") + .withArgs(assetA); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(stableSpot); + expect(state.maxPrice).to.equal(stableSpot); + expect(state.currentlyUsingProtectedPrice).to.equal(false); + }); + + it("revert in any item rolls back the whole batch", async () => { + // Item 1 is a valid SetMinPrice; item 2 is SetMinPrice with value above current spot — must revert. + // After revert, the asset's minPrice must remain at its pre-batch value (no partial application). + const validNewMin = parseUnits("0.85", 18); + const stateBefore = await oracle.assetProtectionConfig(assetA); + const aboveSpot = SPOT_PRICE.add(parseUnits("0.5", 18)); + + await expect( + oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: SetMinPrice, value: validNewMin }, + { asset: assetA, action: SetMinPrice, value: aboveSpot }, + ]), + ).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.minPrice).to.equal(stateBefore.minPrice); + }); + + it("reverts with PriceExceedsUint128 when a SetMin/SetMax value overflows uint128", async () => { + const overflow = BigNumber.from(2).pow(128); + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: overflow }]), + ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + }); + + it("re-uses per-action validation: SetMinPrice with value > spot still reverts with InvalidMinPrice", async () => { + const aboveSpot = SPOT_PRICE.add(1); + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: aboveSpot }]), + ).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + }); + + it("re-uses per-action validation: ExitProtectionMode before cooldown still reverts with CooldownNotElapsed", async () => { + // Pre-arm protection without waiting cooldown + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + resilientOracle.getPrice.whenCalledWith(assetA).returns(pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: ExitProtectionMode, value: 0 }]), + ).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); + }); + + // Note: the catch-all `revert InvalidKeeperAction(...)` branch is defensive for future enum + // additions. With the current 3-value enum, Solidity's abi-boundary enum range check rejects + // out-of-range action values before the function body executes, so the branch is unreachable + // through a well-formed external call and is left untested. + }); + // ──────────────────────────────────────────────────────────────────────── // 10. getBoundedCollateralPrice // ──────────────────────────────────────────────────────────────────────── diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 53d16146..60d2edd8 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -1082,6 +1082,53 @@ describe("DeviationBoundedOracle E2E", () => { }); }); + // ──────────────────────────────────────────────────────────────────────── + // E2E-18. Keeper batch (syncPriceBoundsAndProtections): converge + exit in one tx + // ──────────────────────────────────────────────────────────────────────── + + describe("E2E-18: keeper converges and exits in a single batched tx", () => { + it("18a: pump trigger → spot stabilises → batch (SetMin, SetMax, Exit) clears protection in one tx", async () => { + // KeeperAction enum: 0 = SetMinPrice, 1 = SetMaxPrice, 2 = ExitProtectionMode + const SetMinPrice = 0; + const SetMaxPrice = 1; + const ExitProtectionMode = 2; + + await initAssetWithWindow(assetA); + + // 1. Trigger via pump + const pumpSpot = await triggerPump(assetA, vTokenA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // 2. Spot stabilises somewhere inside the post-trigger window + const stableSpot = MIN_PRICE.add(pumpSpot).div(2); + resilientOracle.getPrice.whenCalledWith(assetA).returns(stableSpot); + + // 3. Wait out cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // 4. Single batched tx — converge window to spot and exit protection + const tx = await oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: SetMinPrice, value: stableSpot }, + { asset: assetA, action: SetMaxPrice, value: stableSpot }, + { asset: assetA, action: ExitProtectionMode, value: 0 }, + ]); + + await expect(tx) + .to.emit(oracle, "MinPriceUpdated") + .and.to.emit(oracle, "MaxPriceUpdated") + .and.to.emit(oracle, "ProtectionModeExited") + .withArgs(assetA); + + // 5. Protection cleared, bounded prices fall back to spot + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + const collateral = await oracle.callStatic.getBoundedCollateralPrice(vTokenA.address); + const debt = await oracle.callStatic.getBoundedDebtPrice(vTokenA.address); + expect(collateral).to.equal(stableSpot); + expect(debt).to.equal(stableSpot); + }); + }); + // ──────────────────────────────────────────────────────────────────────── // E2E-17. Keeper convergence path: trigger → min == max == spot → exitProtectionMode // ──────────────────────────────────────────────────────────────────────── diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 91e1ef72..275fafb7 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -100,6 +100,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { "updateMinPrice(address,uint128)", "updateMaxPrice(address,uint128)", "exitProtectionMode(address)", + "syncPriceBoundsAndProtections((address,uint8,uint256)[])", ]; for (const fn of DBO_FUNCTIONS) { await acmContract.giveCallPermission(oracleDeployed.address, fn, deployer.address); @@ -1851,5 +1852,134 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { expect(stateAfter.minPrice).to.equal(deeperCrash); }); }); + + // ──────────────────────────────────────────────────────────────────── + // 38. syncPriceBoundsAndProtections (keeper batch) + // ──────────────────────────────────────────────────────────────────── + + describe("38. syncPriceBoundsAndProtections", () => { + // KeeperAction enum: 0 = SetMinPrice, 1 = SetMaxPrice, 2 = ExitProtectionMode + const SetMinPrice = 0; + const SetMaxPrice = 1; + const ExitProtectionMode = 2; + + it("38.1 reverts when caller is unauthorized", async () => { + await initAssetWithWindow(assetA); + await expect( + oracle + .connect(someone) + .syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: parseUnits("0.85", 18) }]), + ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + }); + + it("38.2 succeeds with empty array (no-op)", async () => { + await expect(oracle.syncPriceBoundsAndProtections([])).to.not.be.reverted; + }); + + it("38.3 single SetMinPrice item updates the asset and emits MinPriceUpdated", async () => { + await initAssetWithWindow(assetA); + const newMin = parseUnits("0.85", 18); + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: newMin }]); + await expect(tx).to.emit(oracle, "MinPriceUpdated").withArgs(assetA, MIN_PRICE, newMin); + }); + + it("38.4 single SetMaxPrice item updates the asset and emits MaxPriceUpdated", async () => { + await initAssetWithWindow(assetA); + const newMax = parseUnits("1.15", 18); + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMaxPrice, value: newMax }]); + await expect(tx).to.emit(oracle, "MaxPriceUpdated").withArgs(assetA, MAX_PRICE, newMax); + }); + + it("38.5 single ExitProtectionMode item clears protection", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + + // Cooldown elapses + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + // Raise reset threshold so the range check passes + const state = await oracle.assetProtectionConfig(assetA); + const range = state.maxPrice.sub(state.minPrice).mul(EXP_SCALE).div(state.minPrice); + const newReset = range.add(parseUnits("0.001", 18)); + const trigger = state.triggerThreshold; + if (newReset.gte(trigger)) { + await oracle.setThresholds(assetA, newReset.add(parseUnits("0.01", 18)), newReset); + } else { + await oracle.setThresholds(assetA, trigger, newReset); + } + + const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: ExitProtectionMode, value: 0 }]); + await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); + }); + + it("38.6 mixed batch (SetMin, SetMax, Exit) converges and exits in one tx", async () => { + await initAssetWithWindow(assetA); + + // Trigger via pump + const pumpSpot = MIN_PRICE.mul(EXP_SCALE.add(DEFAULT_THRESHOLD)).div(EXP_SCALE).add(1); + await mockOracle.setPrice(assetA, pumpSpot); + await oracle.getBoundedCollateralPrice(vTokenA.address); + expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(true); + + // Spot stabilises somewhere inside the post-trigger window + const stableSpot = MIN_PRICE.add(pumpSpot).div(2); + await mockOracle.setPrice(assetA, stableSpot); + + // Wait out cooldown + await ethers.provider.send("evm_increaseTime", [DEFAULT_COOLDOWN + 1]); + await ethers.provider.send("evm_mine", []); + + const tx = await oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: SetMinPrice, value: stableSpot }, + { asset: assetA, action: SetMaxPrice, value: stableSpot }, + { asset: assetA, action: ExitProtectionMode, value: 0 }, + ]); + + await expect(tx) + .to.emit(oracle, "MinPriceUpdated") + .and.to.emit(oracle, "MaxPriceUpdated") + .and.to.emit(oracle, "ProtectionModeExited") + .withArgs(assetA); + + const state = await oracle.assetProtectionConfig(assetA); + expect(state.minPrice).to.equal(stableSpot); + expect(state.maxPrice).to.equal(stableSpot); + expect(state.currentlyUsingProtectedPrice).to.equal(false); + }); + + it("38.7 revert in any item rolls back the whole batch", async () => { + await initAssetWithWindow(assetA); + const stateBefore = await oracle.assetProtectionConfig(assetA); + const aboveSpot = SPOT_PRICE.add(parseUnits("0.5", 18)); + + await expect( + oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: SetMinPrice, value: parseUnits("0.85", 18) }, + { asset: assetA, action: SetMinPrice, value: aboveSpot }, + ]), + ).to.be.revertedWithCustomError(oracle, "InvalidMinPrice"); + + const stateAfter = await oracle.assetProtectionConfig(assetA); + expect(stateAfter.minPrice).to.equal(stateBefore.minPrice); + }); + + it("38.8 reverts with PriceExceedsUint128 when value overflows uint128", async () => { + await initAssetWithWindow(assetA); + const overflow = BigNumber.from(2).pow(128); + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: SetMinPrice, value: overflow }]), + ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + }); + + it("38.9 ExitProtectionMode before cooldown still reverts with CooldownNotElapsed", async () => { + await initAssetWithWindow(assetA); + await triggerPump(assetA, vTokenA); + await expect( + oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: ExitProtectionMode, value: 0 }]), + ).to.be.revertedWithCustomError(oracle, "CooldownNotElapsed"); + }); + }); }); } From a9a16f512a9bd488fb438376ef32bc86f20831c9 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Thu, 30 Apr 2026 12:53:08 +0530 Subject: [PATCH 22/30] fix: lint --- test/fork/DeviationBoundedOracle.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 275fafb7..5318e7cd 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -1909,7 +1909,9 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { await oracle.setThresholds(assetA, trigger, newReset); } - const tx = await oracle.syncPriceBoundsAndProtections([{ asset: assetA, action: ExitProtectionMode, value: 0 }]); + const tx = await oracle.syncPriceBoundsAndProtections([ + { asset: assetA, action: ExitProtectionMode, value: 0 }, + ]); await expect(tx).to.emit(oracle, "ProtectionModeExited").withArgs(assetA); expect(await oracle.currentlyUsingProtectedPrice(assetA)).to.equal(false); }); From bbf9a97c0c3b81ac55118a6cbf85198d2761e76b Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Thu, 30 Apr 2026 14:31:21 +0530 Subject: [PATCH 23/30] fix: use struct input for setTokenConfig and setTokenConfigs to fix CI stack-too-deep --- contracts/DeviationBoundedOracle.sol | 73 +++----- .../interfaces/IDeviationBoundedOracle.sol | 60 ++++--- test/DeviationBoundedOracle.ts | 170 +++++++----------- test/DeviationBoundedOracleE2E.ts | 18 +- test/fork/DeviationBoundedOracle.ts | 168 ++++++++--------- 5 files changed, 209 insertions(+), 280 deletions(-) diff --git a/contracts/DeviationBoundedOracle.sol b/contracts/DeviationBoundedOracle.sol index a331d116..ef7ca7cd 100644 --- a/contracts/DeviationBoundedOracle.sol +++ b/contracts/DeviationBoundedOracle.sol @@ -288,68 +288,45 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { /** * @notice Initializes protection for a new asset - * @param asset The underlying asset address - * @param cooldownPeriod Minimum time protection stays active after last trigger - * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. - * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. - * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization - * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset + * @param tokenConfig_ Token config input for the asset * @custom:access Only Governance * @custom:event ProtectionInitialized * @custom:event BoundedPricingWhitelistUpdated */ - function setTokenConfig( - address asset, - uint64 cooldownPeriod, - uint256 triggerThreshold, - uint256 resetThreshold, - bool enableBoundedPricing, - bool enableCaching - ) external { - _checkAccessAllowed("setTokenConfig(address,uint64,uint256,uint256,bool,bool)"); - _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing, enableCaching); + function setTokenConfig(TokenConfigInput calldata tokenConfig_) external { + _checkAccessAllowed("setTokenConfig((address,uint64,uint256,uint256,bool,bool))"); + _setTokenConfig( + tokenConfig_.asset, + tokenConfig_.cooldownPeriod, + tokenConfig_.triggerThreshold, + tokenConfig_.resetThreshold, + tokenConfig_.enableBoundedPricing, + tokenConfig_.enableCaching + ); } /** * @notice Batch-initializes protection for multiple assets in a single transaction - * @param assets Array of underlying asset addresses - * @param cooldownPeriods Array of cooldown periods (seconds) - * @param triggerThresholds Array of trigger thresholds (mantissa) - * @param resetThresholds Array of reset thresholds (mantissa) - * @param enableBoundedPricings Array of whether to enable bounded pricing per asset - * @param enableCachings Array of whether transient caching is enabled per asset + * @param tokenConfigs_ Array of token config inputs, one per asset * @custom:access Only Governance - * @custom:error InvalidArrayLength if array lengths do not match + * @custom:error InvalidArrayLength if the input array is empty * @custom:event ProtectionInitialized for each asset * @custom:event BoundedPricingWhitelistUpdated for each asset */ - function setTokenConfigs( - address[] calldata assets, - uint64[] calldata cooldownPeriods, - uint256[] calldata triggerThresholds, - uint256[] calldata resetThresholds, - bool[] calldata enableBoundedPricings, - bool[] calldata enableCachings - ) external { - _checkAccessAllowed("setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[],bool[])"); - uint256 len = assets.length; - if ( - len == 0 || - len != cooldownPeriods.length || - len != triggerThresholds.length || - len != resetThresholds.length || - len != enableBoundedPricings.length || - len != enableCachings.length - ) revert InvalidArrayLength(); + function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external { + _checkAccessAllowed("setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])"); + uint256 len = tokenConfigs_.length; + if (len == 0) revert InvalidArrayLength(); for (uint256 i; i < len; ++i) { + TokenConfigInput calldata tokenConfig = tokenConfigs_[i]; _setTokenConfig( - assets[i], - cooldownPeriods[i], - triggerThresholds[i], - resetThresholds[i], - enableBoundedPricings[i], - enableCachings[i] + tokenConfig.asset, + tokenConfig.cooldownPeriod, + tokenConfig.triggerThreshold, + tokenConfig.resetThreshold, + tokenConfig.enableBoundedPricing, + tokenConfig.enableCaching ); } } @@ -561,6 +538,8 @@ contract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle { * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero * @custom:error MarketAlreadyInitialized if the asset has already been initialized * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% diff --git a/contracts/interfaces/IDeviationBoundedOracle.sol b/contracts/interfaces/IDeviationBoundedOracle.sol index d46ea8ea..f7cc444f 100644 --- a/contracts/interfaces/IDeviationBoundedOracle.sol +++ b/contracts/interfaces/IDeviationBoundedOracle.sol @@ -51,6 +51,22 @@ interface IDeviationBoundedOracle { uint256 value; } + /// @notice One item in a setTokenConfigs payload + struct TokenConfigInput { + /// @notice The underlying asset address + address asset; + /// @notice Minimum time protection stays active after the last trigger (seconds) + uint64 cooldownPeriod; + /// @notice Entry deviation threshold (mantissa). Must be between 5% and 50%. + uint256 triggerThreshold; + /// @notice Exit deviation threshold (mantissa). Must be non-zero and below triggerThreshold. + uint256 resetThreshold; + /// @notice Whether to enable bounded pricing immediately upon initialization + bool enableBoundedPricing; + /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset + bool enableCaching; + } + // --- Events --- /// @notice Emitted when protection is initialized for an asset @@ -286,13 +302,10 @@ interface IDeviationBoundedOracle { * @notice Initializes protection parameters for a new asset * @dev Seeds the initial min/max window from the current ResilientOracle spot price, * confirming the oracle is live for this asset before it is listed. - * @param asset The underlying asset address - * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds - * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%. - * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold. - * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization - * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset + * @param tokenConfig_ Token config input for the asset * @custom:access Only Governance + * @custom:error ZeroAddressNotAllowed if asset is the zero address + * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero * @custom:error MarketAlreadyInitialized if the asset has already been initialized * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5% * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50% @@ -302,36 +315,25 @@ interface IDeviationBoundedOracle { * @custom:event ProtectionInitialized * @custom:event BoundedPricingWhitelistUpdated */ - function setTokenConfig( - address asset, - uint64 cooldownPeriod, - uint256 triggerThreshold, - uint256 resetThreshold, - bool enableBoundedPricing, - bool enableCaching - ) external; + function setTokenConfig(TokenConfigInput calldata tokenConfig_) external; /** * @notice Batch-initializes protection parameters for multiple assets in a single transaction - * @param assets Array of underlying asset addresses - * @param cooldownPeriods Array of cooldown periods (seconds) - * @param triggerThresholds Array of trigger thresholds (mantissa) - * @param resetThresholds Array of reset thresholds (mantissa) - * @param enableBoundedPricings Array of whether to enable bounded pricing per asset - * @param enableCachings Array of whether transient caching is enabled per asset + * @param tokenConfigs_ Array of token config inputs, one per asset * @custom:access Only Governance - * @custom:error InvalidArrayLength if array lengths do not match + * @custom:error InvalidArrayLength if the input array is empty + * @custom:error ZeroAddressNotAllowed if any asset is the zero address + * @custom:error ZeroValueNotAllowed if any cooldownPeriod, triggerThreshold, or resetThreshold is zero + * @custom:error MarketAlreadyInitialized if any asset has already been initialized + * @custom:error ThresholdBelowMinimum if any triggerThreshold is below 5% + * @custom:error ThresholdAboveMaximum if any triggerThreshold is above 50% + * @custom:error InvalidResetThreshold if any resetThreshold is at or above its triggerThreshold + * @custom:error VAINotAllowed if any asset is the VAI token + * @custom:error PriceExceedsUint128 if the spot price for any asset overflows uint128 * @custom:event ProtectionInitialized for each asset * @custom:event BoundedPricingWhitelistUpdated for each asset */ - function setTokenConfigs( - address[] calldata assets, - uint64[] calldata cooldownPeriods, - uint256[] calldata triggerThresholds, - uint256[] calldata resetThresholds, - bool[] calldata enableBoundedPricings, - bool[] calldata enableCachings - ) external; + function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external; /** * @notice Sets the cooldown period for an asset diff --git a/test/DeviationBoundedOracle.ts b/test/DeviationBoundedOracle.ts index d0a2b881..942e8295 100644 --- a/test/DeviationBoundedOracle.ts +++ b/test/DeviationBoundedOracle.ts @@ -44,6 +44,22 @@ describe("DeviationBoundedOracle", () => { let nativeMarket: VBEP20Harness; let vaiToken: VBEP20Harness; + const tokenCfg = ( + asset: string, + cooldownPeriod: number | BigNumber = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + enableBoundedPricing = true, + enableCaching = true, + ) => ({ + asset, + cooldownPeriod, + triggerThreshold, + resetThreshold, + enableBoundedPricing, + enableCaching, + }); + // Basic init: min=max=spot (SPOT_PRICE = 1e18) const initAsset = async ( asset: string, @@ -51,7 +67,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); + await oracle.setTokenConfig(tokenCfg(asset, cooldown, triggerThreshold, resetThreshold)); }; // Init + widen window via keeper updates (for price-bounding tests that need min=0.9, max=1.1) @@ -63,7 +79,7 @@ describe("DeviationBoundedOracle", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); + await oracle.setTokenConfig(tokenCfg(asset, cooldown, triggerThreshold, resetThreshold)); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -141,14 +157,7 @@ describe("DeviationBoundedOracle", () => { describe("setTokenConfig", () => { describe("happy path", () => { it("sets all struct fields, emits events, updates asset lists", async () => { - const tx = await oracle.setTokenConfig( - assetA, - DEFAULT_COOLDOWN, - DEFAULT_THRESHOLD, - DEFAULT_RESET_THRESHOLD, - true, - true, - ); + const tx = await oracle.setTokenConfig(tokenCfg(assetA)); // Verify struct fields via public getter const state = await oracle.assetProtectionConfig(assetA); @@ -180,12 +189,7 @@ describe("DeviationBoundedOracle", () => { it("initializes with bounded pricing disabled when enableBoundedPricing is false", async () => { const tx = await oracle.setTokenConfig( - assetA, - DEFAULT_COOLDOWN, - DEFAULT_THRESHOLD, - DEFAULT_RESET_THRESHOLD, - false, - true, + tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, false, true), ); const state = await oracle.assetProtectionConfig(assetA); @@ -203,81 +207,81 @@ describe("DeviationBoundedOracle", () => { describe("revert branches", () => { it("reverts when caller is unauthorized", async () => { acm.isAllowedToCall.returns(false); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when asset is zero address", async () => { - await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + await expect(oracle.setTokenConfig(tokenCfg(addr0000))).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); }); it("reverts when already initialized", async () => { await initAsset(assetA); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "MarketAlreadyInitialized", + ); }); it("reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("reverts when asset is VAI", async () => { const vaiAddr = await vaiToken.underlying(); - await expect( - oracle.setTokenConfig(vaiAddr, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); + await expect(oracle.setTokenConfig(tokenCfg(vaiAddr))).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); }); it("reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, BigNumber.from(0), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, BigNumber.from(0))), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("reverts when re-initializing after de-whitelist", async () => { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "MarketAlreadyInitialized", + ); }); it("reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { const overflowPrice = BigNumber.from(2).pow(128); resilientOracle.getPrice.whenCalledWith(assetA).returns(overflowPrice); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "PriceExceedsUint128", + ); }); }); }); @@ -287,15 +291,17 @@ describe("DeviationBoundedOracle", () => { // ──────────────────────────────────────────────────────────────────────── describe("setTokenConfigs (batch)", () => { + const cfg = (asset: string, enableBoundedPricing = true, enableCaching = true) => ({ + asset, + cooldownPeriod: DEFAULT_COOLDOWN, + triggerThreshold: DEFAULT_THRESHOLD, + resetThreshold: DEFAULT_RESET_THRESHOLD, + enableBoundedPricing, + enableCaching, + }); + it("batch-initializes multiple assets, verifies structs and events", async () => { - const tx = await oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, true], - [true, true], - ); + const tx = await oracle.setTokenConfigs([cfg(assetA), cfg(assetB)]); // Verify both assets initialized const stateA = await oracle.assetProtectionConfig(assetA); @@ -322,14 +328,7 @@ describe("DeviationBoundedOracle", () => { }); it("batch with mixed enableBoundedPricing values", async () => { - await oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, false], - [true, true], - ); + await oracle.setTokenConfigs([cfg(assetA, true, true), cfg(assetB, false, true)]); expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); expect(await oracle.isBoundedPricingEnabled(assetB)).to.equal(false); @@ -337,64 +336,27 @@ describe("DeviationBoundedOracle", () => { it("reverts when caller is unauthorized", async () => { acm.isAllowedToCall.returns(false); - await expect( - oracle.setTokenConfigs( - [assetA], - [DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD], - [true], - [true], - ), - ).to.be.revertedWithCustomError(oracle, "Unauthorized"); - }); - - it("reverts when array lengths mismatch", async () => { - await expect( - oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD], - [true], - [true], - ), - ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + await expect(oracle.setTokenConfigs([cfg(assetA)])).to.be.revertedWithCustomError(oracle, "Unauthorized"); }); it("reverts when one asset in batch is invalid (entire tx reverts)", async () => { - await expect( - oracle.setTokenConfigs( - [assetA, addr0000], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, true], - [true, true], - ), - ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + await expect(oracle.setTokenConfigs([cfg(assetA), cfg(addr0000)])).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); }); it("reverts when one asset is already initialized", async () => { await initAsset(assetA); - await expect( - oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, true], - [true, true], - ), - ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); - }); - - it("succeeds with empty arrays (no-op)", async () => { - await expect(oracle.setTokenConfigs([], [], [], [], [], [])).to.be.revertedWithCustomError( + await expect(oracle.setTokenConfigs([cfg(assetA), cfg(assetB)])).to.be.revertedWithCustomError( oracle, - "InvalidArrayLength", + "MarketAlreadyInitialized", ); }); + + it("reverts on empty input", async () => { + await expect(oracle.setTokenConfigs([])).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + }); }); // ──────────────────────────────────────────────────────────────────────── diff --git a/test/DeviationBoundedOracleE2E.ts b/test/DeviationBoundedOracleE2E.ts index 60d2edd8..3c713758 100644 --- a/test/DeviationBoundedOracleE2E.ts +++ b/test/DeviationBoundedOracleE2E.ts @@ -90,7 +90,14 @@ describe("DeviationBoundedOracle E2E", () => { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); + await oracle.setTokenConfig({ + asset, + cooldownPeriod: cooldown, + triggerThreshold, + resetThreshold, + enableBoundedPricing: true, + enableCaching: true, + }); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -327,7 +334,14 @@ describe("DeviationBoundedOracle E2E", () => { // Initialize with 30% threshold → upperBound = 0.9 * 1.3 = 1.17 const highThreshold = parseUnits("0.3", 18); const resetThreshold = parseUnits("0.15", 18); - await oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, highThreshold, resetThreshold, true, true); + await oracle.setTokenConfig({ + asset: assetA, + cooldownPeriod: DEFAULT_COOLDOWN, + triggerThreshold: highThreshold, + resetThreshold, + enableBoundedPricing: true, + enableCaching: true, + }); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); resilientOracle.getPrice.whenCalledWith(assetA).returns(spot); diff --git a/test/fork/DeviationBoundedOracle.ts b/test/fork/DeviationBoundedOracle.ts index 5318e7cd..863c4927 100644 --- a/test/fork/DeviationBoundedOracle.ts +++ b/test/fork/DeviationBoundedOracle.ts @@ -91,8 +91,8 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // Impersonated timelock grants all DBO permissions to deployer via real ACM const DBO_FUNCTIONS = [ - "setTokenConfig(address,uint64,uint256,uint256,bool,bool)", - "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[],bool[])", + "setTokenConfig((address,uint64,uint256,uint256,bool,bool))", + "setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])", "setCooldownPeriod(address,uint64)", "setThresholds(address,uint256,uint256)", "setAssetBoundedPricingEnabled(address,bool)", @@ -131,13 +131,29 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // ── Helpers ─────────────────────────────────────────────────────────── + const tokenCfg = ( + asset: string, + cooldownPeriod: number | BigNumber = DEFAULT_COOLDOWN, + triggerThreshold: BigNumber = DEFAULT_THRESHOLD, + resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, + enableBoundedPricing = true, + enableCaching = true, + ) => ({ + asset, + cooldownPeriod, + triggerThreshold, + resetThreshold, + enableBoundedPricing, + enableCaching, + }); + const initAsset = async ( asset: string, cooldown: number = DEFAULT_COOLDOWN, triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); + await oracle.setTokenConfig(tokenCfg(asset, cooldown, triggerThreshold, resetThreshold)); }; const initAssetWithWindow = async ( @@ -148,7 +164,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { triggerThreshold: BigNumber = DEFAULT_THRESHOLD, resetThreshold: BigNumber = DEFAULT_RESET_THRESHOLD, ) => { - await oracle.setTokenConfig(asset, cooldown, triggerThreshold, resetThreshold, true, true); + await oracle.setTokenConfig(tokenCfg(asset, cooldown, triggerThreshold, resetThreshold)); await oracle.updateMinPrice(asset, minPrice); await oracle.updateMaxPrice(asset, maxPrice); }; @@ -227,14 +243,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { describe("3. setTokenConfig", () => { describe("happy path", () => { it("3.1 sets all struct fields, emits events, updates asset lists", async () => { - const tx = await oracle.setTokenConfig( - assetA, - DEFAULT_COOLDOWN, - DEFAULT_THRESHOLD, - DEFAULT_RESET_THRESHOLD, - true, - true, - ); + const tx = await oracle.setTokenConfig(tokenCfg(assetA)); const state = await oracle.assetProtectionConfig(assetA); expect(state.minPrice).to.equal(SPOT_PRICE); @@ -260,89 +269,86 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { describe("revert branches", () => { it("3.2 reverts when caller is unauthorized", async () => { - await expect( - oracle - .connect(someone) - .setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + await expect(oracle.connect(someone).setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); }); it("3.3 reverts when asset is zero address", async () => { - await expect( - oracle.setTokenConfig(addr0000, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "ZeroAddressNotAllowed"); + await expect(oracle.setTokenConfig(tokenCfg(addr0000))).to.be.revertedWithCustomError( + oracle, + "ZeroAddressNotAllowed", + ); }); it("3.4 reverts when already initialized", async () => { await initAsset(assetA); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "MarketAlreadyInitialized", + ); }); it("3.5 reverts when threshold < MIN_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, MIN_THRESHOLD.sub(1), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ThresholdBelowMinimum"); }); it("3.6 reverts when threshold > MAX_THRESHOLD", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, MAX_THRESHOLD.add(1), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ThresholdAboveMaximum"); }); it("3.7 reverts when resetThreshold >= triggerThreshold", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "InvalidResetThreshold"); }); it("3.8 reverts when asset is VAI", async () => { - await expect( - oracle.setTokenConfig( - VAI_ADDRESS, - DEFAULT_COOLDOWN, - DEFAULT_THRESHOLD, - DEFAULT_RESET_THRESHOLD, - true, - true, - ), - ).to.be.revertedWithCustomError(oracle, "VAINotAllowed"); + await expect(oracle.setTokenConfig(tokenCfg(VAI_ADDRESS))).to.be.revertedWithCustomError( + oracle, + "VAINotAllowed", + ); }); it("3.9 reverts when cooldownPeriod is zero", async () => { await expect( - oracle.setTokenConfig(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, 0, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.10 reverts when triggerThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, 0, DEFAULT_RESET_THRESHOLD, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, BigNumber.from(0), DEFAULT_RESET_THRESHOLD)), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.11 reverts when resetThreshold is zero", async () => { await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, 0, true, true), + oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, BigNumber.from(0))), ).to.be.revertedWithCustomError(oracle, "ZeroValueNotAllowed"); }); it("3.12 reverts when re-initializing after de-whitelist", async () => { await initAsset(assetA); await oracle.setAssetBoundedPricingEnabled(assetA, false); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "MarketAlreadyInitialized"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "MarketAlreadyInitialized", + ); }); it("3.13 reverts with PriceExceedsUint128 when oracle returns > uint128 max", async () => { const overflowPrice = BigNumber.from(2).pow(128); await mockOracle.setPrice(assetA, overflowPrice); - await expect( - oracle.setTokenConfig(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, true, true), - ).to.be.revertedWithCustomError(oracle, "PriceExceedsUint128"); + await expect(oracle.setTokenConfig(tokenCfg(assetA))).to.be.revertedWithCustomError( + oracle, + "PriceExceedsUint128", + ); }); }); }); @@ -1237,14 +1243,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { const spot = parseUnits("1.15", 18); it("24.1 lowering threshold triggers protection", async () => { - await oracle.setTokenConfig( - assetA, - DEFAULT_COOLDOWN, - parseUnits("0.3", 18), - parseUnits("0.15", 18), - true, - true, - ); + await oracle.setTokenConfig(tokenCfg(assetA, DEFAULT_COOLDOWN, parseUnits("0.3", 18), parseUnits("0.15", 18))); await oracle.updateMinPrice(assetA, MIN_PRICE); await oracle.updateMaxPrice(assetA, MAX_PRICE); await mockOracle.setPrice(assetA, spot); @@ -1561,15 +1560,17 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { // ──────────────────────────────────────────────────────────────────── describe("34. setTokenConfigs (batch)", () => { + const cfg = (asset: string, enableBoundedPricing = true, enableCaching = true) => ({ + asset, + cooldownPeriod: DEFAULT_COOLDOWN, + triggerThreshold: DEFAULT_THRESHOLD, + resetThreshold: DEFAULT_RESET_THRESHOLD, + enableBoundedPricing, + enableCaching, + }); + it("34.1 batch-initializes multiple assets", async () => { - const tx = await oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, true], - [true, true], - ); + const tx = await oracle.setTokenConfigs([cfg(assetA), cfg(assetB)]); const stateA = await oracle.assetProtectionConfig(assetA); expect(stateA.asset).to.equal(assetA); @@ -1586,45 +1587,21 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { }); it("34.2 batch with mixed enableBoundedPricing values", async () => { - await oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN, DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD, DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD, DEFAULT_RESET_THRESHOLD], - [true, false], - [true, true], - ); + await oracle.setTokenConfigs([cfg(assetA, true, true), cfg(assetB, false, true)]); expect(await oracle.isBoundedPricingEnabled(assetA)).to.equal(true); expect(await oracle.isBoundedPricingEnabled(assetB)).to.equal(false); }); it("34.3 reverts when caller is unauthorized", async () => { - await expect( - oracle - .connect(someone) - .setTokenConfigs( - [assetA], - [DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD], - [true], - [true], - ), - ).to.be.revertedWithCustomError(oracle, "Unauthorized"); + await expect(oracle.connect(someone).setTokenConfigs([cfg(assetA)])).to.be.revertedWithCustomError( + oracle, + "Unauthorized", + ); }); - it("34.4 reverts when array lengths mismatch", async () => { - await expect( - oracle.setTokenConfigs( - [assetA, assetB], - [DEFAULT_COOLDOWN], - [DEFAULT_THRESHOLD], - [DEFAULT_RESET_THRESHOLD], - [true], - [true], - ), - ).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); + it("34.4 reverts on empty input", async () => { + await expect(oracle.setTokenConfigs([])).to.be.revertedWithCustomError(oracle, "InvalidArrayLength"); }); }); @@ -1635,12 +1612,7 @@ if (FORK && FORKED_NETWORK === "bscmainnet") { describe("35. setTokenConfig with enableBoundedPricing=false", () => { it("35.1 initializes with bounded pricing disabled", async () => { const tx = await oracle.setTokenConfig( - assetA, - DEFAULT_COOLDOWN, - DEFAULT_THRESHOLD, - DEFAULT_RESET_THRESHOLD, - false, - true, + tokenCfg(assetA, DEFAULT_COOLDOWN, DEFAULT_THRESHOLD, DEFAULT_RESET_THRESHOLD, false, true), ); expect((await oracle.assetProtectionConfig(assetA)).isBoundedPricingEnabled).to.equal(false); From 7b046f152db93b4bec66d4f30710918e6cae7871 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Thu, 30 Apr 2026 20:38:36 +0530 Subject: [PATCH 24/30] chore: add DeviationBoundedOracle bscmainnet deployment artifacts --- .../bscmainnet/DeviationBoundedOracle.json | 1618 ++++++++++++ ...DeviationBoundedOracle_Implementation.json | 2191 +++++++++++++++++ .../DeviationBoundedOracle_Proxy.json | 262 ++ .../b08018e2eab5f4ca5e3ba0c1798444d8.json | 349 +++ 4 files changed, 4420 insertions(+) create mode 100644 deployments/bscmainnet/DeviationBoundedOracle.json create mode 100644 deployments/bscmainnet/DeviationBoundedOracle_Implementation.json create mode 100644 deployments/bscmainnet/DeviationBoundedOracle_Proxy.json create mode 100644 deployments/bscmainnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json diff --git a/deployments/bscmainnet/DeviationBoundedOracle.json b/deployments/bscmainnet/DeviationBoundedOracle.json new file mode 100644 index 00000000..c356168e --- /dev/null +++ b/deployments/bscmainnet/DeviationBoundedOracle.json @@ -0,0 +1,1618 @@ +{ + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "receipt": { + "to": null, + "from": "0x9b0A3EAE7f174937d31745B710BbeA68e9D1BEf7", + "contractAddress": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "transactionIndex": 67, + "gasUsed": "589361", + "logsBloom": "0x0000000000000000000000004000000040000000000000020080000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000008000000000a000001000000000000000000000000000100000000020000000000000000000800000000800000000000010800000000400000000000000000000000000000000000000000000080000000000000800000000000000000000000000000000400000000000000800000000000000000000000000020000000000000000000040000000000000400000000000000000020000000000000000000000000008000000000000800000000000000000000000000", + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1", + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "logs": [ + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000016691f500541ca35bd63dd878b6d78728c9518ae" + ], + "data": "0x", + "logIndex": 214, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009b0a3eae7f174937d31745b710bbea68e9d1bef7" + ], + "data": "0x", + "logIndex": 215, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004788629abc6cfca10f9f969efdeaa1cf70c23555", + "logIndex": 216, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 217, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bb765b741a5f3c2a338369dab539385534e3343", + "logIndex": 218, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + } + ], + "blockNumber": 95554965, + "cumulativeGasUsed": "8547839", + "status": 1, + "byzantium": true + }, + "args": [ + "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "0x1BB765b741A5f3C2A338369DAb539385534E3343", + "0xc4d66de80000000000000000000000004788629abc6cfca10f9f969efdeaa1cf70c23555" + ], + "numDeployments": 1, + "solcInputHash": "b08018e2eab5f4ca5e3ba0c1798444d8", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"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\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \\\"admin cannot fallback to proxy target\\\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"details\":\"Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\"},\"constructor\":{\"details\":\"Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\"},\"implementation()\":{\"details\":\"Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":\"OptimizedTransparentUpgradeableProxy\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\\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\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.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 *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\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 /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.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(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// 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 IBeacon {\\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\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\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 *\\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \\\"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(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) 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 require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\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 * ```\\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`, and `uint256`._\\n */\\nlibrary StorageSlot {\\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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\\n address internal immutable _ADMIN;\\n\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _ADMIN = admin_;\\n\\n // still store it to work with EIP-1967\\n bytes32 slot = _ADMIN_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, admin_)\\n }\\n emit AdminChanged(address(0), admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n\\n function _getAdmin() internal view virtual override returns (address) {\\n return _ADMIN;\\n }\\n}\\n\",\"keccak256\":\"0xa30117644e27fa5b49e162aae2f62b36c1aca02f801b8c594d46e2024963a534\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052604051610c8f380380610c8f8339810160408190526100229161039f565b828161004f60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61046a565b5f80516020610c488339815191521461006a5761006a610489565b61007582825f610123565b506100a3905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610461046a565b5f80516020610c28833981519152146100be576100be610489565b6001600160a01b03821660808190525f80516020610c28833981519152838155604080515f8152602081019390935290917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050506104e8565b61012c8361014e565b5f825111806101385750805b1561014957610147838361018d565b505b505050565b610157816101bb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606101b28383604051806060016040528060278152602001610c686027913961025b565b90505b92915050565b6001600160a01b0381163b61022d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b5f80516020610c4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6102c35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610224565b5f80856001600160a01b0316856040516102dd919061049d565b5f60405180830381855af49150503d805f8114610315576040519150601f19603f3d011682016040523d82523d5f602084013e61031a565b606091505b50909250905061032b828286610337565b925050505b9392505050565b60608315610346575081610330565b8251156103565782518084602001fd5b8160405162461bcd60e51b815260040161022491906104b3565b80516001600160a01b0381168114610386575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156103b1575f80fd5b6103ba84610370565b92506103c860208501610370565b60408501519092506001600160401b03808211156103e4575f80fd5b818601915086601f8301126103f7575f80fd5b8151818111156104095761040961038b565b604051601f8201601f19908116603f011681019083821181831017156104315761043161038b565b81604052828152896020848701011115610449575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b818103818111156101b557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6080516107066105225f395f818160eb0152818161013f015281816101bf0152818161020801528181610239015261025d01526107065ff3fe608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033", + "execute": { + "methodName": "initialize", + "args": ["0x4788629abc6cfca10f9f969efdeaa1cf70c23555"] + }, + "implementation": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "devdoc": { + "details": "This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \"admin cannot fallback to proxy target\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is upgraded." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "admin()": { + "details": "Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`" + }, + "constructor": { + "details": "Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}." + }, + "implementation()": { + "details": "Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`" + }, + "upgradeTo(address)": { + "details": "Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}." + }, + "upgradeToAndCall(address,bytes)": { + "details": "Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} diff --git a/deployments/bscmainnet/DeviationBoundedOracle_Implementation.json b/deployments/bscmainnet/DeviationBoundedOracle_Implementation.json new file mode 100644 index 00000000..878d59d8 --- /dev/null +++ b/deployments/bscmainnet/DeviationBoundedOracle_Implementation.json @@ -0,0 +1,2191 @@ +{ + "address": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "_resilientOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "nativeMarketAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vaiAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xf261ff1e3635bf22739e370300e0297474050662e8c24e9e147bae87a802c6ef", + "receipt": { + "to": null, + "from": "0x9b0A3EAE7f174937d31745B710BbeA68e9D1BEf7", + "contractAddress": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "transactionIndex": 33, + "gasUsed": "2869841", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x8bd2f130cc2adb37e0e1d307a2829e04e886f57a389769e2d4a54d17f9df13b0", + "transactionHash": "0xf261ff1e3635bf22739e370300e0297474050662e8c24e9e147bae87a802c6ef", + "logs": [ + { + "transactionIndex": 33, + "blockNumber": 95554959, + "transactionHash": "0xf261ff1e3635bf22739e370300e0297474050662e8c24e9e147bae87a802c6ef", + "address": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 99, + "blockHash": "0x8bd2f130cc2adb37e0e1d307a2829e04e886f57a389769e2d4a54d17f9df13b0" + } + ], + "blockNumber": 95554959, + "cumulativeGasUsed": "5988090", + "status": 1, + "byzantium": true + }, + "args": [ + "0x6592b5DE802159F3E74B2486b091D11a8256ab8A", + "0xA07c5b74C9B40447a954e1466938b865b6BBea36", + "0x4BD17003473389A42DAF6a0a729f6Fdb328BbBd7" + ], + "numDeployments": 1, + "solcInputHash": "b08018e2eab5f4ca5e3ba0c1798444d8", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"_resilientOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nativeMarketAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vaiAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"}],\"name\":\"CooldownNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"action\",\"type\":\"uint8\"}],\"name\":\"InvalidKeeperAction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMaxPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMinPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"InvalidResetThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketNotInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"PriceExceedsUint128\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentRangeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"PriceRangeNotConverged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximum\",\"type\":\"uint256\"}],\"name\":\"ThresholdAboveMaximum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"ThresholdBelowMinimum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"calledContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"methodSignature\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VAINotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPriceNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"BoundedPricingWhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldEnabled\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newEnabled\",\"type\":\"bool\"}],\"name\":\"CachingEnabledUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldCooldown\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"CooldownPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMax\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"MaxPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMin\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"MinPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"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\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"}],\"name\":\"ProtectionInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectionModeExited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spotPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"}],\"name\":\"ProtectionTriggered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldExitThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newExitThreshold\",\"type\":\"uint256\"}],\"name\":\"ResetThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"TriggerThresholdSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLATERAL_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEBT_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEEPER_DEADBAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ADDR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RESILIENT_ORACLE\",\"outputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allAssets\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"assetProtectionConfig\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"currentlyUsingProtectedPrice\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isBoundedPricingEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"triggerThreshold\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"resetThreshold\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"cachingEnabled\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"canExitProtection\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMins\",\"type\":\"uint128[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMaxs\",\"type\":\"uint128[]\"}],\"name\":\"checkAndGetWindowDrift\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"needsMinUpdate\",\"type\":\"bool[]\"},{\"internalType\":\"bool[]\",\"name\":\"needsMaxUpdate\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"currentlyUsingProtectedPrice\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"exitProtectionMode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllBoundedPricingEnabledAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPricesView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitializedAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"isBoundedPricingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeMarket\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setAssetBoundedPricingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setCachingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"setCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"newTriggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newResetThreshold\",\"type\":\"uint256\"}],\"name\":\"setThresholds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableCaching\",\"type\":\"bool\"}],\"internalType\":\"struct IDeviationBoundedOracle.TokenConfigInput\",\"name\":\"tokenConfig_\",\"type\":\"tuple\"}],\"name\":\"setTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableCaching\",\"type\":\"bool\"}],\"internalType\":\"struct IDeviationBoundedOracle.TokenConfigInput[]\",\"name\":\"tokenConfigs_\",\"type\":\"tuple[]\"}],\"name\":\"setTokenConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"enum IDeviationBoundedOracle.KeeperAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct IDeviationBoundedOracle.KeeperActionItem[]\",\"name\":\"actions\",\"type\":\"tuple[]\"}],\"name\":\"syncPriceBoundsAndProtections\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"updateMaxPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"updateMinPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"updateProtectionState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vai\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"canExitProtection(address)\":{\"details\":\"Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if protection can be disabled\"}},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"custom:error\":\"InvalidArrayLength if the input array lengths do not match\",\"details\":\"Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\",\"params\":{\"assets\":\"Array of asset addresses to check\",\"proposedMaxs\":\"Keeper's off-chain window maximum prices\",\"proposedMins\":\"Keeper's off-chain window minimum prices\"},\"returns\":{\"needsMaxUpdate\":\"Whether maxPrice drift exceeds deadband for each asset\",\"needsMinUpdate\":\"Whether minPrice drift exceeds deadband for each asset\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"params\":{\"_resilientOracle\":\"Address of the ResilientOracle contract\",\"nativeMarketAddress\":\"The address of a native market (for bsc it would be vBNB address)\",\"vaiAddress\":\"The address of the VAI token, or address(0) if VAI is not deployed on the chain.\"}},\"currentlyUsingProtectedPrice(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is currently using the protected price instead of spot\"}},\"exitProtectionMode(address)\":{\"custom:access\":\"Only authorized monitor/keeper addresses\",\"custom:error\":\"ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold\",\"custom:event\":\"ProtectionModeExited\",\"details\":\"Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"}},\"getAllBoundedPricingEnabledAssets()\":{\"details\":\"Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.\",\"returns\":{\"_0\":\"result Array of whitelisted asset addresses\"}},\"getBoundedCollateralPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedCollateralPriceView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns min(spot, windowMin) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedDebtPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedDebtPriceView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns max(spot, windowMax) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPrices(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPricesView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; falls back to ResilientOracle on cache miss or when caching is disabled.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getInitializedAssets()\":{\"returns\":{\"_0\":\"Array of all initialized asset addresses\"}},\"initialize(address)\":{\"params\":{\"accessControlManager_\":\"Address of the access control manager contract\"}},\"isBoundedPricingEnabled(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is whitelisted\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setAccessControlManager(address)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"Emits NewAccessControlManager event\",\"details\":\"Admin function to set address of AccessControlManager\",\"params\":{\"accessControlManager_\":\"The new address of the AccessControlManager\"}},\"setAssetBoundedPricingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ProtectedPriceActive if trying to disable an asset while protection is active\",\"custom:event\":\"BoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether bounded pricing should be enabled for the asset\"}},\"setCachingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"MarketNotInitialized if the asset has not been initialized\",\"custom:event\":\"CachingEnabledUpdated\",\"details\":\"When disabled, each view/non-view price call recomputes bounded prices from the live spot instead of reading or writing the transient slots. The initial value is set via the `enableCaching` argument of `setTokenConfig`.\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether transient caching is enabled for this asset\"}},\"setCooldownPeriod(address,uint64)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"CooldownPeriodSet\",\"params\":{\"asset\":\"The underlying asset address\",\"newCooldown\":\"The new cooldown period in seconds\"}},\"setThresholds(address,uint256,uint256)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\",\"custom:event\":\"TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed\",\"params\":{\"asset\":\"The underlying asset address\",\"newResetThreshold\":\"The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\",\"newTriggerThreshold\":\"The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\"}},\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"ProtectionInitializedBoundedPricingWhitelistUpdated\",\"params\":{\"tokenConfig_\":\"Token config input for the asset\"}},\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"InvalidArrayLength if the input array is empty\",\"custom:event\":\"ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset\",\"params\":{\"tokenConfigs_\":\"Array of token config inputs, one per asset\"}},\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:error\":\"InvalidKeeperAction if an item carries an unsupported action enum value\",\"custom:event\":\"MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\",\"details\":\"Each item is processed in array order; any item revert rolls back the whole batch. `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. Empty `actions` is a no-op success.\",\"params\":{\"actions\":\"The list of keeper actions to apply\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"updateMaxPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MaxPriceUpdated\",\"details\":\"Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMax\":\"The new maximum price\"}},\"updateMinPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MinPriceUpdated\",\"details\":\"Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMin\":\"The new minimum price\"}},\"updateProtectionState(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls. The transient cache is only populated when the asset's `cachingEnabled` flag is `true`. When caching is disabled, view price reads fall through to live recomputation. Permissionless: anyone can call this, both for gas optimisation and to ensure every caller in the same transaction reads the correct, up-to-date bounded price.\",\"params\":{\"vToken\":\"vToken address\"}}},\"stateVariables\":{\"COLLATERAL_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"DEBT_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"RESILIENT_ORACLE\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"nativeMarket\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"vai\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"}},\"title\":\"DeviationBoundedOracle\",\"version\":1},\"userdoc\":{\"errors\":{\"CooldownNotElapsed(address,uint64,uint64)\":[{\"notice\":\"Thrown when trying to disable protection before cooldown has elapsed\"}],\"InvalidArrayLength()\":[{\"notice\":\"Thrown when the lengths of the arrays are not equal\"}],\"InvalidKeeperAction(uint8)\":[{\"notice\":\"Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\"}],\"InvalidMaxPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set maxPrice below current spot\"}],\"InvalidMinPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set minPrice above current spot\"}],\"InvalidResetThreshold(uint256)\":[{\"notice\":\"Thrown when the exit threshold is set at or above the trigger threshold\"}],\"MarketAlreadyInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize an already initialized market\"}],\"MarketNotInitialized(address)\":[{\"notice\":\"Thrown when trying to use or update protection for an asset that has not been initialized\"}],\"PriceExceedsUint128(uint256)\":[{\"notice\":\"Thrown when a price exceeds uint128 max\"}],\"PriceRangeNotConverged(address,uint256,uint256)\":[{\"notice\":\"Thrown when trying to disable protection before price range has converged\"}],\"ProtectedPriceActive(address)\":[{\"notice\":\"Thrown when trying to disable bounded pricing for an asset while protection is active\"}],\"ProtectedPriceInactive(address)\":[{\"notice\":\"Thrown when trying to disable protection that is not active\"}],\"ThresholdAboveMaximum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set above the maximum allowed value\"}],\"ThresholdBelowMinimum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set below the minimum allowed value\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"Thrown when the action is prohibited by AccessControlManager\"}],\"VAINotAllowed()\":[{\"notice\":\"Thrown when trying to initialize protection for VAI\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}],\"ZeroPriceNotAllowed()\":[{\"notice\":\"Thrown when a zero price is provided where a non-zero price is required\"}],\"ZeroValueNotAllowed()\":[{\"notice\":\"Thrown if the supplied value is 0 where it is not allowed\"}]},\"events\":{\"BoundedPricingWhitelistUpdated(address,bool)\":{\"notice\":\"Emitted when an asset's whitelist status changes\"},\"CachingEnabledUpdated(address,bool,bool)\":{\"notice\":\"Emitted when the per-asset transient caching flag is toggled\"},\"CooldownPeriodSet(address,uint64,uint64)\":{\"notice\":\"Emitted when the cooldown period is updated for an asset\"},\"MaxPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the maximum price for an asset\"},\"MinPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the minimum price for an asset\"},\"NewAccessControlManager(address,address)\":{\"notice\":\"Emitted when access control manager contract address is changed\"},\"ProtectionInitialized(address,uint128,uint128,uint64,uint256)\":{\"notice\":\"Emitted when protection is initialized for an asset\"},\"ProtectionModeExited(address)\":{\"notice\":\"Emitted when protection mode is disabled for an asset\"},\"ProtectionTriggered(address,uint256,uint128,uint128)\":{\"notice\":\"Emitted when protection mode is triggered for an asset\"},\"ResetThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the exit threshold is updated for an asset\"},\"TriggerThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the entry threshold is updated for an asset\"}},\"kind\":\"user\",\"methods\":{\"COLLATERAL_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final collateral prices within a transaction\"},\"DEBT_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final debt prices within a transaction\"},\"KEEPER_DEADBAND()\":{\"notice\":\"Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\"},\"MAX_THRESHOLD()\":{\"notice\":\"Maximum allowed threshold value (50%)\"},\"MIN_THRESHOLD()\":{\"notice\":\"Minimum allowed threshold value (5%) to account for keeper deadband\"},\"NATIVE_TOKEN_ADDR()\":{\"notice\":\"Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens\"},\"RESILIENT_ORACLE()\":{\"notice\":\"Resilient Oracle used to fetch spot prices\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"allAssets(uint256)\":{\"notice\":\"Append-only array of all assets ever initialized, used for enumeration\"},\"assetProtectionConfig(address)\":{\"notice\":\"Per-asset protection state\"},\"canExitProtection(address)\":{\"notice\":\"Checks if protection can be exited for an asset\"},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"notice\":\"Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values\"},\"constructor\":{\"notice\":\"Constructor for the implementation contract. Sets immutable variables.\"},\"currentlyUsingProtectedPrice(address)\":{\"notice\":\"Checks if the asset is currently using the protected (bounded) price\"},\"exitProtectionMode(address)\":{\"notice\":\"Exits protection mode for a given asset\"},\"getAllBoundedPricingEnabledAssets()\":{\"notice\":\"Returns all currently whitelisted asset addresses\"},\"getBoundedCollateralPrice(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken, updating protection state\"},\"getBoundedCollateralPriceView(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken (view variant)\"},\"getBoundedDebtPrice(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken, updating protection state\"},\"getBoundedDebtPriceView(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken (view variant)\"},\"getBoundedPrices(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken, updating protection state\"},\"getBoundedPricesView(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken (view variant)\"},\"getInitializedAssets()\":{\"notice\":\"Returns all asset addresses that have ever been initialized\"},\"initialize(address)\":{\"notice\":\"Initializes the contract admin\"},\"isBoundedPricingEnabled(address)\":{\"notice\":\"Checks if an asset is whitelisted for bounded pricing\"},\"nativeMarket()\":{\"notice\":\"Native market address\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of AccessControlManager\"},\"setAssetBoundedPricingEnabled(address,bool)\":{\"notice\":\"Sets whether an asset is enabled for bounded pricing\"},\"setCachingEnabled(address,bool)\":{\"notice\":\"Toggles transient caching of the bounded (collateral, debt) pair for an asset\"},\"setCooldownPeriod(address,uint64)\":{\"notice\":\"Sets the cooldown period for an asset\"},\"setThresholds(address,uint256,uint256)\":{\"notice\":\"Sets the trigger and reset thresholds for an asset\"},\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\":{\"notice\":\"Initializes protection for a new asset\"},\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\":{\"notice\":\"Batch-initializes protection for multiple assets in a single transaction\"},\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\":{\"notice\":\"Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\"},\"updateMaxPrice(address,uint128)\":{\"notice\":\"Updates the maximum price in the rolling window for a given asset\"},\"updateMinPrice(address,uint128)\":{\"notice\":\"Updates the minimum price in the rolling window for a given asset\"},\"updateProtectionState(address)\":{\"notice\":\"Fetches the spot price, updates the protection window, and caches the resolved collateral and debt prices in transient storage for the duration of the transaction.\"},\"vai()\":{\"notice\":\"VAI address\"}},\"notice\":\"The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeviationBoundedOracle.sol\":\"DeviationBoundedOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./OwnableUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\\n address private _pendingOwner;\\n\\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n function __Ownable2Step_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable2Step_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the address of the pending owner.\\n */\\n function pendingOwner() public view virtual returns (address) {\\n return _pendingOwner;\\n }\\n\\n /**\\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual override onlyOwner {\\n _pendingOwner = newOwner;\\n emit OwnershipTransferStarted(owner(), newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual override {\\n delete _pendingOwner;\\n super._transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev The new owner accepts the ownership transfer.\\n */\\n function acceptOwnership() public virtual {\\n address sender = _msgSender();\\n require(pendingOwner() == sender, \\\"Ownable2Step: caller is not the new owner\\\");\\n _transferOwnership(sender);\\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\",\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal onlyInitializing {\\n _transferOwnership(_msgSender());\\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 require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\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 require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\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 /**\\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\",\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// 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 IAccessControl {\\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\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\nimport \\\"./IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title AccessControlledV8\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\\n /// @notice Access control manager contract\\n IAccessControlManagerV8 internal _accessControlManager;\\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 /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /// @notice Thrown when the action is prohibited by AccessControlManager\\n error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\\n __Ownable2Step_init();\\n __AccessControlled_init_unchained(accessControlManager_);\\n }\\n\\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Sets the address of AccessControlManager\\n * @dev Admin function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n * @custom:event Emits NewAccessControlManager event\\n * @custom:access Only Governance\\n */\\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV8) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert Unauthorized(msg.sender, address(this), signature);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe0fd441c84ac907cabc88db69ef04f6d7532d770c7e6a1dfe6e7d6305debb49\",\"license\":\"BSD-3-Clause\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/access/IAccessControl.sol\\\";\\n\\n/**\\n * @title IAccessControlManagerV8\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\\n */\\ninterface IAccessControlManagerV8 is IAccessControl {\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xaa29b098440d0b3a131c5ecdf25ce548790c1b5ac7bf9b5c0264b6af6f7a1e0b\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0x14de93ead464da249af31bea0e3bcfb62ec693bea3475fb4d90f055ac81dc5eb\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0xdb88e14d50dd21889ca3329d755673d022c47e8da005b6a545c7f69c2c4b7b86\",\"license\":\"BSD-3-Clause\"},\"contracts/DeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { VBep20Interface } from \\\"./interfaces/VBep20Interface.sol\\\";\\nimport { ResilientOracleInterface } from \\\"./interfaces/OracleInterface.sol\\\";\\nimport { IDeviationBoundedOracle } from \\\"./interfaces/IDeviationBoundedOracle.sol\\\";\\nimport { AccessControlledV8 } from \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\\\";\\nimport { EXP_SCALE } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { Transient } from \\\"./lib/Transient.sol\\\";\\n\\n/**\\n * @title DeviationBoundedOracle\\n * @author Venus\\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\\n *\\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\\n * significantly from the window bounds, protection mode activates automatically and conservative\\n * pricing kicks in:\\n * - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low\\n * - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high\\n *\\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\\n * off-chain monitoring systems.\\n *\\n * The oracle exposes both view and non-view price functions. The non-view variants update the\\n * price window and trigger protection. The view variants read stored state only. A transient\\n * price cache avoids redundant ResilientOracle calls within the same transaction when\\n * updateProtectionState is called before the view price reads.\\n */\\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\\n uint256 public constant MIN_THRESHOLD = 5e16;\\n\\n /// @notice Maximum allowed threshold value (50%)\\n uint256 public constant MAX_THRESHOLD = 50e16;\\n\\n /// @notice Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\\n uint256 public constant KEEPER_DEADBAND = 5e16;\\n\\n /// @notice Resilient Oracle used to fetch spot prices\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\\n\\n /// @notice Native market address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable nativeMarket;\\n\\n /// @notice VAI address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable vai;\\n\\n /// @notice Transient storage slot for caching final collateral prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\\n 0x7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf7000;\\n\\n /// @notice Transient storage slot for caching final debt prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\\n\\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\\n /// and can serve as any underlying asset of a market that supports native tokens\\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\\n\\n /// @notice Per-asset protection state\\n mapping(address => MarketProtectionState) public assetProtectionConfig;\\n\\n /// @notice Append-only array of all assets ever initialized, used for enumeration\\n address[] public allAssets;\\n\\n /// @notice Storage gap for upgrades\\n uint256[48] private __gap;\\n\\n /**\\n * @notice Constructor for the implementation contract. Sets immutable variables.\\n * @param _resilientOracle Address of the ResilientOracle contract\\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\\n ensureNonzeroAddress(address(_resilientOracle));\\n ensureNonzeroAddress(nativeMarketAddress);\\n RESILIENT_ORACLE = _resilientOracle;\\n nativeMarket = nativeMarketAddress;\\n vai = vaiAddress;\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract admin\\n * @param accessControlManager_ Address of the access control manager contract\\n */\\n function initialize(address accessControlManager_) external initializer {\\n __AccessControlled_init(accessControlManager_);\\n }\\n\\n // ----- Non-view price functions (update window + trigger protection) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (lower) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (higher) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns both conservative prices in a single call.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\\n * collateral and debt prices in transient storage for the duration of the transaction.\\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\\n * instead of querying ResilientOracle again, keeping those functions as `view` and\\n * avoiding redundant oracle calls.\\n * The transient cache is only populated when the asset's `cachingEnabled` flag is `true`.\\n * When caching is disabled, view price reads fall through to live recomputation.\\n * Permissionless: anyone can call this, both for gas optimisation and to ensure every\\n * caller in the same transaction reads the correct, up-to-date bounded price.\\n * @param vToken vToken address\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external {\\n _updateAndGetBoundedPrices(vToken);\\n }\\n\\n // ----- View price functions (read stored/cached state only) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\\n * to ResilientOracle on cache miss or when caching is disabled.\\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\\n * to ResilientOracle on cache miss or when caching is disabled.\\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\\n (, debtPrice) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _computeBoundedPrices(vToken);\\n }\\n\\n // ----- Keeper functions -----\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\\n * Constraint: newMin must be at or below the current spot price.\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external {\\n _checkAccessAllowed(\\\"updateMinPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\\n }\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\\n * Constraint: newMax must be at or above the current spot price.\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external {\\n _checkAccessAllowed(\\\"updateMaxPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\\n }\\n\\n /**\\n * @notice Exits protection mode for a given asset\\n * @dev Called by the keeper/monitor after confirming price has normalised.\\n * Enforces two conditions on-chain:\\n * 1. Cooldown period has elapsed since the last trigger\\n * 2. Price range has converged below the exit threshold\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external {\\n _checkAccessAllowed(\\\"exitProtectionMode(address)\\\");\\n _exitProtectionMode(asset);\\n }\\n\\n /**\\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\\n * Empty `actions` is a no-op success.\\n * @param actions The list of keeper actions to apply\\n * @custom:access Only authorized keeper addresses\\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\\n */\\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external {\\n _checkAccessAllowed(\\\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\\\");\\n uint256 len = actions.length;\\n for (uint256 i; i < len; ++i) {\\n KeeperActionItem calldata item = actions[i];\\n if (item.action == KeeperAction.SetMinPrice) {\\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MIN);\\n } else if (item.action == KeeperAction.SetMaxPrice) {\\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MAX);\\n } else if (item.action == KeeperAction.ExitProtectionMode) {\\n _exitProtectionMode(item.asset);\\n } else {\\n revert InvalidKeeperAction(uint8(item.action));\\n }\\n }\\n }\\n\\n // ----- Admin functions (governance-gated) -----\\n\\n /**\\n * @notice Initializes protection for a new asset\\n * @param tokenConfig_ Token config input for the asset\\n * @custom:access Only Governance\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external {\\n _checkAccessAllowed(\\\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\\\");\\n _setTokenConfig(\\n tokenConfig_.asset,\\n tokenConfig_.cooldownPeriod,\\n tokenConfig_.triggerThreshold,\\n tokenConfig_.resetThreshold,\\n tokenConfig_.enableBoundedPricing,\\n tokenConfig_.enableCaching\\n );\\n }\\n\\n /**\\n * @notice Batch-initializes protection for multiple assets in a single transaction\\n * @param tokenConfigs_ Array of token config inputs, one per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if the input array is empty\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external {\\n _checkAccessAllowed(\\\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\\\");\\n uint256 len = tokenConfigs_.length;\\n if (len == 0) revert InvalidArrayLength();\\n\\n for (uint256 i; i < len; ++i) {\\n TokenConfigInput calldata tokenConfig = tokenConfigs_[i];\\n _setTokenConfig(\\n tokenConfig.asset,\\n tokenConfig.cooldownPeriod,\\n tokenConfig.triggerThreshold,\\n tokenConfig.resetThreshold,\\n tokenConfig.enableBoundedPricing,\\n tokenConfig.enableCaching\\n );\\n }\\n }\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds\\n * @custom:access Only Governance\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\\n _checkAccessAllowed(\\\"setCooldownPeriod(address,uint64)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newCooldown);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\\n state.cooldownPeriod = newCooldown;\\n }\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\\n _checkAccessAllowed(\\\"setThresholds(address,uint256,uint256)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newTriggerThreshold);\\n ensureNonzeroValue(newResetThreshold);\\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (newTriggerThreshold != state.triggerThreshold) {\\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\\n state.triggerThreshold = uint128(newTriggerThreshold);\\n }\\n if (newResetThreshold != state.resetThreshold) {\\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\\n state.resetThreshold = uint128(newResetThreshold);\\n }\\n }\\n\\n /**\\n * @notice Sets whether an asset is enabled for bounded pricing\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setAssetBoundedPricingEnabled(address,bool)\\\");\\n ensureNonzeroAddress(asset);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!enabled && state.currentlyUsingProtectedPrice) {\\n revert ProtectedPriceActive(asset);\\n }\\n\\n if (state.isBoundedPricingEnabled == enabled) return;\\n\\n // reset the window if re-enabling\\n if (enabled) {\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n _setMinPrice(state, asset, spotU128);\\n _setMaxPrice(state, asset, spotU128);\\n }\\n\\n state.isBoundedPricingEnabled = enabled;\\n emit BoundedPricingWhitelistUpdated(asset, enabled);\\n }\\n\\n /**\\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\\n * live spot instead of reading or writing the transient slots. The initial value is\\n * set via the `enableCaching` argument of `setTokenConfig`.\\n * @param asset The underlying asset address\\n * @param enabled Whether transient caching is enabled for this asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CachingEnabledUpdated\\n */\\n function setCachingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setCachingEnabled(address,bool)\\\");\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CachingEnabledUpdated(asset, state.cachingEnabled, enabled);\\n state.cachingEnabled = enabled;\\n }\\n\\n // ----- View helpers -----\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory) {\\n return allAssets;\\n }\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\\n }\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\\n }\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\\n * Gas-free for off-chain callers.\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\\n uint256 len = allAssets.length;\\n address[] memory temp = new address[](len);\\n uint256 count;\\n for (uint256 i; i < len; ++i) {\\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\\n temp[count++] = allAssets[i];\\n }\\n }\\n address[] memory result = new address[](count);\\n for (uint256 i; i < count; ++i) {\\n result[i] = temp[i];\\n }\\n return result;\\n }\\n\\n /**\\n * @notice Checks if protection can be exited for an asset\\n * @dev Returns true when both conditions are met:\\n * 1. Cooldown period has elapsed since last trigger\\n * 2. Price range has converged below exit threshold\\n * @param asset The underlying asset address\\n * @return True if protection can be disabled\\n */\\n function canExitProtection(address asset) external view returns (bool) {\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n return\\n state.currentlyUsingProtectedPrice &&\\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\\n }\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\\n * from the keeper's proposed window values\\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's off-chain window minimum prices\\n * @param proposedMaxs Keeper's off-chain window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\\n uint256 len = assets.length;\\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\\n\\n needsMinUpdate = new bool[](len);\\n needsMaxUpdate = new bool[](len);\\n\\n for (uint256 i; i < len; ++i) {\\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\\n }\\n }\\n\\n // ----- Internal functions -----\\n\\n /**\\n * @notice Initializes protection parameters and price window for a single asset\\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\\n * spot so the window expands naturally as prices move. Can only be called once per asset.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n */\\n function _setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing,\\n bool enableCaching\\n ) internal {\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(cooldownPeriod);\\n ensureNonzeroValue(triggerThreshold);\\n ensureNonzeroValue(resetThreshold);\\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\\n if (asset == vai) revert VAINotAllowed();\\n\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n\\n assetProtectionConfig[asset] = MarketProtectionState({\\n minPrice: spotU128,\\n maxPrice: spotU128,\\n currentlyUsingProtectedPrice: false,\\n isBoundedPricingEnabled: enableBoundedPricing,\\n lastProtectionTriggeredAt: 0,\\n cooldownPeriod: cooldownPeriod,\\n asset: asset,\\n triggerThreshold: uint128(triggerThreshold),\\n resetThreshold: uint128(resetThreshold),\\n cachingEnabled: enableCaching\\n });\\n\\n allAssets.push(asset);\\n\\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Validates and applies a keeper-provided min or max price update\\n * @param asset The underlying asset address\\n * @param newPrice The new price value to set\\n * @param boundType Whether this is a MIN or MAX bound update\\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is strictly above maxPrice\\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is strictly below minPrice\\n */\\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\\n ensureNonzeroAddress(asset);\\n if (newPrice == 0) revert ZeroPriceNotAllowed();\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n uint256 currentSpot = _fetchSpotPrice(asset);\\n if (boundType == PriceBoundType.MIN) {\\n if (newPrice > state.maxPrice || uint256(newPrice) > currentSpot)\\n revert InvalidMinPrice(asset, newPrice, currentSpot);\\n _setMinPrice(state, asset, newPrice);\\n } else if (boundType == PriceBoundType.MAX) {\\n if (newPrice < state.minPrice || uint256(newPrice) < currentSpot)\\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\\n _setMaxPrice(state, asset, newPrice);\\n }\\n }\\n\\n /**\\n * @notice Clears protection for an asset once cooldown has elapsed and the window has converged\\n * @dev Shared body of `exitProtectionMode` and the ExitProtectionMode branch of `syncPriceBoundsAndProtections`.\\n * Callers are responsible for ACM gating before invoking this helper.\\n * @param asset The underlying asset address\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n */\\n function _exitProtectionMode(address asset) internal {\\n ensureNonzeroAddress(asset);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\\n\\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\\n }\\n\\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\\n if (rangeRatio >= state.resetThreshold) {\\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\\n }\\n\\n state.currentlyUsingProtectedPrice = false;\\n state.lastProtectionTriggeredAt = 0;\\n emit ProtectionModeExited(asset);\\n }\\n\\n /**\\n * @notice Shared non-view logic for all bounded price functions.\\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n */\\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // return early if failure from resilient oracle to prevent cold SLOAD\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) {\\n _setCachedPrices(asset, spot, spot);\\n return (spot, spot);\\n }\\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\\n _setCachedPrices(asset, minPrice, maxPrice);\\n }\\n\\n /**\\n * @dev Expands the price window toward extremes if the spot price is a new min or max\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n */\\n function _expandPriceWindow(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset\\n ) internal returns (uint128, uint128, bool) {\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 currentMin = state.minPrice;\\n uint128 currentMax = state.maxPrice;\\n bool windowExpanded;\\n if (spotU128 < currentMin) {\\n _setMinPrice(state, asset, spotU128);\\n currentMin = spotU128;\\n windowExpanded = true;\\n }\\n if (spotU128 > currentMax) {\\n _setMaxPrice(state, asset, spotU128);\\n currentMax = spotU128;\\n windowExpanded = true;\\n }\\n return (currentMin, currentMax, windowExpanded);\\n }\\n\\n /**\\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\\n */\\n function _checkAndTriggerProtection(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset,\\n bool windowExpanded\\n ) internal returns (bool triggered) {\\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\\n if (enteringProtection || windowExpanded) {\\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\\n }\\n if (enteringProtection) {\\n state.currentlyUsingProtectedPrice = true;\\n }\\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\\n return true;\\n }\\n if (state.currentlyUsingProtectedPrice) return true;\\n }\\n\\n /**\\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\\n * When protection is inactive: both return spot.\\n * @param protectionActive Whether the market protection window is currently active\\n * @param spot The current spot price\\n * @param windowMin The lower bound of the price window\\n * @param windowMax The upper bound of the price window\\n * @return minPrice The resolved lower-bound (collateral) price\\n * @return maxPrice The resolved upper-bound (debt) price\\n */\\n function _resolveBoundedPrices(\\n bool protectionActive,\\n uint256 spot,\\n uint256 windowMin,\\n uint256 windowMax\\n ) internal pure returns (uint256, uint256) {\\n if (!protectionActive) return (spot, spot);\\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\\n }\\n\\n /**\\n * @notice Shared view logic for all bounded price view functions.\\n * Checks transient cache first for an early return; on miss, fetches from oracle\\n * and computes both prices without state mutations.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // Cache miss \\u2014 fetch from oracle and compute without state mutations\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) return (spot, spot);\\n\\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\\n\\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\\n\\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\\n }\\n\\n /**\\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\\n * Formula: \\\\((maxPrice - minPrice) / minPrice\\\\), scaled by `EXP_SCALE`.\\n * Used to measure how much the window has converged -- compared against `resetThreshold`\\n * to determine whether the price window is tight enough to exit protection mode.\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @return The scaled bound ratio \\\\(((max - min) * EXP_SCALE) / min\\\\)\\n */\\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\\n uint256 range = uint256(maxPrice) - uint256(minPrice);\\n return (range * EXP_SCALE) / uint256(minPrice);\\n }\\n\\n /**\\n * @notice Checks whether the spot price has moved beyond the threshold relative to the\\n * opposite window bound \\u2014 i.e. `spot > minPrice * (1 + threshold)` or\\n * `spot < maxPrice * (1 - threshold)`.\\n * @dev Pump detection: spot > minPrice * (1 + threshold)\\n * Crash detection: spot < maxPrice * (1 - threshold)\\n * @param spot The current spot price\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @param threshold The deviation threshold (mantissa)\\n * @return True if deviation is triggered\\n */\\n function _exceedsDeviationThreshold(\\n uint256 spot,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint256 threshold\\n ) internal pure returns (bool) {\\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\\n return (spot > upperBound || spot < lowerBound);\\n }\\n\\n /**\\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\\n * @param currentPrice The current on-chain price\\n * @param proposedPrice The keeper's proposed price\\n * @return True if drift exceeds deadband\\n */\\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\\n if (currentPrice == 0 || proposedPrice == 0) return false;\\n uint256 diff = currentPrice > proposedPrice\\n ? uint256(currentPrice - proposedPrice)\\n : uint256(proposedPrice - currentPrice);\\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\\n }\\n\\n /**\\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMin The new minimum price\\n */\\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\\n emit MinPriceUpdated(asset, state.minPrice, newMin);\\n state.minPrice = newMin;\\n }\\n\\n /**\\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMax The new maximum price\\n */\\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\\n state.maxPrice = newMax;\\n }\\n\\n /**\\n * @dev Writes both lower and upper bounded prices to transient storage. No-ops when the\\n * asset's `cachingEnabled` flag is `false`, so callers that disable caching always\\n * fall through to live recomputation on subsequent reads.\\n * @param asset The underlying asset address\\n * @param minPrice The resolved lower (collateral) price to cache\\n * @param maxPrice The resolved upper (debt) price to cache\\n */\\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\\n if (!assetProtectionConfig[asset].cachingEnabled) return;\\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\\n }\\n\\n /**\\n * @dev Reads a cached final price from transient storage. Returns `(0, 0)` when the\\n * asset's `cachingEnabled` flag is `false`, which callers already treat as a cache\\n * miss and handle via live recomputation.\\n * @param asset The underlying asset address\\n * @return minPrice The cached minimum price, or 0 on cache miss\\n * @return maxPrice The cached maximum price, or 0 on cache miss\\n */\\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n if (!assetProtectionConfig[asset].cachingEnabled) return (0, 0);\\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\\n }\\n\\n /**\\n * @dev This function returns the underlying asset of a vToken\\n * @param vToken vToken address\\n * @return asset underlying asset address\\n */\\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\\n ensureNonzeroAddress(vToken);\\n if (vToken == nativeMarket) {\\n asset = NATIVE_TOKEN_ADDR;\\n } else if (vToken == vai) {\\n asset = vai;\\n } else {\\n asset = VBep20Interface(vToken).underlying();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the market has not been initialized via setTokenConfig\\n * @param asset The underlying asset address\\n * @return state The market protection state storage pointer\\n */\\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\\n state = assetProtectionConfig[asset];\\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\\n }\\n\\n /**\\n * @notice Fetches the current spot price for an asset from the ResilientOracle\\n * @param asset The underlying asset address\\n * @return The current spot price\\n */\\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\\n return RESILIENT_ORACLE.getPrice(asset);\\n }\\n\\n /**\\n * @dev Safely casts a uint256 to uint128, reverting on overflow\\n * @param value The value to cast\\n * @return The value as uint128\\n */\\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\\n return uint128(value);\\n }\\n}\\n\",\"keccak256\":\"0x753d4b0caf8d71739c8615b1cdcc751f45576182ab82cd5859102c16e4402e0d\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/IDeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IDeviationBoundedOracle {\\n // --- Enums ---\\n\\n /// @notice Identifies whether a price bound is a minimum or maximum\\n enum PriceBoundType {\\n MIN,\\n MAX\\n }\\n\\n /// @notice Identifies which keeper action a single syncPriceBoundsAndProtections item performs\\n enum KeeperAction {\\n SetMinPrice,\\n SetMaxPrice,\\n ExitProtectionMode\\n }\\n\\n // --- Structs ---\\n\\n /// @notice Per-asset protection state tracking the min/max price window\\n struct MarketProtectionState {\\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\\n uint128 minPrice;\\n /// @notice Highest price observed in the current window\\n uint128 maxPrice;\\n /// @notice Whether protected price is currently being used\\n bool currentlyUsingProtectedPrice;\\n /// @notice Whether this market is whitelisted for bounded pricing\\n bool isBoundedPricingEnabled;\\n /// @notice Timestamp of the last protection trigger \\u2014 reset on every trigger\\n uint64 lastProtectionTriggeredAt;\\n /// @notice Minimum time protection stays active after last trigger\\n uint64 cooldownPeriod;\\n /// @notice The underlying asset address, used to verify initialization\\n address asset;\\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\\n uint128 triggerThreshold;\\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\\n uint128 resetThreshold;\\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n bool cachingEnabled;\\n }\\n\\n /// @notice One item in an syncPriceBoundsAndProtections payload\\n /// @dev `value` is interpreted per-action: the new bound price for SetMinPrice / SetMaxPrice, ignored for ExitProtectionMode\\n struct KeeperActionItem {\\n address asset;\\n KeeperAction action;\\n uint256 value;\\n }\\n\\n /// @notice One item in a setTokenConfigs payload\\n struct TokenConfigInput {\\n /// @notice The underlying asset address\\n address asset;\\n /// @notice Minimum time protection stays active after the last trigger (seconds)\\n uint64 cooldownPeriod;\\n /// @notice Entry deviation threshold (mantissa). Must be between 5% and 50%.\\n uint256 triggerThreshold;\\n /// @notice Exit deviation threshold (mantissa). Must be non-zero and below triggerThreshold.\\n uint256 resetThreshold;\\n /// @notice Whether to enable bounded pricing immediately upon initialization\\n bool enableBoundedPricing;\\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n bool enableCaching;\\n }\\n\\n // --- Events ---\\n\\n /// @notice Emitted when protection is initialized for an asset\\n event ProtectionInitialized(\\n address indexed asset,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold\\n );\\n\\n /// @notice Emitted when protection mode is triggered for an asset\\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\\n\\n /// @notice Emitted when protection mode is disabled for an asset\\n event ProtectionModeExited(address indexed asset);\\n\\n /// @notice Emitted when the keeper updates the minimum price for an asset\\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\\n\\n /// @notice Emitted when the keeper updates the maximum price for an asset\\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\\n\\n /// @notice Emitted when the entry threshold is updated for an asset\\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\\n\\n /// @notice Emitted when the exit threshold is updated for an asset\\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\\n\\n /// @notice Emitted when the cooldown period is updated for an asset\\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\\n\\n /// @notice Emitted when an asset's whitelist status changes\\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\\n\\n /// @notice Emitted when the per-asset transient caching flag is toggled\\n event CachingEnabledUpdated(address indexed asset, bool oldEnabled, bool newEnabled);\\n\\n // --- Errors ---\\n\\n /// @notice Thrown when trying to use or update protection for an asset that has not been initialized\\n error MarketNotInitialized(address asset);\\n\\n /// @notice Thrown when trying to initialize an already initialized market\\n error MarketAlreadyInitialized(address asset);\\n\\n /// @notice Thrown when trying to disable protection that is not active\\n error ProtectedPriceInactive(address asset);\\n\\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\\n\\n /// @notice Thrown when trying to disable protection before price range has converged\\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\\n\\n /// @notice Thrown when keeper tries to set minPrice above current spot\\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\\n\\n /// @notice Thrown when keeper tries to set maxPrice below current spot\\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\\n\\n /// @notice Thrown when threshold is set below the minimum allowed value\\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\\n\\n /// @notice Thrown when threshold is set above the maximum allowed value\\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\\n\\n /// @notice Thrown when a price exceeds uint128 max\\n error PriceExceedsUint128(uint256 price);\\n\\n /// @notice Thrown when a zero price is provided where a non-zero price is required\\n error ZeroPriceNotAllowed();\\n\\n /// @notice Thrown when trying to initialize protection for VAI\\n error VAINotAllowed();\\n\\n /// @notice Thrown when trying to disable bounded pricing for an asset while protection is active\\n error ProtectedPriceActive(address asset);\\n\\n /// @notice Thrown when the lengths of the arrays are not equal\\n error InvalidArrayLength();\\n\\n /// @notice Thrown when the exit threshold is set at or above the trigger threshold\\n error InvalidResetThreshold(uint256 resetThreshold);\\n\\n /// @notice Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\\n error InvalidKeeperAction(uint8 action);\\n\\n // --- Non-view price functions (update window + trigger protection) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- State update (call before view price reads to populate transient cache) ---\\n\\n /**\\n * @notice Updates the protection state for a given vToken, caching the resolved collateral and debt prices\\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\\n * reads in the same transaction are served from transient storage. The transient\\n * cache is only populated when the asset's `cachingEnabled` flag is `true`.\\n * @param vToken vToken address\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external;\\n\\n // --- View price functions (read stored/cached state only) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return price The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return price The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- Keeper functions ---\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMin is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external;\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMax is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external;\\n\\n /**\\n * @notice Exits protection mode for a given asset once conditions are met\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external;\\n\\n /**\\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\\n * Empty `actions` is a no-op success.\\n * @param actions The list of keeper actions to apply\\n * @custom:access Only authorized keeper addresses\\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\\n * @custom:error PriceExceedsUint128 if a SetMin/SetMax item value overflows uint128\\n * @custom:error ZeroPriceNotAllowed if a SetMin/SetMax item value is zero\\n * @custom:error MarketNotInitialized if any referenced asset has not been initialized\\n * @custom:error InvalidMinPrice if a SetMinPrice item violates the spot/maxPrice constraints\\n * @custom:error InvalidMaxPrice if a SetMaxPrice item violates the spot/minPrice constraints\\n * @custom:error ProtectedPriceInactive if an ExitProtectionMode item targets an asset whose protection is not active\\n * @custom:error CooldownNotElapsed if an ExitProtectionMode item is submitted before cooldown elapsed\\n * @custom:error PriceRangeNotConverged if an ExitProtectionMode item is submitted before window convergence\\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\\n */\\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external;\\n\\n // --- Admin functions (governance-gated) ---\\n\\n /**\\n * @notice Initializes protection parameters for a new asset\\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\\n * confirming the oracle is live for this asset before it is listed.\\n * @param tokenConfig_ Token config input for the asset\\n * @custom:access Only Governance\\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external;\\n\\n /**\\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\\n * @param tokenConfigs_ Array of token config inputs, one per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if the input array is empty\\n * @custom:error ZeroAddressNotAllowed if any asset is the zero address\\n * @custom:error ZeroValueNotAllowed if any cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if any asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if any triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if any triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if any resetThreshold is at or above its triggerThreshold\\n * @custom:error VAINotAllowed if any asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price for any asset overflows uint128\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external;\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds; must be non-zero\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\\n\\n /**\\n * @notice Sets whether bounded pricing is enabled for an asset\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\\n\\n /**\\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\\n * live spot instead of reading or writing the transient slots. The initial value is\\n * set via the `enableCaching` argument of `setTokenConfig`.\\n * @param asset The underlying asset address\\n * @param enabled Whether transient caching is enabled for this asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CachingEnabledUpdated\\n */\\n function setCachingEnabled(address asset, bool enabled) external;\\n\\n // --- View helpers ---\\n\\n /**\\n * @notice Returns the full protection state for an asset\\n * @param asset The underlying asset address\\n * @return minPrice Lowest price observed in the current window\\n * @return maxPrice Highest price observed in the current window\\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\\n * @return cooldownPeriod Minimum time protection stays active after last trigger\\n * @return assetAddr The underlying asset address stored in the struct\\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\\n * @return cachingEnabled Whether transient caching of the bounded pair is enabled for the asset\\n */\\n function assetProtectionConfig(\\n address asset\\n )\\n external\\n view\\n returns (\\n uint128 minPrice,\\n uint128 maxPrice,\\n bool currentlyUsingProtectedPrice,\\n bool isBoundedPricingEnabled,\\n uint64 lastProtectionTriggeredAt,\\n uint64 cooldownPeriod,\\n address assetAddr,\\n uint128 triggerThreshold,\\n uint128 resetThreshold,\\n bool cachingEnabled\\n );\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if protection can be exited for a given asset\\n * @param asset The underlying asset address\\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\\n */\\n function canExitProtection(address asset) external view returns (bool);\\n\\n /**\\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\\n * @param index Array index\\n * @return The asset address at the given index\\n */\\n function allAssets(uint256 index) external view returns (address);\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory);\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's proposed window minimum prices\\n * @param proposedMaxs Keeper's proposed window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\\n}\\n\",\"keccak256\":\"0xe223d88c17c0d752fdb33fa223b63ce124a798512f3d69f3800e9508e7dff931\",\"license\":\"BSD-3-Clause\"},\"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 BoundValidatorInterface {\\n function validatePriceWithAnchorPrice(\\n address asset,\\n uint256 reporterPrice,\\n uint256 anchorPrice\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd3bbb7c9eef19e8f467342df6034ef95399a00964646fb8c82b438968ae3a8c0\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/VBep20Interface.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\ninterface VBep20Interface is IERC20Metadata {\\n /**\\n * @notice Underlying asset for this VToken\\n */\\n function underlying() external view returns (address);\\n}\\n\",\"keccak256\":\"0x6e71c3df86501df5c0e4bace1333c0c91f9f9cced252a54fb99eeda219b789d5\",\"license\":\"BSD-3-Clause\"},\"contracts/lib/Transient.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nlibrary Transient {\\n /**\\n * @notice Cache the asset price into transient storage\\n * @param key address of the asset\\n * @param value asset price\\n */\\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n tstore(slot, value)\\n }\\n }\\n\\n /**\\n * @notice Read cached price from transient storage\\n * @param key address of the asset\\n * @return value cached asset price\\n */\\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n value := tload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x60d7133a48a757ee777cb9230e890ef489ffc33dcea9dadfcf5a8b72f9dd43aa\",\"license\":\"BSD-3-Clause\"}},\"version\":1}", + "bytecode": "0x60e060405234801561000f575f80fd5b5060405161345438038061345483398101604081905261002e91610163565b61003783610069565b61004082610069565b6001600160a01b0380841660805282811660a052811660c052610061610093565b5050506101ad565b6001600160a01b038116610090576040516342bcdf7f60e11b815260040160405180910390fd5b50565b5f54610100900460ff16156100fe5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610090575f80fd5b5f805f60608486031215610175575f80fd5b83516101808161014f565b60208501519093506101918161014f565b60408501519092506101a28161014f565b809150509250925092565b60805160a05160c05161325a6101fa5f395f818161058501528181611c610152818161258001526125ba01525f818161048d015261252c01525f81816104fe01526119d2015261325a5ff3fe608060405234801561000f575f80fd5b5060043610610255575f3560e01c806388142b6b11610140578063b540894f116100bf578063cf1412c011610084578063cf1412c0146106ba578063dcc88962146106cd578063e2201bb8146106e0578063e30c3978146106f3578063e40c2fed14610704578063f2fde38b14610717575f80fd5b8063b540894f1461055f578063b62e4c9214610580578063bd11c4c0146103fe578063c3821757146105a7578063c4d66de8146106a7575f80fd5b8063a31ebe5811610105578063a31ebe58146104e6578063a4edcd4c146104f9578063a9534f8a14610520578063a9c3cab11461053b578063b4a0bdf31461054e575f80fd5b806388142b6b146104755780638a2f7f6d146104885780638cf38bb1146104af5780638da5cb5b146104c2578063969f58d3146104d3575f80fd5b80634912c452116101d757806376489e381161019c57806376489e38146103b357806379ba5097146103f65780637f5e1328146103fe5780637fa6ea501461040c578063870dc597146104345780638769b23114610447575f80fd5b80634912c4521461034757806352a6bce31461035a578063578e5c221461036d5780636121316814610398578063715018a6146103ab575f80fd5b80631be74faf1161021d5780631be74faf146102f157806323013b83146103065780632f7b5dd7146103195780633b4ecdb21461032c578063412b6ec714610334575f80fd5b806308af5431146102595780630a5fa04d1461027b5780630e32cb86146102a25780631169d5a6146102b757806315a53122146102de575b5f80fd5b6102686706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102687f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b6102b56102b0366004612b01565b61072a565b005b6102687f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700081565b6102b56102ec366004612b32565b61073e565b6102f961078b565b6040516102729190612b65565b6102b5610314366004612bbe565b61093e565b6102b5610327366004612bf5565b610a6a565b6102f9610b33565b6102b5610342366004612bbe565b610b93565b6102b5610355366004612c63565b610c43565b610268610368366004612b01565b610e3c565b61038061037b366004612c95565b610e4d565b6040516001600160a01b039091168152602001610272565b6102b56103a6366004612cac565b610e75565b6102b5610ea6565b6103e66103c1366004612b01565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b6040519015158152602001610272565b6102b5610eb9565b61026866b1a2bc2ec5000081565b61041f61041a366004612b01565b610f30565b60408051928352602083019190915201610272565b6102b5610442366004612cc2565b610f44565b6103e6610455366004612b01565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b61041f610483366004612b01565b6110af565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6102b56104bd366004612b01565b6110ba565b6033546001600160a01b0316610380565b6102b56104e1366004612b32565b611101565b6102b56104f4366004612d34565b61114b565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b61038073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6102b5610549366004612b01565b61121e565b6097546001600160a01b0316610380565b61057261056d366004612da5565b61122c565b604051610272929190612e73565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6106326105b5366004612b01565b60c96020525f9081526040902080546001820154600283015460038401546004909401546001600160801b0380851695600160801b9586900482169560ff8087169661010081048216966001600160401b03620100008304811697600160501b90930416956001600160a01b03909116948082169490041691168a565b604080516001600160801b039b8c168152998b1660208b01529715159789019790975294151560608801526001600160401b0393841660808801529290911660a08601526001600160a01b031660c0850152841660e08401529290921661010082015290151561012082015261014001610272565b6102b56106b5366004612b01565b6113f2565b6102686106c8366004612b01565b6114ff565b6103e66106db366004612b01565b611510565b6102686106ee366004612b01565b61159c565b6065546001600160a01b0316610380565b610268610712366004612b01565b6115a6565b6102b5610725366004612b01565b6115b0565b610732611621565b61073b8161167b565b50565b61077c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e743132382900815250611739565b61078782825f6117d0565b5050565b60ca546060905f816001600160401b038111156107aa576107aa612ea0565b6040519080825280602002602001820160405280156107d3578160200160208202803683370190505b5090505f805b838110156108995760c95f60ca83815481106107f7576107f7612eb4565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108915760ca818154811061083f5761083f612eb4565b5f918252602090912001546001600160a01b0316838361085e81612edc565b94508151811061087057610870612eb4565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016107d9565b505f816001600160401b038111156108b3576108b3612ea0565b6040519080825280602002602001820160405280156108dc578160200160208202803683370190505b5090505f5b82811015610935578381815181106108fb576108fb612eb4565b602002602001015182828151811061091557610915612eb4565b6001600160a01b03909216602092830291909101909101526001016108e1565b50949350505050565b61095f6040518060600160405280602b8152602001613104602b9139611739565b6109688261193d565b5f61097283611964565b9050811580156109865750600181015460ff165b156109b4576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff161515036109d557505050565b8115610a07575f6109ed6109e8856119b1565b611a43565b90506109fa828583611a73565b610a05828583611ae3565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a5d90851515815260200190565b60405180910390a2505050565b610a8b6040518060600160405280603d815260200161312f603d9139611739565b805f819003610aad57604051634ec4810560e11b815260040160405180910390fd5b5f5b81811015610b2d5736848483818110610aca57610aca612eb4565b60c002919091019150610b249050610ae56020830183612b01565b610af56040840160208501612ef4565b60408401356060850135610b0f60a0870160808801612f0d565b610b1f60c0880160a08901612f0d565b611b57565b50600101610aaf565b50505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610b8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b6b575b5050505050905090565b610bd16040518060400160405280601f81526020017f73657443616368696e67456e61626c656428616464726573732c626f6f6c2900815250611739565b5f610bdb83611964565b60048101546040805160ff9092161515825284151560208301529192506001600160a01b038516917f80b87a057217c1d7743a43adf6fcf8a06553fde1205440ebbfb539f6f0e04424910160405180910390a2600401805460ff191691151591909117905550565b610c6460405180606001604052806026815260200161316c60269139611739565b610c6d8361193d565b610c768261200e565b610c7f8161200e565b66b1a2bc2ec50000821015610cb757604051630f4d736160e01b81526004810183905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000821115610cf1576040516350ddbb7560e11b8152600481018390526706f05b59d3b2000060248201526044016109ab565b818110610d1457604051632021db5560e21b8152600481018290526024016109ab565b5f610d1e84611964565b60038101549091506001600160801b03168314610da6576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610b2d57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b02911617905550505050565b5f610e468261202e565b9392505050565b60ca8181548110610e5c575f80fd5b5f918252602090912001546001600160a01b0316905081565b610e966040518060600160405280603a8152602001613192603a9139611739565b61073b610ae56020830183612b01565b610eae611621565b610eb75f61210c565b565b60655433906001600160a01b03168114610f275760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109ab565b61073b8161210c565b5f80610f3b8361202e565b91509150915091565b610f656040518060600160405280603881526020016131cc60389139611739565b805f5b81811015610b2d5736848483818110610f8357610f83612eb4565b6060029190910191505f9050610f9f6040830160208401612f3c565b6002811115610fb057610fb0612f28565b03610fdd57610fd8610fc56020830183612b01565b610fd28360400135611a43565b5f6117d0565b6110a6565b6001610fef6040830160208401612f3c565b600281111561100057611000612f28565b0361102957610fd86110156020830183612b01565b6110228360400135611a43565b60016117d0565b600261103b6040830160208401612f3c565b600281111561104c5761104c612f28565b0361106657610fd86110616020830183612b01565b612125565b6110766040820160208301612f3c565b600281111561108757611087612f28565b604051635374467d60e11b815260ff90911660048201526024016109ab565b50600101610f68565b5f80610f3b836122b9565b6110f86040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f64652861646472657373290000000000815250611739565b61073b81612125565b61113f6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e743132382900815250611739565b610787828260016117d0565b61116c60405180606001604052806021815260200161320460219139611739565b6111758261193d565b611187816001600160401b031661200e565b5f61119183611964565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b6112278161202e565b505050565b60608086858114158061123f5750808414155b1561125d57604051634ec4810560e11b815260040160405180910390fd5b806001600160401b0381111561127557611275612ea0565b60405190808252806020026020018201604052801561129e578160200160208202803683370190505b509250806001600160401b038111156112b9576112b9612ea0565b6040519080825280602002602001820160405280156112e2578160200160208202803683370190505b5091505f5b818110156113e5575f60c95f8c8c8581811061130557611305612eb4565b905060200201602081019061131a9190612b01565b6001600160a01b0316815260208101919091526040015f208054909150611370906001600160801b03168a8a8581811061135657611356612eb4565b905060200201602081019061136b9190612f5a565b6123f8565b85838151811061138257611382612eb4565b9115156020928302919091019091015280546113ba90600160801b90046001600160801b031688888581811061135657611356612eb4565b8483815181106113cc576113cc612eb4565b91151560209283029190910190910152506001016112e7565b5050965096945050505050565b5f54610100900460ff161580801561141057505f54600160ff909116105b806114295750303b15801561142957505f5460ff166001145b61148c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109ab565b5f805460ff1916600117905580156114ad575f805461ff0019166101001790555b6114b6826124a1565b8015610787575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f6115098261202e565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156115615750600181015461155d906001600160401b03600160501b820481169162010000900416612f73565b4210155b8015610e465750600381015481546001600160801b03600160801b928390048116926115949280831692919004166124d8565b109392505050565b5f610e46826122b9565b5f611509826122b9565b6115b8611621565b606580546001600160a01b0383166001600160a01b031990911681179091556115e96033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b03163314610eb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ab565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b60648201526084016109ab565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa091016114f3565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab9061176b9033908690600401612fb4565b602060405180830381865afa158015611786573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612fd7565b90508061078757333083604051634a3fa29360e01b81526004016109ab93929190612ff2565b6117d98361193d565b816001600160801b03165f036118025760405163a2b326dd60e01b815260040160405180910390fd5b5f61180c84611964565b90505f611818856119b1565b90505f83600181111561182d5761182d612f28565b036118af5781546001600160801b03600160801b9091048116908516118061185d575080846001600160801b0316115b1561189f5760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b6118aa828686611a73565b611936565b60018360018111156118c3576118c3612f28565b036119365781546001600160801b0390811690851610806118ec575080846001600160801b0316105b1561192b57604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b611936828686611ae3565b5050505050565b6001600160a01b03811661073b576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c96020526040902060028101549091166119ac576040516349c9b68960e11b81526001600160a01b03831660048201526024016109ab565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa158015611a19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d919061301d565b92915050565b5f6001600160801b03821115611a6f5760405163339718d960e11b8152600481018390526024016109ab565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b611b608661193d565b611b72856001600160401b031661200e565b611b7b8461200e565b611b848361200e565b6001600160a01b038681165f90815260c960205260409020600201541615611bca57604051630d8cdd9d60e01b81526001600160a01b03871660048201526024016109ab565b66b1a2bc2ec50000841015611c0257604051630f4d736160e01b81526004810185905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000841115611c3c576040516350ddbb7560e11b8152600481018590526706f05b59d3b2000060248201526044016109ab565b838310611c5f57604051632021db5560e21b8152600481018490526024016109ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603611cb15760405163c992a64b60e01b815260040160405180910390fd5b5f611cbe6109e8886119b1565b9050604051806101400160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200184151581526020015f6001600160401b03168152602001876001600160401b03168152602001886001600160a01b03168152602001866001600160801b03168152602001856001600160801b0316815260200183151581525060c95f896001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b03160217905550610120820151816004015f6101000a81548160ff02191690831515021790555090505060ca87908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550866001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b682838989604051611fb894939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2866001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd84604051611ffd911515815260200190565b60405180910390a250505050505050565b805f0361073b5760405163273e150360e21b815260040160405180910390fd5b5f805f61203a84612520565b90506120458161263e565b9093509150821580159061205857508115155b156120635750915091565b5f61206d826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff166120af576120a48383846126c9565b509485945092505050565b5f805f6120bd848688612746565b9250925092505f6120d0858789856127c7565b90506120f08187866001600160801b0316866001600160801b03166128ce565b9099509750612100878a8a6126c9565b50505050505050915091565b606580546001600160a01b031916905561073b8161290b565b61212e8161193d565b5f61213882611964565b600181015490915060ff1661216b57604051638e001e1f60e01b81526001600160a01b03831660048201526024016109ab565b6001810154612192906001600160401b03600160501b820481169162010000900416612f73565b4210156121e7576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b90920490911660448201526064016109ab565b80545f90612208906001600160801b0380821691600160801b9004166124d8565b6003830154909150600160801b90046001600160801b0316811061226c5760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b031660448201526064016109ab565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b5f805f6122c584612520565b90506122d08161263e565b909350915082158015906122e357508115155b156122ee5750915091565b5f6122f8826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661232f57509485945092505050565b5f61233983611a43565b82549091505f906001600160801b0316841061235f5782546001600160801b0316612361565b815b83549091505f90600160801b90046001600160801b03168511612395578354600160801b90046001600160801b0316612397565b825b60018501549091505f9060ff16806123c7575060038501546123c7908790859085906001600160801b031661295c565b90506123e78187856001600160801b0316856001600160801b03166128ce565b909b909a5098505050505050505050565b5f6001600160801b038316158061241657506001600160801b038216155b1561242257505f611a3d565b5f826001600160801b0316846001600160801b031611612454576124468484613034565b6001600160801b0316612468565b61245e8385613034565b6001600160801b03165b905066b1a2bc2ec500006001600160801b03851661248e670de0b6b3a764000084613054565b612498919061306b565b11949350505050565b5f54610100900460ff166124c75760405162461bcd60e51b81526004016109ab9061308a565b6124cf6129db565b61073b81612a09565b5f806124f06001600160801b038086169085166130d5565b90506001600160801b03841661250e670de0b6b3a764000083613054565b612518919061306b565b949350505050565b5f61252a8261193d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361257e575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036125de57507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561261a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d91906130e8565b6001600160a01b0381165f90815260c96020526040812060040154819060ff1661266c57505f928392509050565b6126967f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700084612a2f565b91506126c27f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084612a2f565b9050915091565b6001600160a01b0383165f90815260c9602052604090206004015460ff166126f057505050565b61271b7f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf70008484612a77565b6112277f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb89706008483612a77565b5f805f8061275386611a43565b87549091506001600160801b0380821691600160801b90048116905f90841683111561278b576127848a8986611a73565b5082915060015b816001600160801b0316846001600160801b031611156127b7576127b08a8986611ae3565b5082905060015b9199909850909650945050505050565b835460038501545f916127f39186916001600160801b0380821692600160801b9092048116911661295c565b156128b657600185015460ff1615808061280a5750825b156128355760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b801561284c576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a26001915050612518565b600185015460ff161561251857506001949350505050565b5f80856128df575083905080612902565b8385106128ec57836128ee565b845b8386116128fb57836128fd565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006129718482612f73565b612984906001600160801b038816613054565b61298e919061306b565b90505f670de0b6b3a76400006129a485826130d5565b6129b7906001600160801b038816613054565b6129c1919061306b565b9050818711806129d057508087105b979650505050505050565b5f54610100900460ff16612a015760405162461bcd60e51b81526004016109ab9061308a565b610eb7612abe565b5f54610100900460ff166107325760405162461bcd60e51b81526004016109ab9061308a565b5f808383604051602001612a569291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f8383604051602001612a9d9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff16612ae45760405162461bcd60e51b81526004016109ab9061308a565b610eb73361210c565b6001600160a01b038116811461073b575f80fd5b5f60208284031215612b11575f80fd5b8135610e4681612aed565b80356001600160801b03811681146119ac575f80fd5b5f8060408385031215612b43575f80fd5b8235612b4e81612aed565b9150612b5c60208401612b1c565b90509250929050565b602080825282518282018190525f9190848201906040850190845b81811015612ba55783516001600160a01b031683529284019291840191600101612b80565b50909695505050505050565b801515811461073b575f80fd5b5f8060408385031215612bcf575f80fd5b8235612bda81612aed565b91506020830135612bea81612bb1565b809150509250929050565b5f8060208385031215612c06575f80fd5b82356001600160401b0380821115612c1c575f80fd5b818501915085601f830112612c2f575f80fd5b813581811115612c3d575f80fd5b86602060c083028501011115612c51575f80fd5b60209290920196919550909350505050565b5f805f60608486031215612c75575f80fd5b8335612c8081612aed565b95602085013595506040909401359392505050565b5f60208284031215612ca5575f80fd5b5035919050565b5f60c08284031215612cbc575f80fd5b50919050565b5f8060208385031215612cd3575f80fd5b82356001600160401b0380821115612ce9575f80fd5b818501915085601f830112612cfc575f80fd5b813581811115612d0a575f80fd5b866020606083028501011115612c51575f80fd5b80356001600160401b03811681146119ac575f80fd5b5f8060408385031215612d45575f80fd5b8235612d5081612aed565b9150612b5c60208401612d1e565b5f8083601f840112612d6e575f80fd5b5081356001600160401b03811115612d84575f80fd5b6020830191508360208260051b8501011115612d9e575f80fd5b9250929050565b5f805f805f8060608789031215612dba575f80fd5b86356001600160401b0380821115612dd0575f80fd5b612ddc8a838b01612d5e565b90985096506020890135915080821115612df4575f80fd5b612e008a838b01612d5e565b90965094506040890135915080821115612e18575f80fd5b50612e2589828a01612d5e565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612e68578151151587529582019590820190600101612e4a565b509495945050505050565b604081525f612e856040830185612e37565b8281036020840152612e978185612e37565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612eed57612eed612ec8565b5060010190565b5f60208284031215612f04575f80fd5b610e4682612d1e565b5f60208284031215612f1d575f80fd5b8135610e4681612bb1565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612f4c575f80fd5b813560038110610e46575f80fd5b5f60208284031215612f6a575f80fd5b610e4682612b1c565b80820180821115611a3d57611a3d612ec8565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061251890830184612f86565b5f60208284031215612fe7575f80fd5b8151610e4681612bb1565b6001600160a01b038481168252831660208201526060604082018190525f90612e9790830184612f86565b5f6020828403121561302d575f80fd5b5051919050565b6001600160801b0382811682821603908082111561150957611509612ec8565b8082028115828204841417611a3d57611a3d612ec8565b5f8261308557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81810381811115611a3d57611a3d612ec8565b5f602082840312156130f8575f80fd5b8151610e4681612aed56fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c29736574546f6b656e436f6e666967732828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c295b5d297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e6669672828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c292973796e635072696365426f756e6473416e6450726f74656374696f6e732828616464726573732c75696e74382c75696e74323536295b5d29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429a264697066735822122007b4cdcf907b0609fb9db3ddc0f71466578874b106706d462bbd01df9551438864736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610255575f3560e01c806388142b6b11610140578063b540894f116100bf578063cf1412c011610084578063cf1412c0146106ba578063dcc88962146106cd578063e2201bb8146106e0578063e30c3978146106f3578063e40c2fed14610704578063f2fde38b14610717575f80fd5b8063b540894f1461055f578063b62e4c9214610580578063bd11c4c0146103fe578063c3821757146105a7578063c4d66de8146106a7575f80fd5b8063a31ebe5811610105578063a31ebe58146104e6578063a4edcd4c146104f9578063a9534f8a14610520578063a9c3cab11461053b578063b4a0bdf31461054e575f80fd5b806388142b6b146104755780638a2f7f6d146104885780638cf38bb1146104af5780638da5cb5b146104c2578063969f58d3146104d3575f80fd5b80634912c452116101d757806376489e381161019c57806376489e38146103b357806379ba5097146103f65780637f5e1328146103fe5780637fa6ea501461040c578063870dc597146104345780638769b23114610447575f80fd5b80634912c4521461034757806352a6bce31461035a578063578e5c221461036d5780636121316814610398578063715018a6146103ab575f80fd5b80631be74faf1161021d5780631be74faf146102f157806323013b83146103065780632f7b5dd7146103195780633b4ecdb21461032c578063412b6ec714610334575f80fd5b806308af5431146102595780630a5fa04d1461027b5780630e32cb86146102a25780631169d5a6146102b757806315a53122146102de575b5f80fd5b6102686706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102687f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b6102b56102b0366004612b01565b61072a565b005b6102687f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700081565b6102b56102ec366004612b32565b61073e565b6102f961078b565b6040516102729190612b65565b6102b5610314366004612bbe565b61093e565b6102b5610327366004612bf5565b610a6a565b6102f9610b33565b6102b5610342366004612bbe565b610b93565b6102b5610355366004612c63565b610c43565b610268610368366004612b01565b610e3c565b61038061037b366004612c95565b610e4d565b6040516001600160a01b039091168152602001610272565b6102b56103a6366004612cac565b610e75565b6102b5610ea6565b6103e66103c1366004612b01565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b6040519015158152602001610272565b6102b5610eb9565b61026866b1a2bc2ec5000081565b61041f61041a366004612b01565b610f30565b60408051928352602083019190915201610272565b6102b5610442366004612cc2565b610f44565b6103e6610455366004612b01565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b61041f610483366004612b01565b6110af565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6102b56104bd366004612b01565b6110ba565b6033546001600160a01b0316610380565b6102b56104e1366004612b32565b611101565b6102b56104f4366004612d34565b61114b565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b61038073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6102b5610549366004612b01565b61121e565b6097546001600160a01b0316610380565b61057261056d366004612da5565b61122c565b604051610272929190612e73565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6106326105b5366004612b01565b60c96020525f9081526040902080546001820154600283015460038401546004909401546001600160801b0380851695600160801b9586900482169560ff8087169661010081048216966001600160401b03620100008304811697600160501b90930416956001600160a01b03909116948082169490041691168a565b604080516001600160801b039b8c168152998b1660208b01529715159789019790975294151560608801526001600160401b0393841660808801529290911660a08601526001600160a01b031660c0850152841660e08401529290921661010082015290151561012082015261014001610272565b6102b56106b5366004612b01565b6113f2565b6102686106c8366004612b01565b6114ff565b6103e66106db366004612b01565b611510565b6102686106ee366004612b01565b61159c565b6065546001600160a01b0316610380565b610268610712366004612b01565b6115a6565b6102b5610725366004612b01565b6115b0565b610732611621565b61073b8161167b565b50565b61077c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e743132382900815250611739565b61078782825f6117d0565b5050565b60ca546060905f816001600160401b038111156107aa576107aa612ea0565b6040519080825280602002602001820160405280156107d3578160200160208202803683370190505b5090505f805b838110156108995760c95f60ca83815481106107f7576107f7612eb4565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108915760ca818154811061083f5761083f612eb4565b5f918252602090912001546001600160a01b0316838361085e81612edc565b94508151811061087057610870612eb4565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016107d9565b505f816001600160401b038111156108b3576108b3612ea0565b6040519080825280602002602001820160405280156108dc578160200160208202803683370190505b5090505f5b82811015610935578381815181106108fb576108fb612eb4565b602002602001015182828151811061091557610915612eb4565b6001600160a01b03909216602092830291909101909101526001016108e1565b50949350505050565b61095f6040518060600160405280602b8152602001613104602b9139611739565b6109688261193d565b5f61097283611964565b9050811580156109865750600181015460ff165b156109b4576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff161515036109d557505050565b8115610a07575f6109ed6109e8856119b1565b611a43565b90506109fa828583611a73565b610a05828583611ae3565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a5d90851515815260200190565b60405180910390a2505050565b610a8b6040518060600160405280603d815260200161312f603d9139611739565b805f819003610aad57604051634ec4810560e11b815260040160405180910390fd5b5f5b81811015610b2d5736848483818110610aca57610aca612eb4565b60c002919091019150610b249050610ae56020830183612b01565b610af56040840160208501612ef4565b60408401356060850135610b0f60a0870160808801612f0d565b610b1f60c0880160a08901612f0d565b611b57565b50600101610aaf565b50505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610b8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b6b575b5050505050905090565b610bd16040518060400160405280601f81526020017f73657443616368696e67456e61626c656428616464726573732c626f6f6c2900815250611739565b5f610bdb83611964565b60048101546040805160ff9092161515825284151560208301529192506001600160a01b038516917f80b87a057217c1d7743a43adf6fcf8a06553fde1205440ebbfb539f6f0e04424910160405180910390a2600401805460ff191691151591909117905550565b610c6460405180606001604052806026815260200161316c60269139611739565b610c6d8361193d565b610c768261200e565b610c7f8161200e565b66b1a2bc2ec50000821015610cb757604051630f4d736160e01b81526004810183905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000821115610cf1576040516350ddbb7560e11b8152600481018390526706f05b59d3b2000060248201526044016109ab565b818110610d1457604051632021db5560e21b8152600481018290526024016109ab565b5f610d1e84611964565b60038101549091506001600160801b03168314610da6576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610b2d57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b02911617905550505050565b5f610e468261202e565b9392505050565b60ca8181548110610e5c575f80fd5b5f918252602090912001546001600160a01b0316905081565b610e966040518060600160405280603a8152602001613192603a9139611739565b61073b610ae56020830183612b01565b610eae611621565b610eb75f61210c565b565b60655433906001600160a01b03168114610f275760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109ab565b61073b8161210c565b5f80610f3b8361202e565b91509150915091565b610f656040518060600160405280603881526020016131cc60389139611739565b805f5b81811015610b2d5736848483818110610f8357610f83612eb4565b6060029190910191505f9050610f9f6040830160208401612f3c565b6002811115610fb057610fb0612f28565b03610fdd57610fd8610fc56020830183612b01565b610fd28360400135611a43565b5f6117d0565b6110a6565b6001610fef6040830160208401612f3c565b600281111561100057611000612f28565b0361102957610fd86110156020830183612b01565b6110228360400135611a43565b60016117d0565b600261103b6040830160208401612f3c565b600281111561104c5761104c612f28565b0361106657610fd86110616020830183612b01565b612125565b6110766040820160208301612f3c565b600281111561108757611087612f28565b604051635374467d60e11b815260ff90911660048201526024016109ab565b50600101610f68565b5f80610f3b836122b9565b6110f86040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f64652861646472657373290000000000815250611739565b61073b81612125565b61113f6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e743132382900815250611739565b610787828260016117d0565b61116c60405180606001604052806021815260200161320460219139611739565b6111758261193d565b611187816001600160401b031661200e565b5f61119183611964565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b6112278161202e565b505050565b60608086858114158061123f5750808414155b1561125d57604051634ec4810560e11b815260040160405180910390fd5b806001600160401b0381111561127557611275612ea0565b60405190808252806020026020018201604052801561129e578160200160208202803683370190505b509250806001600160401b038111156112b9576112b9612ea0565b6040519080825280602002602001820160405280156112e2578160200160208202803683370190505b5091505f5b818110156113e5575f60c95f8c8c8581811061130557611305612eb4565b905060200201602081019061131a9190612b01565b6001600160a01b0316815260208101919091526040015f208054909150611370906001600160801b03168a8a8581811061135657611356612eb4565b905060200201602081019061136b9190612f5a565b6123f8565b85838151811061138257611382612eb4565b9115156020928302919091019091015280546113ba90600160801b90046001600160801b031688888581811061135657611356612eb4565b8483815181106113cc576113cc612eb4565b91151560209283029190910190910152506001016112e7565b5050965096945050505050565b5f54610100900460ff161580801561141057505f54600160ff909116105b806114295750303b15801561142957505f5460ff166001145b61148c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109ab565b5f805460ff1916600117905580156114ad575f805461ff0019166101001790555b6114b6826124a1565b8015610787575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f6115098261202e565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156115615750600181015461155d906001600160401b03600160501b820481169162010000900416612f73565b4210155b8015610e465750600381015481546001600160801b03600160801b928390048116926115949280831692919004166124d8565b109392505050565b5f610e46826122b9565b5f611509826122b9565b6115b8611621565b606580546001600160a01b0383166001600160a01b031990911681179091556115e96033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b03163314610eb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ab565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b60648201526084016109ab565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa091016114f3565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab9061176b9033908690600401612fb4565b602060405180830381865afa158015611786573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612fd7565b90508061078757333083604051634a3fa29360e01b81526004016109ab93929190612ff2565b6117d98361193d565b816001600160801b03165f036118025760405163a2b326dd60e01b815260040160405180910390fd5b5f61180c84611964565b90505f611818856119b1565b90505f83600181111561182d5761182d612f28565b036118af5781546001600160801b03600160801b9091048116908516118061185d575080846001600160801b0316115b1561189f5760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b6118aa828686611a73565b611936565b60018360018111156118c3576118c3612f28565b036119365781546001600160801b0390811690851610806118ec575080846001600160801b0316105b1561192b57604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b611936828686611ae3565b5050505050565b6001600160a01b03811661073b576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c96020526040902060028101549091166119ac576040516349c9b68960e11b81526001600160a01b03831660048201526024016109ab565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa158015611a19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d919061301d565b92915050565b5f6001600160801b03821115611a6f5760405163339718d960e11b8152600481018390526024016109ab565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b611b608661193d565b611b72856001600160401b031661200e565b611b7b8461200e565b611b848361200e565b6001600160a01b038681165f90815260c960205260409020600201541615611bca57604051630d8cdd9d60e01b81526001600160a01b03871660048201526024016109ab565b66b1a2bc2ec50000841015611c0257604051630f4d736160e01b81526004810185905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000841115611c3c576040516350ddbb7560e11b8152600481018590526706f05b59d3b2000060248201526044016109ab565b838310611c5f57604051632021db5560e21b8152600481018490526024016109ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603611cb15760405163c992a64b60e01b815260040160405180910390fd5b5f611cbe6109e8886119b1565b9050604051806101400160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200184151581526020015f6001600160401b03168152602001876001600160401b03168152602001886001600160a01b03168152602001866001600160801b03168152602001856001600160801b0316815260200183151581525060c95f896001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b03160217905550610120820151816004015f6101000a81548160ff02191690831515021790555090505060ca87908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550866001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b682838989604051611fb894939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2866001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd84604051611ffd911515815260200190565b60405180910390a250505050505050565b805f0361073b5760405163273e150360e21b815260040160405180910390fd5b5f805f61203a84612520565b90506120458161263e565b9093509150821580159061205857508115155b156120635750915091565b5f61206d826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff166120af576120a48383846126c9565b509485945092505050565b5f805f6120bd848688612746565b9250925092505f6120d0858789856127c7565b90506120f08187866001600160801b0316866001600160801b03166128ce565b9099509750612100878a8a6126c9565b50505050505050915091565b606580546001600160a01b031916905561073b8161290b565b61212e8161193d565b5f61213882611964565b600181015490915060ff1661216b57604051638e001e1f60e01b81526001600160a01b03831660048201526024016109ab565b6001810154612192906001600160401b03600160501b820481169162010000900416612f73565b4210156121e7576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b90920490911660448201526064016109ab565b80545f90612208906001600160801b0380821691600160801b9004166124d8565b6003830154909150600160801b90046001600160801b0316811061226c5760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b031660448201526064016109ab565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b5f805f6122c584612520565b90506122d08161263e565b909350915082158015906122e357508115155b156122ee5750915091565b5f6122f8826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661232f57509485945092505050565b5f61233983611a43565b82549091505f906001600160801b0316841061235f5782546001600160801b0316612361565b815b83549091505f90600160801b90046001600160801b03168511612395578354600160801b90046001600160801b0316612397565b825b60018501549091505f9060ff16806123c7575060038501546123c7908790859085906001600160801b031661295c565b90506123e78187856001600160801b0316856001600160801b03166128ce565b909b909a5098505050505050505050565b5f6001600160801b038316158061241657506001600160801b038216155b1561242257505f611a3d565b5f826001600160801b0316846001600160801b031611612454576124468484613034565b6001600160801b0316612468565b61245e8385613034565b6001600160801b03165b905066b1a2bc2ec500006001600160801b03851661248e670de0b6b3a764000084613054565b612498919061306b565b11949350505050565b5f54610100900460ff166124c75760405162461bcd60e51b81526004016109ab9061308a565b6124cf6129db565b61073b81612a09565b5f806124f06001600160801b038086169085166130d5565b90506001600160801b03841661250e670de0b6b3a764000083613054565b612518919061306b565b949350505050565b5f61252a8261193d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361257e575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036125de57507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561261a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d91906130e8565b6001600160a01b0381165f90815260c96020526040812060040154819060ff1661266c57505f928392509050565b6126967f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700084612a2f565b91506126c27f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084612a2f565b9050915091565b6001600160a01b0383165f90815260c9602052604090206004015460ff166126f057505050565b61271b7f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf70008484612a77565b6112277f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb89706008483612a77565b5f805f8061275386611a43565b87549091506001600160801b0380821691600160801b90048116905f90841683111561278b576127848a8986611a73565b5082915060015b816001600160801b0316846001600160801b031611156127b7576127b08a8986611ae3565b5082905060015b9199909850909650945050505050565b835460038501545f916127f39186916001600160801b0380821692600160801b9092048116911661295c565b156128b657600185015460ff1615808061280a5750825b156128355760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b801561284c576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a26001915050612518565b600185015460ff161561251857506001949350505050565b5f80856128df575083905080612902565b8385106128ec57836128ee565b845b8386116128fb57836128fd565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006129718482612f73565b612984906001600160801b038816613054565b61298e919061306b565b90505f670de0b6b3a76400006129a485826130d5565b6129b7906001600160801b038816613054565b6129c1919061306b565b9050818711806129d057508087105b979650505050505050565b5f54610100900460ff16612a015760405162461bcd60e51b81526004016109ab9061308a565b610eb7612abe565b5f54610100900460ff166107325760405162461bcd60e51b81526004016109ab9061308a565b5f808383604051602001612a569291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f8383604051602001612a9d9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff16612ae45760405162461bcd60e51b81526004016109ab9061308a565b610eb73361210c565b6001600160a01b038116811461073b575f80fd5b5f60208284031215612b11575f80fd5b8135610e4681612aed565b80356001600160801b03811681146119ac575f80fd5b5f8060408385031215612b43575f80fd5b8235612b4e81612aed565b9150612b5c60208401612b1c565b90509250929050565b602080825282518282018190525f9190848201906040850190845b81811015612ba55783516001600160a01b031683529284019291840191600101612b80565b50909695505050505050565b801515811461073b575f80fd5b5f8060408385031215612bcf575f80fd5b8235612bda81612aed565b91506020830135612bea81612bb1565b809150509250929050565b5f8060208385031215612c06575f80fd5b82356001600160401b0380821115612c1c575f80fd5b818501915085601f830112612c2f575f80fd5b813581811115612c3d575f80fd5b86602060c083028501011115612c51575f80fd5b60209290920196919550909350505050565b5f805f60608486031215612c75575f80fd5b8335612c8081612aed565b95602085013595506040909401359392505050565b5f60208284031215612ca5575f80fd5b5035919050565b5f60c08284031215612cbc575f80fd5b50919050565b5f8060208385031215612cd3575f80fd5b82356001600160401b0380821115612ce9575f80fd5b818501915085601f830112612cfc575f80fd5b813581811115612d0a575f80fd5b866020606083028501011115612c51575f80fd5b80356001600160401b03811681146119ac575f80fd5b5f8060408385031215612d45575f80fd5b8235612d5081612aed565b9150612b5c60208401612d1e565b5f8083601f840112612d6e575f80fd5b5081356001600160401b03811115612d84575f80fd5b6020830191508360208260051b8501011115612d9e575f80fd5b9250929050565b5f805f805f8060608789031215612dba575f80fd5b86356001600160401b0380821115612dd0575f80fd5b612ddc8a838b01612d5e565b90985096506020890135915080821115612df4575f80fd5b612e008a838b01612d5e565b90965094506040890135915080821115612e18575f80fd5b50612e2589828a01612d5e565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612e68578151151587529582019590820190600101612e4a565b509495945050505050565b604081525f612e856040830185612e37565b8281036020840152612e978185612e37565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612eed57612eed612ec8565b5060010190565b5f60208284031215612f04575f80fd5b610e4682612d1e565b5f60208284031215612f1d575f80fd5b8135610e4681612bb1565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612f4c575f80fd5b813560038110610e46575f80fd5b5f60208284031215612f6a575f80fd5b610e4682612b1c565b80820180821115611a3d57611a3d612ec8565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061251890830184612f86565b5f60208284031215612fe7575f80fd5b8151610e4681612bb1565b6001600160a01b038481168252831660208201526060604082018190525f90612e9790830184612f86565b5f6020828403121561302d575f80fd5b5051919050565b6001600160801b0382811682821603908082111561150957611509612ec8565b8082028115828204841417611a3d57611a3d612ec8565b5f8261308557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81810381811115611a3d57611a3d612ec8565b5f602082840312156130f8575f80fd5b8151610e4681612aed56fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c29736574546f6b656e436f6e666967732828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c295b5d297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e6669672828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c292973796e635072696365426f756e6473416e6450726f74656374696f6e732828616464726573732c75696e74382c75696e74323536295b5d29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429a264697066735822122007b4cdcf907b0609fb9db3ddc0f71466578874b106706d462bbd01df9551438864736f6c63430008190033", + "devdoc": { + "author": "Venus", + "events": { + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + } + }, + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "canExitProtection(address)": { + "details": "Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold", + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if protection can be disabled" + } + }, + "checkAndGetWindowDrift(address[],uint128[],uint128[])": { + "custom:error": "InvalidArrayLength if the input array lengths do not match", + "details": "Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)", + "params": { + "assets": "Array of asset addresses to check", + "proposedMaxs": "Keeper's off-chain window maximum prices", + "proposedMins": "Keeper's off-chain window minimum prices" + }, + "returns": { + "needsMaxUpdate": "Whether maxPrice drift exceeds deadband for each asset", + "needsMinUpdate": "Whether minPrice drift exceeds deadband for each asset" + } + }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "params": { + "_resilientOracle": "Address of the ResilientOracle contract", + "nativeMarketAddress": "The address of a native market (for bsc it would be vBNB address)", + "vaiAddress": "The address of the VAI token, or address(0) if VAI is not deployed on the chain." + } + }, + "currentlyUsingProtectedPrice(address)": { + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if the asset is currently using the protected price instead of spot" + } + }, + "exitProtectionMode(address)": { + "custom:access": "Only authorized monitor/keeper addresses", + "custom:error": "ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold", + "custom:event": "ProtectionModeExited", + "details": "Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold", + "params": { + "asset": "The underlying asset address" + } + }, + "getAllBoundedPricingEnabledAssets()": { + "details": "Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.", + "returns": { + "_0": "result Array of whitelisted asset addresses" + } + }, + "getBoundedCollateralPrice(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price" + } + }, + "getBoundedCollateralPriceView(address)": { + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns min(spot, windowMin) when protection is active, spot otherwise.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price" + } + }, + "getBoundedDebtPrice(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "debtPrice": "The bounded debt price" + } + }, + "getBoundedDebtPriceView(address)": { + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns max(spot, windowMax) when protection is active, spot otherwise.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "debtPrice": "The bounded debt price" + } + }, + "getBoundedPrices(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price", + "debtPrice": "The bounded debt price" + } + }, + "getBoundedPricesView(address)": { + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; falls back to ResilientOracle on cache miss or when caching is disabled.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price", + "debtPrice": "The bounded debt price" + } + }, + "getInitializedAssets()": { + "returns": { + "_0": "Array of all initialized asset addresses" + } + }, + "initialize(address)": { + "params": { + "accessControlManager_": "Address of the access control manager contract" + } + }, + "isBoundedPricingEnabled(address)": { + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if the asset is whitelisted" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "setAccessControlManager(address)": { + "custom:access": "Only Governance", + "custom:event": "Emits NewAccessControlManager event", + "details": "Admin function to set address of AccessControlManager", + "params": { + "accessControlManager_": "The new address of the AccessControlManager" + } + }, + "setAssetBoundedPricingEnabled(address,bool)": { + "custom:access": "Only Governance", + "custom:error": "ProtectedPriceActive if trying to disable an asset while protection is active", + "custom:event": "BoundedPricingWhitelistUpdated", + "params": { + "asset": "The underlying asset address", + "enabled": "Whether bounded pricing should be enabled for the asset" + } + }, + "setCachingEnabled(address,bool)": { + "custom:access": "Only Governance", + "custom:error": "MarketNotInitialized if the asset has not been initialized", + "custom:event": "CachingEnabledUpdated", + "details": "When disabled, each view/non-view price call recomputes bounded prices from the live spot instead of reading or writing the transient slots. The initial value is set via the `enableCaching` argument of `setTokenConfig`.", + "params": { + "asset": "The underlying asset address", + "enabled": "Whether transient caching is enabled for this asset" + } + }, + "setCooldownPeriod(address,uint64)": { + "custom:access": "Only Governance", + "custom:event": "CooldownPeriodSet", + "params": { + "asset": "The underlying asset address", + "newCooldown": "The new cooldown period in seconds" + } + }, + "setThresholds(address,uint256,uint256)": { + "custom:access": "Only Governance", + "custom:error": "ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold", + "custom:event": "TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed", + "params": { + "asset": "The underlying asset address", + "newResetThreshold": "The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.", + "newTriggerThreshold": "The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold." + } + }, + "setTokenConfig((address,uint64,uint256,uint256,bool,bool))": { + "custom:access": "Only Governance", + "custom:event": "ProtectionInitializedBoundedPricingWhitelistUpdated", + "params": { + "tokenConfig_": "Token config input for the asset" + } + }, + "setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])": { + "custom:access": "Only Governance", + "custom:error": "InvalidArrayLength if the input array is empty", + "custom:event": "ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset", + "params": { + "tokenConfigs_": "Array of token config inputs, one per asset" + } + }, + "syncPriceBoundsAndProtections((address,uint8,uint256)[])": { + "custom:access": "Only authorized keeper addresses", + "custom:error": "InvalidKeeperAction if an item carries an unsupported action enum value", + "custom:event": "MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited", + "details": "Each item is processed in array order; any item revert rolls back the whole batch. `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. Empty `actions` is a no-op success.", + "params": { + "actions": "The list of keeper actions to apply" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + }, + "updateMaxPrice(address,uint128)": { + "custom:access": "Only authorized keeper addresses", + "custom:event": "MaxPriceUpdated", + "details": "Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.", + "params": { + "asset": "The underlying asset address", + "newMax": "The new maximum price" + } + }, + "updateMinPrice(address,uint128)": { + "custom:access": "Only authorized keeper addresses", + "custom:event": "MinPriceUpdated", + "details": "Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.", + "params": { + "asset": "The underlying asset address", + "newMin": "The new minimum price" + } + }, + "updateProtectionState(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls. The transient cache is only populated when the asset's `cachingEnabled` flag is `true`. When caching is disabled, view price reads fall through to live recomputation. Permissionless: anyone can call this, both for gas optimisation and to ensure every caller in the same transaction reads the correct, up-to-date bounded price.", + "params": { + "vToken": "vToken address" + } + } + }, + "stateVariables": { + "COLLATERAL_PRICE_CACHE_SLOT": { + "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\")) - 1)) & ~bytes32(uint256(0xff))" + }, + "DEBT_PRICE_CACHE_SLOT": { + "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1)) & ~bytes32(uint256(0xff))" + }, + "RESILIENT_ORACLE": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + }, + "nativeMarket": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + }, + "vai": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + } + }, + "title": "DeviationBoundedOracle", + "version": 1 + }, + "userdoc": { + "errors": { + "CooldownNotElapsed(address,uint64,uint64)": [ + { + "notice": "Thrown when trying to disable protection before cooldown has elapsed" + } + ], + "InvalidArrayLength()": [ + { + "notice": "Thrown when the lengths of the arrays are not equal" + } + ], + "InvalidKeeperAction(uint8)": [ + { + "notice": "Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value" + } + ], + "InvalidMaxPrice(address,uint128,uint256)": [ + { + "notice": "Thrown when keeper tries to set maxPrice below current spot" + } + ], + "InvalidMinPrice(address,uint128,uint256)": [ + { + "notice": "Thrown when keeper tries to set minPrice above current spot" + } + ], + "InvalidResetThreshold(uint256)": [ + { + "notice": "Thrown when the exit threshold is set at or above the trigger threshold" + } + ], + "MarketAlreadyInitialized(address)": [ + { + "notice": "Thrown when trying to initialize an already initialized market" + } + ], + "MarketNotInitialized(address)": [ + { + "notice": "Thrown when trying to use or update protection for an asset that has not been initialized" + } + ], + "PriceExceedsUint128(uint256)": [ + { + "notice": "Thrown when a price exceeds uint128 max" + } + ], + "PriceRangeNotConverged(address,uint256,uint256)": [ + { + "notice": "Thrown when trying to disable protection before price range has converged" + } + ], + "ProtectedPriceActive(address)": [ + { + "notice": "Thrown when trying to disable bounded pricing for an asset while protection is active" + } + ], + "ProtectedPriceInactive(address)": [ + { + "notice": "Thrown when trying to disable protection that is not active" + } + ], + "ThresholdAboveMaximum(uint256,uint256)": [ + { + "notice": "Thrown when threshold is set above the maximum allowed value" + } + ], + "ThresholdBelowMinimum(uint256,uint256)": [ + { + "notice": "Thrown when threshold is set below the minimum allowed value" + } + ], + "Unauthorized(address,address,string)": [ + { + "notice": "Thrown when the action is prohibited by AccessControlManager" + } + ], + "VAINotAllowed()": [ + { + "notice": "Thrown when trying to initialize protection for VAI" + } + ], + "ZeroAddressNotAllowed()": [ + { + "notice": "Thrown if the supplied address is a zero address where it is not allowed" + } + ], + "ZeroPriceNotAllowed()": [ + { + "notice": "Thrown when a zero price is provided where a non-zero price is required" + } + ], + "ZeroValueNotAllowed()": [ + { + "notice": "Thrown if the supplied value is 0 where it is not allowed" + } + ] + }, + "events": { + "BoundedPricingWhitelistUpdated(address,bool)": { + "notice": "Emitted when an asset's whitelist status changes" + }, + "CachingEnabledUpdated(address,bool,bool)": { + "notice": "Emitted when the per-asset transient caching flag is toggled" + }, + "CooldownPeriodSet(address,uint64,uint64)": { + "notice": "Emitted when the cooldown period is updated for an asset" + }, + "MaxPriceUpdated(address,uint128,uint128)": { + "notice": "Emitted when the keeper updates the maximum price for an asset" + }, + "MinPriceUpdated(address,uint128,uint128)": { + "notice": "Emitted when the keeper updates the minimum price for an asset" + }, + "NewAccessControlManager(address,address)": { + "notice": "Emitted when access control manager contract address is changed" + }, + "ProtectionInitialized(address,uint128,uint128,uint64,uint256)": { + "notice": "Emitted when protection is initialized for an asset" + }, + "ProtectionModeExited(address)": { + "notice": "Emitted when protection mode is disabled for an asset" + }, + "ProtectionTriggered(address,uint256,uint128,uint128)": { + "notice": "Emitted when protection mode is triggered for an asset" + }, + "ResetThresholdSet(address,uint256,uint256)": { + "notice": "Emitted when the exit threshold is updated for an asset" + }, + "TriggerThresholdSet(address,uint256,uint256)": { + "notice": "Emitted when the entry threshold is updated for an asset" + } + }, + "kind": "user", + "methods": { + "COLLATERAL_PRICE_CACHE_SLOT()": { + "notice": "Transient storage slot for caching final collateral prices within a transaction" + }, + "DEBT_PRICE_CACHE_SLOT()": { + "notice": "Transient storage slot for caching final debt prices within a transaction" + }, + "KEEPER_DEADBAND()": { + "notice": "Keeper deadband threshold (5%) — min/max corrections below this are suppressed" + }, + "MAX_THRESHOLD()": { + "notice": "Maximum allowed threshold value (50%)" + }, + "MIN_THRESHOLD()": { + "notice": "Minimum allowed threshold value (5%) to account for keeper deadband" + }, + "NATIVE_TOKEN_ADDR()": { + "notice": "Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens" + }, + "RESILIENT_ORACLE()": { + "notice": "Resilient Oracle used to fetch spot prices" + }, + "accessControlManager()": { + "notice": "Returns the address of the access control manager contract" + }, + "allAssets(uint256)": { + "notice": "Append-only array of all assets ever initialized, used for enumeration" + }, + "assetProtectionConfig(address)": { + "notice": "Per-asset protection state" + }, + "canExitProtection(address)": { + "notice": "Checks if protection can be exited for an asset" + }, + "checkAndGetWindowDrift(address[],uint128[],uint128[])": { + "notice": "Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values" + }, + "constructor": { + "notice": "Constructor for the implementation contract. Sets immutable variables." + }, + "currentlyUsingProtectedPrice(address)": { + "notice": "Checks if the asset is currently using the protected (bounded) price" + }, + "exitProtectionMode(address)": { + "notice": "Exits protection mode for a given asset" + }, + "getAllBoundedPricingEnabledAssets()": { + "notice": "Returns all currently whitelisted asset addresses" + }, + "getBoundedCollateralPrice(address)": { + "notice": "Gets the bounded collateral price for a given vToken, updating protection state" + }, + "getBoundedCollateralPriceView(address)": { + "notice": "Gets the bounded collateral price for a given vToken (view variant)" + }, + "getBoundedDebtPrice(address)": { + "notice": "Gets the bounded debt price for a given vToken, updating protection state" + }, + "getBoundedDebtPriceView(address)": { + "notice": "Gets the bounded debt price for a given vToken (view variant)" + }, + "getBoundedPrices(address)": { + "notice": "Gets both the bounded collateral and debt prices for a given vToken, updating protection state" + }, + "getBoundedPricesView(address)": { + "notice": "Gets both the bounded collateral and debt prices for a given vToken (view variant)" + }, + "getInitializedAssets()": { + "notice": "Returns all asset addresses that have ever been initialized" + }, + "initialize(address)": { + "notice": "Initializes the contract admin" + }, + "isBoundedPricingEnabled(address)": { + "notice": "Checks if an asset is whitelisted for bounded pricing" + }, + "nativeMarket()": { + "notice": "Native market address" + }, + "setAccessControlManager(address)": { + "notice": "Sets the address of AccessControlManager" + }, + "setAssetBoundedPricingEnabled(address,bool)": { + "notice": "Sets whether an asset is enabled for bounded pricing" + }, + "setCachingEnabled(address,bool)": { + "notice": "Toggles transient caching of the bounded (collateral, debt) pair for an asset" + }, + "setCooldownPeriod(address,uint64)": { + "notice": "Sets the cooldown period for an asset" + }, + "setThresholds(address,uint256,uint256)": { + "notice": "Sets the trigger and reset thresholds for an asset" + }, + "setTokenConfig((address,uint64,uint256,uint256,bool,bool))": { + "notice": "Initializes protection for a new asset" + }, + "setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])": { + "notice": "Batch-initializes protection for multiple assets in a single transaction" + }, + "syncPriceBoundsAndProtections((address,uint8,uint256)[])": { + "notice": "Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check" + }, + "updateMaxPrice(address,uint128)": { + "notice": "Updates the maximum price in the rolling window for a given asset" + }, + "updateMinPrice(address,uint128)": { + "notice": "Updates the minimum price in the rolling window for a given asset" + }, + "updateProtectionState(address)": { + "notice": "Fetches the spot price, updates the protection window, and caches the resolved collateral and debt prices in transient storage for the duration of the transaction." + }, + "vai()": { + "notice": "VAI address" + } + }, + "notice": "The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low - Debt is valued at max(spot, windowMax) — floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 349, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 352, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 1019, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 221, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address" + }, + { + "astId": 341, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 114, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_pendingOwner", + "offset": 0, + "slot": "101", + "type": "t_address" + }, + { + "astId": 208, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 1940, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_accessControlManager", + "offset": 0, + "slot": "151", + "type": "t_contract(IAccessControlManagerV8)2125" + }, + { + "astId": 1945, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 2242, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "assetProtectionConfig", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_address,t_struct(MarketProtectionState)5622_storage)" + }, + { + "astId": 2246, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "allAssets", + "offset": 0, + "slot": "202", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 2251, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)48_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IAccessControlManagerV8)2125": { + "encoding": "inplace", + "label": "contract IAccessControlManagerV8", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(MarketProtectionState)5622_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct IDeviationBoundedOracle.MarketProtectionState)", + "numberOfBytes": "32", + "value": "t_struct(MarketProtectionState)5622_storage" + }, + "t_struct(MarketProtectionState)5622_storage": { + "encoding": "inplace", + "label": "struct IDeviationBoundedOracle.MarketProtectionState", + "members": [ + { + "astId": 5594, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "minPrice", + "offset": 0, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 5597, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "maxPrice", + "offset": 16, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 5600, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "currentlyUsingProtectedPrice", + "offset": 0, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 5603, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "isBoundedPricingEnabled", + "offset": 1, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 5606, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "lastProtectionTriggeredAt", + "offset": 2, + "slot": "1", + "type": "t_uint64" + }, + { + "astId": 5609, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "cooldownPeriod", + "offset": 10, + "slot": "1", + "type": "t_uint64" + }, + { + "astId": 5612, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "asset", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 5615, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "triggerThreshold", + "offset": 0, + "slot": "3", + "type": "t_uint128" + }, + { + "astId": 5618, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "resetThreshold", + "offset": 16, + "slot": "3", + "type": "t_uint128" + }, + { + "astId": 5621, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "cachingEnabled", + "offset": 0, + "slot": "4", + "type": "t_bool" + } + ], + "numberOfBytes": "160" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} diff --git a/deployments/bscmainnet/DeviationBoundedOracle_Proxy.json b/deployments/bscmainnet/DeviationBoundedOracle_Proxy.json new file mode 100644 index 00000000..f75fcf25 --- /dev/null +++ b/deployments/bscmainnet/DeviationBoundedOracle_Proxy.json @@ -0,0 +1,262 @@ +{ + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "receipt": { + "to": null, + "from": "0x9b0A3EAE7f174937d31745B710BbeA68e9D1BEf7", + "contractAddress": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "transactionIndex": 67, + "gasUsed": "589361", + "logsBloom": "0x0000000000000000000000004000000040000000000000020080000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000008000000000a000001000000000000000000000000000100000000020000000000000000000800000000800000000000010800000000400000000000000000000000000000000000000000000080000000000000800000000000000000000000000000000400000000000000800000000000000000000000000020000000000000000000040000000000000400000000000000000020000000000000000000000000008000000000000800000000000000000000000000", + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1", + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "logs": [ + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000016691f500541ca35bd63dd878b6d78728c9518ae" + ], + "data": "0x", + "logIndex": 214, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000009b0a3eae7f174937d31745b710bbea68e9d1bef7" + ], + "data": "0x", + "logIndex": 215, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000004788629abc6cfca10f9f969efdeaa1cf70c23555", + "logIndex": 216, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 217, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + }, + { + "transactionIndex": 67, + "blockNumber": 95554965, + "transactionHash": "0xbf0472d7953289be0b662e908451615ffffe949eb44fa729b28a9ee0b28e46de", + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "topics": ["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000001bb765b741a5f3c2a338369dab539385534e3343", + "logIndex": 218, + "blockHash": "0x804d9e01a6b8d00ba375c22dc17c338ca833a462d0fad50b19745d692fa40ca1" + } + ], + "blockNumber": 95554965, + "cumulativeGasUsed": "8547839", + "status": 1, + "byzantium": true + }, + "args": [ + "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "0x1BB765b741A5f3C2A338369DAb539385534E3343", + "0xc4d66de80000000000000000000000004788629abc6cfca10f9f969efdeaa1cf70c23555" + ], + "numDeployments": 1, + "solcInputHash": "b08018e2eab5f4ca5e3ba0c1798444d8", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"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\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \\\"admin cannot fallback to proxy target\\\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"details\":\"Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\"},\"constructor\":{\"details\":\"Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\"},\"implementation()\":{\"details\":\"Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":\"OptimizedTransparentUpgradeableProxy\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\\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\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.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 *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\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 /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.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(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// 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 IBeacon {\\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\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\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 *\\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \\\"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(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) 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 require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\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 * ```\\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`, and `uint256`._\\n */\\nlibrary StorageSlot {\\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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\\n address internal immutable _ADMIN;\\n\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _ADMIN = admin_;\\n\\n // still store it to work with EIP-1967\\n bytes32 slot = _ADMIN_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, admin_)\\n }\\n emit AdminChanged(address(0), admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n\\n function _getAdmin() internal view virtual override returns (address) {\\n return _ADMIN;\\n }\\n}\\n\",\"keccak256\":\"0xa30117644e27fa5b49e162aae2f62b36c1aca02f801b8c594d46e2024963a534\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052604051610c8f380380610c8f8339810160408190526100229161039f565b828161004f60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61046a565b5f80516020610c488339815191521461006a5761006a610489565b61007582825f610123565b506100a3905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610461046a565b5f80516020610c28833981519152146100be576100be610489565b6001600160a01b03821660808190525f80516020610c28833981519152838155604080515f8152602081019390935290917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050506104e8565b61012c8361014e565b5f825111806101385750805b1561014957610147838361018d565b505b505050565b610157816101bb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606101b28383604051806060016040528060278152602001610c686027913961025b565b90505b92915050565b6001600160a01b0381163b61022d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b5f80516020610c4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6102c35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610224565b5f80856001600160a01b0316856040516102dd919061049d565b5f60405180830381855af49150503d805f8114610315576040519150601f19603f3d011682016040523d82523d5f602084013e61031a565b606091505b50909250905061032b828286610337565b925050505b9392505050565b60608315610346575081610330565b8251156103565782518084602001fd5b8160405162461bcd60e51b815260040161022491906104b3565b80516001600160a01b0381168114610386575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156103b1575f80fd5b6103ba84610370565b92506103c860208501610370565b60408501519092506001600160401b03808211156103e4575f80fd5b818601915086601f8301126103f7575f80fd5b8151818111156104095761040961038b565b604051601f8201601f19908116603f011681019083821181831017156104315761043161038b565b81604052828152896020848701011115610449575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b818103818111156101b557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6080516107066105225f395f818160eb0152818161013f015281816101bf0152818161020801528181610239015261025d01526107065ff3fe608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033", + "devdoc": { + "details": "This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \"admin cannot fallback to proxy target\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is upgraded." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "admin()": { + "details": "Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`" + }, + "constructor": { + "details": "Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}." + }, + "implementation()": { + "details": "Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`" + }, + "upgradeTo(address)": { + "details": "Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}." + }, + "upgradeToAndCall(address,bytes)": { + "details": "Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} diff --git a/deployments/bscmainnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json b/deployments/bscmainnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json new file mode 100644 index 00000000..0355b9cb --- /dev/null +++ b/deployments/bscmainnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json @@ -0,0 +1,349 @@ +{ + "language": "Solidity", + "sources": { + "@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n\n function latestTimestamp() external view returns (uint256);\n\n function latestRound() external view returns (uint256);\n\n function getAnswer(uint256 roundId) external view returns (int256);\n\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);\n\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AggregatorInterface.sol\";\nimport \"./AggregatorV3Interface.sol\";\n\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\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 (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\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" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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 /**\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" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// 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 IAccessControl {\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" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "@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" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport \"./IAccessControlManagerV8.sol\";\n\n/**\n * @title AccessControlledV8\n * @author Venus\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\n */\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\n /// @notice Access control manager contract\n IAccessControlManagerV8 internal _accessControlManager;\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 /// @notice Emitted when access control manager contract address is changed\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\n\n /// @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\n __Ownable2Step_init();\n __AccessControlled_init_unchained(accessControlManager_);\n }\n\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Sets the address of AccessControlManager\n * @dev Admin function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n * @custom:event Emits NewAccessControlManager event\n * @custom:access Only Governance\n */\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Returns the address of the access control manager contract\n */\n function accessControlManager() external view returns (IAccessControlManagerV8) {\n return _accessControlManager;\n }\n\n /**\n * @dev Internal function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n */\n function _setAccessControlManager(address accessControlManager_) internal {\n require(address(accessControlManager_) != address(0), \"invalid acess control manager address\");\n address oldAccessControlManager = address(_accessControlManager);\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/access/IAccessControl.sol\";\n\n/**\n * @title IAccessControlManagerV8\n * @author Venus\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\n */\ninterface IAccessControlManagerV8 is IAccessControl {\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\n\n function revokeCallPermission(\n address contractAddress,\n string calldata functionSig,\n address accountToRevoke\n ) external;\n\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\n\n function hasPermission(\n address account,\n address contractAddress,\n string calldata functionSig\n ) external view 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/DeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { ResilientOracleInterface } from \"./interfaces/OracleInterface.sol\";\nimport { IDeviationBoundedOracle } from \"./interfaces/IDeviationBoundedOracle.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title DeviationBoundedOracle\n * @author Venus\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\n *\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\n * significantly from the window bounds, protection mode activates automatically and conservative\n * pricing kicks in:\n * - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low\n * - Debt is valued at max(spot, windowMax) — floors debt value at recent window high\n *\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\n * off-chain monitoring systems.\n *\n * The oracle exposes both view and non-view price functions. The non-view variants update the\n * price window and trigger protection. The view variants read stored state only. A transient\n * price cache avoids redundant ResilientOracle calls within the same transaction when\n * updateProtectionState is called before the view price reads.\n */\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\n uint256 public constant MIN_THRESHOLD = 5e16;\n\n /// @notice Maximum allowed threshold value (50%)\n uint256 public constant MAX_THRESHOLD = 50e16;\n\n /// @notice Keeper deadband threshold (5%) — min/max corrections below this are suppressed\n uint256 public constant KEEPER_DEADBAND = 5e16;\n\n /// @notice Resilient Oracle used to fetch spot prices\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Transient storage slot for caching final collateral prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\n 0x7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf7000;\n\n /// @notice Transient storage slot for caching final debt prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Per-asset protection state\n mapping(address => MarketProtectionState) public assetProtectionConfig;\n\n /// @notice Append-only array of all assets ever initialized, used for enumeration\n address[] public allAssets;\n\n /// @notice Storage gap for upgrades\n uint256[48] private __gap;\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param _resilientOracle Address of the ResilientOracle contract\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\n ensureNonzeroAddress(address(_resilientOracle));\n ensureNonzeroAddress(nativeMarketAddress);\n RESILIENT_ORACLE = _resilientOracle;\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n // ----- Non-view price functions (update window + trigger protection) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (lower) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (higher) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns both conservative prices in a single call.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\n return _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\n * collateral and debt prices in transient storage for the duration of the transaction.\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\n * instead of querying ResilientOracle again, keeping those functions as `view` and\n * avoiding redundant oracle calls.\n * The transient cache is only populated when the asset's `cachingEnabled` flag is `true`.\n * When caching is disabled, view price reads fall through to live recomputation.\n * Permissionless: anyone can call this, both for gas optimisation and to ensure every\n * caller in the same transaction reads the correct, up-to-date bounded price.\n * @param vToken vToken address\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external {\n _updateAndGetBoundedPrices(vToken);\n }\n\n // ----- View price functions (read stored/cached state only) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\n * to ResilientOracle on cache miss or when caching is disabled.\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\n (collateralPrice, ) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\n * to ResilientOracle on cache miss or when caching is disabled.\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\n (, debtPrice) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\n return _computeBoundedPrices(vToken);\n }\n\n // ----- Keeper functions -----\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\n * Constraint: newMin must be at or below the current spot price.\n * @param asset The underlying asset address\n * @param newMin The new minimum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external {\n _checkAccessAllowed(\"updateMinPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\n }\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\n * Constraint: newMax must be at or above the current spot price.\n * @param asset The underlying asset address\n * @param newMax The new maximum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external {\n _checkAccessAllowed(\"updateMaxPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\n }\n\n /**\n * @notice Exits protection mode for a given asset\n * @dev Called by the keeper/monitor after confirming price has normalised.\n * Enforces two conditions on-chain:\n * 1. Cooldown period has elapsed since the last trigger\n * 2. Price range has converged below the exit threshold\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external {\n _checkAccessAllowed(\"exitProtectionMode(address)\");\n _exitProtectionMode(asset);\n }\n\n /**\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\n * Empty `actions` is a no-op success.\n * @param actions The list of keeper actions to apply\n * @custom:access Only authorized keeper addresses\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\n */\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external {\n _checkAccessAllowed(\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\");\n uint256 len = actions.length;\n for (uint256 i; i < len; ++i) {\n KeeperActionItem calldata item = actions[i];\n if (item.action == KeeperAction.SetMinPrice) {\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MIN);\n } else if (item.action == KeeperAction.SetMaxPrice) {\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MAX);\n } else if (item.action == KeeperAction.ExitProtectionMode) {\n _exitProtectionMode(item.asset);\n } else {\n revert InvalidKeeperAction(uint8(item.action));\n }\n }\n }\n\n // ----- Admin functions (governance-gated) -----\n\n /**\n * @notice Initializes protection for a new asset\n * @param tokenConfig_ Token config input for the asset\n * @custom:access Only Governance\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external {\n _checkAccessAllowed(\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\");\n _setTokenConfig(\n tokenConfig_.asset,\n tokenConfig_.cooldownPeriod,\n tokenConfig_.triggerThreshold,\n tokenConfig_.resetThreshold,\n tokenConfig_.enableBoundedPricing,\n tokenConfig_.enableCaching\n );\n }\n\n /**\n * @notice Batch-initializes protection for multiple assets in a single transaction\n * @param tokenConfigs_ Array of token config inputs, one per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if the input array is empty\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external {\n _checkAccessAllowed(\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\");\n uint256 len = tokenConfigs_.length;\n if (len == 0) revert InvalidArrayLength();\n\n for (uint256 i; i < len; ++i) {\n TokenConfigInput calldata tokenConfig = tokenConfigs_[i];\n _setTokenConfig(\n tokenConfig.asset,\n tokenConfig.cooldownPeriod,\n tokenConfig.triggerThreshold,\n tokenConfig.resetThreshold,\n tokenConfig.enableBoundedPricing,\n tokenConfig.enableCaching\n );\n }\n }\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds\n * @custom:access Only Governance\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\n _checkAccessAllowed(\"setCooldownPeriod(address,uint64)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newCooldown);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\n state.cooldownPeriod = newCooldown;\n }\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\n _checkAccessAllowed(\"setThresholds(address,uint256,uint256)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newTriggerThreshold);\n ensureNonzeroValue(newResetThreshold);\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (newTriggerThreshold != state.triggerThreshold) {\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\n state.triggerThreshold = uint128(newTriggerThreshold);\n }\n if (newResetThreshold != state.resetThreshold) {\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\n state.resetThreshold = uint128(newResetThreshold);\n }\n }\n\n /**\n * @notice Sets whether an asset is enabled for bounded pricing\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setAssetBoundedPricingEnabled(address,bool)\");\n ensureNonzeroAddress(asset);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!enabled && state.currentlyUsingProtectedPrice) {\n revert ProtectedPriceActive(asset);\n }\n\n if (state.isBoundedPricingEnabled == enabled) return;\n\n // reset the window if re-enabling\n if (enabled) {\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n _setMinPrice(state, asset, spotU128);\n _setMaxPrice(state, asset, spotU128);\n }\n\n state.isBoundedPricingEnabled = enabled;\n emit BoundedPricingWhitelistUpdated(asset, enabled);\n }\n\n /**\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\n * live spot instead of reading or writing the transient slots. The initial value is\n * set via the `enableCaching` argument of `setTokenConfig`.\n * @param asset The underlying asset address\n * @param enabled Whether transient caching is enabled for this asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CachingEnabledUpdated\n */\n function setCachingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setCachingEnabled(address,bool)\");\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CachingEnabledUpdated(asset, state.cachingEnabled, enabled);\n state.cachingEnabled = enabled;\n }\n\n // ----- View helpers -----\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory) {\n return allAssets;\n }\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\n }\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\n }\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\n * Gas-free for off-chain callers.\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\n uint256 len = allAssets.length;\n address[] memory temp = new address[](len);\n uint256 count;\n for (uint256 i; i < len; ++i) {\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\n temp[count++] = allAssets[i];\n }\n }\n address[] memory result = new address[](count);\n for (uint256 i; i < count; ++i) {\n result[i] = temp[i];\n }\n return result;\n }\n\n /**\n * @notice Checks if protection can be exited for an asset\n * @dev Returns true when both conditions are met:\n * 1. Cooldown period has elapsed since last trigger\n * 2. Price range has converged below exit threshold\n * @param asset The underlying asset address\n * @return True if protection can be disabled\n */\n function canExitProtection(address asset) external view returns (bool) {\n MarketProtectionState storage state = assetProtectionConfig[asset];\n return\n state.currentlyUsingProtectedPrice &&\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\n }\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\n * from the keeper's proposed window values\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's off-chain window minimum prices\n * @param proposedMaxs Keeper's off-chain window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\n uint256 len = assets.length;\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\n\n needsMinUpdate = new bool[](len);\n needsMaxUpdate = new bool[](len);\n\n for (uint256 i; i < len; ++i) {\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\n }\n }\n\n // ----- Internal functions -----\n\n /**\n * @notice Initializes protection parameters and price window for a single asset\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\n * spot so the window expands naturally as prices move. Can only be called once per asset.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after last trigger\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\n * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n */\n function _setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold,\n bool enableBoundedPricing,\n bool enableCaching\n ) internal {\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(cooldownPeriod);\n ensureNonzeroValue(triggerThreshold);\n ensureNonzeroValue(resetThreshold);\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\n if (asset == vai) revert VAINotAllowed();\n\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n\n assetProtectionConfig[asset] = MarketProtectionState({\n minPrice: spotU128,\n maxPrice: spotU128,\n currentlyUsingProtectedPrice: false,\n isBoundedPricingEnabled: enableBoundedPricing,\n lastProtectionTriggeredAt: 0,\n cooldownPeriod: cooldownPeriod,\n asset: asset,\n triggerThreshold: uint128(triggerThreshold),\n resetThreshold: uint128(resetThreshold),\n cachingEnabled: enableCaching\n });\n\n allAssets.push(asset);\n\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\n }\n\n /**\n * @notice Validates and applies a keeper-provided min or max price update\n * @param asset The underlying asset address\n * @param newPrice The new price value to set\n * @param boundType Whether this is a MIN or MAX bound update\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is strictly above maxPrice\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is strictly below minPrice\n */\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\n ensureNonzeroAddress(asset);\n if (newPrice == 0) revert ZeroPriceNotAllowed();\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n uint256 currentSpot = _fetchSpotPrice(asset);\n if (boundType == PriceBoundType.MIN) {\n if (newPrice > state.maxPrice || uint256(newPrice) > currentSpot)\n revert InvalidMinPrice(asset, newPrice, currentSpot);\n _setMinPrice(state, asset, newPrice);\n } else if (boundType == PriceBoundType.MAX) {\n if (newPrice < state.minPrice || uint256(newPrice) < currentSpot)\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\n _setMaxPrice(state, asset, newPrice);\n }\n }\n\n /**\n * @notice Clears protection for an asset once cooldown has elapsed and the window has converged\n * @dev Shared body of `exitProtectionMode` and the ExitProtectionMode branch of `syncPriceBoundsAndProtections`.\n * Callers are responsible for ACM gating before invoking this helper.\n * @param asset The underlying asset address\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n */\n function _exitProtectionMode(address asset) internal {\n ensureNonzeroAddress(asset);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\n\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\n }\n\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\n if (rangeRatio >= state.resetThreshold) {\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\n }\n\n state.currentlyUsingProtectedPrice = false;\n state.lastProtectionTriggeredAt = 0;\n emit ProtectionModeExited(asset);\n }\n\n /**\n * @notice Shared non-view logic for all bounded price functions.\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n */\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // return early if failure from resilient oracle to prevent cold SLOAD\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) {\n _setCachedPrices(asset, spot, spot);\n return (spot, spot);\n }\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\n _setCachedPrices(asset, minPrice, maxPrice);\n }\n\n /**\n * @dev Expands the price window toward extremes if the spot price is a new min or max\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n */\n function _expandPriceWindow(\n MarketProtectionState storage state,\n uint256 spot,\n address asset\n ) internal returns (uint128, uint128, bool) {\n uint128 spotU128 = _safeToUint128(spot);\n uint128 currentMin = state.minPrice;\n uint128 currentMax = state.maxPrice;\n bool windowExpanded;\n if (spotU128 < currentMin) {\n _setMinPrice(state, asset, spotU128);\n currentMin = spotU128;\n windowExpanded = true;\n }\n if (spotU128 > currentMax) {\n _setMaxPrice(state, asset, spotU128);\n currentMax = spotU128;\n windowExpanded = true;\n }\n return (currentMin, currentMax, windowExpanded);\n }\n\n /**\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\n */\n function _checkAndTriggerProtection(\n MarketProtectionState storage state,\n uint256 spot,\n address asset,\n bool windowExpanded\n ) internal returns (bool triggered) {\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\n if (enteringProtection || windowExpanded) {\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\n }\n if (enteringProtection) {\n state.currentlyUsingProtectedPrice = true;\n }\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\n return true;\n }\n if (state.currentlyUsingProtectedPrice) return true;\n }\n\n /**\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\n * When protection is inactive: both return spot.\n * @param protectionActive Whether the market protection window is currently active\n * @param spot The current spot price\n * @param windowMin The lower bound of the price window\n * @param windowMax The upper bound of the price window\n * @return minPrice The resolved lower-bound (collateral) price\n * @return maxPrice The resolved upper-bound (debt) price\n */\n function _resolveBoundedPrices(\n bool protectionActive,\n uint256 spot,\n uint256 windowMin,\n uint256 windowMax\n ) internal pure returns (uint256, uint256) {\n if (!protectionActive) return (spot, spot);\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\n }\n\n /**\n * @notice Shared view logic for all bounded price view functions.\n * Checks transient cache first for an early return; on miss, fetches from oracle\n * and computes both prices without state mutations.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // Cache miss — fetch from oracle and compute without state mutations\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) return (spot, spot);\n\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\n uint128 spotU128 = _safeToUint128(spot);\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\n\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\n\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\n }\n\n /**\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\n * Formula: \\((maxPrice - minPrice) / minPrice\\), scaled by `EXP_SCALE`.\n * Used to measure how much the window has converged -- compared against `resetThreshold`\n * to determine whether the price window is tight enough to exit protection mode.\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @return The scaled bound ratio \\(((max - min) * EXP_SCALE) / min\\)\n */\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\n uint256 range = uint256(maxPrice) - uint256(minPrice);\n return (range * EXP_SCALE) / uint256(minPrice);\n }\n\n /**\n * @notice Checks whether the spot price has moved beyond the threshold relative to the\n * opposite window bound — i.e. `spot > minPrice * (1 + threshold)` or\n * `spot < maxPrice * (1 - threshold)`.\n * @dev Pump detection: spot > minPrice * (1 + threshold)\n * Crash detection: spot < maxPrice * (1 - threshold)\n * @param spot The current spot price\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @param threshold The deviation threshold (mantissa)\n * @return True if deviation is triggered\n */\n function _exceedsDeviationThreshold(\n uint256 spot,\n uint128 minPrice,\n uint128 maxPrice,\n uint256 threshold\n ) internal pure returns (bool) {\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\n return (spot > upperBound || spot < lowerBound);\n }\n\n /**\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\n * @param currentPrice The current on-chain price\n * @param proposedPrice The keeper's proposed price\n * @return True if drift exceeds deadband\n */\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\n if (currentPrice == 0 || proposedPrice == 0) return false;\n uint256 diff = currentPrice > proposedPrice\n ? uint256(currentPrice - proposedPrice)\n : uint256(proposedPrice - currentPrice);\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\n }\n\n /**\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMin The new minimum price\n */\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\n emit MinPriceUpdated(asset, state.minPrice, newMin);\n state.minPrice = newMin;\n }\n\n /**\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMax The new maximum price\n */\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\n state.maxPrice = newMax;\n }\n\n /**\n * @dev Writes both lower and upper bounded prices to transient storage. No-ops when the\n * asset's `cachingEnabled` flag is `false`, so callers that disable caching always\n * fall through to live recomputation on subsequent reads.\n * @param asset The underlying asset address\n * @param minPrice The resolved lower (collateral) price to cache\n * @param maxPrice The resolved upper (debt) price to cache\n */\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\n if (!assetProtectionConfig[asset].cachingEnabled) return;\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\n }\n\n /**\n * @dev Reads a cached final price from transient storage. Returns `(0, 0)` when the\n * asset's `cachingEnabled` flag is `false`, which callers already treat as a cache\n * miss and handle via live recomputation.\n * @param asset The underlying asset address\n * @return minPrice The cached minimum price, or 0 on cache miss\n * @return maxPrice The cached maximum price, or 0 on cache miss\n */\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\n if (!assetProtectionConfig[asset].cachingEnabled) return (0, 0);\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\n ensureNonzeroAddress(vToken);\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev Reverts if the market has not been initialized via setTokenConfig\n * @param asset The underlying asset address\n * @return state The market protection state storage pointer\n */\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\n state = assetProtectionConfig[asset];\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\n }\n\n /**\n * @notice Fetches the current spot price for an asset from the ResilientOracle\n * @param asset The underlying asset address\n * @return The current spot price\n */\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n /**\n * @dev Safely casts a uint256 to uint128, reverting on overflow\n * @param value The value to cast\n * @return The value as uint128\n */\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\n return uint128(value);\n }\n}\n" + }, + "contracts/hardhat-dependency-compiler/@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport '@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol';\n" + }, + "contracts/interfaces/FeedRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface FeedRegistryInterface {\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n function decimalsByName(string memory base, string memory quote) external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAccountant {\n function getRateSafe() external view returns (uint256);\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/IAsBNB.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNB {\n function minter() external view returns (address);\n function decimals() external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNBMinter {\n function convertToTokens(uint256 amount) external view returns (uint256);\n}\n" + }, + "contracts/interfaces/ICappedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ICappedOracle {\n function updateSnapshot() external;\n}\n" + }, + "contracts/interfaces/IDeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IDeviationBoundedOracle {\n // --- Enums ---\n\n /// @notice Identifies whether a price bound is a minimum or maximum\n enum PriceBoundType {\n MIN,\n MAX\n }\n\n /// @notice Identifies which keeper action a single syncPriceBoundsAndProtections item performs\n enum KeeperAction {\n SetMinPrice,\n SetMaxPrice,\n ExitProtectionMode\n }\n\n // --- Structs ---\n\n /// @notice Per-asset protection state tracking the min/max price window\n struct MarketProtectionState {\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\n uint128 minPrice;\n /// @notice Highest price observed in the current window\n uint128 maxPrice;\n /// @notice Whether protected price is currently being used\n bool currentlyUsingProtectedPrice;\n /// @notice Whether this market is whitelisted for bounded pricing\n bool isBoundedPricingEnabled;\n /// @notice Timestamp of the last protection trigger — reset on every trigger\n uint64 lastProtectionTriggeredAt;\n /// @notice Minimum time protection stays active after last trigger\n uint64 cooldownPeriod;\n /// @notice The underlying asset address, used to verify initialization\n address asset;\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\n uint128 triggerThreshold;\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\n uint128 resetThreshold;\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n bool cachingEnabled;\n }\n\n /// @notice One item in an syncPriceBoundsAndProtections payload\n /// @dev `value` is interpreted per-action: the new bound price for SetMinPrice / SetMaxPrice, ignored for ExitProtectionMode\n struct KeeperActionItem {\n address asset;\n KeeperAction action;\n uint256 value;\n }\n\n /// @notice One item in a setTokenConfigs payload\n struct TokenConfigInput {\n /// @notice The underlying asset address\n address asset;\n /// @notice Minimum time protection stays active after the last trigger (seconds)\n uint64 cooldownPeriod;\n /// @notice Entry deviation threshold (mantissa). Must be between 5% and 50%.\n uint256 triggerThreshold;\n /// @notice Exit deviation threshold (mantissa). Must be non-zero and below triggerThreshold.\n uint256 resetThreshold;\n /// @notice Whether to enable bounded pricing immediately upon initialization\n bool enableBoundedPricing;\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n bool enableCaching;\n }\n\n // --- Events ---\n\n /// @notice Emitted when protection is initialized for an asset\n event ProtectionInitialized(\n address indexed asset,\n uint128 minPrice,\n uint128 maxPrice,\n uint64 cooldownPeriod,\n uint256 triggerThreshold\n );\n\n /// @notice Emitted when protection mode is triggered for an asset\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\n\n /// @notice Emitted when protection mode is disabled for an asset\n event ProtectionModeExited(address indexed asset);\n\n /// @notice Emitted when the keeper updates the minimum price for an asset\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\n\n /// @notice Emitted when the keeper updates the maximum price for an asset\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\n\n /// @notice Emitted when the entry threshold is updated for an asset\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when the exit threshold is updated for an asset\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\n\n /// @notice Emitted when the cooldown period is updated for an asset\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\n\n /// @notice Emitted when an asset's whitelist status changes\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\n\n /// @notice Emitted when the per-asset transient caching flag is toggled\n event CachingEnabledUpdated(address indexed asset, bool oldEnabled, bool newEnabled);\n\n // --- Errors ---\n\n /// @notice Thrown when trying to use or update protection for an asset that has not been initialized\n error MarketNotInitialized(address asset);\n\n /// @notice Thrown when trying to initialize an already initialized market\n error MarketAlreadyInitialized(address asset);\n\n /// @notice Thrown when trying to disable protection that is not active\n error ProtectedPriceInactive(address asset);\n\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\n\n /// @notice Thrown when trying to disable protection before price range has converged\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\n\n /// @notice Thrown when keeper tries to set minPrice above current spot\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\n\n /// @notice Thrown when keeper tries to set maxPrice below current spot\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\n\n /// @notice Thrown when threshold is set below the minimum allowed value\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\n\n /// @notice Thrown when threshold is set above the maximum allowed value\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\n\n /// @notice Thrown when a price exceeds uint128 max\n error PriceExceedsUint128(uint256 price);\n\n /// @notice Thrown when a zero price is provided where a non-zero price is required\n error ZeroPriceNotAllowed();\n\n /// @notice Thrown when trying to initialize protection for VAI\n error VAINotAllowed();\n\n /// @notice Thrown when trying to disable bounded pricing for an asset while protection is active\n error ProtectedPriceActive(address asset);\n\n /// @notice Thrown when the lengths of the arrays are not equal\n error InvalidArrayLength();\n\n /// @notice Thrown when the exit threshold is set at or above the trigger threshold\n error InvalidResetThreshold(uint256 resetThreshold);\n\n /// @notice Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\n error InvalidKeeperAction(uint8 action);\n\n // --- Non-view price functions (update window + trigger protection) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- State update (call before view price reads to populate transient cache) ---\n\n /**\n * @notice Updates the protection state for a given vToken, caching the resolved collateral and debt prices\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\n * reads in the same transaction are served from transient storage. The transient\n * cache is only populated when the asset's `cachingEnabled` flag is `true`.\n * @param vToken vToken address\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external;\n\n // --- View price functions (read stored/cached state only) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return price The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return price The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- Keeper functions ---\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMin is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external;\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMax is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external;\n\n /**\n * @notice Exits protection mode for a given asset once conditions are met\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external;\n\n /**\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\n * Empty `actions` is a no-op success.\n * @param actions The list of keeper actions to apply\n * @custom:access Only authorized keeper addresses\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\n * @custom:error PriceExceedsUint128 if a SetMin/SetMax item value overflows uint128\n * @custom:error ZeroPriceNotAllowed if a SetMin/SetMax item value is zero\n * @custom:error MarketNotInitialized if any referenced asset has not been initialized\n * @custom:error InvalidMinPrice if a SetMinPrice item violates the spot/maxPrice constraints\n * @custom:error InvalidMaxPrice if a SetMaxPrice item violates the spot/minPrice constraints\n * @custom:error ProtectedPriceInactive if an ExitProtectionMode item targets an asset whose protection is not active\n * @custom:error CooldownNotElapsed if an ExitProtectionMode item is submitted before cooldown elapsed\n * @custom:error PriceRangeNotConverged if an ExitProtectionMode item is submitted before window convergence\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\n */\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external;\n\n // --- Admin functions (governance-gated) ---\n\n /**\n * @notice Initializes protection parameters for a new asset\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\n * confirming the oracle is live for this asset before it is listed.\n * @param tokenConfig_ Token config input for the asset\n * @custom:access Only Governance\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external;\n\n /**\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\n * @param tokenConfigs_ Array of token config inputs, one per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if the input array is empty\n * @custom:error ZeroAddressNotAllowed if any asset is the zero address\n * @custom:error ZeroValueNotAllowed if any cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if any asset has already been initialized\n * @custom:error ThresholdBelowMinimum if any triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if any triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if any resetThreshold is at or above its triggerThreshold\n * @custom:error VAINotAllowed if any asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price for any asset overflows uint128\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external;\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds; must be non-zero\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\n\n /**\n * @notice Sets whether bounded pricing is enabled for an asset\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\n\n /**\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\n * live spot instead of reading or writing the transient slots. The initial value is\n * set via the `enableCaching` argument of `setTokenConfig`.\n * @param asset The underlying asset address\n * @param enabled Whether transient caching is enabled for this asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CachingEnabledUpdated\n */\n function setCachingEnabled(address asset, bool enabled) external;\n\n // --- View helpers ---\n\n /**\n * @notice Returns the full protection state for an asset\n * @param asset The underlying asset address\n * @return minPrice Lowest price observed in the current window\n * @return maxPrice Highest price observed in the current window\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\n * @return cooldownPeriod Minimum time protection stays active after last trigger\n * @return assetAddr The underlying asset address stored in the struct\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\n * @return cachingEnabled Whether transient caching of the bounded pair is enabled for the asset\n */\n function assetProtectionConfig(\n address asset\n )\n external\n view\n returns (\n uint128 minPrice,\n uint128 maxPrice,\n bool currentlyUsingProtectedPrice,\n bool isBoundedPricingEnabled,\n uint64 lastProtectionTriggeredAt,\n uint64 cooldownPeriod,\n address assetAddr,\n uint128 triggerThreshold,\n uint128 resetThreshold,\n bool cachingEnabled\n );\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool);\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\n\n /**\n * @notice Checks if protection can be exited for a given asset\n * @param asset The underlying asset address\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\n */\n function canExitProtection(address asset) external view returns (bool);\n\n /**\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\n * @param index Array index\n * @return The asset address at the given index\n */\n function allAssets(uint256 index) external view returns (address);\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory);\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's proposed window minimum prices\n * @param proposedMaxs Keeper's proposed window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\n}\n" + }, + "contracts/interfaces/IERC4626.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IERC4626 {\n function convertToAssets(uint256 shares) 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\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256);\n\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/ISfrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISfrxEthFraxOracle {\n function getPrices() external view returns (bool _isbadData, uint256 _priceLow, uint256 _priceHigh);\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/IZkETH.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface IZkETH {\n function LSTPerToken() 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 BoundValidatorInterface {\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool);\n}\n" + }, + "contracts/interfaces/PublicResolverInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface PublicResolverInterface {\n function addr(bytes32 node) external view returns (address payable);\n}\n" + }, + "contracts/interfaces/SIDRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface SIDRegistryInterface {\n function resolver(bytes32 node) external view returns (address);\n}\n" + }, + "contracts/interfaces/VBep20Interface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\ninterface VBep20Interface is IERC20Metadata {\n /**\n * @notice Underlying asset for this VToken\n */\n function underlying() external view returns (address);\n}\n" + }, + "contracts/lib/Transient.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nlibrary Transient {\n /**\n * @notice Cache the asset price into transient storage\n * @param key address of the asset\n * @param value asset price\n */\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n tstore(slot, value)\n }\n }\n\n /**\n * @notice Read cached price from transient storage\n * @param key address of the asset\n * @return value cached asset price\n */\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/oracles/AnkrBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title AnkrBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of ankrBNB asset\n */\ncontract AnkrBNBOracle 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 Constructor for the implementation contract.\n constructor(\n address ankrBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n ankrBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of BNB for 1 ankrBNB\n * @return amount The amount of BNB for ankrBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IAnkrBNB(CORRELATED_TOKEN).sharesToBonds(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/AsBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title asBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of asBNB asset\n */\ncontract AsBNBOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address asBNB,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n asBNB,\n slisBNB,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of slisBNB for 1 asBNB\n * @return price The amount of slisBNB for asBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n IAsBNBMinter minter = IAsBNBMinter(IAsBNB(CORRELATED_TOKEN).minter());\n return minter.convertToTokens(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/SIDRegistryInterface.sol\";\nimport \"../interfaces/FeedRegistryInterface.sol\";\nimport \"../interfaces/PublicResolverInterface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title BinanceOracle\n * @author Venus\n * @notice This oracle fetches price of assets from Binance.\n */\ncontract BinanceOracle is AccessControlledV8, OracleInterface {\n /// @notice Used to fetch feed registry address.\n address public sidRegistryAddress;\n\n /// @notice Set this as asset address for BNB. This is the underlying address for vBNB\n address public constant BNB_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Max stale period configuration for assets\n mapping(string => uint256) public maxStalePeriod;\n\n /// @notice Override symbols to be compatible with Binance feed registry\n mapping(string => string) public symbols;\n\n /// @notice Used to fetch price of assets used directly when space ID is not supported by current chain.\n address public feedRegistryAddress;\n\n /// @notice Emits when asset stale period is updated.\n event MaxStalePeriodAdded(string indexed asset, uint256 maxStalePeriod);\n\n /// @notice Emits when symbol of the asset is updated.\n event SymbolOverridden(string indexed symbol, string overriddenSymbol);\n\n /// @notice Emits when address of feed registry is updated.\n event FeedRegistryUpdated(address indexed oldFeedRegistry, address indexed newFeedRegistry);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _sidRegistryAddress Address of SID registry\n * @param _acm Address of the access control manager contract\n */\n function initialize(address _sidRegistryAddress, address _acm) external initializer {\n sidRegistryAddress = _sidRegistryAddress;\n __AccessControlled_init(_acm);\n }\n\n /**\n * @notice Used to set the max stale period of an asset\n * @param symbol The symbol of the asset\n * @param _maxStalePeriod The max stake period\n */\n function setMaxStalePeriod(string memory symbol, uint256 _maxStalePeriod) external {\n _checkAccessAllowed(\"setMaxStalePeriod(string,uint256)\");\n if (_maxStalePeriod == 0) revert(\"stale period can't be zero\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n maxStalePeriod[symbol] = _maxStalePeriod;\n emit MaxStalePeriodAdded(symbol, _maxStalePeriod);\n }\n\n /**\n * @notice Used to override a symbol when fetching price\n * @param symbol The symbol to override\n * @param overrideSymbol The symbol after override\n */\n function setSymbolOverride(string calldata symbol, string calldata overrideSymbol) external {\n _checkAccessAllowed(\"setSymbolOverride(string,string)\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n symbols[symbol] = overrideSymbol;\n emit SymbolOverridden(symbol, overrideSymbol);\n }\n\n /**\n * @notice Used to set feed registry address when current chain does not support space ID.\n * @param newfeedRegistryAddress Address of new feed registry.\n */\n function setFeedRegistryAddress(\n address newfeedRegistryAddress\n ) external notNullAddress(newfeedRegistryAddress) onlyOwner {\n if (sidRegistryAddress != address(0)) revert(\"sidRegistryAddress must be zero\");\n emit FeedRegistryUpdated(feedRegistryAddress, newfeedRegistryAddress);\n feedRegistryAddress = newfeedRegistryAddress;\n }\n\n /**\n * @notice Uses Space ID to fetch the feed registry address\n * @return feedRegistryAddress Address of binance oracle feed registry.\n */\n function getFeedRegistryAddress() public view returns (address) {\n bytes32 nodeHash = 0x94fe3821e0768eb35012484db4df61890f9a6ca5bfa984ef8ff717e73139faff;\n\n SIDRegistryInterface sidRegistry = SIDRegistryInterface(sidRegistryAddress);\n address publicResolverAddress = sidRegistry.resolver(nodeHash);\n PublicResolverInterface publicResolver = PublicResolverInterface(publicResolverAddress);\n\n return publicResolver.addr(nodeHash);\n }\n\n /**\n * @notice Gets the price of a asset from the binance oracle\n * @param asset Address of the asset\n * @return Price in USD\n */\n function getPrice(address asset) public view returns (uint256) {\n string memory symbol;\n uint256 decimals;\n\n if (asset == BNB_ADDR) {\n symbol = \"BNB\";\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n symbol = token.symbol();\n decimals = token.decimals();\n }\n\n string memory overrideSymbol = symbols[symbol];\n\n if (bytes(overrideSymbol).length != 0) {\n symbol = overrideSymbol;\n }\n\n return _getPrice(symbol, decimals);\n }\n\n function _getPrice(string memory symbol, uint256 decimals) internal view returns (uint256) {\n FeedRegistryInterface feedRegistry;\n\n if (sidRegistryAddress != address(0)) {\n // If sidRegistryAddress is available, fetch feedRegistryAddress from sidRegistry\n feedRegistry = FeedRegistryInterface(getFeedRegistryAddress());\n } else {\n // Use feedRegistry directly if sidRegistryAddress is not available\n feedRegistry = FeedRegistryInterface(feedRegistryAddress);\n }\n\n (, int256 answer, , uint256 updatedAt, ) = feedRegistry.latestRoundDataByName(symbol, \"USD\");\n if (answer <= 0) revert(\"invalid binance oracle price\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n if (deltaTime > maxStalePeriod[symbol]) revert(\"binance oracle price expired\");\n\n uint256 decimalDelta = feedRegistry.decimalsByName(symbol, \"USD\");\n return (uint256(answer) * (10 ** (18 - decimalDelta))) * (10 ** (18 - decimals));\n }\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 IStaderStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address bnbx,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n bnbx,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertBnbXToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BoundValidator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title BoundValidator\n * @author Venus\n * @notice The BoundValidator contract is used to validate prices fetched from two different sources.\n * Each asset has an upper and lower bound ratio set in the config. In order for a price to be valid\n * it must fall within this range of the validator price.\n */\ncontract BoundValidator is AccessControlledV8, BoundValidatorInterface {\n struct ValidateConfig {\n /// @notice asset address\n address asset;\n /// @notice Upper bound of deviation between reported price and anchor price,\n /// beyond which the reported price will be invalidated\n uint256 upperBoundRatio;\n /// @notice Lower bound of deviation between reported price and anchor price,\n /// below which the reported price will be invalidated\n uint256 lowerBoundRatio;\n }\n\n /// @notice validation configs by asset\n mapping(address => ValidateConfig) public validateConfigs;\n\n /// @notice Emit this event when new validation configs are added\n event ValidateConfigAdded(address indexed asset, uint256 indexed upperBound, uint256 indexed lowerBound);\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Add multiple validation configs at the same time\n * @param configs Array of validation configs\n * @custom:access Only Governance\n * @custom:error Zero length error is thrown if length of the config array is 0\n * @custom:event Emits ValidateConfigAdded for each validation config that is successfully set\n */\n function setValidateConfigs(ValidateConfig[] memory configs) external {\n uint256 length = configs.length;\n if (length == 0) revert(\"invalid validate config length\");\n for (uint256 i; i < length; ++i) {\n setValidateConfig(configs[i]);\n }\n }\n\n /**\n * @notice Add a single validation config\n * @param config Validation config struct\n * @custom:access Only Governance\n * @custom:error Null address error is thrown if asset address is null\n * @custom:error Range error thrown if bound ratio is not positive\n * @custom:error Range error thrown if lower bound is greater than or equal to upper bound\n * @custom:event Emits ValidateConfigAdded when a validation config is successfully set\n */\n function setValidateConfig(ValidateConfig memory config) public {\n _checkAccessAllowed(\"setValidateConfig(ValidateConfig)\");\n\n if (config.asset == address(0)) revert(\"asset can't be zero address\");\n if (config.upperBoundRatio == 0 || config.lowerBoundRatio == 0) revert(\"bound must be positive\");\n if (config.upperBoundRatio <= config.lowerBoundRatio) revert(\"upper bound must be higher than lowner bound\");\n validateConfigs[config.asset] = config;\n emit ValidateConfigAdded(config.asset, config.upperBoundRatio, config.lowerBoundRatio);\n }\n\n /**\n * @notice Test reported asset price against anchor price\n * @param asset asset address\n * @param reportedPrice The price to be tested\n * @custom:error Missing error thrown if asset config is not set\n * @custom:error Price error thrown if anchor price is not valid\n */\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reportedPrice,\n uint256 anchorPrice\n ) public view virtual override returns (bool) {\n if (validateConfigs[asset].upperBoundRatio == 0) revert(\"validation config not exist\");\n if (anchorPrice == 0) revert(\"anchor price is not valid\");\n return _isWithinAnchor(asset, reportedPrice, anchorPrice);\n }\n\n /**\n * @notice Test whether the reported price is within the valid bounds\n * @param asset Asset address\n * @param reportedPrice The price to be tested\n * @param anchorPrice The reported price must be within the the valid bounds of this price\n */\n function _isWithinAnchor(address asset, uint256 reportedPrice, uint256 anchorPrice) private view returns (bool) {\n if (reportedPrice != 0) {\n // we need to multiply anchorPrice by 1e18 to make the ratio 18 decimals\n uint256 anchorRatio = (anchorPrice * 1e18) / reportedPrice;\n uint256 upperBoundAnchorRatio = validateConfigs[asset].upperBoundRatio;\n uint256 lowerBoundAnchorRatio = validateConfigs[asset].lowerBoundRatio;\n return anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio;\n }\n return false;\n }\n\n // BoundValidator is to get inherited, so it's a good practice to add some storage gaps like\n // OpenZepplin proposed in their contracts: https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n // solhint-disable-next-line\n uint256[49] private __gap;\n}\n" + }, + "contracts/oracles/ChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title ChainlinkOracle\n * @author Venus\n * @notice This oracle fetches prices of assets from the Chainlink oracle.\n */\ncontract ChainlinkOracle is AccessControlledV8, OracleInterface {\n struct TokenConfig {\n /// @notice Underlying token address, which can't be a null address\n /// @notice Used to check if a token is supported\n /// @notice 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB address for native tokens\n /// (e.g BNB for BNB chain, ETH for Ethereum network)\n address asset;\n /// @notice Chainlink feed address\n address feed;\n /// @notice Price expiration period of this asset\n uint256 maxStalePeriod;\n }\n\n /// @notice Set this as asset address for native token on each chain.\n /// This is the underlying address for vBNB on BNB chain or an underlying asset for a native market on any chain.\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Manually set an override price, useful under extenuating conditions such as price feed failure\n mapping(address => uint256) public prices;\n\n /// @notice Token config by assets\n mapping(address => TokenConfig) public tokenConfigs;\n\n /// @notice Emit when a price is manually set\n event PricePosted(address indexed asset, uint256 previousPriceMantissa, uint256 newPriceMantissa);\n\n /// @notice Emit when a token config is added\n event TokenConfigAdded(address indexed asset, address feed, uint256 maxStalePeriod);\n\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Manually set the price of a given asset\n * @param asset Asset address\n * @param price Asset price in 18 decimals\n * @custom:access Only Governance\n * @custom:event Emits PricePosted event on successfully setup of asset price\n */\n function setDirectPrice(address asset, uint256 price) external notNullAddress(asset) {\n _checkAccessAllowed(\"setDirectPrice(address,uint256)\");\n\n uint256 previousPriceMantissa = prices[asset];\n prices[asset] = price;\n emit PricePosted(asset, previousPriceMantissa, price);\n }\n\n /**\n * @notice Add multiple token configs at the same time\n * @param tokenConfigs_ config array\n * @custom:access Only Governance\n * @custom:error Zero length error thrown, if length of the array in parameter is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Add single token config. asset & feed cannot be null addresses and maxStalePeriod must be positive\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error NotNullAddress error is thrown if token feed address is null\n * @custom:error Range error is thrown if maxStale period of token is not greater than zero\n * @custom:event Emits TokenConfigAdded event on successfully setting of the token config\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.feed) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n if (tokenConfig.maxStalePeriod == 0) revert(\"stale period can't be zero\");\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(tokenConfig.asset, tokenConfig.feed, tokenConfig.maxStalePeriod);\n }\n\n /**\n * @notice Gets the price of a asset from the chainlink oracle\n * @param asset Address of the asset\n * @return Price in USD from Chainlink or a manually set price for the asset\n */\n function getPrice(address asset) public view virtual returns (uint256) {\n uint256 decimals;\n\n if (asset == NATIVE_TOKEN_ADDR) {\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n decimals = token.decimals();\n }\n\n return _getPriceInternal(asset, decimals);\n }\n\n /**\n * @notice Gets the Chainlink price for a given asset\n * @param asset address of the asset\n * @param decimals decimals of the asset\n * @return price Asset price in USD or a manually set price of the asset\n */\n function _getPriceInternal(address asset, uint256 decimals) internal view returns (uint256 price) {\n uint256 tokenPrice = prices[asset];\n if (tokenPrice != 0) {\n price = tokenPrice;\n } else {\n price = _getChainlinkPrice(asset);\n }\n\n uint256 decimalDelta = 18 - decimals;\n return price * (10 ** decimalDelta);\n }\n\n /**\n * @notice Get the Chainlink price for an asset, revert if token config doesn't exist\n * @dev The precision of the price feed is used to ensure the returned price has 18 decimals of precision\n * @param asset Address of the asset\n * @return price Price in USD, with 18 decimals of precision\n * @custom:error NotNullAddress error is thrown if the asset address is null\n * @custom:error Price error is thrown if the Chainlink price of asset is not greater than zero\n * @custom:error Timing error is thrown if current timestamp is less than the last updatedAt timestamp\n * @custom:error Timing error is thrown if time difference between current time and last updated time\n * is greater than maxStalePeriod\n */\n function _getChainlinkPrice(\n address asset\n ) private view notNullAddress(tokenConfigs[asset].asset) returns (uint256) {\n TokenConfig memory tokenConfig = tokenConfigs[asset];\n AggregatorV3Interface feed = AggregatorV3Interface(tokenConfig.feed);\n\n // note: maxStalePeriod cannot be 0\n uint256 maxStalePeriod = tokenConfig.maxStalePeriod;\n\n // Chainlink USD-denominated feeds store answers at 8 decimals, mostly\n uint256 decimalDelta = 18 - feed.decimals();\n\n (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();\n if (answer <= 0) revert(\"chainlink price must be positive\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n\n if (deltaTime > maxStalePeriod) revert(\"chainlink price expired\");\n\n return uint256(answer) * (10 ** decimalDelta);\n }\n}\n" + }, + "contracts/oracles/common/CorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../../interfaces/OracleInterface.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { SECONDS_PER_YEAR } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { ICappedOracle } from \"../../interfaces/ICappedOracle.sol\";\nimport { IAccessControlManagerV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.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, ICappedOracle {\n /// @notice Address of the correlated token\n address public immutable CORRELATED_TOKEN;\n\n /// @notice Address of the underlying token\n address public immutable UNDERLYING_TOKEN;\n\n /// @notice Address of Resilient Oracle\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Address of the AccessControlManager contract\n IAccessControlManagerV8 public immutable ACCESS_CONTROL_MANAGER;\n\n //// @notice Growth rate percentage in seconds. Ex: 1e18 is 100%\n uint256 public growthRatePerSecond;\n\n /// @notice Snapshot update interval\n uint256 public snapshotInterval;\n\n /// @notice Last stored snapshot maximum exchange rate\n uint256 public snapshotMaxExchangeRate;\n\n /// @notice Last stored snapshot timestamp\n uint256 public snapshotTimestamp;\n\n /// @notice Gap to add when updating the snapshot\n uint256 public snapshotGap;\n\n /// @notice Emitted when the snapshot is updated\n event SnapshotUpdated(uint256 indexed maxExchangeRate, uint256 indexed timestamp);\n\n /// @notice Emitted when the growth rate is updated\n event GrowthRateUpdated(\n uint256 indexed oldGrowthRatePerSecond,\n uint256 indexed newGrowthRatePerSecond,\n uint256 indexed oldSnapshotInterval,\n uint256 newSnapshotInterval\n );\n\n /// @notice Emitted when the snapshot gap is updated\n event SnapshotGapUpdated(uint256 indexed oldSnapshotGap, uint256 indexed newSnapshotGap);\n\n /// @notice Thrown if the token address is invalid\n error InvalidTokenAddress();\n\n /// @notice Thrown if the growth rate is invalid\n error InvalidGrowthRate();\n\n /// @notice Thrown if the initial snapshot is invalid\n error InvalidInitialSnapshot();\n\n /// @notice Thrown if the max snapshot exchange rate is invalid\n error InvalidSnapshotMaxExchangeRate();\n\n /// @notice @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:error InvalidInitialSnapshot error is thrown if the initial snapshot values are invalid\n */\n constructor(\n address _correlatedToken,\n address _underlyingToken,\n address _resilientOracle,\n uint256 _annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 _initialSnapshotMaxExchangeRate,\n uint256 _initialSnapshotTimestamp,\n address _accessControlManager,\n uint256 _snapshotGap\n ) {\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n if ((_initialSnapshotMaxExchangeRate == 0 || _initialSnapshotTimestamp == 0) && _snapshotInterval > 0) {\n revert InvalidInitialSnapshot();\n }\n\n ensureNonzeroAddress(_correlatedToken);\n ensureNonzeroAddress(_underlyingToken);\n ensureNonzeroAddress(_resilientOracle);\n ensureNonzeroAddress(_accessControlManager);\n\n CORRELATED_TOKEN = _correlatedToken;\n UNDERLYING_TOKEN = _underlyingToken;\n RESILIENT_ORACLE = ResilientOracleInterface(_resilientOracle);\n snapshotInterval = _snapshotInterval;\n\n snapshotMaxExchangeRate = _initialSnapshotMaxExchangeRate;\n snapshotTimestamp = _initialSnapshotTimestamp;\n snapshotGap = _snapshotGap;\n\n ACCESS_CONTROL_MANAGER = IAccessControlManagerV8(_accessControlManager);\n }\n\n /**\n * @notice Directly sets the snapshot exchange rate and timestamp\n * @param _snapshotMaxExchangeRate The exchange rate to set\n * @param _snapshotTimestamp The timestamp to set\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n */\n function setSnapshot(uint256 _snapshotMaxExchangeRate, uint256 _snapshotTimestamp) external {\n _checkAccessAllowed(\"setSnapshot(uint256,uint256)\");\n\n snapshotMaxExchangeRate = _snapshotMaxExchangeRate;\n snapshotTimestamp = _snapshotTimestamp;\n\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Sets the growth rate and snapshot interval\n * @param _annualGrowthRate The annual growth rate to set\n * @param _snapshotInterval The snapshot interval to set\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:event Emits GrowthRateUpdated event on successful update of the growth rate\n */\n function setGrowthRate(uint256 _annualGrowthRate, uint256 _snapshotInterval) external {\n _checkAccessAllowed(\"setGrowthRate(uint256,uint256)\");\n uint256 oldGrowthRatePerSecond = growthRatePerSecond;\n\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n emit GrowthRateUpdated(oldGrowthRatePerSecond, growthRatePerSecond, snapshotInterval, _snapshotInterval);\n\n snapshotInterval = _snapshotInterval;\n }\n\n /**\n * @notice Sets the snapshot gap\n * @param _snapshotGap The snapshot gap to set\n * @custom:event Emits SnapshotGapUpdated event on successful update of the snapshot gap\n */\n function setSnapshotGap(uint256 _snapshotGap) external {\n _checkAccessAllowed(\"setSnapshotGap(uint256)\");\n\n emit SnapshotGapUpdated(snapshotGap, _snapshotGap);\n\n snapshotGap = _snapshotGap;\n }\n\n /**\n * @notice Returns if the price is capped\n * @return isCapped Boolean indicating if the price is capped\n */\n function isCapped() external view virtual returns (bool) {\n if (snapshotInterval == 0) {\n return false;\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n if (maxAllowedExchangeRate == 0) {\n return false;\n }\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n return exchangeRate > maxAllowedExchangeRate;\n }\n\n /**\n * @notice Updates the snapshot price and timestamp\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n * @custom:error InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero\n */\n function updateSnapshot() public override {\n if (block.timestamp - snapshotTimestamp < snapshotInterval || snapshotInterval == 0) return;\n\n uint256 exchangeRate = getUnderlyingAmount();\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n snapshotMaxExchangeRate =\n (exchangeRate > maxAllowedExchangeRate ? maxAllowedExchangeRate : exchangeRate) +\n snapshotGap;\n snapshotTimestamp = block.timestamp;\n\n if (snapshotMaxExchangeRate == 0) revert InvalidSnapshotMaxExchangeRate();\n\n RESILIENT_ORACLE.updateAssetPrice(UNDERLYING_TOKEN);\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Fetches the price of the token\n * @param asset Address of the token\n * @return price The price of the token in scaled decimal places. It can be capped\n * to a maximum value taking into account the growth rate\n * @custom:error InvalidTokenAddress error is thrown if the token address is invalid\n */\n function getPrice(address asset) public view override returns (uint256) {\n if (asset != CORRELATED_TOKEN) revert InvalidTokenAddress();\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n if (snapshotInterval == 0) {\n return _calculatePrice(exchangeRate);\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n uint256 finalExchangeRate = (exchangeRate > maxAllowedExchangeRate && maxAllowedExchangeRate != 0)\n ? maxAllowedExchangeRate\n : exchangeRate;\n\n return _calculatePrice(finalExchangeRate);\n }\n\n /**\n * @notice Gets the maximum allowed exchange rate for token\n * @return maxExchangeRate Maximum allowed exchange rate\n */\n function getMaxAllowedExchangeRate() public view returns (uint256) {\n uint256 timeElapsed = block.timestamp - snapshotTimestamp;\n uint256 maxExchangeRate = snapshotMaxExchangeRate +\n (snapshotMaxExchangeRate * growthRatePerSecond * timeElapsed) /\n 1e18;\n return maxExchangeRate;\n }\n\n /**\n * @notice Gets the underlying amount for correlated token\n * @return underlyingAmount Amount of underlying token\n */\n function getUnderlyingAmount() public view virtual returns (uint256);\n\n /**\n * @notice Fetches price of the token based on an underlying exchange rate\n * @param exchangeRate The underlying exchange rate to use\n * @return price The price of the token in scaled decimal places\n */\n function _calculatePrice(uint256 exchangeRate) internal view returns (uint256) {\n uint256 underlyingUSDPrice = RESILIENT_ORACLE.getPrice(UNDERLYING_TOKEN);\n\n IERC20Metadata token = IERC20Metadata(CORRELATED_TOKEN);\n uint256 decimals = token.decimals();\n\n return (exchangeRate * underlyingUSDPrice) / (10 ** decimals);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n * @custom:error Unauthorized error is thrown if the call is not allowed\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = ACCESS_CONTROL_MANAGER.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "contracts/oracles/ERC4626Oracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IERC4626 } from \"../interfaces/IERC4626.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ERC4626Oracle\n * @author Venus\n * @notice This oracle fetches the price of ERC4626 tokens\n */\ncontract ERC4626Oracle is CorrelatedTokenOracle {\n uint256 public immutable ONE_CORRELATED_TOKEN;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ONE_CORRELATED_TOKEN = 10 ** IERC4626(correlatedToken).decimals();\n }\n\n /**\n * @notice Fetches the amount of underlying token for 1 correlated token\n * @return amount The amount of underlying token for correlated token\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IERC4626(CORRELATED_TOKEN).convertToAssets(ONE_CORRELATED_TOKEN);\n }\n}\n" + }, + "contracts/oracles/EtherfiAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title EtherfiAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of any Ether.fi asset that uses\n * Accountant contracts to derive the underlying price\n */\ncontract EtherfiAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Fetches the conversion rate from the ACCOUNTANT contract\n * @return amount Amount of WBTC\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\n }\n}\n" + }, + "contracts/oracles/mocks/MockAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IAccountant.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAccountant is IAccountant, Ownable {\n uint256 public rate;\n\n constructor() Ownable() {}\n\n function setRate(uint256 _rate) external onlyOwner {\n rate = _rate;\n }\n\n function getRateSafe() external view override returns (uint256) {\n return rate;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceFeedRegistry.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/FeedRegistryInterface.sol\";\n\ncontract MockBinanceFeedRegistry is FeedRegistryInterface {\n mapping(string => uint256) public assetPrices;\n\n function setAssetPrice(string memory base, uint256 price) external {\n assetPrices[base] = price;\n }\n\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n override\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n quote;\n return (0, int256(assetPrices[base]), 0, block.timestamp - 10, 0);\n }\n\n function decimalsByName(string memory base, string memory quote) external view override returns (uint8) {\n return 8;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockBinanceOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n constructor() {}\n\n function initialize() public initializer {}\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockChainlinkOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n //set price in 6 decimal precision\n constructor() {}\n\n function initialize() public initializer {\n __Ownable_init();\n }\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n //https://compound.finance/docs/prices\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockPendlePtOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IPendlePtOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockPendlePtOracle is IPendlePtOracle, Ownable {\n mapping(address => mapping(uint32 => uint256)) public ptToAssetRate;\n mapping(address => mapping(uint32 => uint256)) public ptToSyRate;\n\n constructor() Ownable() {}\n\n function setPtToAssetRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToAssetRate[market][duration] = rate;\n }\n\n function setPtToSyRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToSyRate[market][duration] = rate;\n }\n\n function getPtToAssetRate(address market, uint32 duration) external view returns (uint256) {\n return ptToAssetRate[market][duration];\n }\n\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256) {\n return ptToSyRate[market][duration];\n }\n\n function getOracleState(\n address /* market */,\n uint32 /* duration */\n )\n external\n pure\n returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied)\n {\n return (false, 0, true);\n }\n}\n" + }, + "contracts/oracles/mocks/MockSFrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/ISfrxEthFraxOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSfrxEthFraxOracle is ISfrxEthFraxOracle, Ownable {\n bool public isBadData;\n uint256 public priceLow;\n uint256 public priceHigh;\n\n constructor() Ownable() {}\n\n function setPrices(bool _isBadData, uint256 _priceLow, uint256 _priceHigh) external onlyOwner {\n isBadData = _isBadData;\n priceLow = _priceLow;\n priceHigh = _priceHigh;\n }\n\n function getPrices() external view override returns (bool, uint256, uint256) {\n return (isBadData, priceLow, priceHigh);\n }\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 OracleInterface public immutable INTERMEDIATE_ORACLE;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n address intermediateOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 scaled by the underlying token decimals\n */\n function getUnderlyingAmount() public 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 (underlyingAmount * (10 ** correlatedDecimals)) / (10 ** (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\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title PendleOracle\n * @author Venus\n * @notice This oracle fetches the price of a pendle token\n * @dev As a base price the oracle uses either the price of the Pendle\n * market's asset (in this case PT_TO_ASSET rate should be used) or\n * the price of the Pendle market's interest bearing token (e.g. wstETH\n * for stETH; in this case PT_TO_SY rate should be used). Technically,\n * interest bearing token is different from standardized yield (SY) token,\n * but since SY is a wrapper around an interest bearing token, we can safely\n * assume the prices of the two are equal. This is not always true for asset\n * price though: using PT_TO_ASSET rate assumes that the yield token can\n * be seamlessly redeemed for the underlying asset. In reality, this might\n * not always be the case. For more details, see\n * https://docs.pendle.finance/Developers/Contracts/StandardizedYield\n */\ncontract PendleOracle is CorrelatedTokenOracle {\n struct ConstructorParams {\n /// @notice Pendle market\n address market;\n /// @notice Pendle oracle\n address ptOracle;\n /// @notice Either PT_TO_ASSET or PT_TO_SY\n RateKind rateKind;\n /// @notice Pendle PT token\n address ptToken;\n /// @notice Underlying token, can be either the market's asset or the interest bearing token\n address underlyingToken;\n /// @notice Resilient oracle to get the underlying token price from\n address resilientOracle;\n /// @notice TWAP duration to call Pendle oracle with\n uint32 twapDuration;\n /// @notice Annual growth rate of the underlying token\n uint256 annualGrowthRate;\n /// @notice Snapshot interval for the oracle\n uint256 snapshotInterval;\n /// @notice Initial exchange rate of the underlying token\n uint256 initialSnapshotMaxExchangeRate;\n /// @notice Initial timestamp of the underlying token\n uint256 initialSnapshotTimestamp;\n /// @notice Access control manager\n address accessControlManager;\n /// @notice Gap to add when updating the snapshot\n uint256 snapshotGap;\n }\n\n /// @notice Which asset to use as a base for the returned PT\n /// price. Can be either a standardized yield token (SY), in\n /// this case PT/SY price is returned, or the Pendle\n /// market's asset directly.\n enum RateKind {\n PT_TO_ASSET,\n PT_TO_SY\n }\n\n /// @notice Address of the PT oracle\n IPendlePtOracle public immutable PT_ORACLE;\n\n /// @notice Whether to use PT/SY (standardized yield token) rate\n /// or PT/market asset rate\n RateKind public immutable RATE_KIND;\n\n /// @notice Address of the market\n address public immutable MARKET;\n\n /// @notice Twap duration for the oracle\n uint32 public immutable TWAP_DURATION;\n\n /// @notice Decimals of the underlying token\n /// @dev We make an assumption that the underlying decimals will\n /// not change throughout the lifetime of the Pendle market\n uint8 public immutable UNDERLYING_DECIMALS;\n\n /// @notice Thrown if the duration is invalid\n error InvalidDuration();\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidDuration Thrown if the duration is invalid\n */\n constructor(\n ConstructorParams memory params\n )\n CorrelatedTokenOracle(\n params.ptToken,\n params.underlyingToken,\n params.resilientOracle,\n params.annualGrowthRate,\n params.snapshotInterval,\n params.initialSnapshotMaxExchangeRate,\n params.initialSnapshotTimestamp,\n params.accessControlManager,\n params.snapshotGap\n )\n {\n ensureNonzeroAddress(params.market);\n ensureNonzeroAddress(params.ptOracle);\n ensureNonzeroValue(params.twapDuration);\n\n MARKET = params.market;\n PT_ORACLE = IPendlePtOracle(params.ptOracle);\n RATE_KIND = params.rateKind;\n TWAP_DURATION = params.twapDuration;\n UNDERLYING_DECIMALS = IERC20Metadata(UNDERLYING_TOKEN).decimals();\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 /// @notice Fetches the amount of underlying token for 1 PT\n /// @return amount The amount of underlying token (either the market's asset\n /// or the yield token) for 1 PT, adjusted for decimals such that the result\n /// has the same precision as the underlying token\n function getUnderlyingAmount() public view override returns (uint256) {\n uint256 rate;\n if (RATE_KIND == RateKind.PT_TO_SY) {\n rate = PT_ORACLE.getPtToSyRate(MARKET, TWAP_DURATION);\n } else {\n rate = PT_ORACLE.getPtToAssetRate(MARKET, TWAP_DURATION);\n }\n return ((10 ** UNDERLYING_DECIMALS) * rate) / 1e18;\n }\n}\n" + }, + "contracts/oracles/SequencerChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.25;\n\nimport { ChainlinkOracle } from \"./ChainlinkOracle.sol\";\nimport { AggregatorV3Interface } from \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\n\n/**\n @title Sequencer Chain Link Oracle\n @notice Oracle to fetch price using chainlink oracles on L2s with sequencer\n*/\ncontract SequencerChainlinkOracle is ChainlinkOracle {\n /// @notice L2 Sequencer feed\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n AggregatorV3Interface public immutable sequencer;\n\n /// @notice L2 Sequencer grace period\n uint256 public constant GRACE_PERIOD_TIME = 3600;\n\n /**\n @notice Contract constructor\n @param _sequencer L2 sequencer\n @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(AggregatorV3Interface _sequencer) ChainlinkOracle() {\n require(address(_sequencer) != address(0), \"zero address\");\n\n sequencer = _sequencer;\n }\n\n /// @inheritdoc ChainlinkOracle\n function getPrice(address asset) public view override returns (uint) {\n if (!isSequencerActive()) revert(\"L2 sequencer unavailable\");\n return super.getPrice(asset);\n }\n\n function isSequencerActive() internal view returns (bool) {\n // answer from oracle is a variable with a value of either 1 or 0\n // 0: The sequencer is up\n // 1: The sequencer is down\n // startedAt: This timestamp indicates when the sequencer changed status\n (, int256 answer, uint256 startedAt, , ) = sequencer.latestRoundData();\n if (block.timestamp - startedAt <= GRACE_PERIOD_TIME || answer == 1) return false;\n return true;\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 constructor(\n address sFrax,\n address frax,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n sFrax,\n frax,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public 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 { ISfrxEthFraxOracle } from \"../interfaces/ISfrxEthFraxOracle.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title SFrxETHOracle\n * @author Venus\n * @notice This oracle fetches the price of sfrxETH\n */\ncontract SFrxETHOracle is AccessControlledV8, OracleInterface {\n /// @notice Address of SfrxEthFraxOracle\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ISfrxEthFraxOracle public immutable SFRXETH_FRAX_ORACLE;\n\n /// @notice Address of sfrxETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable SFRXETH;\n\n /// @notice Maximum allowed price difference\n uint256 public maxAllowedPriceDifference;\n\n /// @notice Emits when the maximum allowed price difference is updated\n event MaxAllowedPriceDifferenceUpdated(uint256 oldMaxAllowedPriceDifference, uint256 newMaxAllowedPriceDifference);\n\n /// @notice Thrown if the price data is invalid\n error BadPriceData();\n\n /// @notice Thrown if the price difference exceeds the allowed limit\n error PriceDifferenceExceeded();\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 /// @custom:error ZeroAddressNotAllowed is thrown when `_sfrxEthFraxOracle` or `_sfrxETH` are the zero address\n constructor(address _sfrxEthFraxOracle, address _sfrxETH) {\n ensureNonzeroAddress(_sfrxEthFraxOracle);\n ensureNonzeroAddress(_sfrxETH);\n\n SFRXETH_FRAX_ORACLE = ISfrxEthFraxOracle(_sfrxEthFraxOracle);\n SFRXETH = _sfrxETH;\n\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _acm Address of the access control manager contract\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function initialize(address _acm, uint256 _maxAllowedPriceDifference) external initializer {\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n __AccessControlled_init(_acm);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Sets the maximum allowed price difference\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function setMaxAllowedPriceDifference(uint256 _maxAllowedPriceDifference) external {\n _checkAccessAllowed(\"setMaxAllowedPriceDifference(uint256)\");\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n emit MaxAllowedPriceDifferenceUpdated(maxAllowedPriceDifference, _maxAllowedPriceDifference);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Fetches the USD price of sfrxETH\n * @param asset Address of the sfrxETH token\n * @return price The price scaled by 1e18\n * @custom:error InvalidTokenAddress is thrown when the `asset` is not the sfrxETH token (`SFRXETH`)\n * @custom:error BadPriceData is thrown if the `SFRXETH_FRAX_ORACLE` oracle informs it has bad data\n * @custom:error ZeroValueNotAllowed is thrown if the prices (low or high, in USD) are zero\n * @custom:error PriceDifferenceExceeded is thrown if priceHigh/priceLow is greater than `maxAllowedPriceDifference`\n */\n function getPrice(address asset) external view returns (uint256) {\n if (asset != SFRXETH) revert InvalidTokenAddress();\n\n (bool isBadData, uint256 priceLow, uint256 priceHigh) = SFRXETH_FRAX_ORACLE.getPrices();\n\n if (isBadData) revert BadPriceData();\n\n // calculate price in USD\n uint256 priceHighInUSD = (EXP_SCALE ** 2) / priceLow;\n uint256 priceLowInUSD = (EXP_SCALE ** 2) / priceHigh;\n\n ensureNonzeroValue(priceHighInUSD);\n ensureNonzeroValue(priceLowInUSD);\n\n // validate price difference\n uint256 difference = (priceHighInUSD * EXP_SCALE) / priceLowInUSD;\n if (difference > maxAllowedPriceDifference) revert PriceDifferenceExceeded();\n\n // calculate and return average price\n return (priceHighInUSD + priceLowInUSD) / 2;\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 ISynclubStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n slisBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertSnBnbToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/StableUsdtPriceFeed.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title StableUsdtPriceFeed\n * @dev This contract is used to get the price of USDT from a Resilient Oracle\n * and bounds the price to a certain range.\n */\ncontract StableUsdtPriceFeed {\n ResilientOracleInterface public resilientOracle;\n\n address public constant USDT_TOKEN_ADDR = 0x55d398326f99059fF775485246999027B3197955;\n uint256 public constant UPPER_BOUND = 1020000000000000000; // 1.02 USD\n uint256 public constant LOWER_BOUND = 980000000000000000; // 0.98 USD\n\n constructor(address _resilientOracle) {\n require(_resilientOracle != address(0), \"Zero address provided\");\n resilientOracle = ResilientOracleInterface(_resilientOracle);\n }\n\n function latestAnswer() external view returns (int256 answer) {\n // get price\n uint256 price = getPrice();\n // cast price to int256\n answer = int256(price);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n // get price\n uint256 _answer = getPrice();\n // mock timestamp to latest block timestamp\n uint256 timestamp = block.timestamp;\n // mock roundId to timestamp\n roundId = uint80(timestamp);\n return (roundId, int256(_answer), timestamp, timestamp, roundId);\n }\n\n function decimals() external pure returns (uint8) {\n return 18;\n }\n\n function description() external pure returns (string memory) {\n return \"Stabilized USDT Price Feed\";\n }\n\n function version() external pure returns (uint256) {\n return 1;\n }\n\n /**\n * @dev Get the price from the Resilient Oracle, and bound it to the range\n * @return price The price of USDT in 18 decimals\n */\n function getPrice() private view returns (uint256 price) {\n // get USDT price (18 decimals)\n price = resilientOracle.getPrice(USDT_TOKEN_ADDR);\n price = price < LOWER_BOUND ? LOWER_BOUND : (price > UPPER_BOUND ? UPPER_BOUND : price);\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 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 constructor(\n address stakePool,\n address stkBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n stkBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 * @custom:error PoolTokenSupplyIsZero error is thrown if the pool token supply is zero\n */\n function getUnderlyingAmount() public 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 constructor(\n address wbeth,\n address eth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wbeth,\n eth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public view override returns (uint256) {\n return IWBETH(CORRELATED_TOKEN).exchangeRate();\n }\n}\n" + }, + "contracts/oracles/WeETHAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title WeETHAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of Ether.fi tokens based on an `Accountant` contract (i.e. weETHs and weETHk)\n */\ncontract WeETHAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address weethLRT,\n address weth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weethLRT,\n weth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Gets the WETH for 1 weETH LRT\n * @return amount Amount of WETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\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 IEtherFiLiquidityPool public immutable LIQUIDITY_POOL;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address liquidityPool,\n address weETH,\n address eETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weETH,\n eETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return LIQUIDITY_POOL.amountForShare(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/WstETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\nimport { IStETH } from \"../interfaces/IStETH.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title WstETHOracle\n * @author Venus\n * @notice Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle.\n */\ncontract WstETHOracle is OracleInterface {\n /// @notice A flag assuming 1:1 price equivalence between stETH/ETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n bool public immutable ASSUME_STETH_ETH_EQUIVALENCE;\n\n /// @notice Address of stETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n IStETH public immutable STETH;\n\n /// @notice Address of wstETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WSTETH_ADDRESS;\n\n /// @notice Address of WETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WETH_ADDRESS;\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 Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address wstETHAddress,\n address wETHAddress,\n address stETHAddress,\n address resilientOracleAddress,\n bool assumeEquivalence\n ) {\n ensureNonzeroAddress(wstETHAddress);\n ensureNonzeroAddress(wETHAddress);\n ensureNonzeroAddress(stETHAddress);\n ensureNonzeroAddress(resilientOracleAddress);\n WSTETH_ADDRESS = wstETHAddress;\n WETH_ADDRESS = wETHAddress;\n STETH = IStETH(stETHAddress);\n RESILIENT_ORACLE = OracleInterface(resilientOracleAddress);\n ASSUME_STETH_ETH_EQUIVALENCE = assumeEquivalence;\n }\n\n /**\n * @notice Gets the USD price of wstETH asset\n * @dev Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle\n * @param asset Address of wstETH\n * @return wstETH Price in USD scaled by 1e18\n */\n function getPrice(address asset) public view returns (uint256) {\n if (asset != WSTETH_ADDRESS) revert(\"wrong wstETH address\");\n\n // get stETH amount for 1 wstETH scaled by 1e18\n uint256 stETHAmount = STETH.getPooledEthByShares(1 ether);\n\n // price is scaled 1e18 (oracle returns 36 - asset decimal scale)\n uint256 stETHUSDPrice = RESILIENT_ORACLE.getPrice(ASSUME_STETH_ETH_EQUIVALENCE ? WETH_ADDRESS : address(STETH));\n\n // stETHAmount (for 1 wstETH) * stETHUSDPrice / 1e18\n return (stETHAmount * stETHUSDPrice) / 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\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.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 Address of stETH\n IStETH public immutable STETH;\n\n /// @notice Constructor for the implementation contract.\n /// @dev The underlyingToken must be correlated so that 1 underlyingToken is equal to 1 stETH, because\n /// getUnderlyingAmount() implicitly assumes that\n constructor(\n address stETH,\n address wstETH,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wstETH,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(stETH);\n STETH = IStETH(stETH);\n }\n\n /**\n * @notice Gets the amount of underlyingToken for 1 wstETH, assuming that 1 underlyingToken is equivalent to 1 stETH\n * @return amount Amount of underlyingToken\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return STETH.getPooledEthByShares(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/ZkETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IZkETH } from \"../interfaces/IZkETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ZkETHOracle\n * @author Venus\n * @notice This oracle fetches the price of zkETH\n */\ncontract ZkETHOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address zkETH,\n address rzkETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n zkETH,\n rzkETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Gets the amount of rzkETH for 1 zkETH\n * @return amount Amount of rzkETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IZkETH(CORRELATED_TOKEN).LSTPerToken();\n }\n}\n" + }, + "contracts/ReferenceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2025 Venus\npragma solidity 0.8.25;\n\nimport { Ownable2StepUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { ResilientOracleInterface, OracleInterface } from \"./interfaces/OracleInterface.sol\";\n\n/**\n * @title ReferenceOracle\n * @author Venus\n * @notice Reference oracle is the oracle that is not used for production but required for\n * price monitoring. This oracle contains some extra configurations for assets required to\n * compute reference prices of their derivative assets (OneJump, ERC4626, Pendle, etc.)\n */\ncontract ReferenceOracle is Ownable2StepUpgradeable, OracleInterface {\n struct ExternalPrice {\n /// @notice asset address\n address asset;\n /// @notice price of the asset from an external source\n uint256 price;\n }\n\n /// @notice Slot to temporarily store price information from external sources\n /// like CMC/Coingecko, useful to compute prices of derivative assets based on\n /// prices of the base assets with no on chain price information\n bytes32 public constant PRICES_SLOT = keccak256(abi.encode(\"venus-protocol/oracle/ReferenceOracle/prices\"));\n\n /// @notice Resilient oracle address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Oracle configuration for assets\n mapping(address => OracleInterface) public oracles;\n\n /// @notice Event emitted when an oracle is set\n event OracleConfigured(address indexed asset, address indexed oracle);\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param resilientOracle Resilient oracle address\n * @custom:error ZeroAddressNotAllowed is thrown if resilient oracle address is null\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface resilientOracle) {\n ensureNonzeroAddress(address(resilientOracle));\n RESILIENT_ORACLE = resilientOracle;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n */\n function initialize() external initializer {\n __Ownable2Step_init();\n }\n\n /**\n * @notice Sets an oracle to use for a specific asset\n * @dev The production resilientOracle will be used if zero address is passed\n * @param asset Asset address\n * @param oracle Oracle address\n * @custom:access Only owner\n * @custom:error ZeroAddressNotAllowed is thrown if asset address is null\n * @custom:event Emits OracleConfigured event\n */\n function setOracle(address asset, OracleInterface oracle) external onlyOwner {\n ensureNonzeroAddress(asset);\n oracles[asset] = OracleInterface(oracle);\n emit OracleConfigured(asset, address(oracle));\n }\n\n /**\n * @notice Gets price of the asset assuming other assets have the defined price\n * @param asset asset address\n * @param externalPrices an array of prices for other assets\n * @return USD price in scaled decimal places\n */\n function getPriceAssuming(address asset, ExternalPrice[] memory externalPrices) external returns (uint256) {\n uint256 externalPricesCount = externalPrices.length;\n for (uint256 i = 0; i < externalPricesCount; ++i) {\n _storeExternalPrice(externalPrices[i].asset, externalPrices[i].price);\n }\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return USD price in scaled decimal places\n */\n function getPrice(address asset) external view override returns (uint256) {\n return _getPrice(asset);\n }\n\n function _storeExternalPrice(address asset, uint256 price) internal {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n tstore(slot, price)\n }\n }\n\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 externalPrice = _loadExternalPrice(asset);\n if (externalPrice != 0) {\n return externalPrice;\n }\n OracleInterface oracle = oracles[asset];\n if (oracle != OracleInterface(address(0))) {\n return oracle.getPrice(asset);\n }\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n function _loadExternalPrice(address asset) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/ResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity 0.8.25;\n\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { OracleInterface, ResilientOracleInterface, BoundValidatorInterface } from \"./interfaces/OracleInterface.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { ICappedOracle } from \"./interfaces/ICappedOracle.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title ResilientOracle\n * @author Venus\n * @notice The Resilient Oracle is the main contract that the protocol uses to fetch prices of assets.\n *\n * DeFi protocols are vulnerable to price oracle failures including oracle manipulation and incorrectly\n * reported prices. If only one oracle is used, this creates a single point of failure and opens a vector\n * for attacking the protocol.\n *\n * The Resilient Oracle uses multiple sources and fallback mechanisms to provide accurate prices and protect\n * the protocol from oracle attacks.\n *\n * For every market (vToken) we configure the main, pivot and fallback oracles. The oracles are configured per\n * vToken's underlying asset address. The main oracle oracle is the most trustworthy price source, the pivot\n * oracle is used as a loose sanity checker and the fallback oracle is used as a backup price source.\n *\n * To validate prices returned from two oracles, we use an upper and lower bound ratio that is set for every\n * market. The upper bound ratio represents the deviation between reported price (the price that’s being\n * validated) and the anchor price (the price we are validating against) above which the reported price will\n * be invalidated. The lower bound ratio presents the deviation between reported price and anchor price below\n * which the reported price will be invalidated. So for oracle price to be considered valid the below statement\n * should be true:\n\n```\nanchorRatio = anchorPrice/reporterPrice\nisValid = anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio\n```\n\n * In most cases, Chainlink is used as the main oracle, other oracles are used as the pivot oracle depending\n * on which supports the given market and Binance oracle is used as the fallback oracle.\n *\n * For a fetched price to be valid it must be positive and not stagnant. If the price is invalid then we consider the\n * oracle to be stagnant and treat it like it's disabled.\n */\ncontract ResilientOracle is PausableUpgradeable, AccessControlledV8, ResilientOracleInterface {\n /**\n * @dev Oracle roles:\n * **main**: The most trustworthy price source\n * **pivot**: Price oracle used as a loose sanity checker\n * **fallback**: The backup source when main oracle price is invalidated\n */\n enum OracleRole {\n MAIN,\n PIVOT,\n FALLBACK\n }\n\n struct TokenConfig {\n /// @notice asset address\n address asset;\n /// @notice `oracles` stores the oracles based on their role in the following order:\n /// [main, pivot, fallback],\n /// It can be indexed with the corresponding enum OracleRole value\n address[3] oracles;\n /// @notice `enableFlagsForOracles` stores the enabled state\n /// for each oracle in the same order as `oracles`\n bool[3] enableFlagsForOracles;\n /// @notice `cachingEnabled` is a flag that indicates whether the asset price should be cached\n bool cachingEnabled;\n }\n\n uint256 public constant INVALID_PRICE = 0;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Slot to cache the asset's price, used for transient storage\n /// custom:storage-location erc7201:venus-protocol/oracle/ResilientOracle/cache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/ResilientOracle/cache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant CACHE_SLOT = 0x4e99ec55972332f5e0ef9c6623192c0401b609161bffae64d9ccdd7ad6cc7800;\n\n /// @notice Bound validator contract address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n BoundValidatorInterface public immutable boundValidator;\n\n mapping(address => TokenConfig) private tokenConfigs;\n\n event TokenConfigAdded(\n address indexed asset,\n address indexed mainOracle,\n address indexed pivotOracle,\n address fallbackOracle\n );\n\n /// Event emitted when an oracle is set\n event OracleSet(address indexed asset, address indexed oracle, uint256 indexed role);\n\n /// Event emitted when an oracle is enabled or disabled\n event OracleEnabled(address indexed asset, uint256 indexed role, bool indexed enable);\n\n /// Event emitted when an asset cachingEnabled flag is set\n event CachedEnabled(address indexed asset, bool indexed enabled);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /**\n * @notice Checks whether token config exists by checking whether asset is null address\n * @dev address can't be null, so it's suitable to be used to check the validity of the config\n * @param asset asset address\n */\n modifier checkTokenConfigExistence(address asset) {\n if (tokenConfigs[asset].asset == address(0)) revert(\"token config must exist\");\n _;\n }\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @dev nativeMarketAddress can be address(0) if on the chain we do not support native market\n /// (e.g vETH on ethereum would not be supported, only vWETH)\n /// @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n /// @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain).\n /// Set to address(0) of VAI is not existent.\n /// @param _boundValidator Address of the bound validator contract\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address nativeMarketAddress,\n address vaiAddress,\n BoundValidatorInterface _boundValidator\n ) notNullAddress(address(_boundValidator)) {\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n boundValidator = _boundValidator;\n\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin and sets the BoundValidator contract address\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n __Pausable_init();\n }\n\n /**\n * @notice Pauses oracle\n * @custom:access Only Governance\n */\n function pause() external {\n _checkAccessAllowed(\"pause()\");\n _pause();\n }\n\n /**\n * @notice Unpauses oracle\n * @custom:access Only Governance\n */\n function unpause() external {\n _checkAccessAllowed(\"unpause()\");\n _unpause();\n }\n\n /**\n * @notice Batch sets token configs\n * @param tokenConfigs_ Token config array\n * @custom:access Only Governance\n * @custom:error Throws a length error if the length of the token configs array is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Sets oracle for a given asset and role.\n * @dev Supplied asset **must** exist and main oracle may not be null\n * @param asset Asset address\n * @param oracle Oracle address\n * @param role Oracle role\n * @custom:access Only Governance\n * @custom:error Null address error if main-role oracle address is null\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleSet event with asset address, oracle address and role of the oracle for the asset\n */\n function setOracle(\n address asset,\n address oracle,\n OracleRole role\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"setOracle(address,address,uint8)\");\n if (oracle == address(0) && role == OracleRole.MAIN) revert(\"can't set zero address to main oracle\");\n tokenConfigs[asset].oracles[uint256(role)] = oracle;\n emit OracleSet(asset, oracle, uint256(role));\n }\n\n /**\n * @notice Enables/ disables oracle for the input asset. Token config for the input asset **must** exist\n * @dev Configuration for the asset **must** already exist and the asset cannot be 0 address\n * @param asset Asset address\n * @param role Oracle role\n * @param enable Enabled boolean of the oracle\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleEnabled event with asset address, role of the oracle and enabled flag\n */\n function enableOracle(\n address asset,\n OracleRole role,\n bool enable\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"enableOracle(address,uint8,bool)\");\n tokenConfigs[asset].enableFlagsForOracles[uint256(role)] = enable;\n emit OracleEnabled(asset, uint256(role), enable);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getUnderlyingPrice\n * @param vToken vToken address\n */\n function updatePrice(address vToken) external override {\n address asset = _getUnderlyingAsset(vToken);\n _updateAssetPrice(asset);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getPrice\n * @param asset asset address\n */\n function updateAssetPrice(address asset) external {\n _updateAssetPrice(asset);\n }\n\n /**\n * @dev Gets token config by asset address\n * @param asset asset address\n * @return tokenConfig Config for the asset\n */\n function getTokenConfig(address asset) external view returns (TokenConfig memory) {\n return tokenConfigs[asset];\n }\n\n /**\n * @notice Gets price of the underlying asset for a given vToken. Validation flow:\n * - Check if the oracle is paused globally\n * - Validate price from main oracle against pivot oracle\n * - Validate price from fallback oracle against pivot oracle if the first validation failed\n * - Validate price from main oracle against fallback oracle if the second validation failed\n * In the case that the pivot oracle is not available but main price is available and validation is successful,\n * main oracle price is returned.\n * @param vToken vToken address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getUnderlyingPrice(address vToken) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n\n address asset = _getUnderlyingAsset(vToken);\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getPrice(address asset) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n return _getPrice(asset);\n }\n\n /**\n * @notice Sets/resets single token configs.\n * @dev main oracle **must not** be a null address\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress is thrown if asset address is null\n * @custom:error NotNullAddress is thrown if main-role oracle address for asset is null\n * @custom:event Emits TokenConfigAdded event when the asset config is set successfully by the authorized account\n * @custom:event Emits CachedEnabled event when the asset cachingEnabled flag is set successfully\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.oracles[uint256(OracleRole.MAIN)]) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(\n tokenConfig.asset,\n tokenConfig.oracles[uint256(OracleRole.MAIN)],\n tokenConfig.oracles[uint256(OracleRole.PIVOT)],\n tokenConfig.oracles[uint256(OracleRole.FALLBACK)]\n );\n emit CachedEnabled(tokenConfig.asset, tokenConfig.cachingEnabled);\n }\n\n /**\n * @notice Gets oracle and enabled status by asset address\n * @param asset asset address\n * @param role Oracle role\n * @return oracle Oracle address based on role\n * @return enabled Enabled flag of the oracle based on token config\n */\n function getOracle(address asset, OracleRole role) public view returns (address oracle, bool enabled) {\n oracle = tokenConfigs[asset].oracles[uint256(role)];\n enabled = tokenConfigs[asset].enableFlagsForOracles[uint256(role)];\n }\n\n /**\n * @notice Updates the capped oracle snapshot.\n * @dev Cache the asset price and return if already cached\n * @param asset asset address\n */\n function _updateAssetPrice(address asset) internal {\n if (Transient.readCachedPrice(CACHE_SLOT, asset) != 0) {\n return;\n }\n\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracle != address(0) && mainOracleEnabled) {\n // if main oracle is not CorrelatedTokenOracle it will revert so we need to catch the revert\n try ICappedOracle(mainOracle).updateSnapshot() {} catch {}\n }\n\n if (_isCacheEnabled(asset)) {\n uint256 price = _getPrice(asset);\n Transient.cachePrice(CACHE_SLOT, asset, price);\n }\n }\n\n /**\n * @notice Gets price for the provided asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 pivotPrice = INVALID_PRICE;\n uint256 price;\n\n price = Transient.readCachedPrice(CACHE_SLOT, asset);\n if (price != 0) {\n return price;\n }\n\n // Get pivot oracle price, Invalid price if not available or error\n (address pivotOracle, bool pivotOracleEnabled) = getOracle(asset, OracleRole.PIVOT);\n if (pivotOracleEnabled && pivotOracle != address(0)) {\n try OracleInterface(pivotOracle).getPrice(asset) returns (uint256 pricePivot) {\n pivotPrice = pricePivot;\n } catch {}\n }\n\n // Compare main price and pivot price, return main price and if validation was successful\n // note: In case pivot oracle is not available but main price is available and\n // validation is successful, the main oracle price is returned.\n (uint256 mainPrice, bool validatedPivotMain) = _getMainOraclePrice(\n asset,\n pivotPrice,\n pivotOracleEnabled && pivotOracle != address(0)\n );\n if (mainPrice != INVALID_PRICE && validatedPivotMain) return mainPrice;\n\n // Compare fallback and pivot if main oracle comparision fails with pivot\n // Return fallback price when fallback price is validated successfully with pivot oracle\n (uint256 fallbackPrice, bool validatedPivotFallback) = _getFallbackOraclePrice(asset, pivotPrice);\n if (fallbackPrice != INVALID_PRICE && validatedPivotFallback) return fallbackPrice;\n\n // Lastly compare main price and fallback price\n if (\n mainPrice != INVALID_PRICE &&\n fallbackPrice != INVALID_PRICE &&\n boundValidator.validatePriceWithAnchorPrice(asset, mainPrice, fallbackPrice)\n ) {\n return mainPrice;\n }\n\n revert(\"invalid resilient oracle price\");\n }\n\n /**\n * @notice Gets a price for the provided asset\n * @dev This function won't revert when price is 0, because the fallback oracle may still be\n * able to fetch a correct price\n * @param asset asset address\n * @param pivotPrice Pivot oracle price\n * @param pivotEnabled If pivot oracle is not empty and enabled\n * @return price USD price in scaled decimals\n * e.g. asset decimals is 8 then price is returned as 10**18 * 10**(18-8) = 10**28 decimals\n * @return pivotValidated Boolean representing if the validation of main oracle price\n * and pivot oracle price were successful\n * @custom:error Invalid price error is thrown if main oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if main oracle is not enabled or main oracle\n * address is null\n */\n function _getMainOraclePrice(\n address asset,\n uint256 pivotPrice,\n bool pivotEnabled\n ) internal view returns (uint256, bool) {\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracleEnabled && mainOracle != address(0)) {\n try OracleInterface(mainOracle).getPrice(asset) returns (uint256 mainOraclePrice) {\n if (!pivotEnabled) {\n return (mainOraclePrice, true);\n }\n if (pivotPrice == INVALID_PRICE) {\n return (mainOraclePrice, false);\n }\n return (\n mainOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, mainOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function won't revert when the price is 0 because getPrice checks if price is > 0\n * @param asset asset address\n * @return price USD price in 18 decimals\n * @return pivotValidated Boolean representing if the validation of fallback oracle price\n * and pivot oracle price were successfully\n * @custom:error Invalid price error is thrown if fallback oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if fallback oracle is not enabled or fallback oracle\n * address is null\n */\n function _getFallbackOraclePrice(address asset, uint256 pivotPrice) private view returns (uint256, bool) {\n (address fallbackOracle, bool fallbackEnabled) = getOracle(asset, OracleRole.FALLBACK);\n if (fallbackEnabled && fallbackOracle != address(0)) {\n try OracleInterface(fallbackOracle).getPrice(asset) returns (uint256 fallbackOraclePrice) {\n if (pivotPrice == INVALID_PRICE) {\n return (fallbackOraclePrice, false);\n }\n return (\n fallbackOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, fallbackOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view notNullAddress(vToken) returns (address asset) {\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev This function checks if the asset price should be cached\n * @param asset asset address\n * @return bool true if caching is enabled, false otherwise\n */\n function _isCacheEnabled(address asset) private view returns (bool) {\n return tokenConfigs[asset].cachingEnabled;\n }\n}\n" + }, + "contracts/test/BEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract BEP20Harness is ERC20 {\n uint8 public decimalsInternal = 18;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) {\n decimalsInternal = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return decimalsInternal;\n }\n}\n" + }, + "contracts/test/DeviationBoundedOracleCaller.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IDeviationBoundedOracle } from \"../interfaces/IDeviationBoundedOracle.sol\";\n\n/// @notice Test helper that batches DeviationBoundedOracle calls in a single transaction\n/// so transient storage (tstore/tload) cache can be tested.\ncontract DeviationBoundedOracleCaller {\n IDeviationBoundedOracle public immutable oracle;\n\n constructor(address _oracle) {\n oracle = IDeviationBoundedOracle(_oracle);\n }\n\n function updateAndGetCollateralPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPriceView(vToken);\n }\n\n function updateAndGetDebtPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateAndGetBothPrices(address vToken) external returns (uint256 collateral, uint256 debt) {\n oracle.updateProtectionState(vToken);\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateThenNonViewCollateral(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPrice(vToken);\n }\n\n function twoConsecutiveNonViewCollateral(address vToken) external returns (uint256 first, uint256 second) {\n first = oracle.getBoundedCollateralPrice(vToken);\n second = oracle.getBoundedCollateralPrice(vToken);\n }\n\n /// @notice Non-view wrapper so smock records oracle calls made by the view functions.\n function getViewPricesWithoutUpdateNonView(address vToken) external returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n /// @notice Calls updateProtectionState on vTokenA, then getBoundedCollateralPriceView on vTokenB.\n function updateAViewB(address vTokenA, address vTokenB) external returns (uint256) {\n oracle.updateProtectionState(vTokenA);\n return oracle.getBoundedCollateralPriceView(vTokenB);\n }\n\n function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n}\n" + }, + "contracts/test/MockAnkrBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAnkrBNB is ERC20, Ownable, IAnkrBNB {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setSharesToBonds(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function sharesToBonds(uint256 amount) external view override returns (uint256) {\n return (amount * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, IAnkrBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAsBNB is ERC20, Ownable, IAsBNB {\n uint8 private immutable _decimals;\n address public minter;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals_,\n address minter_\n ) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n minter = minter_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setMinter(address minter_) external onlyOwner {\n minter = minter_;\n }\n\n function decimals() public view virtual override(ERC20, IAsBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\n\ncontract MockAsBNBMinter is IAsBNBMinter {\n function convertToTokens(uint256 _amount) external pure override returns (uint256) {\n return _amount;\n }\n}\n" + }, + "contracts/test/MockCallPrice.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\ninterface CorrelatedTokenOracleInterface {\n function updateSnapshot() external;\n function getPrice(address asset) external view returns (uint256);\n}\n\ncontract MockCallPrice {\n function getMultiPrice(CorrelatedTokenOracleInterface oracle, address asset) public returns (uint256, uint256) {\n oracle.updateSnapshot();\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n\n function getUnderlyingPriceResilientOracle(\n ResilientOracleInterface oracle,\n address vToken\n ) public returns (uint256, uint256) {\n oracle.updatePrice(vToken);\n oracle.updatePrice(vToken);\n return (oracle.getUnderlyingPrice(vToken), oracle.getUnderlyingPrice(vToken));\n }\n\n function getAssetPriceResilientOracle(\n ResilientOracleInterface oracle,\n address asset\n ) public returns (uint256, uint256) {\n oracle.updateAssetPrice(asset);\n oracle.updateAssetPrice(asset);\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n}\n" + }, + "contracts/test/MockEtherFiLiquidityPool.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/IEtherFiLiquidityPool.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockEtherFiLiquidityPool is IEtherFiLiquidityPool, Ownable {\n /// @notice The amount of eETH per weETH scaled by 1e18\n uint256 public amountPerShare;\n\n constructor() Ownable() {}\n\n function setAmountPerShare(uint256 _amountPerShare) external onlyOwner {\n amountPerShare = _amountPerShare;\n }\n\n function amountForShare(uint256 _share) external view override returns (uint256) {\n return (_share * amountPerShare) / 1e18;\n }\n}\n" + }, + "contracts/test/MockSFrax.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ISFrax } from \"../interfaces/ISFrax.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSFrax is ERC20, Ownable, ISFrax {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function convertToAssets(uint256 shares) external view override returns (uint256) {\n return (shares * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, ISFrax) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockSimpleOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/OracleInterface.sol\";\n\ncontract MockSimpleOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n constructor() {\n //\n }\n\n function getUnderlyingPrice(address vToken) external view returns (uint256) {\n return prices[vToken];\n }\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n\ncontract MockBoundValidator is BoundValidatorInterface {\n mapping(address => bool) public validateResults;\n bool public twapUpdated;\n\n constructor() {\n //\n }\n\n function validatePriceWithAnchorPrice(\n address vToken,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[vToken];\n }\n\n function validateAssetPriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[asset];\n }\n\n function setValidateResult(address token, bool pass) public {\n validateResults[token] = pass;\n }\n}\n" + }, + "contracts/test/MockV3Aggregator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol\";\n\n/**\n * @title MockV3Aggregator\n * @notice Based on the FluxAggregator contract\n * @notice Use this contract when you need to test\n * other contract's ability to read data from an\n * aggregator contract, but how the aggregator got\n * its answer is unimportant\n */\ncontract MockV3Aggregator is AggregatorV2V3Interface {\n uint256 public constant version = 0;\n\n uint8 public decimals;\n int256 public latestAnswer;\n uint256 public latestTimestamp;\n uint256 public latestRound;\n\n mapping(uint256 => int256) public getAnswer;\n mapping(uint256 => uint256) public getTimestamp;\n mapping(uint256 => uint256) private getStartedAt;\n\n constructor(uint8 _decimals, int256 _initialAnswer) {\n decimals = _decimals;\n updateAnswer(_initialAnswer);\n }\n\n function getRoundData(\n uint80 _roundId\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (_roundId, getAnswer[_roundId], getStartedAt[_roundId], getTimestamp[_roundId], _roundId);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (\n uint80(latestRound),\n getAnswer[latestRound],\n getStartedAt[latestRound],\n getTimestamp[latestRound],\n uint80(latestRound)\n );\n }\n\n function description() external pure returns (string memory) {\n return \"v0.6/tests/MockV3Aggregator.sol\";\n }\n\n function updateAnswer(int256 _answer) public {\n latestAnswer = _answer;\n latestTimestamp = block.timestamp;\n latestRound++;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = block.timestamp;\n getStartedAt[latestRound] = block.timestamp;\n }\n\n function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public {\n latestRound = _roundId;\n latestAnswer = _answer;\n latestTimestamp = _timestamp;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = _timestamp;\n getStartedAt[latestRound] = _startedAt;\n }\n}\n" + }, + "contracts/test/MockWBETH.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IWBETH } from \"../interfaces/IWBETH.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockWBETH is ERC20, Ownable, IWBETH {\n uint8 private immutable _decimals;\n uint256 public override exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setExchangeRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function decimals() public view virtual override(ERC20, IWBETH) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/oracles/MockCorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"../../oracles/common/CorrelatedTokenOracle.sol\";\n\ncontract MockCorrelatedTokenOracle is CorrelatedTokenOracle {\n uint256 public mockUnderlyingAmount;\n\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n snapshotGap\n )\n {}\n\n function setMockUnderlyingAmount(uint256 amount) external {\n mockUnderlyingAmount = amount;\n }\n\n function getUnderlyingAmount() public view override returns (uint256) {\n return mockUnderlyingAmount;\n }\n}\n" + }, + "contracts/test/oracles/MockERC20.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MockERC20 is ERC20 {\n constructor(string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) {\n _mint(msg.sender, 100000 * 10 ** uint256(decimals));\n }\n}\n" + }, + "contracts/test/oracles/MockResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/OracleInterface.sol\";\n\ncontract MockOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n" + }, + "contracts/test/PancakePairHarness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\n// a library for performing various math operations\n\nlibrary Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n //solhint-disable-next-line state-visibility\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n\ncontract PancakePairHarness {\n using UQ112x112 for uint224;\n\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) external {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"PancakeV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n unchecked {\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n }\n\n function currentBlockTimestamp() external view returns (uint32) {\n return uint32(block.timestamp % 2 ** 32);\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n}\n" + }, + "contracts/test/VBEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"./BEP20Harness.sol\";\n\ncontract VBEP20Harness is BEP20Harness {\n /**\n * @notice Underlying asset for this VToken\n */\n address public underlying;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals,\n address underlying_\n ) BEP20Harness(name_, symbol_, decimals) {\n underlying = underlying_;\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor (address initialOwner) {\n _transferOwnership(initialOwner);\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 called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing 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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol": { + "content": "// 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 IBeacon {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.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 *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\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 /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view virtual returns (address) {\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(Address.isContract(IBeacon(newBeacon).implementation()), \"ERC1967: beacon implementation is not a contract\");\n StorageSlot.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(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overriden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./TransparentUpgradeableProxy.sol\";\nimport \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n\n constructor (address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Returns the current implementation of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"implementation()\")) == 0x5c60da1b\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"5c60da1b\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Returns the current admin of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"admin()\")) == 0xf851a440\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"f851a440\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Changes the admin of `proxy` to `newAdmin`.\n *\n * Requirements:\n *\n * - This contract must be the current admin of `proxy`.\n */\n function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {\n proxy.changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {\n proxy.upgradeTo(implementation);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See\n * {TransparentUpgradeableProxy-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgradeAndCall(\n TransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\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 *\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \"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(\n address target,\n bytes memory data,\n uint256 value\n ) 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 require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(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 require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(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 require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason 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 // 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\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}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\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 * ```\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`, and `uint256`._\n */\nlibrary StorageSlot {\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 /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\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 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 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 assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\n address internal immutable _ADMIN;\n\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _ADMIN = admin_;\n\n // still store it to work with EIP-1967\n bytes32 slot = _ADMIN_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, admin_)\n }\n emit AdminChanged(address(0), admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n\n function _getAdmin() internal view virtual override returns (address) {\n return _ADMIN;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "evmVersion": "cancun", + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": ["ast"] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} From 99f6a8fa993276c5b1c440cf745ee7e5a66d4cc5 Mon Sep 17 00:00:00 2001 From: GitGuru7 <128375421+GitGuru7@users.noreply.github.com> Date: Fri, 1 May 2026 05:17:59 +0000 Subject: [PATCH 25/30] feat: updating deployment files --- deployments/bscmainnet.json | 3000 +++++++++++++++++++++++++ deployments/bscmainnet_addresses.json | 3 + 2 files changed, 3003 insertions(+) diff --git a/deployments/bscmainnet.json b/deployments/bscmainnet.json index 95171c0d..ac93b97b 100644 --- a/deployments/bscmainnet.json +++ b/deployments/bscmainnet.json @@ -4653,6 +4653,3006 @@ } ] }, + "DeviationBoundedOracle": { + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "DeviationBoundedOracle_Implementation": { + "address": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "_resilientOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "nativeMarketAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vaiAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "DeviationBoundedOracle_Proxy": { + "address": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, "PendleOracle-PT-SolvBTC.BBN-27MAR2025": { "address": "0xE11965a3513F537d91D73d9976FBe8c0969Bb252", "abi": [ diff --git a/deployments/bscmainnet_addresses.json b/deployments/bscmainnet_addresses.json index 5c46c523..516cb249 100644 --- a/deployments/bscmainnet_addresses.json +++ b/deployments/bscmainnet_addresses.json @@ -16,6 +16,9 @@ "ChainlinkOracle_Proxy": "0x1B2103441A0A108daD8848D8F5d790e4D402921F", "DefaultProxyAdmin": "0x1BB765b741A5f3C2A338369DAb539385534E3343", "DevProxyAdmin": "0x10BA1AA0F56790835a3462371cCbeAa7A4BA1e46", + "DeviationBoundedOracle": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", + "DeviationBoundedOracle_Implementation": "0x16691f500541ca35bd63DD878B6D78728C9518AE", + "DeviationBoundedOracle_Proxy": "0xc79Cb7efEBd121DC4B39eA141C214606595D665A", "PendleOracle-PT-SolvBTC.BBN-27MAR2025": "0xE11965a3513F537d91D73d9976FBe8c0969Bb252", "PendleOracle-PT-SolvBTC.BBN-27MAR2025_Implementation": "0xD2721FB0d9F071d84B3EbFd27Ab35B568b350079", "PendleOracle-PT-SolvBTC.BBN-27MAR2025_Proxy": "0xE11965a3513F537d91D73d9976FBe8c0969Bb252", From 00ea1c62ede8eda1b19d128e8efa905a7ff42183 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Fri, 1 May 2026 15:16:41 +0530 Subject: [PATCH 26/30] chore: add DeviationBoundedOracle bsctestnet deployments --- .../bsctestnet/DeviationBoundedOracle.json | 1505 ++++++++++++ ...DeviationBoundedOracle_Implementation.json | 2045 +++++++++++++++++ .../DeviationBoundedOracle_Proxy.json | 262 +++ .../4e92f74ff4913274028244b68ad09cb7.json | 88 + .../fad126030085a626952462c92d5fc265.json | 349 +++ 5 files changed, 4249 insertions(+) create mode 100644 deployments/bsctestnet/DeviationBoundedOracle.json create mode 100644 deployments/bsctestnet/DeviationBoundedOracle_Implementation.json create mode 100644 deployments/bsctestnet/DeviationBoundedOracle_Proxy.json create mode 100644 deployments/bsctestnet/solcInputs/4e92f74ff4913274028244b68ad09cb7.json create mode 100644 deployments/bsctestnet/solcInputs/fad126030085a626952462c92d5fc265.json diff --git a/deployments/bsctestnet/DeviationBoundedOracle.json b/deployments/bsctestnet/DeviationBoundedOracle.json new file mode 100644 index 00000000..f079fd70 --- /dev/null +++ b/deployments/bsctestnet/DeviationBoundedOracle.json @@ -0,0 +1,1505 @@ +{ + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint64[]", + "name": "cooldownPeriods", + "type": "uint64[]" + }, + { + "internalType": "uint256[]", + "name": "triggerThresholds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "resetThresholds", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "enableBoundedPricings", + "type": "bool[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ], + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "receipt": { + "to": null, + "from": "0x4cD6300F5cb8D6BbA5E646131c3522664C10dF11", + "contractAddress": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "transactionIndex": 0, + "gasUsed": "589317", + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000020000000000000000000000000000000008000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000000000400000000000000000000000000002000000100000000080000000000000800000000000000000000000000000080440000000000000800000000000000000000000000020008000000000000000040000000000000400000000000000200020001000000000000000000000000000000000000880000000000000000000000000", + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32", + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000028f9576ec8d73331cda7f0a6fac88b0ca4d41e3f" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000004cd6300f5cb8d6bba5e646131c3522664c10df11" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0"], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045f8a08f534f34a97187626e05d4b6648eeaa9aa", + "logIndex": 2, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 3, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef480a5654b231ff7d80a0681f938f3db71a6ca6", + "logIndex": 4, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + } + ], + "blockNumber": 102770929, + "cumulativeGasUsed": "589317", + "status": 1, + "byzantium": true + }, + "args": [ + "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "0xef480a5654b231ff7d80A0681F938f3Db71a6Ca6", + "0xc4d66de800000000000000000000000045f8a08f534f34a97187626e05d4b6648eeaa9aa" + ], + "numDeployments": 1, + "solcInputHash": "fad126030085a626952462c92d5fc265", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"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\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \\\"admin cannot fallback to proxy target\\\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"details\":\"Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\"},\"constructor\":{\"details\":\"Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\"},\"implementation()\":{\"details\":\"Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":\"OptimizedTransparentUpgradeableProxy\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\\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\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.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 *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\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 /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.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(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// 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 IBeacon {\\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\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\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 *\\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \\\"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(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) 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 require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\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 * ```\\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`, and `uint256`._\\n */\\nlibrary StorageSlot {\\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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\\n address internal immutable _ADMIN;\\n\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _ADMIN = admin_;\\n\\n // still store it to work with EIP-1967\\n bytes32 slot = _ADMIN_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, admin_)\\n }\\n emit AdminChanged(address(0), admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n\\n function _getAdmin() internal view virtual override returns (address) {\\n return _ADMIN;\\n }\\n}\\n\",\"keccak256\":\"0xa30117644e27fa5b49e162aae2f62b36c1aca02f801b8c594d46e2024963a534\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052604051610c8f380380610c8f8339810160408190526100229161039f565b828161004f60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61046a565b5f80516020610c488339815191521461006a5761006a610489565b61007582825f610123565b506100a3905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610461046a565b5f80516020610c28833981519152146100be576100be610489565b6001600160a01b03821660808190525f80516020610c28833981519152838155604080515f8152602081019390935290917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050506104e8565b61012c8361014e565b5f825111806101385750805b1561014957610147838361018d565b505b505050565b610157816101bb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606101b28383604051806060016040528060278152602001610c686027913961025b565b90505b92915050565b6001600160a01b0381163b61022d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b5f80516020610c4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6102c35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610224565b5f80856001600160a01b0316856040516102dd919061049d565b5f60405180830381855af49150503d805f8114610315576040519150601f19603f3d011682016040523d82523d5f602084013e61031a565b606091505b50909250905061032b828286610337565b925050505b9392505050565b60608315610346575081610330565b8251156103565782518084602001fd5b8160405162461bcd60e51b815260040161022491906104b3565b80516001600160a01b0381168114610386575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156103b1575f80fd5b6103ba84610370565b92506103c860208501610370565b60408501519092506001600160401b03808211156103e4575f80fd5b818601915086601f8301126103f7575f80fd5b8151818111156104095761040961038b565b604051601f8201601f19908116603f011681019083821181831017156104315761043161038b565b81604052828152896020848701011115610449575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b818103818111156101b557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6080516107066105225f395f818160eb0152818161013f015281816101bf0152818161020801528181610239015261025d01526107065ff3fe608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033", + "execute": { + "methodName": "initialize", + "args": ["0x45f8a08F534f34A97187626E05d4b6648Eeaa9AA"] + }, + "implementation": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "devdoc": { + "details": "This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \"admin cannot fallback to proxy target\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is upgraded." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "admin()": { + "details": "Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`" + }, + "constructor": { + "details": "Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}." + }, + "implementation()": { + "details": "Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`" + }, + "upgradeTo(address)": { + "details": "Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}." + }, + "upgradeToAndCall(address,bytes)": { + "details": "Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} diff --git a/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json b/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json new file mode 100644 index 00000000..83454975 --- /dev/null +++ b/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json @@ -0,0 +1,2045 @@ +{ + "address": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "_resilientOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "nativeMarketAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vaiAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint64[]", + "name": "cooldownPeriods", + "type": "uint64[]" + }, + { + "internalType": "uint256[]", + "name": "triggerThresholds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "resetThresholds", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "enableBoundedPricings", + "type": "bool[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", + "receipt": { + "to": null, + "from": "0x4cD6300F5cb8D6BbA5E646131c3522664C10dF11", + "contractAddress": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "transactionIndex": 0, + "gasUsed": "2732766", + "logsBloom": "0x00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000080000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000", + "blockHash": "0xe8cdcc52471fd12f9e4d6481b36353ea749f57b055d4d3a7d5a83101d8075b09", + "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 102770915, + "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", + "address": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", + "logIndex": 0, + "blockHash": "0xe8cdcc52471fd12f9e4d6481b36353ea749f57b055d4d3a7d5a83101d8075b09" + } + ], + "blockNumber": 102770915, + "cumulativeGasUsed": "2732766", + "status": 1, + "byzantium": true + }, + "args": [ + "0x3cD69251D04A28d887Ac14cbe2E14c52F3D57823", + "0x2E7222e51c0f6e98610A1543Aa3836E092CDe62c", + "0x5fFbE5302BadED40941A403228E6AD03f93752d9" + ], + "numDeployments": 1, + "solcInputHash": "4e92f74ff4913274028244b68ad09cb7", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"_resilientOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nativeMarketAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vaiAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"}],\"name\":\"CooldownNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMaxPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMinPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"InvalidResetThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketNotInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"PriceExceedsUint128\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentRangeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"PriceRangeNotConverged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximum\",\"type\":\"uint256\"}],\"name\":\"ThresholdAboveMaximum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"ThresholdBelowMinimum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"calledContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"methodSignature\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VAINotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPriceNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"BoundedPricingWhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldCooldown\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"CooldownPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMax\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"MaxPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMin\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"MinPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"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\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"}],\"name\":\"ProtectionInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectionModeExited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spotPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"}],\"name\":\"ProtectionTriggered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldExitThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newExitThreshold\",\"type\":\"uint256\"}],\"name\":\"ResetThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"TriggerThresholdSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLATERAL_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEBT_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEEPER_DEADBAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ADDR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RESILIENT_ORACLE\",\"outputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allAssets\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"assetProtectionConfig\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"currentlyUsingProtectedPrice\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isBoundedPricingEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"triggerThreshold\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"resetThreshold\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"canExitProtection\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMins\",\"type\":\"uint128[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMaxs\",\"type\":\"uint128[]\"}],\"name\":\"checkAndGetWindowDrift\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"needsMinUpdate\",\"type\":\"bool[]\"},{\"internalType\":\"bool[]\",\"name\":\"needsMaxUpdate\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"currentlyUsingProtectedPrice\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"exitProtectionMode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllBoundedPricingEnabledAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPricesView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitializedAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"isBoundedPricingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeMarket\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setAssetBoundedPricingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"setCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"newTriggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newResetThreshold\",\"type\":\"uint256\"}],\"name\":\"setThresholds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"}],\"name\":\"setTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint64[]\",\"name\":\"cooldownPeriods\",\"type\":\"uint64[]\"},{\"internalType\":\"uint256[]\",\"name\":\"triggerThresholds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"resetThresholds\",\"type\":\"uint256[]\"},{\"internalType\":\"bool[]\",\"name\":\"enableBoundedPricings\",\"type\":\"bool[]\"}],\"name\":\"setTokenConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"updateMaxPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"updateMinPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"updateProtectionState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vai\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"canExitProtection(address)\":{\"details\":\"Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if protection can be disabled\"}},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"custom:error\":\"InvalidArrayLength if the input array lengths do not match\",\"details\":\"Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\",\"params\":{\"assets\":\"Array of asset addresses to check\",\"proposedMaxs\":\"Keeper's off-chain window maximum prices\",\"proposedMins\":\"Keeper's off-chain window minimum prices\"},\"returns\":{\"needsMaxUpdate\":\"Whether maxPrice drift exceeds deadband for each asset\",\"needsMinUpdate\":\"Whether minPrice drift exceeds deadband for each asset\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"params\":{\"_resilientOracle\":\"Address of the ResilientOracle contract\",\"nativeMarketAddress\":\"The address of a native market (for bsc it would be vBNB address)\",\"vaiAddress\":\"The address of the VAI token, or address(0) if VAI is not deployed on the chain.\"}},\"currentlyUsingProtectedPrice(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is currently using the protected price instead of spot\"}},\"exitProtectionMode(address)\":{\"custom:access\":\"Only authorized monitor/keeper addresses\",\"custom:error\":\"ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold\",\"custom:event\":\"ProtectionModeExited\",\"details\":\"Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"}},\"getAllBoundedPricingEnabledAssets()\":{\"details\":\"Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.\",\"returns\":{\"_0\":\"result Array of whitelisted asset addresses\"}},\"getBoundedCollateralPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedCollateralPriceView(address)\":{\"details\":\"Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns min(spot, windowMin) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedDebtPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedDebtPriceView(address)\":{\"details\":\"Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns max(spot, windowMax) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPrices(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPricesView(address)\":{\"details\":\"Reads from transient cache first; falls back to ResilientOracle on cache miss.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getInitializedAssets()\":{\"returns\":{\"_0\":\"Array of all initialized asset addresses\"}},\"initialize(address)\":{\"params\":{\"accessControlManager_\":\"Address of the access control manager contract\"}},\"isBoundedPricingEnabled(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is whitelisted\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setAccessControlManager(address)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"Emits NewAccessControlManager event\",\"details\":\"Admin function to set address of AccessControlManager\",\"params\":{\"accessControlManager_\":\"The new address of the AccessControlManager\"}},\"setAssetBoundedPricingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ProtectedPriceActive if trying to disable an asset while protection is active\",\"custom:event\":\"BoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether bounded pricing should be enabled for the asset\"}},\"setCooldownPeriod(address,uint64)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"CooldownPeriodSet\",\"params\":{\"asset\":\"The underlying asset address\",\"newCooldown\":\"The new cooldown period in seconds\"}},\"setThresholds(address,uint256,uint256)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\",\"custom:event\":\"TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed\",\"params\":{\"asset\":\"The underlying asset address\",\"newResetThreshold\":\"The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\",\"newTriggerThreshold\":\"The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\"}},\"setTokenConfig(address,uint64,uint256,uint256,bool)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"ProtectionInitializedBoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"cooldownPeriod\":\"Minimum time protection stays active after last trigger\",\"enableBoundedPricing\":\"Whether to enable bounded pricing immediately upon initialization\",\"resetThreshold\":\"Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\",\"triggerThreshold\":\"Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\"}},\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"InvalidArrayLength if array lengths do not match\",\"custom:event\":\"ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset\",\"params\":{\"assets\":\"Array of underlying asset addresses\",\"cooldownPeriods\":\"Array of cooldown periods (seconds)\",\"enableBoundedPricings\":\"Array of whether to enable bounded pricing per asset\",\"resetThresholds\":\"Array of reset thresholds (mantissa)\",\"triggerThresholds\":\"Array of trigger thresholds (mantissa)\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"updateMaxPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MaxPriceUpdated\",\"details\":\"Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMax\":\"The new maximum price\"}},\"updateMinPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MinPriceUpdated\",\"details\":\"Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMin\":\"The new minimum price\"}},\"updateProtectionState(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls.\",\"params\":{\"vToken\":\"vToken address\"}}},\"stateVariables\":{\"COLLATERAL_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/cache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"DEBT_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"RESILIENT_ORACLE\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"nativeMarket\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"vai\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"}},\"title\":\"DeviationBoundedOracle\",\"version\":1},\"userdoc\":{\"errors\":{\"CooldownNotElapsed(address,uint64,uint64)\":[{\"notice\":\"Thrown when trying to disable protection before cooldown has elapsed\"}],\"InvalidArrayLength()\":[{\"notice\":\"Thrown when the lengths of the arrays are not equal\"}],\"InvalidMaxPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set maxPrice below current spot\"}],\"InvalidMinPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set minPrice above current spot\"}],\"InvalidResetThreshold(uint256)\":[{\"notice\":\"Thrown when the exit threshold is set above the deviation threshold\"}],\"MarketAlreadyInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize an already initialized market\"}],\"MarketNotInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize protection for an asset that is not initialized\"}],\"PriceExceedsUint128(uint256)\":[{\"notice\":\"Thrown when a price exceeds uint128 max\"}],\"PriceRangeNotConverged(address,uint256,uint256)\":[{\"notice\":\"Thrown when trying to disable protection before price range has converged\"}],\"ProtectedPriceActive(address)\":[{\"notice\":\"Thrown when trying to update for an asset with active protection\"}],\"ProtectedPriceInactive(address)\":[{\"notice\":\"Thrown when trying to disable protection that is not active\"}],\"ThresholdAboveMaximum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set above the maximum allowed value\"}],\"ThresholdBelowMinimum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set below the minimum allowed value\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"Thrown when the action is prohibited by AccessControlManager\"}],\"VAINotAllowed()\":[{\"notice\":\"Thrown when trying to initialize protection for VAI\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}],\"ZeroPriceNotAllowed()\":[{\"notice\":\"Thrown when a zero price is provided where a non-zero price is required\"}],\"ZeroValueNotAllowed()\":[{\"notice\":\"Thrown if the supplied value is 0 where it is not allowed\"}]},\"events\":{\"BoundedPricingWhitelistUpdated(address,bool)\":{\"notice\":\"Emitted when an asset's whitelist status changes\"},\"CooldownPeriodSet(address,uint64,uint64)\":{\"notice\":\"Emitted when the cooldown period is updated for an asset\"},\"MaxPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the maximum price for an asset\"},\"MinPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the minimum price for an asset\"},\"NewAccessControlManager(address,address)\":{\"notice\":\"Emitted when access control manager contract address is changed\"},\"ProtectionInitialized(address,uint128,uint128,uint64,uint256)\":{\"notice\":\"Emitted when protection is initialized for an asset\"},\"ProtectionModeExited(address)\":{\"notice\":\"Emitted when protection mode is disabled for an asset\"},\"ProtectionTriggered(address,uint256,uint128,uint128)\":{\"notice\":\"Emitted when protection mode is triggered for an asset\"},\"ResetThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the exit threshold is updated for an asset\"},\"TriggerThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the entry threshold is updated for an asset\"}},\"kind\":\"user\",\"methods\":{\"COLLATERAL_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final collateral prices within a transaction\"},\"DEBT_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final debt prices within a transaction\"},\"KEEPER_DEADBAND()\":{\"notice\":\"Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\"},\"MAX_THRESHOLD()\":{\"notice\":\"Maximum allowed threshold value (50%)\"},\"MIN_THRESHOLD()\":{\"notice\":\"Minimum allowed threshold value (5%) to account for keeper deadband\"},\"NATIVE_TOKEN_ADDR()\":{\"notice\":\"Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens\"},\"RESILIENT_ORACLE()\":{\"notice\":\"Resilient Oracle used to fetch spot prices\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"allAssets(uint256)\":{\"notice\":\"Append-only array of all assets ever initialized, used for enumeration\"},\"assetProtectionConfig(address)\":{\"notice\":\"Per-asset protection state\"},\"canExitProtection(address)\":{\"notice\":\"Checks if protection can be exited for an asset\"},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"notice\":\"Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values\"},\"constructor\":{\"notice\":\"Constructor for the implementation contract. Sets immutable variables.\"},\"currentlyUsingProtectedPrice(address)\":{\"notice\":\"Checks if the asset is currently using the protected (bounded) price\"},\"exitProtectionMode(address)\":{\"notice\":\"Exits protection mode for a given asset\"},\"getAllBoundedPricingEnabledAssets()\":{\"notice\":\"Returns all currently whitelisted asset addresses\"},\"getBoundedCollateralPrice(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken, updating protection state\"},\"getBoundedCollateralPriceView(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken (view variant)\"},\"getBoundedDebtPrice(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken, updating protection state\"},\"getBoundedDebtPriceView(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken (view variant)\"},\"getBoundedPrices(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken, updating protection state\"},\"getBoundedPricesView(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken (view variant)\"},\"getInitializedAssets()\":{\"notice\":\"Returns all asset addresses that have ever been initialized\"},\"initialize(address)\":{\"notice\":\"Initializes the contract admin\"},\"isBoundedPricingEnabled(address)\":{\"notice\":\"Checks if an asset is whitelisted for bounded pricing\"},\"nativeMarket()\":{\"notice\":\"Native market address\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of AccessControlManager\"},\"setAssetBoundedPricingEnabled(address,bool)\":{\"notice\":\"Sets whether an asset is enabled for bounded pricing\"},\"setCooldownPeriod(address,uint64)\":{\"notice\":\"Sets the cooldown period for an asset\"},\"setThresholds(address,uint256,uint256)\":{\"notice\":\"Sets the trigger and reset thresholds for an asset\"},\"setTokenConfig(address,uint64,uint256,uint256,bool)\":{\"notice\":\"Initializes protection for a new asset\"},\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\":{\"notice\":\"Batch-initializes protection for multiple assets in a single transaction\"},\"updateMaxPrice(address,uint128)\":{\"notice\":\"Updates the maximum price in the rolling window for a given asset\"},\"updateMinPrice(address,uint128)\":{\"notice\":\"Updates the minimum price in the rolling window for a given asset\"},\"updateProtectionState(address)\":{\"notice\":\"Fetches the spot price, updates the protection window, and caches the resolved bounded prices in transient storage for the duration of the transaction.\"},\"vai()\":{\"notice\":\"VAI address\"}},\"notice\":\"The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeviationBoundedOracle.sol\":\"DeviationBoundedOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./OwnableUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\\n address private _pendingOwner;\\n\\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n function __Ownable2Step_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable2Step_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the address of the pending owner.\\n */\\n function pendingOwner() public view virtual returns (address) {\\n return _pendingOwner;\\n }\\n\\n /**\\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual override onlyOwner {\\n _pendingOwner = newOwner;\\n emit OwnershipTransferStarted(owner(), newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual override {\\n delete _pendingOwner;\\n super._transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev The new owner accepts the ownership transfer.\\n */\\n function acceptOwnership() public virtual {\\n address sender = _msgSender();\\n require(pendingOwner() == sender, \\\"Ownable2Step: caller is not the new owner\\\");\\n _transferOwnership(sender);\\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\",\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal onlyInitializing {\\n _transferOwnership(_msgSender());\\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 require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\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 require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\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 /**\\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\",\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// 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 IAccessControl {\\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\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\nimport \\\"./IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title AccessControlledV8\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\\n /// @notice Access control manager contract\\n IAccessControlManagerV8 internal _accessControlManager;\\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 /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /// @notice Thrown when the action is prohibited by AccessControlManager\\n error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\\n __Ownable2Step_init();\\n __AccessControlled_init_unchained(accessControlManager_);\\n }\\n\\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Sets the address of AccessControlManager\\n * @dev Admin function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n * @custom:event Emits NewAccessControlManager event\\n * @custom:access Only Governance\\n */\\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV8) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert Unauthorized(msg.sender, address(this), signature);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe0fd441c84ac907cabc88db69ef04f6d7532d770c7e6a1dfe6e7d6305debb49\",\"license\":\"BSD-3-Clause\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/access/IAccessControl.sol\\\";\\n\\n/**\\n * @title IAccessControlManagerV8\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\\n */\\ninterface IAccessControlManagerV8 is IAccessControl {\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xaa29b098440d0b3a131c5ecdf25ce548790c1b5ac7bf9b5c0264b6af6f7a1e0b\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0x14de93ead464da249af31bea0e3bcfb62ec693bea3475fb4d90f055ac81dc5eb\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0xdb88e14d50dd21889ca3329d755673d022c47e8da005b6a545c7f69c2c4b7b86\",\"license\":\"BSD-3-Clause\"},\"contracts/DeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { VBep20Interface } from \\\"./interfaces/VBep20Interface.sol\\\";\\nimport { ResilientOracleInterface } from \\\"./interfaces/OracleInterface.sol\\\";\\nimport { IDeviationBoundedOracle } from \\\"./interfaces/IDeviationBoundedOracle.sol\\\";\\nimport { AccessControlledV8 } from \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\\\";\\nimport { EXP_SCALE } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { Transient } from \\\"./lib/Transient.sol\\\";\\n\\n/**\\n * @title DeviationBoundedOracle\\n * @author Venus\\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\\n *\\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\\n * significantly from the window bounds, protection mode activates automatically and conservative\\n * pricing kicks in:\\n * - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low\\n * - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high\\n *\\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\\n * off-chain monitoring systems.\\n *\\n * The oracle exposes both view and non-view price functions. The non-view variants update the\\n * price window and trigger protection. The view variants read stored state only. A transient\\n * price cache avoids redundant ResilientOracle calls within the same transaction when\\n * updateProtectionState is called before the view price reads.\\n */\\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\\n uint256 public constant MIN_THRESHOLD = 5e16;\\n\\n /// @notice Maximum allowed threshold value (50%)\\n uint256 public constant MAX_THRESHOLD = 50e16;\\n\\n /// @notice Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\\n uint256 public constant KEEPER_DEADBAND = 5e16;\\n\\n /// @notice Resilient Oracle used to fetch spot prices\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\\n\\n /// @notice Native market address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable nativeMarket;\\n\\n /// @notice VAI address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable vai;\\n\\n /// @notice Transient storage slot for caching final collateral prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/cache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\\n 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200;\\n\\n /// @notice Transient storage slot for caching final debt prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\\n\\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\\n /// and can serve as any underlying asset of a market that supports native tokens\\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\\n\\n /// @notice Per-asset protection state\\n mapping(address => MarketProtectionState) public assetProtectionConfig;\\n\\n /// @notice Append-only array of all assets ever initialized, used for enumeration\\n address[] public allAssets;\\n\\n /// @notice Storage gap for upgrades\\n uint256[48] private __gap;\\n\\n /**\\n * @notice Constructor for the implementation contract. Sets immutable variables.\\n * @param _resilientOracle Address of the ResilientOracle contract\\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\\n ensureNonzeroAddress(address(_resilientOracle));\\n ensureNonzeroAddress(nativeMarketAddress);\\n RESILIENT_ORACLE = _resilientOracle;\\n nativeMarket = nativeMarketAddress;\\n vai = vaiAddress;\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract admin\\n * @param accessControlManager_ Address of the access control manager contract\\n */\\n function initialize(address accessControlManager_) external initializer {\\n __AccessControlled_init(accessControlManager_);\\n }\\n\\n // ----- Non-view price functions (update window + trigger protection) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (lower) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (higher) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns both conservative prices in a single call.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\\n * bounded prices in transient storage for the duration of the transaction.\\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\\n * instead of querying ResilientOracle again, keeping those functions as `view` and\\n * avoiding redundant oracle calls.\\n * @param vToken vToken address\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external {\\n _updateAndGetBoundedPrices(vToken);\\n }\\n\\n // ----- View price functions (read stored/cached state only) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\\n * in the same transaction). Falls back to ResilientOracle on cache miss.\\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\\n * in the same transaction). Falls back to ResilientOracle on cache miss.\\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\\n (, debtPrice) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _computeBoundedPrices(vToken);\\n }\\n\\n // ----- Keeper functions -----\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\\n * Constraint: newMin must be at or below the current spot price.\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external {\\n _checkAccessAllowed(\\\"updateMinPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\\n }\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\\n * Constraint: newMax must be at or above the current spot price.\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external {\\n _checkAccessAllowed(\\\"updateMaxPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\\n }\\n\\n /**\\n * @notice Exits protection mode for a given asset\\n * @dev Called by the keeper/monitor after confirming price has normalised.\\n * Enforces two conditions on-chain:\\n * 1. Cooldown period has elapsed since the last trigger\\n * 2. Price range has converged below the exit threshold\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external {\\n _checkAccessAllowed(\\\"exitProtectionMode(address)\\\");\\n ensureNonzeroAddress(asset);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\\n\\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\\n }\\n\\n // exit protected price if price range has converged below exit threshold\\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\\n if (rangeRatio >= state.resetThreshold) {\\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\\n }\\n\\n state.currentlyUsingProtectedPrice = false;\\n state.lastProtectionTriggeredAt = 0;\\n emit ProtectionModeExited(asset);\\n }\\n\\n // ----- Admin functions (governance-gated) -----\\n\\n /**\\n * @notice Initializes protection for a new asset\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:access Only Governance\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) external {\\n _checkAccessAllowed(\\\"setTokenConfig(address,uint64,uint256,uint256,bool)\\\");\\n _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Batch-initializes protection for multiple assets in a single transaction\\n * @param assets Array of underlying asset addresses\\n * @param cooldownPeriods Array of cooldown periods (seconds)\\n * @param triggerThresholds Array of trigger thresholds (mantissa)\\n * @param resetThresholds Array of reset thresholds (mantissa)\\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if array lengths do not match\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(\\n address[] calldata assets,\\n uint64[] calldata cooldownPeriods,\\n uint256[] calldata triggerThresholds,\\n uint256[] calldata resetThresholds,\\n bool[] calldata enableBoundedPricings\\n ) external {\\n _checkAccessAllowed(\\\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\\\");\\n uint256 len = assets.length;\\n if (\\n len == 0 ||\\n len != cooldownPeriods.length ||\\n len != triggerThresholds.length ||\\n len != resetThresholds.length ||\\n len != enableBoundedPricings.length\\n ) revert InvalidArrayLength();\\n\\n for (uint256 i; i < len; ++i) {\\n _setTokenConfig(\\n assets[i],\\n cooldownPeriods[i],\\n triggerThresholds[i],\\n resetThresholds[i],\\n enableBoundedPricings[i]\\n );\\n }\\n }\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds\\n * @custom:access Only Governance\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\\n _checkAccessAllowed(\\\"setCooldownPeriod(address,uint64)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newCooldown);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\\n state.cooldownPeriod = newCooldown;\\n }\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\\n _checkAccessAllowed(\\\"setThresholds(address,uint256,uint256)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newTriggerThreshold);\\n ensureNonzeroValue(newResetThreshold);\\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (newTriggerThreshold != state.triggerThreshold) {\\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\\n state.triggerThreshold = uint128(newTriggerThreshold);\\n }\\n if (newResetThreshold != state.resetThreshold) {\\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\\n state.resetThreshold = uint128(newResetThreshold);\\n }\\n }\\n\\n /**\\n * @notice Sets whether an asset is enabled for bounded pricing\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setAssetBoundedPricingEnabled(address,bool)\\\");\\n ensureNonzeroAddress(asset);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!enabled && state.currentlyUsingProtectedPrice) {\\n revert ProtectedPriceActive(asset);\\n }\\n\\n if (state.isBoundedPricingEnabled == enabled) return;\\n\\n // reset the window if re-enabling\\n if (enabled) {\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n _setMinPrice(state, asset, spotU128);\\n _setMaxPrice(state, asset, spotU128);\\n }\\n\\n state.isBoundedPricingEnabled = enabled;\\n emit BoundedPricingWhitelistUpdated(asset, enabled);\\n }\\n\\n // ----- View helpers -----\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory) {\\n return allAssets;\\n }\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\\n }\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\\n }\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\\n * Gas-free for off-chain callers.\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\\n uint256 len = allAssets.length;\\n address[] memory temp = new address[](len);\\n uint256 count;\\n for (uint256 i; i < len; ++i) {\\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\\n temp[count++] = allAssets[i];\\n }\\n }\\n address[] memory result = new address[](count);\\n for (uint256 i; i < count; ++i) {\\n result[i] = temp[i];\\n }\\n return result;\\n }\\n\\n /**\\n * @notice Checks if protection can be exited for an asset\\n * @dev Returns true when both conditions are met:\\n * 1. Cooldown period has elapsed since last trigger\\n * 2. Price range has converged below exit threshold\\n * @param asset The underlying asset address\\n * @return True if protection can be disabled\\n */\\n function canExitProtection(address asset) external view returns (bool) {\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n return\\n state.currentlyUsingProtectedPrice &&\\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\\n }\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\\n * from the keeper's proposed window values\\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's off-chain window minimum prices\\n * @param proposedMaxs Keeper's off-chain window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\\n uint256 len = assets.length;\\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\\n\\n needsMinUpdate = new bool[](len);\\n needsMaxUpdate = new bool[](len);\\n\\n for (uint256 i; i < len; ++i) {\\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\\n }\\n }\\n\\n // ----- Internal functions -----\\n\\n /**\\n * @notice Initializes protection parameters and price window for a single asset\\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\\n * spot so the window expands naturally as prices move. Can only be called once per asset.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n */\\n function _setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) internal {\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(cooldownPeriod);\\n ensureNonzeroValue(triggerThreshold);\\n ensureNonzeroValue(resetThreshold);\\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\\n if (asset == vai) revert VAINotAllowed();\\n\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n\\n assetProtectionConfig[asset] = MarketProtectionState({\\n minPrice: spotU128,\\n maxPrice: spotU128,\\n currentlyUsingProtectedPrice: false,\\n isBoundedPricingEnabled: enableBoundedPricing,\\n lastProtectionTriggeredAt: 0,\\n cooldownPeriod: cooldownPeriod,\\n asset: asset,\\n triggerThreshold: uint128(triggerThreshold),\\n resetThreshold: uint128(resetThreshold)\\n });\\n\\n allAssets.push(asset);\\n\\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Validates and applies a keeper-provided min or max price update\\n * @param asset The underlying asset address\\n * @param newPrice The new price value to set\\n * @param boundType Whether this is a MIN or MAX bound update\\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice\\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice\\n */\\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\\n ensureNonzeroAddress(asset);\\n if (newPrice == 0) revert ZeroPriceNotAllowed();\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n uint256 currentSpot = _fetchSpotPrice(asset);\\n if (boundType == PriceBoundType.MIN) {\\n if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot)\\n revert InvalidMinPrice(asset, newPrice, currentSpot);\\n _setMinPrice(state, asset, newPrice);\\n } else if (boundType == PriceBoundType.MAX) {\\n if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot)\\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\\n _setMaxPrice(state, asset, newPrice);\\n }\\n }\\n\\n /**\\n * @notice Shared non-view logic for all bounded price functions.\\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n */\\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // return early if failure from resilient oracle to prevent cold SLOAD\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) {\\n _setCachedPrices(asset, spot, spot);\\n return (spot, spot);\\n }\\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\\n _setCachedPrices(asset, minPrice, maxPrice);\\n }\\n\\n /**\\n * @dev Expands the price window toward extremes if the spot price is a new min or max\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n */\\n function _expandPriceWindow(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset\\n ) internal returns (uint128, uint128, bool) {\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 currentMin = state.minPrice;\\n uint128 currentMax = state.maxPrice;\\n bool windowExpanded;\\n if (spotU128 < currentMin) {\\n _setMinPrice(state, asset, spotU128);\\n currentMin = spotU128;\\n windowExpanded = true;\\n }\\n if (spotU128 > currentMax) {\\n _setMaxPrice(state, asset, spotU128);\\n currentMax = spotU128;\\n windowExpanded = true;\\n }\\n return (currentMin, currentMax, windowExpanded);\\n }\\n\\n /**\\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\\n */\\n function _checkAndTriggerProtection(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset,\\n bool windowExpanded\\n ) internal returns (bool triggered) {\\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\\n if (enteringProtection || windowExpanded) {\\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\\n }\\n if (enteringProtection) {\\n state.currentlyUsingProtectedPrice = true;\\n }\\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\\n return true;\\n }\\n if (state.currentlyUsingProtectedPrice) return true;\\n }\\n\\n /**\\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\\n * When protection is inactive: both return spot.\\n * @param protectionActive Whether the market protection window is currently active\\n * @param spot The current spot price\\n * @param windowMin The lower bound of the price window\\n * @param windowMax The upper bound of the price window\\n * @return minPrice The resolved lower-bound (collateral) price\\n * @return maxPrice The resolved upper-bound (debt) price\\n */\\n function _resolveBoundedPrices(\\n bool protectionActive,\\n uint256 spot,\\n uint256 windowMin,\\n uint256 windowMax\\n ) internal pure returns (uint256, uint256) {\\n if (!protectionActive) return (spot, spot);\\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\\n }\\n\\n /**\\n * @notice Shared view logic for all bounded price view functions.\\n * Checks transient cache first for an early return; on miss, fetches from oracle\\n * and computes both prices without state mutations.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // Cache miss \\u2014 fetch from oracle and compute without state mutations\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) return (spot, spot);\\n\\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\\n\\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\\n\\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\\n }\\n\\n /**\\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\\n * Formula: \\\\((maxPrice - minPrice) / minPrice\\\\), scaled by `EXP_SCALE`.\\n * Used to measure how much the window has converged -- compared against `resetThreshold`\\n * to determine whether the price window is tight enough to exit protection mode.\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @return The scaled bound ratio \\\\(((max - min) * EXP_SCALE) / min\\\\)\\n */\\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\\n uint256 range = uint256(maxPrice) - uint256(minPrice);\\n return (range * EXP_SCALE) / uint256(minPrice);\\n }\\n\\n /**\\n * @notice Checks if the spot price has deviated beyond the threshold from the window bounds\\n * @dev Pump detection: spot > minPrice * (1 + threshold)\\n * Crash detection: spot < maxPrice * (1 - threshold)\\n * @param spot The current spot price\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @param threshold The deviation threshold (mantissa)\\n * @return True if deviation is triggered\\n */\\n function _exceedsDeviationThreshold(\\n uint256 spot,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint256 threshold\\n ) internal pure returns (bool) {\\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\\n return (spot > upperBound || spot < lowerBound);\\n }\\n\\n /**\\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\\n * @param currentPrice The current on-chain price\\n * @param proposedPrice The keeper's proposed price\\n * @return True if drift exceeds deadband\\n */\\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\\n if (currentPrice == 0 || proposedPrice == 0) return false;\\n uint256 diff = currentPrice > proposedPrice\\n ? uint256(currentPrice - proposedPrice)\\n : uint256(proposedPrice - currentPrice);\\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\\n }\\n\\n /**\\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMin The new minimum price\\n */\\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\\n emit MinPriceUpdated(asset, state.minPrice, newMin);\\n state.minPrice = newMin;\\n }\\n\\n /**\\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMax The new maximum price\\n */\\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\\n state.maxPrice = newMax;\\n }\\n\\n /**\\n * @dev Writes both lower and upper bounded prices to transient storage\\n * @param asset The underlying asset address\\n * @param minPrice The resolved lower (collateral) price to cache\\n * @param maxPrice The resolved upper (debt) price to cache\\n */\\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\\n }\\n\\n /**\\n * @dev Reads a cached final price from transient storage\\n * @param asset The underlying asset address\\n * @return minPrice The cached minimum price, or 0 on cache miss\\n * @return maxPrice The cached maximum price, or 0 on cache miss\\n */\\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\\n }\\n\\n /**\\n * @dev This function returns the underlying asset of a vToken\\n * @param vToken vToken address\\n * @return asset underlying asset address\\n */\\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\\n ensureNonzeroAddress(vToken);\\n if (vToken == nativeMarket) {\\n asset = NATIVE_TOKEN_ADDR;\\n } else if (vToken == vai) {\\n asset = vai;\\n } else {\\n asset = VBep20Interface(vToken).underlying();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the market has not been initialized via setTokenConfig\\n * @param asset The underlying asset address\\n * @return state The market protection state storage pointer\\n */\\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\\n state = assetProtectionConfig[asset];\\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\\n }\\n\\n /**\\n * @notice Fetches the current spot price for an asset from the ResilientOracle\\n * @param asset The underlying asset address\\n * @return The current spot price\\n */\\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\\n return RESILIENT_ORACLE.getPrice(asset);\\n }\\n\\n /**\\n * @dev Safely casts a uint256 to uint128, reverting on overflow\\n * @param value The value to cast\\n * @return The value as uint128\\n */\\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\\n return uint128(value);\\n }\\n}\\n\",\"keccak256\":\"0xbd8ad8239c2003615cc63f663ff64bc00a41b85a1c01e6b2decc8627c45789e3\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/IDeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IDeviationBoundedOracle {\\n // --- Enums ---\\n\\n /// @notice Identifies whether a price bound is a minimum or maximum\\n enum PriceBoundType {\\n MIN,\\n MAX\\n }\\n\\n // --- Structs ---\\n\\n /// @notice Per-asset protection state tracking the min/max price window\\n struct MarketProtectionState {\\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\\n uint128 minPrice;\\n /// @notice Highest price observed in the current window\\n uint128 maxPrice;\\n /// @notice Whether protected price is currently being used\\n bool currentlyUsingProtectedPrice;\\n /// @notice Whether this market is whitelisted for bounded pricing\\n bool isBoundedPricingEnabled;\\n /// @notice Timestamp of the last protection trigger \\u2014 reset on every trigger\\n uint64 lastProtectionTriggeredAt;\\n /// @notice Minimum time protection stays active after last trigger\\n uint64 cooldownPeriod;\\n /// @notice The underlying asset address, used to verify initialization\\n address asset;\\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\\n uint128 triggerThreshold;\\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\\n uint128 resetThreshold;\\n }\\n\\n // --- Events ---\\n\\n /// @notice Emitted when protection is initialized for an asset\\n event ProtectionInitialized(\\n address indexed asset,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold\\n );\\n\\n /// @notice Emitted when protection mode is triggered for an asset\\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\\n\\n /// @notice Emitted when protection mode is disabled for an asset\\n event ProtectionModeExited(address indexed asset);\\n\\n /// @notice Emitted when the keeper updates the minimum price for an asset\\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\\n\\n /// @notice Emitted when the keeper updates the maximum price for an asset\\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\\n\\n /// @notice Emitted when the entry threshold is updated for an asset\\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\\n\\n /// @notice Emitted when the exit threshold is updated for an asset\\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\\n\\n /// @notice Emitted when the cooldown period is updated for an asset\\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\\n\\n /// @notice Emitted when an asset's whitelist status changes\\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\\n\\n // --- Errors ---\\n\\n /// @notice Thrown when trying to initialize protection for an asset that is not initialized\\n error MarketNotInitialized(address asset);\\n\\n /// @notice Thrown when trying to initialize an already initialized market\\n error MarketAlreadyInitialized(address asset);\\n\\n /// @notice Thrown when trying to disable protection that is not active\\n error ProtectedPriceInactive(address asset);\\n\\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\\n\\n /// @notice Thrown when trying to disable protection before price range has converged\\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\\n\\n /// @notice Thrown when keeper tries to set minPrice above current spot\\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\\n\\n /// @notice Thrown when keeper tries to set maxPrice below current spot\\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\\n\\n /// @notice Thrown when threshold is set below the minimum allowed value\\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\\n\\n /// @notice Thrown when threshold is set above the maximum allowed value\\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\\n\\n /// @notice Thrown when a price exceeds uint128 max\\n error PriceExceedsUint128(uint256 price);\\n\\n /// @notice Thrown when a zero price is provided where a non-zero price is required\\n error ZeroPriceNotAllowed();\\n\\n /// @notice Thrown when trying to initialize protection for VAI\\n error VAINotAllowed();\\n\\n /// @notice Thrown when trying to update for an asset with active protection\\n error ProtectedPriceActive(address asset);\\n\\n /// @notice Thrown when the lengths of the arrays are not equal\\n error InvalidArrayLength();\\n\\n /// @notice Thrown when the exit threshold is set above the deviation threshold\\n error InvalidResetThreshold(uint256 resetThreshold);\\n\\n // --- Non-view price functions (update window + trigger protection) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- State update (call before view price reads to populate transient cache) ---\\n\\n /**\\n * @notice Updates the protection state for a given vToken, caching the resolved price\\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\\n * reads in the same transaction are served from transient storage.\\n * @param vToken vToken address\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external;\\n\\n // --- View price functions (read stored/cached state only) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return price The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return price The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- Keeper functions ---\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMin is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external;\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMax is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external;\\n\\n /**\\n * @notice Exits protection mode for a given asset once conditions are met\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external;\\n\\n // --- Admin functions (governance-gated) ---\\n\\n /**\\n * @notice Initializes protection parameters for a new asset\\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\\n * confirming the oracle is live for this asset before it is listed.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:access Only Governance\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) external;\\n\\n /**\\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\\n * @param assets Array of underlying asset addresses\\n * @param cooldownPeriods Array of cooldown periods (seconds)\\n * @param triggerThresholds Array of trigger thresholds (mantissa)\\n * @param resetThresholds Array of reset thresholds (mantissa)\\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if array lengths do not match\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(\\n address[] calldata assets,\\n uint64[] calldata cooldownPeriods,\\n uint256[] calldata triggerThresholds,\\n uint256[] calldata resetThresholds,\\n bool[] calldata enableBoundedPricings\\n ) external;\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds; must be non-zero\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\\n\\n /**\\n * @notice Sets whether bounded pricing is enabled for an asset\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\\n\\n // --- View helpers ---\\n\\n /**\\n * @notice Returns the full protection state for an asset\\n * @param asset The underlying asset address\\n * @return minPrice Lowest price observed in the current window\\n * @return maxPrice Highest price observed in the current window\\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\\n * @return cooldownPeriod Minimum time protection stays active after last trigger\\n * @return assetAddr The underlying asset address stored in the struct\\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\\n */\\n function assetProtectionConfig(\\n address asset\\n )\\n external\\n view\\n returns (\\n uint128 minPrice,\\n uint128 maxPrice,\\n bool currentlyUsingProtectedPrice,\\n bool isBoundedPricingEnabled,\\n uint64 lastProtectionTriggeredAt,\\n uint64 cooldownPeriod,\\n address assetAddr,\\n uint128 triggerThreshold,\\n uint128 resetThreshold\\n );\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if protection can be exited for a given asset\\n * @param asset The underlying asset address\\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\\n */\\n function canExitProtection(address asset) external view returns (bool);\\n\\n /**\\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\\n * @param index Array index\\n * @return The asset address at the given index\\n */\\n function allAssets(uint256 index) external view returns (address);\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory);\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's proposed window minimum prices\\n * @param proposedMaxs Keeper's proposed window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\\n}\\n\",\"keccak256\":\"0x085d9a9abab4d4b594e958b7b74c5ccacd312a860627fd6e339aacf745549d18\",\"license\":\"BSD-3-Clause\"},\"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 BoundValidatorInterface {\\n function validatePriceWithAnchorPrice(\\n address asset,\\n uint256 reporterPrice,\\n uint256 anchorPrice\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd3bbb7c9eef19e8f467342df6034ef95399a00964646fb8c82b438968ae3a8c0\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/VBep20Interface.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\ninterface VBep20Interface is IERC20Metadata {\\n /**\\n * @notice Underlying asset for this VToken\\n */\\n function underlying() external view returns (address);\\n}\\n\",\"keccak256\":\"0x6e71c3df86501df5c0e4bace1333c0c91f9f9cced252a54fb99eeda219b789d5\",\"license\":\"BSD-3-Clause\"},\"contracts/lib/Transient.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nlibrary Transient {\\n /**\\n * @notice Cache the asset price into transient storage\\n * @param key address of the asset\\n * @param value asset price\\n */\\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n tstore(slot, value)\\n }\\n }\\n\\n /**\\n * @notice Read cached price from transient storage\\n * @param key address of the asset\\n * @return value cached asset price\\n */\\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n value := tload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x60d7133a48a757ee777cb9230e890ef489ffc33dcea9dadfcf5a8b72f9dd43aa\",\"license\":\"BSD-3-Clause\"}},\"version\":1}", + "bytecode": "0x60e060405234801561000f575f80fd5b506040516131da3803806131da83398101604081905261002e91610163565b61003783610069565b61004082610069565b6001600160a01b0380841660805282811660a052811660c052610061610093565b5050506101ad565b6001600160a01b038116610090576040516342bcdf7f60e11b815260040160405180910390fd5b50565b5f54610100900460ff16156100fe5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610090575f80fd5b5f805f60608486031215610175575f80fd5b83516101808161014f565b60208501519093506101918161014f565b60408501519092506101a28161014f565b809150509250925092565b60805160a05160c051612fe06101fa5f395f818161053601528181611d0c01528181612357015261239101525f818161043e015261230301525f81816104af01526119660152612fe05ff3fe608060405234801561000f575f80fd5b506004361061023f575f3560e01c80638cf38bb111610135578063bd11c4c0116100b4578063e2201bb811610079578063e2201bb81461067d578063e30c397814610690578063e40c2fed146106a1578063f2fde38b146106b4578063f4ee807a146106c7575f80fd5b8063bd11c4c0146103c2578063c382175714610558578063c4d66de814610644578063cf1412c014610657578063dcc889621461066a575f80fd5b8063a9534f8a116100fa578063a9534f8a146104d1578063a9c3cab1146104ec578063b4a0bdf3146104ff578063b540894f14610510578063b62e4c9214610531575f80fd5b80638cf38bb1146104605780638da5cb5b14610473578063969f58d314610484578063a31ebe5814610497578063a4edcd4c146104aa575f80fd5b8063578e5c22116101c15780637f5e1328116101865780637f5e1328146103c25780637fa6ea50146103d05780638769b231146103f857806388142b6b146104265780638a2f7f6d14610439575f80fd5b8063578e5c2214610331578063715018a61461035c57806376489e381461036457806377c9e613146103a757806379ba5097146103ba575f80fd5b80631be74faf116102075780631be74faf146102db57806323013b83146102f05780633b4ecdb2146103035780634912c4521461030b57806352a6bce31461031e575f80fd5b806308af5431146102435780630a5fa04d146102655780630e32cb861461028c5780631169d5a6146102a157806315a53122146102c8575b5f80fd5b6102526706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102527f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b61029f61029a366004612885565b6106da565b005b6102527f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20081565b61029f6102d63660046128b6565b6106ee565b6102e361073b565b60405161025c91906128e9565b61029f6102fe366004612942565b6108ee565b6102e3610a1a565b61029f610319366004612979565b610a7a565b61025261032c366004612885565b610c74565b61034461033f3660046129ab565b610c85565b6040516001600160a01b03909116815260200161025c565b61029f610cad565b610397610372366004612885565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b604051901515815260200161025c565b61029f6103b53660046129d8565b610cc0565b61029f610cf5565b61025266b1a2bc2ec5000081565b6103e36103de366004612885565b610d6c565b6040805192835260208301919091520161025c565b610397610406366004612885565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b6103e3610434366004612885565b610d80565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61029f61046e366004612885565b610d8b565b6033546001600160a01b0316610344565b61029f6104923660046128b6565b610f5d565b61029f6104a5366004612a31565b610fa7565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61034473bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b61029f6104fa366004612885565b61107a565b6097546001600160a01b0316610344565b61052361051e366004612aa2565b611088565b60405161025c929190612b70565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b6105db610566366004612885565b60c96020525f908152604090208054600182015460028301546003909301546001600160801b0380841694600160801b9485900482169460ff808616956101008104909116946001600160401b03620100008304811695600160501b90930416936001600160a01b0316928183169291041689565b604080516001600160801b039a8b168152988a1660208a01529615159688019690965293151560608701526001600160401b039283166080870152911660a08501526001600160a01b031660c0840152831660e08301529091166101008201526101200161025c565b61029f610652366004612885565b61124e565b610252610665366004612885565b61135b565b610397610678366004612885565b61136c565b61025261068b366004612885565b6113f8565b6065546001600160a01b0316610344565b6102526106af366004612885565b611402565b61029f6106c2366004612885565b61140c565b61029f6106d5366004612b9d565b61147d565b6106e26115ba565b6106eb81611614565b50565b61072c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e7431323829008152506116d2565b61073782825f611769565b5050565b60ca546060905f816001600160401b0381111561075a5761075a612c82565b604051908082528060200260200182016040528015610783578160200160208202803683370190505b5090505f805b838110156108495760c95f60ca83815481106107a7576107a7612c96565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108415760ca81815481106107ef576107ef612c96565b5f918252602090912001546001600160a01b0316838361080e81612cbe565b94508151811061082057610820612c96565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610789565b505f816001600160401b0381111561086357610863612c82565b60405190808252806020026020018201604052801561088c578160200160208202803683370190505b5090505f5b828110156108e5578381815181106108ab576108ab612c96565b60200260200101518282815181106108c5576108c5612c96565b6001600160a01b0390921660209283029190910190910152600101610891565b50949350505050565b61090f6040518060600160405280602b8152602001612ec8602b91396116d2565b610918826118d1565b5f610922836118f8565b9050811580156109365750600181015460ff165b15610964576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff1615150361098557505050565b81156109b7575f61099d61099885611945565b6119d7565b90506109aa828583611a07565b6109b5828583611a77565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a0d90851515815260200190565b60405180910390a2505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610a7057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a52575b5050505050905090565b610a9b604051806060016040528060268152602001612ef3602691396116d2565b610aa4836118d1565b610aad82611aeb565b610ab681611aeb565b66b1a2bc2ec50000821015610aee57604051630f4d736160e01b81526004810183905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000821115610b28576040516350ddbb7560e11b8152600481018390526706f05b59d3b20000602482015260440161095b565b818110610b4b57604051632021db5560e21b81526004810182905260240161095b565b5f610b55846118f8565b60038101549091506001600160801b03168314610bdd576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610c6e57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b0291161790555b50505050565b5f610c7e82611b0b565b9392505050565b60ca8181548110610c94575f80fd5b5f918252602090912001546001600160a01b0316905081565b610cb56115ba565b610cbe5f611be9565b565b610ce1604051806060016040528060338152602001612f19603391396116d2565b610cee8585858585611c02565b5050505050565b60655433906001600160a01b03168114610d635760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161095b565b6106eb81611be9565b5f80610d7783611b0b565b91509150915091565b5f80610d7783612090565b610dc96040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f646528616464726573732900000000008152506116d2565b610dd2816118d1565b5f610ddc826118f8565b600181015490915060ff16610e0f57604051638e001e1f60e01b81526001600160a01b038316600482015260240161095b565b6001810154610e36906001600160401b03600160501b820481169162010000900416612cd6565b421015610e8b576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b909204909116604482015260640161095b565b80545f90610eac906001600160801b0380821691600160801b9004166121cf565b6003830154909150600160801b90046001600160801b03168110610f105760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b0316604482015260640161095b565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b610f9b6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e7431323829008152506116d2565b61073782826001611769565b610fc8604051806060016040528060218152602001612f4c602191396116d2565b610fd1826118d1565b610fe3816001600160401b0316611aeb565b5f610fed836118f8565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b61108381611b0b565b505050565b60608086858114158061109b5750808414155b156110b957604051634ec4810560e11b815260040160405180910390fd5b806001600160401b038111156110d1576110d1612c82565b6040519080825280602002602001820160405280156110fa578160200160208202803683370190505b509250806001600160401b0381111561111557611115612c82565b60405190808252806020026020018201604052801561113e578160200160208202803683370190505b5091505f5b81811015611241575f60c95f8c8c8581811061116157611161612c96565b90506020020160208101906111769190612885565b6001600160a01b0316815260208101919091526040015f2080549091506111cc906001600160801b03168a8a858181106111b2576111b2612c96565b90506020020160208101906111c79190612ce9565b612217565b8583815181106111de576111de612c96565b91151560209283029190910190910152805461121690600160801b90046001600160801b03168888858181106111b2576111b2612c96565b84838151811061122857611228612c96565b9115156020928302919091019091015250600101611143565b5050965096945050505050565b5f54610100900460ff161580801561126c57505f54600160ff909116105b806112855750303b15801561128557505f5460ff166001145b6112e85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161095b565b5f805460ff191660011790558015611309575f805461ff0019166101001790555b611312826122c0565b8015610737575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f61136582611b0b565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156113bd575060018101546113b9906001600160401b03600160501b820481169162010000900416612cd6565b4210155b8015610c7e5750600381015481546001600160801b03600160801b928390048116926113f09280831692919004166121cf565b109392505050565b5f610c7e82612090565b5f61136582612090565b6114146115ba565b606580546001600160a01b0383166001600160a01b031990911681179091556114456033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61149e6040518060600160405280603e8152602001612f6d603e91396116d2565b888015806114ac5750808814155b806114b75750808614155b806114c25750808414155b806114cd5750808214155b156114eb57604051634ec4810560e11b815260040160405180910390fd5b5f5b818110156115ac576115a48c8c8381811061150a5761150a612c96565b905060200201602081019061151f9190612885565b8b8b8481811061153157611531612c96565b90506020020160208101906115469190612d02565b8a8a8581811061155857611558612c96565b9050602002013589898681811061157157611571612c96565b9050602002013588888781811061158a5761158a612c96565b905060200201602081019061159f9190612d1b565b611c02565b6001016114ed565b505050505050505050505050565b6033546001600160a01b03163314610cbe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b6001600160a01b0381166116785760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161095b565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910161134f565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab906117049033908690600401612d64565b602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117439190612d87565b90508061073757333083604051634a3fa29360e01b815260040161095b93929190612da2565b611772836118d1565b816001600160801b03165f0361179b5760405163a2b326dd60e01b815260040160405180910390fd5b5f6117a5846118f8565b90505f6117b185611945565b90505f8360018111156117c6576117c6612dcd565b036118495781546001600160801b03600160801b90910481169085161015806117f7575080846001600160801b0316115b156118395760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b611844828686611a07565b610cee565b600183600181111561185d5761185d612dcd565b03610cee5781546001600160801b03908116908516111580611887575080846001600160801b0316105b156118c657604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b610cee828686611a77565b6001600160a01b0381166106eb576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c9602052604090206002810154909116611940576040516349c9b68960e11b81526001600160a01b038316600482015260240161095b565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612de1565b92915050565b5f6001600160801b03821115611a035760405163339718d960e11b81526004810183905260240161095b565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b805f036106eb5760405163273e150360e21b815260040160405180910390fd5b5f805f611b17846122f7565b9050611b2281612415565b90935091508215801590611b3557508115155b15611b405750915091565b5f611b4a82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff16611b8c57611b81838384612474565b509485945092505050565b5f805f611b9a8486886124ca565b9250925092505f611bad8587898561254b565b9050611bcd8187866001600160801b0316866001600160801b0316612652565b9099509750611bdd878a8a612474565b50505050505050915091565b606580546001600160a01b03191690556106eb8161268f565b611c0b856118d1565b611c1d846001600160401b0316611aeb565b611c2683611aeb565b611c2f82611aeb565b6001600160a01b038581165f90815260c960205260409020600201541615611c7557604051630d8cdd9d60e01b81526001600160a01b038616600482015260240161095b565b66b1a2bc2ec50000831015611cad57604051630f4d736160e01b81526004810184905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000831115611ce7576040516350ddbb7560e11b8152600481018490526706f05b59d3b20000602482015260440161095b565b828210611d0a57604051632021db5560e21b81526004810183905260240161095b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611d5c5760405163c992a64b60e01b815260040160405180910390fd5b5f611d6961099887611945565b9050604051806101200160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200183151581526020015f6001600160401b03168152602001866001600160401b03168152602001876001600160a01b03168152602001856001600160801b03168152602001846001600160801b031681525060c95f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b0316021790555090505060ca86908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b68283888860405161203b94939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2856001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd83604051612080911515815260200190565b60405180910390a2505050505050565b5f805f61209c846122f7565b90506120a781612415565b909350915082158015906120ba57508115155b156120c55750915091565b5f6120cf82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661210657509485945092505050565b5f612110836119d7565b82549091505f906001600160801b031684106121365782546001600160801b0316612138565b815b83549091505f90600160801b90046001600160801b0316851161216c578354600160801b90046001600160801b031661216e565b825b60018501549091505f9060ff168061219e5750600385015461219e908790859085906001600160801b03166126e0565b90506121be8187856001600160801b0316856001600160801b0316612652565b909b909a5098505050505050505050565b5f806121e76001600160801b03808616908516612df8565b90506001600160801b038416612205670de0b6b3a764000083612e0b565b61220f9190612e22565b949350505050565b5f6001600160801b038316158061223557506001600160801b038216155b1561224157505f6119d1565b5f826001600160801b0316846001600160801b031611612273576122658484612e41565b6001600160801b0316612287565b61227d8385612e41565b6001600160801b03165b905066b1a2bc2ec500006001600160801b0385166122ad670de0b6b3a764000084612e0b565b6122b79190612e22565b11949350505050565b5f54610100900460ff166122e65760405162461bcd60e51b815260040161095b90612e61565b6122ee61275f565b6106eb8161278d565b5f612301826118d1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603612355575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036123b557507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612eac565b5f806124417f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200846127b3565b915061246d7f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600846127b3565b9050915091565b61249f7f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20084846127fb565b6110837f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084836127fb565b5f805f806124d7866119d7565b87549091506001600160801b0380821691600160801b90048116905f90841683111561250f576125088a8986611a07565b5082915060015b816001600160801b0316846001600160801b0316111561253b576125348a8986611a77565b5082905060015b9199909850909650945050505050565b835460038501545f916125779186916001600160801b0380821692600160801b909204811691166126e0565b1561263a57600185015460ff1615808061258e5750825b156125b95760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b80156125d0576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a2600191505061220f565b600185015460ff161561220f57506001949350505050565b5f8085612663575083905080612686565b8385106126705783612672565b845b83861161267f5783612681565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006126f58482612cd6565b612708906001600160801b038816612e0b565b6127129190612e22565b90505f670de0b6b3a76400006127288582612df8565b61273b906001600160801b038816612e0b565b6127459190612e22565b90508187118061275457508087105b979650505050505050565b5f54610100900460ff166127855760405162461bcd60e51b815260040161095b90612e61565b610cbe612842565b5f54610100900460ff166106e25760405162461bcd60e51b815260040161095b90612e61565b5f8083836040516020016127da9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f83836040516020016128219291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff166128685760405162461bcd60e51b815260040161095b90612e61565b610cbe33611be9565b6001600160a01b03811681146106eb575f80fd5b5f60208284031215612895575f80fd5b8135610c7e81612871565b80356001600160801b0381168114611940575f80fd5b5f80604083850312156128c7575f80fd5b82356128d281612871565b91506128e0602084016128a0565b90509250929050565b602080825282518282018190525f9190848201906040850190845b818110156129295783516001600160a01b031683529284019291840191600101612904565b50909695505050505050565b80151581146106eb575f80fd5b5f8060408385031215612953575f80fd5b823561295e81612871565b9150602083013561296e81612935565b809150509250929050565b5f805f6060848603121561298b575f80fd5b833561299681612871565b95602085013595506040909401359392505050565b5f602082840312156129bb575f80fd5b5035919050565b80356001600160401b0381168114611940575f80fd5b5f805f805f60a086880312156129ec575f80fd5b85356129f781612871565b9450612a05602087016129c2565b935060408601359250606086013591506080860135612a2381612935565b809150509295509295909350565b5f8060408385031215612a42575f80fd5b8235612a4d81612871565b91506128e0602084016129c2565b5f8083601f840112612a6b575f80fd5b5081356001600160401b03811115612a81575f80fd5b6020830191508360208260051b8501011115612a9b575f80fd5b9250929050565b5f805f805f8060608789031215612ab7575f80fd5b86356001600160401b0380821115612acd575f80fd5b612ad98a838b01612a5b565b90985096506020890135915080821115612af1575f80fd5b612afd8a838b01612a5b565b90965094506040890135915080821115612b15575f80fd5b50612b2289828a01612a5b565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612b65578151151587529582019590820190600101612b47565b509495945050505050565b604081525f612b826040830185612b34565b8281036020840152612b948185612b34565b95945050505050565b5f805f805f805f805f8060a08b8d031215612bb6575f80fd5b8a356001600160401b0380821115612bcc575f80fd5b612bd88e838f01612a5b565b909c509a5060208d0135915080821115612bf0575f80fd5b612bfc8e838f01612a5b565b909a50985060408d0135915080821115612c14575f80fd5b612c208e838f01612a5b565b909850965060608d0135915080821115612c38575f80fd5b612c448e838f01612a5b565b909650945060808d0135915080821115612c5c575f80fd5b50612c698d828e01612a5b565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612ccf57612ccf612caa565b5060010190565b808201808211156119d1576119d1612caa565b5f60208284031215612cf9575f80fd5b610c7e826128a0565b5f60208284031215612d12575f80fd5b610c7e826129c2565b5f60208284031215612d2b575f80fd5b8135610c7e81612935565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061220f90830184612d36565b5f60208284031215612d97575f80fd5b8151610c7e81612935565b6001600160a01b038481168252831660208201526060604082018190525f90612b9490830184612d36565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612df1575f80fd5b5051919050565b818103818111156119d1576119d1612caa565b80820281158282048414176119d1576119d1612caa565b5f82612e3c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160801b0382811682821603908082111561136557611365612caa565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612ebc575f80fd5b8151610c7e8161287156fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e66696728616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429736574546f6b656e436f6e6669677328616464726573735b5d2c75696e7436345b5d2c75696e743235365b5d2c75696e743235365b5d2c626f6f6c5b5d29a26469706673582212200b0f1b644e888914e3b4b2add80a376b34c39798a4ea6a946e169ae33aada4b164736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061023f575f3560e01c80638cf38bb111610135578063bd11c4c0116100b4578063e2201bb811610079578063e2201bb81461067d578063e30c397814610690578063e40c2fed146106a1578063f2fde38b146106b4578063f4ee807a146106c7575f80fd5b8063bd11c4c0146103c2578063c382175714610558578063c4d66de814610644578063cf1412c014610657578063dcc889621461066a575f80fd5b8063a9534f8a116100fa578063a9534f8a146104d1578063a9c3cab1146104ec578063b4a0bdf3146104ff578063b540894f14610510578063b62e4c9214610531575f80fd5b80638cf38bb1146104605780638da5cb5b14610473578063969f58d314610484578063a31ebe5814610497578063a4edcd4c146104aa575f80fd5b8063578e5c22116101c15780637f5e1328116101865780637f5e1328146103c25780637fa6ea50146103d05780638769b231146103f857806388142b6b146104265780638a2f7f6d14610439575f80fd5b8063578e5c2214610331578063715018a61461035c57806376489e381461036457806377c9e613146103a757806379ba5097146103ba575f80fd5b80631be74faf116102075780631be74faf146102db57806323013b83146102f05780633b4ecdb2146103035780634912c4521461030b57806352a6bce31461031e575f80fd5b806308af5431146102435780630a5fa04d146102655780630e32cb861461028c5780631169d5a6146102a157806315a53122146102c8575b5f80fd5b6102526706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102527f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b61029f61029a366004612885565b6106da565b005b6102527f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20081565b61029f6102d63660046128b6565b6106ee565b6102e361073b565b60405161025c91906128e9565b61029f6102fe366004612942565b6108ee565b6102e3610a1a565b61029f610319366004612979565b610a7a565b61025261032c366004612885565b610c74565b61034461033f3660046129ab565b610c85565b6040516001600160a01b03909116815260200161025c565b61029f610cad565b610397610372366004612885565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b604051901515815260200161025c565b61029f6103b53660046129d8565b610cc0565b61029f610cf5565b61025266b1a2bc2ec5000081565b6103e36103de366004612885565b610d6c565b6040805192835260208301919091520161025c565b610397610406366004612885565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b6103e3610434366004612885565b610d80565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61029f61046e366004612885565b610d8b565b6033546001600160a01b0316610344565b61029f6104923660046128b6565b610f5d565b61029f6104a5366004612a31565b610fa7565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61034473bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b61029f6104fa366004612885565b61107a565b6097546001600160a01b0316610344565b61052361051e366004612aa2565b611088565b60405161025c929190612b70565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b6105db610566366004612885565b60c96020525f908152604090208054600182015460028301546003909301546001600160801b0380841694600160801b9485900482169460ff808616956101008104909116946001600160401b03620100008304811695600160501b90930416936001600160a01b0316928183169291041689565b604080516001600160801b039a8b168152988a1660208a01529615159688019690965293151560608701526001600160401b039283166080870152911660a08501526001600160a01b031660c0840152831660e08301529091166101008201526101200161025c565b61029f610652366004612885565b61124e565b610252610665366004612885565b61135b565b610397610678366004612885565b61136c565b61025261068b366004612885565b6113f8565b6065546001600160a01b0316610344565b6102526106af366004612885565b611402565b61029f6106c2366004612885565b61140c565b61029f6106d5366004612b9d565b61147d565b6106e26115ba565b6106eb81611614565b50565b61072c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e7431323829008152506116d2565b61073782825f611769565b5050565b60ca546060905f816001600160401b0381111561075a5761075a612c82565b604051908082528060200260200182016040528015610783578160200160208202803683370190505b5090505f805b838110156108495760c95f60ca83815481106107a7576107a7612c96565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108415760ca81815481106107ef576107ef612c96565b5f918252602090912001546001600160a01b0316838361080e81612cbe565b94508151811061082057610820612c96565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610789565b505f816001600160401b0381111561086357610863612c82565b60405190808252806020026020018201604052801561088c578160200160208202803683370190505b5090505f5b828110156108e5578381815181106108ab576108ab612c96565b60200260200101518282815181106108c5576108c5612c96565b6001600160a01b0390921660209283029190910190910152600101610891565b50949350505050565b61090f6040518060600160405280602b8152602001612ec8602b91396116d2565b610918826118d1565b5f610922836118f8565b9050811580156109365750600181015460ff165b15610964576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff1615150361098557505050565b81156109b7575f61099d61099885611945565b6119d7565b90506109aa828583611a07565b6109b5828583611a77565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a0d90851515815260200190565b60405180910390a2505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610a7057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a52575b5050505050905090565b610a9b604051806060016040528060268152602001612ef3602691396116d2565b610aa4836118d1565b610aad82611aeb565b610ab681611aeb565b66b1a2bc2ec50000821015610aee57604051630f4d736160e01b81526004810183905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000821115610b28576040516350ddbb7560e11b8152600481018390526706f05b59d3b20000602482015260440161095b565b818110610b4b57604051632021db5560e21b81526004810182905260240161095b565b5f610b55846118f8565b60038101549091506001600160801b03168314610bdd576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610c6e57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b0291161790555b50505050565b5f610c7e82611b0b565b9392505050565b60ca8181548110610c94575f80fd5b5f918252602090912001546001600160a01b0316905081565b610cb56115ba565b610cbe5f611be9565b565b610ce1604051806060016040528060338152602001612f19603391396116d2565b610cee8585858585611c02565b5050505050565b60655433906001600160a01b03168114610d635760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161095b565b6106eb81611be9565b5f80610d7783611b0b565b91509150915091565b5f80610d7783612090565b610dc96040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f646528616464726573732900000000008152506116d2565b610dd2816118d1565b5f610ddc826118f8565b600181015490915060ff16610e0f57604051638e001e1f60e01b81526001600160a01b038316600482015260240161095b565b6001810154610e36906001600160401b03600160501b820481169162010000900416612cd6565b421015610e8b576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b909204909116604482015260640161095b565b80545f90610eac906001600160801b0380821691600160801b9004166121cf565b6003830154909150600160801b90046001600160801b03168110610f105760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b0316604482015260640161095b565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b610f9b6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e7431323829008152506116d2565b61073782826001611769565b610fc8604051806060016040528060218152602001612f4c602191396116d2565b610fd1826118d1565b610fe3816001600160401b0316611aeb565b5f610fed836118f8565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b61108381611b0b565b505050565b60608086858114158061109b5750808414155b156110b957604051634ec4810560e11b815260040160405180910390fd5b806001600160401b038111156110d1576110d1612c82565b6040519080825280602002602001820160405280156110fa578160200160208202803683370190505b509250806001600160401b0381111561111557611115612c82565b60405190808252806020026020018201604052801561113e578160200160208202803683370190505b5091505f5b81811015611241575f60c95f8c8c8581811061116157611161612c96565b90506020020160208101906111769190612885565b6001600160a01b0316815260208101919091526040015f2080549091506111cc906001600160801b03168a8a858181106111b2576111b2612c96565b90506020020160208101906111c79190612ce9565b612217565b8583815181106111de576111de612c96565b91151560209283029190910190910152805461121690600160801b90046001600160801b03168888858181106111b2576111b2612c96565b84838151811061122857611228612c96565b9115156020928302919091019091015250600101611143565b5050965096945050505050565b5f54610100900460ff161580801561126c57505f54600160ff909116105b806112855750303b15801561128557505f5460ff166001145b6112e85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161095b565b5f805460ff191660011790558015611309575f805461ff0019166101001790555b611312826122c0565b8015610737575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f61136582611b0b565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156113bd575060018101546113b9906001600160401b03600160501b820481169162010000900416612cd6565b4210155b8015610c7e5750600381015481546001600160801b03600160801b928390048116926113f09280831692919004166121cf565b109392505050565b5f610c7e82612090565b5f61136582612090565b6114146115ba565b606580546001600160a01b0383166001600160a01b031990911681179091556114456033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61149e6040518060600160405280603e8152602001612f6d603e91396116d2565b888015806114ac5750808814155b806114b75750808614155b806114c25750808414155b806114cd5750808214155b156114eb57604051634ec4810560e11b815260040160405180910390fd5b5f5b818110156115ac576115a48c8c8381811061150a5761150a612c96565b905060200201602081019061151f9190612885565b8b8b8481811061153157611531612c96565b90506020020160208101906115469190612d02565b8a8a8581811061155857611558612c96565b9050602002013589898681811061157157611571612c96565b9050602002013588888781811061158a5761158a612c96565b905060200201602081019061159f9190612d1b565b611c02565b6001016114ed565b505050505050505050505050565b6033546001600160a01b03163314610cbe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b6001600160a01b0381166116785760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161095b565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910161134f565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab906117049033908690600401612d64565b602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117439190612d87565b90508061073757333083604051634a3fa29360e01b815260040161095b93929190612da2565b611772836118d1565b816001600160801b03165f0361179b5760405163a2b326dd60e01b815260040160405180910390fd5b5f6117a5846118f8565b90505f6117b185611945565b90505f8360018111156117c6576117c6612dcd565b036118495781546001600160801b03600160801b90910481169085161015806117f7575080846001600160801b0316115b156118395760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b611844828686611a07565b610cee565b600183600181111561185d5761185d612dcd565b03610cee5781546001600160801b03908116908516111580611887575080846001600160801b0316105b156118c657604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b610cee828686611a77565b6001600160a01b0381166106eb576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c9602052604090206002810154909116611940576040516349c9b68960e11b81526001600160a01b038316600482015260240161095b565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612de1565b92915050565b5f6001600160801b03821115611a035760405163339718d960e11b81526004810183905260240161095b565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b805f036106eb5760405163273e150360e21b815260040160405180910390fd5b5f805f611b17846122f7565b9050611b2281612415565b90935091508215801590611b3557508115155b15611b405750915091565b5f611b4a82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff16611b8c57611b81838384612474565b509485945092505050565b5f805f611b9a8486886124ca565b9250925092505f611bad8587898561254b565b9050611bcd8187866001600160801b0316866001600160801b0316612652565b9099509750611bdd878a8a612474565b50505050505050915091565b606580546001600160a01b03191690556106eb8161268f565b611c0b856118d1565b611c1d846001600160401b0316611aeb565b611c2683611aeb565b611c2f82611aeb565b6001600160a01b038581165f90815260c960205260409020600201541615611c7557604051630d8cdd9d60e01b81526001600160a01b038616600482015260240161095b565b66b1a2bc2ec50000831015611cad57604051630f4d736160e01b81526004810184905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000831115611ce7576040516350ddbb7560e11b8152600481018490526706f05b59d3b20000602482015260440161095b565b828210611d0a57604051632021db5560e21b81526004810183905260240161095b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611d5c5760405163c992a64b60e01b815260040160405180910390fd5b5f611d6961099887611945565b9050604051806101200160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200183151581526020015f6001600160401b03168152602001866001600160401b03168152602001876001600160a01b03168152602001856001600160801b03168152602001846001600160801b031681525060c95f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b0316021790555090505060ca86908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b68283888860405161203b94939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2856001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd83604051612080911515815260200190565b60405180910390a2505050505050565b5f805f61209c846122f7565b90506120a781612415565b909350915082158015906120ba57508115155b156120c55750915091565b5f6120cf82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661210657509485945092505050565b5f612110836119d7565b82549091505f906001600160801b031684106121365782546001600160801b0316612138565b815b83549091505f90600160801b90046001600160801b0316851161216c578354600160801b90046001600160801b031661216e565b825b60018501549091505f9060ff168061219e5750600385015461219e908790859085906001600160801b03166126e0565b90506121be8187856001600160801b0316856001600160801b0316612652565b909b909a5098505050505050505050565b5f806121e76001600160801b03808616908516612df8565b90506001600160801b038416612205670de0b6b3a764000083612e0b565b61220f9190612e22565b949350505050565b5f6001600160801b038316158061223557506001600160801b038216155b1561224157505f6119d1565b5f826001600160801b0316846001600160801b031611612273576122658484612e41565b6001600160801b0316612287565b61227d8385612e41565b6001600160801b03165b905066b1a2bc2ec500006001600160801b0385166122ad670de0b6b3a764000084612e0b565b6122b79190612e22565b11949350505050565b5f54610100900460ff166122e65760405162461bcd60e51b815260040161095b90612e61565b6122ee61275f565b6106eb8161278d565b5f612301826118d1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603612355575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036123b557507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612eac565b5f806124417f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200846127b3565b915061246d7f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600846127b3565b9050915091565b61249f7f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20084846127fb565b6110837f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084836127fb565b5f805f806124d7866119d7565b87549091506001600160801b0380821691600160801b90048116905f90841683111561250f576125088a8986611a07565b5082915060015b816001600160801b0316846001600160801b0316111561253b576125348a8986611a77565b5082905060015b9199909850909650945050505050565b835460038501545f916125779186916001600160801b0380821692600160801b909204811691166126e0565b1561263a57600185015460ff1615808061258e5750825b156125b95760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b80156125d0576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a2600191505061220f565b600185015460ff161561220f57506001949350505050565b5f8085612663575083905080612686565b8385106126705783612672565b845b83861161267f5783612681565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006126f58482612cd6565b612708906001600160801b038816612e0b565b6127129190612e22565b90505f670de0b6b3a76400006127288582612df8565b61273b906001600160801b038816612e0b565b6127459190612e22565b90508187118061275457508087105b979650505050505050565b5f54610100900460ff166127855760405162461bcd60e51b815260040161095b90612e61565b610cbe612842565b5f54610100900460ff166106e25760405162461bcd60e51b815260040161095b90612e61565b5f8083836040516020016127da9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f83836040516020016128219291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff166128685760405162461bcd60e51b815260040161095b90612e61565b610cbe33611be9565b6001600160a01b03811681146106eb575f80fd5b5f60208284031215612895575f80fd5b8135610c7e81612871565b80356001600160801b0381168114611940575f80fd5b5f80604083850312156128c7575f80fd5b82356128d281612871565b91506128e0602084016128a0565b90509250929050565b602080825282518282018190525f9190848201906040850190845b818110156129295783516001600160a01b031683529284019291840191600101612904565b50909695505050505050565b80151581146106eb575f80fd5b5f8060408385031215612953575f80fd5b823561295e81612871565b9150602083013561296e81612935565b809150509250929050565b5f805f6060848603121561298b575f80fd5b833561299681612871565b95602085013595506040909401359392505050565b5f602082840312156129bb575f80fd5b5035919050565b80356001600160401b0381168114611940575f80fd5b5f805f805f60a086880312156129ec575f80fd5b85356129f781612871565b9450612a05602087016129c2565b935060408601359250606086013591506080860135612a2381612935565b809150509295509295909350565b5f8060408385031215612a42575f80fd5b8235612a4d81612871565b91506128e0602084016129c2565b5f8083601f840112612a6b575f80fd5b5081356001600160401b03811115612a81575f80fd5b6020830191508360208260051b8501011115612a9b575f80fd5b9250929050565b5f805f805f8060608789031215612ab7575f80fd5b86356001600160401b0380821115612acd575f80fd5b612ad98a838b01612a5b565b90985096506020890135915080821115612af1575f80fd5b612afd8a838b01612a5b565b90965094506040890135915080821115612b15575f80fd5b50612b2289828a01612a5b565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612b65578151151587529582019590820190600101612b47565b509495945050505050565b604081525f612b826040830185612b34565b8281036020840152612b948185612b34565b95945050505050565b5f805f805f805f805f8060a08b8d031215612bb6575f80fd5b8a356001600160401b0380821115612bcc575f80fd5b612bd88e838f01612a5b565b909c509a5060208d0135915080821115612bf0575f80fd5b612bfc8e838f01612a5b565b909a50985060408d0135915080821115612c14575f80fd5b612c208e838f01612a5b565b909850965060608d0135915080821115612c38575f80fd5b612c448e838f01612a5b565b909650945060808d0135915080821115612c5c575f80fd5b50612c698d828e01612a5b565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612ccf57612ccf612caa565b5060010190565b808201808211156119d1576119d1612caa565b5f60208284031215612cf9575f80fd5b610c7e826128a0565b5f60208284031215612d12575f80fd5b610c7e826129c2565b5f60208284031215612d2b575f80fd5b8135610c7e81612935565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061220f90830184612d36565b5f60208284031215612d97575f80fd5b8151610c7e81612935565b6001600160a01b038481168252831660208201526060604082018190525f90612b9490830184612d36565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612df1575f80fd5b5051919050565b818103818111156119d1576119d1612caa565b80820281158282048414176119d1576119d1612caa565b5f82612e3c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160801b0382811682821603908082111561136557611365612caa565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612ebc575f80fd5b8151610c7e8161287156fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e66696728616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429736574546f6b656e436f6e6669677328616464726573735b5d2c75696e7436345b5d2c75696e743235365b5d2c75696e743235365b5d2c626f6f6c5b5d29a26469706673582212200b0f1b644e888914e3b4b2add80a376b34c39798a4ea6a946e169ae33aada4b164736f6c63430008190033", + "devdoc": { + "author": "Venus", + "events": { + "Initialized(uint8)": { + "details": "Triggered when the contract has been initialized or reinitialized." + } + }, + "kind": "dev", + "methods": { + "acceptOwnership()": { + "details": "The new owner accepts the ownership transfer." + }, + "canExitProtection(address)": { + "details": "Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold", + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if protection can be disabled" + } + }, + "checkAndGetWindowDrift(address[],uint128[],uint128[])": { + "custom:error": "InvalidArrayLength if the input array lengths do not match", + "details": "Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)", + "params": { + "assets": "Array of asset addresses to check", + "proposedMaxs": "Keeper's off-chain window maximum prices", + "proposedMins": "Keeper's off-chain window minimum prices" + }, + "returns": { + "needsMaxUpdate": "Whether maxPrice drift exceeds deadband for each asset", + "needsMinUpdate": "Whether minPrice drift exceeds deadband for each asset" + } + }, + "constructor": { + "custom:oz-upgrades-unsafe-allow": "constructor", + "params": { + "_resilientOracle": "Address of the ResilientOracle contract", + "nativeMarketAddress": "The address of a native market (for bsc it would be vBNB address)", + "vaiAddress": "The address of the VAI token, or address(0) if VAI is not deployed on the chain." + } + }, + "currentlyUsingProtectedPrice(address)": { + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if the asset is currently using the protected price instead of spot" + } + }, + "exitProtectionMode(address)": { + "custom:access": "Only authorized monitor/keeper addresses", + "custom:error": "ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold", + "custom:event": "ProtectionModeExited", + "details": "Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold", + "params": { + "asset": "The underlying asset address" + } + }, + "getAllBoundedPricingEnabledAssets()": { + "details": "Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.", + "returns": { + "_0": "result Array of whitelisted asset addresses" + } + }, + "getBoundedCollateralPrice(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price" + } + }, + "getBoundedCollateralPriceView(address)": { + "details": "Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns min(spot, windowMin) when protection is active, spot otherwise.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price" + } + }, + "getBoundedDebtPrice(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "debtPrice": "The bounded debt price" + } + }, + "getBoundedDebtPriceView(address)": { + "details": "Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns max(spot, windowMax) when protection is active, spot otherwise.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "debtPrice": "The bounded debt price" + } + }, + "getBoundedPrices(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price", + "debtPrice": "The bounded debt price" + } + }, + "getBoundedPricesView(address)": { + "details": "Reads from transient cache first; falls back to ResilientOracle on cache miss.", + "params": { + "vToken": "vToken address" + }, + "returns": { + "collateralPrice": "The bounded collateral price", + "debtPrice": "The bounded debt price" + } + }, + "getInitializedAssets()": { + "returns": { + "_0": "Array of all initialized asset addresses" + } + }, + "initialize(address)": { + "params": { + "accessControlManager_": "Address of the access control manager contract" + } + }, + "isBoundedPricingEnabled(address)": { + "params": { + "asset": "The underlying asset address" + }, + "returns": { + "_0": "True if the asset is whitelisted" + } + }, + "owner()": { + "details": "Returns the address of the current owner." + }, + "pendingOwner()": { + "details": "Returns the address of the pending owner." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "setAccessControlManager(address)": { + "custom:access": "Only Governance", + "custom:event": "Emits NewAccessControlManager event", + "details": "Admin function to set address of AccessControlManager", + "params": { + "accessControlManager_": "The new address of the AccessControlManager" + } + }, + "setAssetBoundedPricingEnabled(address,bool)": { + "custom:access": "Only Governance", + "custom:error": "ProtectedPriceActive if trying to disable an asset while protection is active", + "custom:event": "BoundedPricingWhitelistUpdated", + "params": { + "asset": "The underlying asset address", + "enabled": "Whether bounded pricing should be enabled for the asset" + } + }, + "setCooldownPeriod(address,uint64)": { + "custom:access": "Only Governance", + "custom:event": "CooldownPeriodSet", + "params": { + "asset": "The underlying asset address", + "newCooldown": "The new cooldown period in seconds" + } + }, + "setThresholds(address,uint256,uint256)": { + "custom:access": "Only Governance", + "custom:error": "ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold", + "custom:event": "TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed", + "params": { + "asset": "The underlying asset address", + "newResetThreshold": "The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.", + "newTriggerThreshold": "The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold." + } + }, + "setTokenConfig(address,uint64,uint256,uint256,bool)": { + "custom:access": "Only Governance", + "custom:event": "ProtectionInitializedBoundedPricingWhitelistUpdated", + "params": { + "asset": "The underlying asset address", + "cooldownPeriod": "Minimum time protection stays active after last trigger", + "enableBoundedPricing": "Whether to enable bounded pricing immediately upon initialization", + "resetThreshold": "Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.", + "triggerThreshold": "Deviation threshold that activates protection (mantissa). Must be between 5% and 50%." + } + }, + "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])": { + "custom:access": "Only Governance", + "custom:error": "InvalidArrayLength if array lengths do not match", + "custom:event": "ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset", + "params": { + "assets": "Array of underlying asset addresses", + "cooldownPeriods": "Array of cooldown periods (seconds)", + "enableBoundedPricings": "Array of whether to enable bounded pricing per asset", + "resetThresholds": "Array of reset thresholds (mantissa)", + "triggerThresholds": "Array of trigger thresholds (mantissa)" + } + }, + "transferOwnership(address)": { + "details": "Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner." + }, + "updateMaxPrice(address,uint128)": { + "custom:access": "Only authorized keeper addresses", + "custom:event": "MaxPriceUpdated", + "details": "Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.", + "params": { + "asset": "The underlying asset address", + "newMax": "The new maximum price" + } + }, + "updateMinPrice(address,uint128)": { + "custom:access": "Only authorized keeper addresses", + "custom:event": "MinPriceUpdated", + "details": "Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.", + "params": { + "asset": "The underlying asset address", + "newMin": "The new minimum price" + } + }, + "updateProtectionState(address)": { + "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", + "details": "Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls.", + "params": { + "vToken": "vToken address" + } + } + }, + "stateVariables": { + "COLLATERAL_PRICE_CACHE_SLOT": { + "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/cache\")) - 1)) & ~bytes32(uint256(0xff))" + }, + "DEBT_PRICE_CACHE_SLOT": { + "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1)) & ~bytes32(uint256(0xff))" + }, + "RESILIENT_ORACLE": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + }, + "nativeMarket": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + }, + "vai": { + "custom:oz-upgrades-unsafe-allow": "state-variable-immutable" + } + }, + "title": "DeviationBoundedOracle", + "version": 1 + }, + "userdoc": { + "errors": { + "CooldownNotElapsed(address,uint64,uint64)": [ + { + "notice": "Thrown when trying to disable protection before cooldown has elapsed" + } + ], + "InvalidArrayLength()": [ + { + "notice": "Thrown when the lengths of the arrays are not equal" + } + ], + "InvalidMaxPrice(address,uint128,uint256)": [ + { + "notice": "Thrown when keeper tries to set maxPrice below current spot" + } + ], + "InvalidMinPrice(address,uint128,uint256)": [ + { + "notice": "Thrown when keeper tries to set minPrice above current spot" + } + ], + "InvalidResetThreshold(uint256)": [ + { + "notice": "Thrown when the exit threshold is set above the deviation threshold" + } + ], + "MarketAlreadyInitialized(address)": [ + { + "notice": "Thrown when trying to initialize an already initialized market" + } + ], + "MarketNotInitialized(address)": [ + { + "notice": "Thrown when trying to initialize protection for an asset that is not initialized" + } + ], + "PriceExceedsUint128(uint256)": [ + { + "notice": "Thrown when a price exceeds uint128 max" + } + ], + "PriceRangeNotConverged(address,uint256,uint256)": [ + { + "notice": "Thrown when trying to disable protection before price range has converged" + } + ], + "ProtectedPriceActive(address)": [ + { + "notice": "Thrown when trying to update for an asset with active protection" + } + ], + "ProtectedPriceInactive(address)": [ + { + "notice": "Thrown when trying to disable protection that is not active" + } + ], + "ThresholdAboveMaximum(uint256,uint256)": [ + { + "notice": "Thrown when threshold is set above the maximum allowed value" + } + ], + "ThresholdBelowMinimum(uint256,uint256)": [ + { + "notice": "Thrown when threshold is set below the minimum allowed value" + } + ], + "Unauthorized(address,address,string)": [ + { + "notice": "Thrown when the action is prohibited by AccessControlManager" + } + ], + "VAINotAllowed()": [ + { + "notice": "Thrown when trying to initialize protection for VAI" + } + ], + "ZeroAddressNotAllowed()": [ + { + "notice": "Thrown if the supplied address is a zero address where it is not allowed" + } + ], + "ZeroPriceNotAllowed()": [ + { + "notice": "Thrown when a zero price is provided where a non-zero price is required" + } + ], + "ZeroValueNotAllowed()": [ + { + "notice": "Thrown if the supplied value is 0 where it is not allowed" + } + ] + }, + "events": { + "BoundedPricingWhitelistUpdated(address,bool)": { + "notice": "Emitted when an asset's whitelist status changes" + }, + "CooldownPeriodSet(address,uint64,uint64)": { + "notice": "Emitted when the cooldown period is updated for an asset" + }, + "MaxPriceUpdated(address,uint128,uint128)": { + "notice": "Emitted when the keeper updates the maximum price for an asset" + }, + "MinPriceUpdated(address,uint128,uint128)": { + "notice": "Emitted when the keeper updates the minimum price for an asset" + }, + "NewAccessControlManager(address,address)": { + "notice": "Emitted when access control manager contract address is changed" + }, + "ProtectionInitialized(address,uint128,uint128,uint64,uint256)": { + "notice": "Emitted when protection is initialized for an asset" + }, + "ProtectionModeExited(address)": { + "notice": "Emitted when protection mode is disabled for an asset" + }, + "ProtectionTriggered(address,uint256,uint128,uint128)": { + "notice": "Emitted when protection mode is triggered for an asset" + }, + "ResetThresholdSet(address,uint256,uint256)": { + "notice": "Emitted when the exit threshold is updated for an asset" + }, + "TriggerThresholdSet(address,uint256,uint256)": { + "notice": "Emitted when the entry threshold is updated for an asset" + } + }, + "kind": "user", + "methods": { + "COLLATERAL_PRICE_CACHE_SLOT()": { + "notice": "Transient storage slot for caching final collateral prices within a transaction" + }, + "DEBT_PRICE_CACHE_SLOT()": { + "notice": "Transient storage slot for caching final debt prices within a transaction" + }, + "KEEPER_DEADBAND()": { + "notice": "Keeper deadband threshold (5%) — min/max corrections below this are suppressed" + }, + "MAX_THRESHOLD()": { + "notice": "Maximum allowed threshold value (50%)" + }, + "MIN_THRESHOLD()": { + "notice": "Minimum allowed threshold value (5%) to account for keeper deadband" + }, + "NATIVE_TOKEN_ADDR()": { + "notice": "Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens" + }, + "RESILIENT_ORACLE()": { + "notice": "Resilient Oracle used to fetch spot prices" + }, + "accessControlManager()": { + "notice": "Returns the address of the access control manager contract" + }, + "allAssets(uint256)": { + "notice": "Append-only array of all assets ever initialized, used for enumeration" + }, + "assetProtectionConfig(address)": { + "notice": "Per-asset protection state" + }, + "canExitProtection(address)": { + "notice": "Checks if protection can be exited for an asset" + }, + "checkAndGetWindowDrift(address[],uint128[],uint128[])": { + "notice": "Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values" + }, + "constructor": { + "notice": "Constructor for the implementation contract. Sets immutable variables." + }, + "currentlyUsingProtectedPrice(address)": { + "notice": "Checks if the asset is currently using the protected (bounded) price" + }, + "exitProtectionMode(address)": { + "notice": "Exits protection mode for a given asset" + }, + "getAllBoundedPricingEnabledAssets()": { + "notice": "Returns all currently whitelisted asset addresses" + }, + "getBoundedCollateralPrice(address)": { + "notice": "Gets the bounded collateral price for a given vToken, updating protection state" + }, + "getBoundedCollateralPriceView(address)": { + "notice": "Gets the bounded collateral price for a given vToken (view variant)" + }, + "getBoundedDebtPrice(address)": { + "notice": "Gets the bounded debt price for a given vToken, updating protection state" + }, + "getBoundedDebtPriceView(address)": { + "notice": "Gets the bounded debt price for a given vToken (view variant)" + }, + "getBoundedPrices(address)": { + "notice": "Gets both the bounded collateral and debt prices for a given vToken, updating protection state" + }, + "getBoundedPricesView(address)": { + "notice": "Gets both the bounded collateral and debt prices for a given vToken (view variant)" + }, + "getInitializedAssets()": { + "notice": "Returns all asset addresses that have ever been initialized" + }, + "initialize(address)": { + "notice": "Initializes the contract admin" + }, + "isBoundedPricingEnabled(address)": { + "notice": "Checks if an asset is whitelisted for bounded pricing" + }, + "nativeMarket()": { + "notice": "Native market address" + }, + "setAccessControlManager(address)": { + "notice": "Sets the address of AccessControlManager" + }, + "setAssetBoundedPricingEnabled(address,bool)": { + "notice": "Sets whether an asset is enabled for bounded pricing" + }, + "setCooldownPeriod(address,uint64)": { + "notice": "Sets the cooldown period for an asset" + }, + "setThresholds(address,uint256,uint256)": { + "notice": "Sets the trigger and reset thresholds for an asset" + }, + "setTokenConfig(address,uint64,uint256,uint256,bool)": { + "notice": "Initializes protection for a new asset" + }, + "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])": { + "notice": "Batch-initializes protection for multiple assets in a single transaction" + }, + "updateMaxPrice(address,uint128)": { + "notice": "Updates the maximum price in the rolling window for a given asset" + }, + "updateMinPrice(address,uint128)": { + "notice": "Updates the minimum price in the rolling window for a given asset" + }, + "updateProtectionState(address)": { + "notice": "Fetches the spot price, updates the protection window, and caches the resolved bounded prices in transient storage for the duration of the transaction." + }, + "vai()": { + "notice": "VAI address" + } + }, + "notice": "The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low - Debt is valued at max(spot, windowMax) — floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.", + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 246, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 249, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 788, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 118, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_owner", + "offset": 0, + "slot": "51", + "type": "t_address" + }, + { + "astId": 238, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "52", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 11, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_pendingOwner", + "offset": 0, + "slot": "101", + "type": "t_address" + }, + { + "astId": 105, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "102", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 979, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "_accessControlManager", + "offset": 0, + "slot": "151", + "type": "t_contract(IAccessControlManagerV8)1164" + }, + { + "astId": 984, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 1281, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "assetProtectionConfig", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_address,t_struct(MarketProtectionState)3209_storage)" + }, + { + "astId": 1285, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "allAssets", + "offset": 0, + "slot": "202", + "type": "t_array(t_address)dyn_storage" + }, + { + "astId": 1290, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "__gap", + "offset": 0, + "slot": "203", + "type": "t_array(t_uint256)48_storage" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)48_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[48]", + "numberOfBytes": "1536" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_contract(IAccessControlManagerV8)1164": { + "encoding": "inplace", + "label": "contract IAccessControlManagerV8", + "numberOfBytes": "20" + }, + "t_mapping(t_address,t_struct(MarketProtectionState)3209_storage)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => struct IDeviationBoundedOracle.MarketProtectionState)", + "numberOfBytes": "32", + "value": "t_struct(MarketProtectionState)3209_storage" + }, + "t_struct(MarketProtectionState)3209_storage": { + "encoding": "inplace", + "label": "struct IDeviationBoundedOracle.MarketProtectionState", + "members": [ + { + "astId": 3184, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "minPrice", + "offset": 0, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 3187, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "maxPrice", + "offset": 16, + "slot": "0", + "type": "t_uint128" + }, + { + "astId": 3190, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "currentlyUsingProtectedPrice", + "offset": 0, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 3193, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "isBoundedPricingEnabled", + "offset": 1, + "slot": "1", + "type": "t_bool" + }, + { + "astId": 3196, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "lastProtectionTriggeredAt", + "offset": 2, + "slot": "1", + "type": "t_uint64" + }, + { + "astId": 3199, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "cooldownPeriod", + "offset": 10, + "slot": "1", + "type": "t_uint64" + }, + { + "astId": 3202, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "asset", + "offset": 0, + "slot": "2", + "type": "t_address" + }, + { + "astId": 3205, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "triggerThreshold", + "offset": 0, + "slot": "3", + "type": "t_uint128" + }, + { + "astId": 3208, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "resetThreshold", + "offset": 16, + "slot": "3", + "type": "t_uint128" + } + ], + "numberOfBytes": "128" + }, + "t_uint128": { + "encoding": "inplace", + "label": "uint128", + "numberOfBytes": "16" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} diff --git a/deployments/bsctestnet/DeviationBoundedOracle_Proxy.json b/deployments/bsctestnet/DeviationBoundedOracle_Proxy.json new file mode 100644 index 00000000..551eaaab --- /dev/null +++ b/deployments/bsctestnet/DeviationBoundedOracle_Proxy.json @@ -0,0 +1,262 @@ +{ + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ], + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "receipt": { + "to": null, + "from": "0x4cD6300F5cb8D6BbA5E646131c3522664C10dF11", + "contractAddress": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "transactionIndex": 0, + "gasUsed": "589317", + "logsBloom": "0x00000000000000000000000000000000400000000000000000800000000000000000000000000000000000000020000000000000000000000000000000008000000000000000000000000000000002000001000000000000000000000000000000000000020000000000000000000800000000800000000000000000000000400000000000000000000000000002000000100000000080000000000000800000000000000000000000000000080440000000000000800000000000000000000000000020008000000000000000040000000000000400000000000000200020001000000000000000000000000000000000000880000000000000000000000000", + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32", + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "logs": [ + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": [ + "0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b", + "0x00000000000000000000000028f9576ec8d73331cda7f0a6fac88b0ca4d41e3f" + ], + "data": "0x", + "logIndex": 0, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x0000000000000000000000004cd6300f5cb8d6bba5e646131c3522664c10df11" + ], + "data": "0x", + "logIndex": 1, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0"], + "data": "0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000045f8a08f534f34a97187626e05d4b6648eeaa9aa", + "logIndex": 2, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 3, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + }, + { + "transactionIndex": 0, + "blockNumber": 102770929, + "transactionHash": "0xdaf70e4f278b5bc496fd14f91f26044bb85d4772d1f7f1b954a60040e81e94a4", + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "topics": ["0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"], + "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ef480a5654b231ff7d80a0681f938f3db71a6ca6", + "logIndex": 4, + "blockHash": "0x018962ed107006d4fcad6ef22d2b2b9e0b56ab825637934a82f147c1bca15c32" + } + ], + "blockNumber": 102770929, + "cumulativeGasUsed": "589317", + "status": 1, + "byzantium": true + }, + "args": [ + "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "0xef480a5654b231ff7d80A0681F938f3Db71a6Ca6", + "0xc4d66de800000000000000000000000045f8a08f534f34a97187626e05d4b6648eeaa9aa" + ], + "numDeployments": 1, + "solcInputHash": "fad126030085a626952462c92d5fc265", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_logic\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"AdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"beacon\",\"type\":\"address\"}],\"name\":\"BeaconUpgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"admin_\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"implementation_\",\"type\":\"address\"}],\"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\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"details\":\"This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \\\"admin cannot fallback to proxy target\\\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\",\"events\":{\"AdminChanged(address,address)\":{\"details\":\"Emitted when the admin account has changed.\"},\"BeaconUpgraded(address)\":{\"details\":\"Emitted when the beacon is upgraded.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"admin()\":{\"details\":\"Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\"},\"constructor\":{\"details\":\"Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\"},\"implementation()\":{\"details\":\"Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\"},\"upgradeTo(address)\":{\"details\":\"Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\"},\"upgradeToAndCall(address,bytes)\":{\"details\":\"Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":\"OptimizedTransparentUpgradeableProxy\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\\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\",\"keccak256\":\"0x93b4e21c931252739a1ec13ea31d3d35a5c068be3163ccab83e4d70c40355f03\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../Proxy.sol\\\";\\nimport \\\"./ERC1967Upgrade.sol\\\";\\n\\n/**\\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\\n * implementation address that can be changed. This address is stored in storage in the location specified by\\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\\n * implementation behind the proxy.\\n */\\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\\n /**\\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\\n *\\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\\n */\\n constructor(address _logic, bytes memory _data) payable {\\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.implementation\\\")) - 1));\\n _upgradeToAndCall(_logic, _data, false);\\n }\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _implementation() internal view virtual override returns (address impl) {\\n return ERC1967Upgrade._getImplementation();\\n }\\n}\\n\",\"keccak256\":\"0x6309f9f39dc6f4f45a24f296543867aa358e32946cd6b2874627a996d606b3a0\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../beacon/IBeacon.sol\\\";\\nimport \\\"../../interfaces/draft-IERC1822.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/StorageSlot.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 *\\n * @custom:oz-upgrades-unsafe-allow delegatecall\\n */\\nabstract contract ERC1967Upgrade {\\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 /**\\n * @dev Emitted when the implementation is upgraded.\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @dev Returns the current implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newImplementation), \\\"ERC1967: new implementation is not a contract\\\");\\n StorageSlot.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _upgradeTo(newImplementation);\\n if (data.length > 0 || forceCall) {\\n Address.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(\\n address newImplementation,\\n bytes memory data,\\n bool forceCall\\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\\n _setImplementation(newImplementation);\\n } else {\\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _getAdmin() internal view virtual returns (address) {\\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\\n */\\n event BeaconUpgraded(address indexed beacon);\\n\\n /**\\n * @dev Returns the current beacon.\\n */\\n function _getBeacon() internal view returns (address) {\\n return StorageSlot.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(Address.isContract(newBeacon), \\\"ERC1967: new beacon is not a contract\\\");\\n require(Address.isContract(IBeacon(newBeacon).implementation()), \\\"ERC1967: beacon implementation is not a contract\\\");\\n StorageSlot.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(\\n address newBeacon,\\n bytes memory data,\\n bool forceCall\\n ) internal {\\n _setBeacon(newBeacon);\\n emit BeaconUpgraded(newBeacon);\\n if (data.length > 0 || forceCall) {\\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x17668652127feebed0ce8d9431ef95ccc8c4292f03e3b8cf06c6ca16af396633\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\\n * be specified by overriding the virtual {_implementation} function.\\n *\\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\\n * different contract through the {_delegate} function.\\n *\\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\\n */\\nabstract contract Proxy {\\n /**\\n * @dev Delegates the current call to `implementation`.\\n *\\n * This function does not return to its internal call site, it will return directly to the external caller.\\n */\\n function _delegate(address implementation) internal virtual {\\n assembly {\\n // Copy msg.data. We take full control of memory in this inline assembly\\n // block because it will not return to Solidity code. We overwrite the\\n // Solidity scratch pad at memory position 0.\\n calldatacopy(0, 0, calldatasize())\\n\\n // Call the implementation.\\n // out and outsize are 0 because we don't know the size yet.\\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\\n\\n // Copy the returned data.\\n returndatacopy(0, 0, returndatasize())\\n\\n switch result\\n // delegatecall returns 0 on error.\\n case 0 {\\n revert(0, returndatasize())\\n }\\n default {\\n return(0, returndatasize())\\n }\\n }\\n }\\n\\n /**\\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\\n * and {_fallback} should delegate.\\n */\\n function _implementation() internal view virtual returns (address);\\n\\n /**\\n * @dev Delegates the current call to the address returned by `_implementation()`.\\n *\\n * This function does not return to its internall call site, it will return directly to the external caller.\\n */\\n function _fallback() internal virtual {\\n _beforeFallback();\\n _delegate(_implementation());\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\\n * function in the contract matches the call data.\\n */\\n fallback() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\\n * is empty.\\n */\\n receive() external payable virtual {\\n _fallback();\\n }\\n\\n /**\\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\\n * call, or as part of the Solidity `fallback` or `receive` functions.\\n *\\n * If overriden should call `super._beforeFallback()`.\\n */\\n function _beforeFallback() internal virtual {}\\n}\\n\",\"keccak256\":\"0xd5d1fd16e9faff7fcb3a52e02a8d49156f42a38a03f07b5f1810c21c2149a8ab\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol\":{\"content\":\"// 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 IBeacon {\\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\",\"keccak256\":\"0xd50a3421ac379ccb1be435fa646d66a65c986b4924f0849839f08692f39dde61\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\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 *\\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \\\"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(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) 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 require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(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 require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason 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 // 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\\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}\\n\",\"keccak256\":\"0x3777e696b62134e6177440dbe6e6601c0c156a443f57167194b67e75527439de\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\\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 * ```\\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`, and `uint256`._\\n */\\nlibrary StorageSlot {\\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 /**\\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\\n */\\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\\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 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 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 assembly {\\n r.slot := slot\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe1b7a9aa2a530a9e705b220e26cd584e2fbdc9602a3a1066032b12816b46aca\",\"license\":\"MIT\"},\"hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\\\";\\n\\n/**\\n * @dev This contract implements a proxy that is upgradeable by an admin.\\n *\\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\\n * clashing], which can potentially be used in an attack, this contract uses the\\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\\n * things that go hand in hand:\\n *\\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\\n * that call matches one of the admin functions exposed by the proxy itself.\\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\\n * \\\"admin cannot fallback to proxy target\\\".\\n *\\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\\n * to sudden errors when trying to call a function from the proxy implementation.\\n *\\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\\n */\\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\\n address internal immutable _ADMIN;\\n\\n /**\\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\\n */\\n constructor(\\n address _logic,\\n address admin_,\\n bytes memory _data\\n ) payable ERC1967Proxy(_logic, _data) {\\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\\\"eip1967.proxy.admin\\\")) - 1));\\n _ADMIN = admin_;\\n\\n // still store it to work with EIP-1967\\n bytes32 slot = _ADMIN_SLOT;\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n sstore(slot, admin_)\\n }\\n emit AdminChanged(address(0), admin_);\\n }\\n\\n /**\\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\\n */\\n modifier ifAdmin() {\\n if (msg.sender == _getAdmin()) {\\n _;\\n } else {\\n _fallback();\\n }\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\\n */\\n function admin() external ifAdmin returns (address admin_) {\\n admin_ = _getAdmin();\\n }\\n\\n /**\\n * @dev Returns the current implementation.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\\n *\\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\\n */\\n function implementation() external ifAdmin returns (address implementation_) {\\n implementation_ = _implementation();\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\\n */\\n function upgradeTo(address newImplementation) external ifAdmin {\\n _upgradeToAndCall(newImplementation, bytes(\\\"\\\"), false);\\n }\\n\\n /**\\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\\n * proxied contract.\\n *\\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\\n */\\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\\n _upgradeToAndCall(newImplementation, data, true);\\n }\\n\\n /**\\n * @dev Returns the current admin.\\n */\\n function _admin() internal view virtual returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\\n */\\n function _beforeFallback() internal virtual override {\\n require(msg.sender != _getAdmin(), \\\"TransparentUpgradeableProxy: admin cannot fallback to proxy target\\\");\\n super._beforeFallback();\\n }\\n\\n function _getAdmin() internal view virtual override returns (address) {\\n return _ADMIN;\\n }\\n}\\n\",\"keccak256\":\"0xa30117644e27fa5b49e162aae2f62b36c1aca02f801b8c594d46e2024963a534\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a0604052604051610c8f380380610c8f8339810160408190526100229161039f565b828161004f60017f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbd61046a565b5f80516020610c488339815191521461006a5761006a610489565b61007582825f610123565b506100a3905060017fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610461046a565b5f80516020610c28833981519152146100be576100be610489565b6001600160a01b03821660808190525f80516020610c28833981519152838155604080515f8152602081019390935290917f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a1505050506104e8565b61012c8361014e565b5f825111806101385750805b1561014957610147838361018d565b505b505050565b610157816101bb565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606101b28383604051806060016040528060278152602001610c686027913961025b565b90505b92915050565b6001600160a01b0381163b61022d5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084015b60405180910390fd5b5f80516020610c4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6102c35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610224565b5f80856001600160a01b0316856040516102dd919061049d565b5f60405180830381855af49150503d805f8114610315576040519150601f19603f3d011682016040523d82523d5f602084013e61031a565b606091505b50909250905061032b828286610337565b925050505b9392505050565b60608315610346575081610330565b8251156103565782518084602001fd5b8160405162461bcd60e51b815260040161022491906104b3565b80516001600160a01b0381168114610386575f80fd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f805f606084860312156103b1575f80fd5b6103ba84610370565b92506103c860208501610370565b60408501519092506001600160401b03808211156103e4575f80fd5b818601915086601f8301126103f7575f80fd5b8151818111156104095761040961038b565b604051601f8201601f19908116603f011681019083821181831017156104315761043161038b565b81604052828152896020848701011115610449575f80fd5b8260208601602083015e5f6020848301015280955050505050509250925092565b818103818111156101b557634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52600160045260245ffd5b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b6080516107066105225f395f818160eb0152818161013f015281816101bf0152818161020801528181610239015261025d01526107065ff3fe608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564", + "deployedBytecode": "0x608060405260043610610042575f3560e01c80633659cfe6146100595780634f1ef286146100785780635c60da1b1461008b578063f851a440146100bb57610051565b366100515761004f6100cf565b005b61004f6100cf565b348015610064575f80fd5b5061004f6100733660046105c9565b6100e9565b61004f6100863660046105e2565b61013d565b348015610096575f80fd5b5061009f6101bc565b6040516001600160a01b03909116815260200160405180910390f35b3480156100c6575f80fd5b5061009f610205565b6100d761025b565b6100e76100e2610309565b61033b565b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03163303610135576101328160405180602001604052805f8152505f610359565b50565b6101326100cf565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101b4576101af8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525060019250610359915050565b505050565b6101af6100cf565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa576101f5610309565b905090565b6102026100cf565b90565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036101fa57507f000000000000000000000000000000000000000000000000000000000000000090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036100e75760405162461bcd60e51b815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f78792074617267606482015261195d60f21b608482015260a4015b60405180910390fd5b5f6101f57f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc546001600160a01b031690565b365f80375f80365f845af43d5f803e808015610355573d5ff35b3d5ffd5b61036283610383565b5f8251118061036e5750805b156101af5761037d83836103c2565b50505050565b61038c816103ee565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b60606103e783836040518060600160405280602781526020016106aa6027913961049c565b9392505050565b6001600160a01b0381163b61045b5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610300565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc80546001600160a01b0319166001600160a01b0392909216919091179055565b60606001600160a01b0384163b6105045760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610300565b5f80856001600160a01b03168560405161051e919061065e565b5f60405180830381855af49150503d805f8114610556576040519150601f19603f3d011682016040523d82523d5f602084013e61055b565b606091505b509150915061056b828286610575565b9695505050505050565b606083156105845750816103e7565b8251156105945782518084602001fd5b8160405162461bcd60e51b81526004016103009190610674565b80356001600160a01b03811681146105c4575f80fd5b919050565b5f602082840312156105d9575f80fd5b6103e7826105ae565b5f805f604084860312156105f4575f80fd5b6105fd846105ae565b9250602084013567ffffffffffffffff80821115610619575f80fd5b818601915086601f83011261062c575f80fd5b81358181111561063a575f80fd5b87602082850101111561064b575f80fd5b6020830194508093505050509250925092565b5f82518060208501845e5f920191825250919050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f8301168401019150509291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a2646970667358221220d447ec2a4b47962d9e959ca0ec6571d77747999259501e773b66fdcaef0e50bf64736f6c63430008190033", + "devdoc": { + "details": "This contract implements a proxy that is upgradeable by an admin. To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector clashing], which can potentially be used in an attack, this contract uses the https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two things that go hand in hand: 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if that call matches one of the admin functions exposed by the proxy itself. 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the implementation. If the admin tries to call a function on the implementation it will fail with an error that says \"admin cannot fallback to proxy target\". These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due to sudden errors when trying to call a function from the proxy implementation. Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way, you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.", + "events": { + "AdminChanged(address,address)": { + "details": "Emitted when the admin account has changed." + }, + "BeaconUpgraded(address)": { + "details": "Emitted when the beacon is upgraded." + }, + "Upgraded(address)": { + "details": "Emitted when the implementation is upgraded." + } + }, + "kind": "dev", + "methods": { + "admin()": { + "details": "Returns the current admin. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`" + }, + "constructor": { + "details": "Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}." + }, + "implementation()": { + "details": "Returns the current implementation. NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}. TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`" + }, + "upgradeTo(address)": { + "details": "Upgrade the implementation of the proxy. NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}." + }, + "upgradeToAndCall(address,bytes)": { + "details": "Upgrade the implementation of the proxy, and then call a function from the new implementation as specified by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the proxied contract. NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [], + "types": null + } +} diff --git a/deployments/bsctestnet/solcInputs/4e92f74ff4913274028244b68ad09cb7.json b/deployments/bsctestnet/solcInputs/4e92f74ff4913274028244b68ad09cb7.json new file mode 100644 index 00000000..84766072 --- /dev/null +++ b/deployments/bsctestnet/solcInputs/4e92f74ff4913274028244b68ad09cb7.json @@ -0,0 +1,88 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\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" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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 /**\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" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// 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 IAccessControl {\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" + }, + "@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/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport \"./IAccessControlManagerV8.sol\";\n\n/**\n * @title AccessControlledV8\n * @author Venus\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\n */\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\n /// @notice Access control manager contract\n IAccessControlManagerV8 internal _accessControlManager;\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 /// @notice Emitted when access control manager contract address is changed\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\n\n /// @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\n __Ownable2Step_init();\n __AccessControlled_init_unchained(accessControlManager_);\n }\n\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Sets the address of AccessControlManager\n * @dev Admin function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n * @custom:event Emits NewAccessControlManager event\n * @custom:access Only Governance\n */\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Returns the address of the access control manager contract\n */\n function accessControlManager() external view returns (IAccessControlManagerV8) {\n return _accessControlManager;\n }\n\n /**\n * @dev Internal function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n */\n function _setAccessControlManager(address accessControlManager_) internal {\n require(address(accessControlManager_) != address(0), \"invalid acess control manager address\");\n address oldAccessControlManager = address(_accessControlManager);\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/access/IAccessControl.sol\";\n\n/**\n * @title IAccessControlManagerV8\n * @author Venus\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\n */\ninterface IAccessControlManagerV8 is IAccessControl {\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\n\n function revokeCallPermission(\n address contractAddress,\n string calldata functionSig,\n address accountToRevoke\n ) external;\n\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\n\n function hasPermission(\n address account,\n address contractAddress,\n string calldata functionSig\n ) external view 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/DeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { ResilientOracleInterface } from \"./interfaces/OracleInterface.sol\";\nimport { IDeviationBoundedOracle } from \"./interfaces/IDeviationBoundedOracle.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title DeviationBoundedOracle\n * @author Venus\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\n *\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\n * significantly from the window bounds, protection mode activates automatically and conservative\n * pricing kicks in:\n * - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low\n * - Debt is valued at max(spot, windowMax) — floors debt value at recent window high\n *\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\n * off-chain monitoring systems.\n *\n * The oracle exposes both view and non-view price functions. The non-view variants update the\n * price window and trigger protection. The view variants read stored state only. A transient\n * price cache avoids redundant ResilientOracle calls within the same transaction when\n * updateProtectionState is called before the view price reads.\n */\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\n uint256 public constant MIN_THRESHOLD = 5e16;\n\n /// @notice Maximum allowed threshold value (50%)\n uint256 public constant MAX_THRESHOLD = 50e16;\n\n /// @notice Keeper deadband threshold (5%) — min/max corrections below this are suppressed\n uint256 public constant KEEPER_DEADBAND = 5e16;\n\n /// @notice Resilient Oracle used to fetch spot prices\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Transient storage slot for caching final collateral prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/cache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\n 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200;\n\n /// @notice Transient storage slot for caching final debt prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Per-asset protection state\n mapping(address => MarketProtectionState) public assetProtectionConfig;\n\n /// @notice Append-only array of all assets ever initialized, used for enumeration\n address[] public allAssets;\n\n /// @notice Storage gap for upgrades\n uint256[48] private __gap;\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param _resilientOracle Address of the ResilientOracle contract\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\n ensureNonzeroAddress(address(_resilientOracle));\n ensureNonzeroAddress(nativeMarketAddress);\n RESILIENT_ORACLE = _resilientOracle;\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n // ----- Non-view price functions (update window + trigger protection) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (lower) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (higher) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns both conservative prices in a single call.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\n return _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\n * bounded prices in transient storage for the duration of the transaction.\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\n * instead of querying ResilientOracle again, keeping those functions as `view` and\n * avoiding redundant oracle calls.\n * @param vToken vToken address\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external {\n _updateAndGetBoundedPrices(vToken);\n }\n\n // ----- View price functions (read stored/cached state only) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\n * in the same transaction). Falls back to ResilientOracle on cache miss.\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\n (collateralPrice, ) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\n * in the same transaction). Falls back to ResilientOracle on cache miss.\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\n (, debtPrice) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\n return _computeBoundedPrices(vToken);\n }\n\n // ----- Keeper functions -----\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\n * Constraint: newMin must be at or below the current spot price.\n * @param asset The underlying asset address\n * @param newMin The new minimum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external {\n _checkAccessAllowed(\"updateMinPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\n }\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\n * Constraint: newMax must be at or above the current spot price.\n * @param asset The underlying asset address\n * @param newMax The new maximum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external {\n _checkAccessAllowed(\"updateMaxPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\n }\n\n /**\n * @notice Exits protection mode for a given asset\n * @dev Called by the keeper/monitor after confirming price has normalised.\n * Enforces two conditions on-chain:\n * 1. Cooldown period has elapsed since the last trigger\n * 2. Price range has converged below the exit threshold\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external {\n _checkAccessAllowed(\"exitProtectionMode(address)\");\n ensureNonzeroAddress(asset);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\n\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\n }\n\n // exit protected price if price range has converged below exit threshold\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\n if (rangeRatio >= state.resetThreshold) {\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\n }\n\n state.currentlyUsingProtectedPrice = false;\n state.lastProtectionTriggeredAt = 0;\n emit ProtectionModeExited(asset);\n }\n\n // ----- Admin functions (governance-gated) -----\n\n /**\n * @notice Initializes protection for a new asset\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after last trigger\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\n * @custom:access Only Governance\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold,\n bool enableBoundedPricing\n ) external {\n _checkAccessAllowed(\"setTokenConfig(address,uint64,uint256,uint256,bool)\");\n _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing);\n }\n\n /**\n * @notice Batch-initializes protection for multiple assets in a single transaction\n * @param assets Array of underlying asset addresses\n * @param cooldownPeriods Array of cooldown periods (seconds)\n * @param triggerThresholds Array of trigger thresholds (mantissa)\n * @param resetThresholds Array of reset thresholds (mantissa)\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if array lengths do not match\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(\n address[] calldata assets,\n uint64[] calldata cooldownPeriods,\n uint256[] calldata triggerThresholds,\n uint256[] calldata resetThresholds,\n bool[] calldata enableBoundedPricings\n ) external {\n _checkAccessAllowed(\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\");\n uint256 len = assets.length;\n if (\n len == 0 ||\n len != cooldownPeriods.length ||\n len != triggerThresholds.length ||\n len != resetThresholds.length ||\n len != enableBoundedPricings.length\n ) revert InvalidArrayLength();\n\n for (uint256 i; i < len; ++i) {\n _setTokenConfig(\n assets[i],\n cooldownPeriods[i],\n triggerThresholds[i],\n resetThresholds[i],\n enableBoundedPricings[i]\n );\n }\n }\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds\n * @custom:access Only Governance\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\n _checkAccessAllowed(\"setCooldownPeriod(address,uint64)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newCooldown);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\n state.cooldownPeriod = newCooldown;\n }\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\n _checkAccessAllowed(\"setThresholds(address,uint256,uint256)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newTriggerThreshold);\n ensureNonzeroValue(newResetThreshold);\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (newTriggerThreshold != state.triggerThreshold) {\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\n state.triggerThreshold = uint128(newTriggerThreshold);\n }\n if (newResetThreshold != state.resetThreshold) {\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\n state.resetThreshold = uint128(newResetThreshold);\n }\n }\n\n /**\n * @notice Sets whether an asset is enabled for bounded pricing\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setAssetBoundedPricingEnabled(address,bool)\");\n ensureNonzeroAddress(asset);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!enabled && state.currentlyUsingProtectedPrice) {\n revert ProtectedPriceActive(asset);\n }\n\n if (state.isBoundedPricingEnabled == enabled) return;\n\n // reset the window if re-enabling\n if (enabled) {\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n _setMinPrice(state, asset, spotU128);\n _setMaxPrice(state, asset, spotU128);\n }\n\n state.isBoundedPricingEnabled = enabled;\n emit BoundedPricingWhitelistUpdated(asset, enabled);\n }\n\n // ----- View helpers -----\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory) {\n return allAssets;\n }\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\n }\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\n }\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\n * Gas-free for off-chain callers.\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\n uint256 len = allAssets.length;\n address[] memory temp = new address[](len);\n uint256 count;\n for (uint256 i; i < len; ++i) {\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\n temp[count++] = allAssets[i];\n }\n }\n address[] memory result = new address[](count);\n for (uint256 i; i < count; ++i) {\n result[i] = temp[i];\n }\n return result;\n }\n\n /**\n * @notice Checks if protection can be exited for an asset\n * @dev Returns true when both conditions are met:\n * 1. Cooldown period has elapsed since last trigger\n * 2. Price range has converged below exit threshold\n * @param asset The underlying asset address\n * @return True if protection can be disabled\n */\n function canExitProtection(address asset) external view returns (bool) {\n MarketProtectionState storage state = assetProtectionConfig[asset];\n return\n state.currentlyUsingProtectedPrice &&\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\n }\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\n * from the keeper's proposed window values\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's off-chain window minimum prices\n * @param proposedMaxs Keeper's off-chain window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\n uint256 len = assets.length;\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\n\n needsMinUpdate = new bool[](len);\n needsMaxUpdate = new bool[](len);\n\n for (uint256 i; i < len; ++i) {\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\n }\n }\n\n // ----- Internal functions -----\n\n /**\n * @notice Initializes protection parameters and price window for a single asset\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\n * spot so the window expands naturally as prices move. Can only be called once per asset.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after last trigger\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n */\n function _setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold,\n bool enableBoundedPricing\n ) internal {\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(cooldownPeriod);\n ensureNonzeroValue(triggerThreshold);\n ensureNonzeroValue(resetThreshold);\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\n if (asset == vai) revert VAINotAllowed();\n\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n\n assetProtectionConfig[asset] = MarketProtectionState({\n minPrice: spotU128,\n maxPrice: spotU128,\n currentlyUsingProtectedPrice: false,\n isBoundedPricingEnabled: enableBoundedPricing,\n lastProtectionTriggeredAt: 0,\n cooldownPeriod: cooldownPeriod,\n asset: asset,\n triggerThreshold: uint128(triggerThreshold),\n resetThreshold: uint128(resetThreshold)\n });\n\n allAssets.push(asset);\n\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\n }\n\n /**\n * @notice Validates and applies a keeper-provided min or max price update\n * @param asset The underlying asset address\n * @param newPrice The new price value to set\n * @param boundType Whether this is a MIN or MAX bound update\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice\n */\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\n ensureNonzeroAddress(asset);\n if (newPrice == 0) revert ZeroPriceNotAllowed();\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n uint256 currentSpot = _fetchSpotPrice(asset);\n if (boundType == PriceBoundType.MIN) {\n if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot)\n revert InvalidMinPrice(asset, newPrice, currentSpot);\n _setMinPrice(state, asset, newPrice);\n } else if (boundType == PriceBoundType.MAX) {\n if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot)\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\n _setMaxPrice(state, asset, newPrice);\n }\n }\n\n /**\n * @notice Shared non-view logic for all bounded price functions.\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n */\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // return early if failure from resilient oracle to prevent cold SLOAD\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) {\n _setCachedPrices(asset, spot, spot);\n return (spot, spot);\n }\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\n _setCachedPrices(asset, minPrice, maxPrice);\n }\n\n /**\n * @dev Expands the price window toward extremes if the spot price is a new min or max\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n */\n function _expandPriceWindow(\n MarketProtectionState storage state,\n uint256 spot,\n address asset\n ) internal returns (uint128, uint128, bool) {\n uint128 spotU128 = _safeToUint128(spot);\n uint128 currentMin = state.minPrice;\n uint128 currentMax = state.maxPrice;\n bool windowExpanded;\n if (spotU128 < currentMin) {\n _setMinPrice(state, asset, spotU128);\n currentMin = spotU128;\n windowExpanded = true;\n }\n if (spotU128 > currentMax) {\n _setMaxPrice(state, asset, spotU128);\n currentMax = spotU128;\n windowExpanded = true;\n }\n return (currentMin, currentMax, windowExpanded);\n }\n\n /**\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\n */\n function _checkAndTriggerProtection(\n MarketProtectionState storage state,\n uint256 spot,\n address asset,\n bool windowExpanded\n ) internal returns (bool triggered) {\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\n if (enteringProtection || windowExpanded) {\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\n }\n if (enteringProtection) {\n state.currentlyUsingProtectedPrice = true;\n }\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\n return true;\n }\n if (state.currentlyUsingProtectedPrice) return true;\n }\n\n /**\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\n * When protection is inactive: both return spot.\n * @param protectionActive Whether the market protection window is currently active\n * @param spot The current spot price\n * @param windowMin The lower bound of the price window\n * @param windowMax The upper bound of the price window\n * @return minPrice The resolved lower-bound (collateral) price\n * @return maxPrice The resolved upper-bound (debt) price\n */\n function _resolveBoundedPrices(\n bool protectionActive,\n uint256 spot,\n uint256 windowMin,\n uint256 windowMax\n ) internal pure returns (uint256, uint256) {\n if (!protectionActive) return (spot, spot);\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\n }\n\n /**\n * @notice Shared view logic for all bounded price view functions.\n * Checks transient cache first for an early return; on miss, fetches from oracle\n * and computes both prices without state mutations.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // Cache miss — fetch from oracle and compute without state mutations\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) return (spot, spot);\n\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\n uint128 spotU128 = _safeToUint128(spot);\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\n\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\n\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\n }\n\n /**\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\n * Formula: \\((maxPrice - minPrice) / minPrice\\), scaled by `EXP_SCALE`.\n * Used to measure how much the window has converged -- compared against `resetThreshold`\n * to determine whether the price window is tight enough to exit protection mode.\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @return The scaled bound ratio \\(((max - min) * EXP_SCALE) / min\\)\n */\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\n uint256 range = uint256(maxPrice) - uint256(minPrice);\n return (range * EXP_SCALE) / uint256(minPrice);\n }\n\n /**\n * @notice Checks if the spot price has deviated beyond the threshold from the window bounds\n * @dev Pump detection: spot > minPrice * (1 + threshold)\n * Crash detection: spot < maxPrice * (1 - threshold)\n * @param spot The current spot price\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @param threshold The deviation threshold (mantissa)\n * @return True if deviation is triggered\n */\n function _exceedsDeviationThreshold(\n uint256 spot,\n uint128 minPrice,\n uint128 maxPrice,\n uint256 threshold\n ) internal pure returns (bool) {\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\n return (spot > upperBound || spot < lowerBound);\n }\n\n /**\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\n * @param currentPrice The current on-chain price\n * @param proposedPrice The keeper's proposed price\n * @return True if drift exceeds deadband\n */\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\n if (currentPrice == 0 || proposedPrice == 0) return false;\n uint256 diff = currentPrice > proposedPrice\n ? uint256(currentPrice - proposedPrice)\n : uint256(proposedPrice - currentPrice);\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\n }\n\n /**\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMin The new minimum price\n */\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\n emit MinPriceUpdated(asset, state.minPrice, newMin);\n state.minPrice = newMin;\n }\n\n /**\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMax The new maximum price\n */\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\n state.maxPrice = newMax;\n }\n\n /**\n * @dev Writes both lower and upper bounded prices to transient storage\n * @param asset The underlying asset address\n * @param minPrice The resolved lower (collateral) price to cache\n * @param maxPrice The resolved upper (debt) price to cache\n */\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\n }\n\n /**\n * @dev Reads a cached final price from transient storage\n * @param asset The underlying asset address\n * @return minPrice The cached minimum price, or 0 on cache miss\n * @return maxPrice The cached maximum price, or 0 on cache miss\n */\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\n ensureNonzeroAddress(vToken);\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev Reverts if the market has not been initialized via setTokenConfig\n * @param asset The underlying asset address\n * @return state The market protection state storage pointer\n */\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\n state = assetProtectionConfig[asset];\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\n }\n\n /**\n * @notice Fetches the current spot price for an asset from the ResilientOracle\n * @param asset The underlying asset address\n * @return The current spot price\n */\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n /**\n * @dev Safely casts a uint256 to uint128, reverting on overflow\n * @param value The value to cast\n * @return The value as uint128\n */\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\n return uint128(value);\n }\n}\n" + }, + "contracts/interfaces/IDeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IDeviationBoundedOracle {\n // --- Enums ---\n\n /// @notice Identifies whether a price bound is a minimum or maximum\n enum PriceBoundType {\n MIN,\n MAX\n }\n\n // --- Structs ---\n\n /// @notice Per-asset protection state tracking the min/max price window\n struct MarketProtectionState {\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\n uint128 minPrice;\n /// @notice Highest price observed in the current window\n uint128 maxPrice;\n /// @notice Whether protected price is currently being used\n bool currentlyUsingProtectedPrice;\n /// @notice Whether this market is whitelisted for bounded pricing\n bool isBoundedPricingEnabled;\n /// @notice Timestamp of the last protection trigger — reset on every trigger\n uint64 lastProtectionTriggeredAt;\n /// @notice Minimum time protection stays active after last trigger\n uint64 cooldownPeriod;\n /// @notice The underlying asset address, used to verify initialization\n address asset;\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\n uint128 triggerThreshold;\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\n uint128 resetThreshold;\n }\n\n // --- Events ---\n\n /// @notice Emitted when protection is initialized for an asset\n event ProtectionInitialized(\n address indexed asset,\n uint128 minPrice,\n uint128 maxPrice,\n uint64 cooldownPeriod,\n uint256 triggerThreshold\n );\n\n /// @notice Emitted when protection mode is triggered for an asset\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\n\n /// @notice Emitted when protection mode is disabled for an asset\n event ProtectionModeExited(address indexed asset);\n\n /// @notice Emitted when the keeper updates the minimum price for an asset\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\n\n /// @notice Emitted when the keeper updates the maximum price for an asset\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\n\n /// @notice Emitted when the entry threshold is updated for an asset\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when the exit threshold is updated for an asset\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\n\n /// @notice Emitted when the cooldown period is updated for an asset\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\n\n /// @notice Emitted when an asset's whitelist status changes\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\n\n // --- Errors ---\n\n /// @notice Thrown when trying to initialize protection for an asset that is not initialized\n error MarketNotInitialized(address asset);\n\n /// @notice Thrown when trying to initialize an already initialized market\n error MarketAlreadyInitialized(address asset);\n\n /// @notice Thrown when trying to disable protection that is not active\n error ProtectedPriceInactive(address asset);\n\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\n\n /// @notice Thrown when trying to disable protection before price range has converged\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\n\n /// @notice Thrown when keeper tries to set minPrice above current spot\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\n\n /// @notice Thrown when keeper tries to set maxPrice below current spot\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\n\n /// @notice Thrown when threshold is set below the minimum allowed value\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\n\n /// @notice Thrown when threshold is set above the maximum allowed value\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\n\n /// @notice Thrown when a price exceeds uint128 max\n error PriceExceedsUint128(uint256 price);\n\n /// @notice Thrown when a zero price is provided where a non-zero price is required\n error ZeroPriceNotAllowed();\n\n /// @notice Thrown when trying to initialize protection for VAI\n error VAINotAllowed();\n\n /// @notice Thrown when trying to update for an asset with active protection\n error ProtectedPriceActive(address asset);\n\n /// @notice Thrown when the lengths of the arrays are not equal\n error InvalidArrayLength();\n\n /// @notice Thrown when the exit threshold is set above the deviation threshold\n error InvalidResetThreshold(uint256 resetThreshold);\n\n // --- Non-view price functions (update window + trigger protection) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- State update (call before view price reads to populate transient cache) ---\n\n /**\n * @notice Updates the protection state for a given vToken, caching the resolved price\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\n * reads in the same transaction are served from transient storage.\n * @param vToken vToken address\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external;\n\n // --- View price functions (read stored/cached state only) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return price The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return price The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- Keeper functions ---\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMin is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external;\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMax is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external;\n\n /**\n * @notice Exits protection mode for a given asset once conditions are met\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external;\n\n // --- Admin functions (governance-gated) ---\n\n /**\n * @notice Initializes protection parameters for a new asset\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\n * confirming the oracle is live for this asset before it is listed.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\n * @custom:access Only Governance\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold,\n bool enableBoundedPricing\n ) external;\n\n /**\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\n * @param assets Array of underlying asset addresses\n * @param cooldownPeriods Array of cooldown periods (seconds)\n * @param triggerThresholds Array of trigger thresholds (mantissa)\n * @param resetThresholds Array of reset thresholds (mantissa)\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if array lengths do not match\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(\n address[] calldata assets,\n uint64[] calldata cooldownPeriods,\n uint256[] calldata triggerThresholds,\n uint256[] calldata resetThresholds,\n bool[] calldata enableBoundedPricings\n ) external;\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds; must be non-zero\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\n\n /**\n * @notice Sets whether bounded pricing is enabled for an asset\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\n\n // --- View helpers ---\n\n /**\n * @notice Returns the full protection state for an asset\n * @param asset The underlying asset address\n * @return minPrice Lowest price observed in the current window\n * @return maxPrice Highest price observed in the current window\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\n * @return cooldownPeriod Minimum time protection stays active after last trigger\n * @return assetAddr The underlying asset address stored in the struct\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\n */\n function assetProtectionConfig(\n address asset\n )\n external\n view\n returns (\n uint128 minPrice,\n uint128 maxPrice,\n bool currentlyUsingProtectedPrice,\n bool isBoundedPricingEnabled,\n uint64 lastProtectionTriggeredAt,\n uint64 cooldownPeriod,\n address assetAddr,\n uint128 triggerThreshold,\n uint128 resetThreshold\n );\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool);\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\n\n /**\n * @notice Checks if protection can be exited for a given asset\n * @param asset The underlying asset address\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\n */\n function canExitProtection(address asset) external view returns (bool);\n\n /**\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\n * @param index Array index\n * @return The asset address at the given index\n */\n function allAssets(uint256 index) external view returns (address);\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory);\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's proposed window minimum prices\n * @param proposedMaxs Keeper's proposed window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\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 BoundValidatorInterface {\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool);\n}\n" + }, + "contracts/interfaces/VBep20Interface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\ninterface VBep20Interface is IERC20Metadata {\n /**\n * @notice Underlying asset for this VToken\n */\n function underlying() external view returns (address);\n}\n" + }, + "contracts/lib/Transient.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nlibrary Transient {\n /**\n * @notice Cache the asset price into transient storage\n * @param key address of the asset\n * @param value asset price\n */\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n tstore(slot, value)\n }\n }\n\n /**\n * @notice Read cached price from transient storage\n * @param key address of the asset\n * @return value cached asset price\n */\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/test/DeviationBoundedOracleCaller.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IDeviationBoundedOracle } from \"../interfaces/IDeviationBoundedOracle.sol\";\n\n/// @notice Test helper that batches DeviationBoundedOracle calls in a single transaction\n/// so transient storage (tstore/tload) cache can be tested.\ncontract DeviationBoundedOracleCaller {\n IDeviationBoundedOracle public immutable oracle;\n\n constructor(address _oracle) {\n oracle = IDeviationBoundedOracle(_oracle);\n }\n\n function updateAndGetCollateralPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPriceView(vToken);\n }\n\n function updateAndGetDebtPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateAndGetBothPrices(address vToken) external returns (uint256 collateral, uint256 debt) {\n oracle.updateProtectionState(vToken);\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateThenNonViewCollateral(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPrice(vToken);\n }\n\n function twoConsecutiveNonViewCollateral(address vToken) external returns (uint256 first, uint256 second) {\n first = oracle.getBoundedCollateralPrice(vToken);\n second = oracle.getBoundedCollateralPrice(vToken);\n }\n\n /// @notice Non-view wrapper so smock records oracle calls made by the view functions.\n function getViewPricesWithoutUpdateNonView(address vToken) external returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n /// @notice Calls updateProtectionState on vTokenA, then getBoundedCollateralPriceView on vTokenB.\n function updateAViewB(address vTokenA, address vTokenB) external returns (uint256) {\n oracle.updateProtectionState(vTokenA);\n return oracle.getBoundedCollateralPriceView(vTokenB);\n }\n\n function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "evmVersion": "cancun", + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": ["ast"] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} diff --git a/deployments/bsctestnet/solcInputs/fad126030085a626952462c92d5fc265.json b/deployments/bsctestnet/solcInputs/fad126030085a626952462c92d5fc265.json new file mode 100644 index 00000000..1e5482b8 --- /dev/null +++ b/deployments/bsctestnet/solcInputs/fad126030085a626952462c92d5fc265.json @@ -0,0 +1,349 @@ +{ + "language": "Solidity", + "sources": { + "@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n\n function latestTimestamp() external view returns (uint256);\n\n function latestRound() external view returns (uint256);\n\n function getAnswer(uint256 roundId) external view returns (int256);\n\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);\n\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AggregatorInterface.sol\";\nimport \"./AggregatorV3Interface.sol\";\n\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\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 (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\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" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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 /**\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" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// 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 IAccessControl {\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" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "@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" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport \"./IAccessControlManagerV8.sol\";\n\n/**\n * @title AccessControlledV8\n * @author Venus\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\n */\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\n /// @notice Access control manager contract\n IAccessControlManagerV8 internal _accessControlManager;\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 /// @notice Emitted when access control manager contract address is changed\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\n\n /// @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\n __Ownable2Step_init();\n __AccessControlled_init_unchained(accessControlManager_);\n }\n\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Sets the address of AccessControlManager\n * @dev Admin function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n * @custom:event Emits NewAccessControlManager event\n * @custom:access Only Governance\n */\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Returns the address of the access control manager contract\n */\n function accessControlManager() external view returns (IAccessControlManagerV8) {\n return _accessControlManager;\n }\n\n /**\n * @dev Internal function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n */\n function _setAccessControlManager(address accessControlManager_) internal {\n require(address(accessControlManager_) != address(0), \"invalid acess control manager address\");\n address oldAccessControlManager = address(_accessControlManager);\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/access/IAccessControl.sol\";\n\n/**\n * @title IAccessControlManagerV8\n * @author Venus\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\n */\ninterface IAccessControlManagerV8 is IAccessControl {\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\n\n function revokeCallPermission(\n address contractAddress,\n string calldata functionSig,\n address accountToRevoke\n ) external;\n\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\n\n function hasPermission(\n address account,\n address contractAddress,\n string calldata functionSig\n ) external view 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/DeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2024 Venus\npragma solidity 0.8.25;\n\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { ResilientOracleInterface } from \"./interfaces/OracleInterface.sol\";\nimport { IDeviationBoundedOracle } from \"./interfaces/IDeviationBoundedOracle.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title DeviationBoundedOracle\n * @author Venus\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\n *\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\n * significantly from the window bounds, protection mode activates automatically and conservative\n * pricing kicks in:\n * - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low\n * - Debt is valued at max(spot, windowMax) — floors debt value at recent window high\n *\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\n * off-chain monitoring systems.\n *\n * The oracle exposes both view and non-view price functions. The non-view variants update the\n * price window and trigger protection. The view variants read stored state only. A transient\n * price cache avoids redundant ResilientOracle calls within the same transaction when\n * updateProtectionState is called before the view price reads.\n */\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\n uint256 public constant MIN_THRESHOLD = 5e16;\n\n /// @notice Maximum allowed threshold value (50%)\n uint256 public constant MAX_THRESHOLD = 50e16;\n\n /// @notice Keeper deadband threshold (5%) — min/max corrections below this are suppressed\n uint256 public constant KEEPER_DEADBAND = 5e16;\n\n /// @notice Resilient Oracle used to fetch spot prices\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Transient storage slot for caching final collateral prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/cache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\n 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200;\n\n /// @notice Transient storage slot for caching final debt prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Per-asset protection state\n mapping(address => MarketProtectionState) public assetProtectionConfig;\n\n /// @notice Append-only array of all assets ever initialized, used for enumeration\n address[] public allAssets;\n\n /// @notice Storage gap for upgrades\n uint256[48] private __gap;\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param _resilientOracle Address of the ResilientOracle contract\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n * @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain).\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\n ensureNonzeroAddress(address(_resilientOracle));\n ensureNonzeroAddress(nativeMarketAddress);\n RESILIENT_ORACLE = _resilientOracle;\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n // ----- Non-view price functions (update window + trigger protection) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (lower) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (higher) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns both conservative prices in a single call.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\n return _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\n * bounded prices in transient storage for the duration of the transaction.\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\n * instead of querying ResilientOracle again, keeping those functions as `view` and\n * avoiding redundant oracle calls.\n * @param vToken vToken address\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external {\n _updateAndGetBoundedPrices(vToken);\n }\n\n // ----- View price functions (read stored/cached state only) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\n * in the same transaction). Falls back to ResilientOracle on cache miss.\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\n (collateralPrice, ) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\n * in the same transaction). Falls back to ResilientOracle on cache miss.\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\n (, debtPrice) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\n return _computeBoundedPrices(vToken);\n }\n\n // ----- Keeper functions -----\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\n * Constraint: newMin must be at or below the current spot price.\n * @param asset The underlying asset address\n * @param newMin The new minimum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external {\n _checkAccessAllowed(\"updateMinPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\n }\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\n * Constraint: newMax must be at or above the current spot price.\n * @param asset The underlying asset address\n * @param newMax The new maximum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external {\n _checkAccessAllowed(\"updateMaxPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\n }\n\n /**\n * @notice Disables protection mode for a given asset\n * @dev Called by the keeper/monitor after confirming price has normalised.\n * Enforces two conditions on-chain:\n * 1. Cooldown period has elapsed since the last trigger\n * 2. Price range has converged below the exit threshold\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\n * @custom:event ProtectedPriceDisabled\n */\n function disableActiveProtection(address asset) external {\n _checkAccessAllowed(\"disableActiveProtection(address)\");\n\n MarketProtectionState storage state = assetProtectionConfig[asset];\n\n if (!state.isProtectedPriceActive) revert ProtectedPriceInactive(asset);\n\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\n }\n\n // exit protected price if price range has converged below exit threshold\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\n if (rangeRatio >= state.resetThreshold) {\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\n }\n\n state.isProtectedPriceActive = false;\n emit ProtectedPriceDisabled(asset);\n }\n\n // ----- Admin functions (governance-gated) -----\n\n /**\n * @notice Initializes protection for a new asset\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\n * spot so the window expands naturally as prices move. Can only be called once per asset.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after last trigger\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @custom:access Only Governance\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold\n ) external {\n _checkAccessAllowed(\"setTokenConfig(address,uint64,uint256,uint256)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(cooldownPeriod);\n ensureNonzeroValue(triggerThreshold);\n ensureNonzeroValue(resetThreshold);\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\n if (asset == vai) revert VAINotAllowed();\n\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n\n assetProtectionConfig[asset] = MarketProtectionState({\n minPrice: spotU128,\n maxPrice: spotU128,\n isProtectedPriceActive: false,\n isBoundedPricingEnabled: true,\n lastProtectionTriggeredAt: 0,\n cooldownPeriod: cooldownPeriod,\n asset: asset,\n triggerThreshold: uint128(triggerThreshold),\n resetThreshold: uint128(resetThreshold)\n });\n\n allAssets.push(asset);\n\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\n emit BoundedPricingWhitelistUpdated(asset, true);\n }\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds\n * @custom:access Only Governance\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\n _checkAccessAllowed(\"setCooldownPeriod(address,uint64)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newCooldown);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\n state.cooldownPeriod = newCooldown;\n }\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\n _checkAccessAllowed(\"setThresholds(address,uint256,uint256)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newTriggerThreshold);\n ensureNonzeroValue(newResetThreshold);\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (newTriggerThreshold != state.triggerThreshold) {\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\n state.triggerThreshold = uint128(newTriggerThreshold);\n }\n if (newResetThreshold != state.resetThreshold) {\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\n state.resetThreshold = uint128(newResetThreshold);\n }\n }\n\n /**\n * @notice Sets whether an asset is enabled for bounded pricing\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setAssetBoundedPricingEnabled(address,bool)\");\n ensureNonzeroAddress(asset);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!enabled && state.isProtectedPriceActive) {\n revert ProtectedPriceActive(asset);\n }\n\n state.isBoundedPricingEnabled = enabled;\n emit BoundedPricingWhitelistUpdated(asset, enabled);\n }\n\n // ----- View helpers -----\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory) {\n return allAssets;\n }\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\n }\n\n /**\n * @notice Checks if protection is currently active for an asset\n * @param asset The underlying asset address\n * @return True if protected price is active\n */\n function isProtectedPriceActive(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].isProtectedPriceActive;\n }\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\n * Gas-free for off-chain callers.\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\n uint256 len = allAssets.length;\n address[] memory temp = new address[](len);\n uint256 count;\n for (uint256 i; i < len; ++i) {\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\n temp[count++] = allAssets[i];\n }\n }\n address[] memory result = new address[](count);\n for (uint256 i; i < count; ++i) {\n result[i] = temp[i];\n }\n return result;\n }\n\n /**\n * @notice Checks if protection can be exited for an asset\n * @dev Returns true when both conditions are met:\n * 1. Cooldown period has elapsed since last trigger\n * 2. Price range has converged below exit threshold\n * @param asset The underlying asset address\n * @return True if protection can be disabled\n */\n function canExitProtection(address asset) external view returns (bool) {\n MarketProtectionState storage state = assetProtectionConfig[asset];\n return\n state.isProtectedPriceActive &&\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\n }\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\n * from the keeper's proposed window values\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's off-chain window minimum prices\n * @param proposedMaxs Keeper's off-chain window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\n uint256 len = assets.length;\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\n\n needsMinUpdate = new bool[](len);\n needsMaxUpdate = new bool[](len);\n\n for (uint256 i; i < len; ++i) {\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\n }\n }\n\n // ----- Internal functions -----\n\n /**\n * @notice Validates and applies a keeper-provided min or max price update\n * @param asset The underlying asset address\n * @param newPrice The new price value to set\n * @param boundType Whether this is a MIN or MAX bound update\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice\n */\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\n ensureNonzeroAddress(asset);\n if (newPrice == 0) revert ZeroPriceNotAllowed();\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n uint256 currentSpot = _fetchSpotPrice(asset);\n if (boundType == PriceBoundType.MIN) {\n if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot)\n revert InvalidMinPrice(asset, newPrice, currentSpot);\n _setMinPrice(state, asset, newPrice);\n } else if (boundType == PriceBoundType.MAX) {\n if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot)\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\n _setMaxPrice(state, asset, newPrice);\n }\n }\n\n /**\n * @notice Shared non-view logic for all bounded price functions.\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n */\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // return early if failure from resilient oracle to prevent cold SLOAD\n uint256 spot = _fetchSpotPrice(asset); \n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) {\n _setCachedPrices(asset, spot, spot);\n return (spot, spot);\n }\n _expandPriceWindow(state, spot, asset);\n _checkAndTriggerProtection(state, spot, asset);\n (minPrice, maxPrice) = _resolveBoundedPrices(\n state.isProtectedPriceActive,\n spot,\n uint256(state.minPrice),\n uint256(state.maxPrice)\n );\n _setCachedPrices(asset, minPrice, maxPrice);\n }\n\n /**\n * @dev Expands the price window toward extremes if the spot price is a new min or max\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n */\n function _expandPriceWindow(MarketProtectionState storage state, uint256 spot, address asset) internal {\n uint128 spotU128 = _safeToUint128(spot);\n if (spotU128 < state.minPrice) {\n _setMinPrice(state, asset, spotU128);\n }\n if (spotU128 > state.maxPrice) {\n _setMaxPrice(state, asset, spotU128);\n }\n }\n\n /**\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n */\n function _checkAndTriggerProtection(MarketProtectionState storage state, uint256 spot, address asset) internal {\n if (state.isProtectedPriceActive) return;\n\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\n state.isProtectedPriceActive = true;\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\n }\n }\n\n /**\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\n * When protection is inactive: both return spot.\n * @param protectionActive Whether the market protection window is currently active\n * @param spot The current spot price\n * @param windowMin The lower bound of the price window\n * @param windowMax The upper bound of the price window\n * @return minPrice The resolved lower-bound (collateral) price\n * @return maxPrice The resolved upper-bound (debt) price\n */\n function _resolveBoundedPrices(\n bool protectionActive,\n uint256 spot,\n uint256 windowMin,\n uint256 windowMax\n ) internal pure returns (uint256, uint256) {\n if (!protectionActive) return (spot, spot);\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\n }\n\n /**\n * @notice Shared view logic for all bounded price view functions.\n * Checks transient cache first for an early return; on miss, fetches from oracle\n * and computes both prices without state mutations.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // Cache miss — fetch from oracle and compute without state mutations\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) return (spot, spot);\n\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\n uint128 spotU128 = _safeToUint128(spot);\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\n\n bool shouldProtect = state.isProtectedPriceActive ||\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\n\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\n }\n\n /**\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\n * Formula: \\((maxPrice - minPrice) / minPrice\\), scaled by `EXP_SCALE`.\n * Used to measure how much the window has converged -- compared against `resetThreshold`\n * to determine whether the price window is tight enough to exit protection mode.\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @return The scaled bound ratio \\(((max - min) * EXP_SCALE) / min\\)\n */\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\n uint256 range = uint256(maxPrice) - uint256(minPrice);\n return (range * EXP_SCALE) / uint256(minPrice);\n }\n\n /**\n * @notice Checks if the spot price has deviated beyond the threshold from the window bounds\n * @dev Pump detection: spot > minPrice * (1 + threshold)\n * Crash detection: spot < maxPrice * (1 - threshold)\n * @param spot The current spot price\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @param threshold The deviation threshold (mantissa)\n * @return True if deviation is triggered\n */\n function _exceedsDeviationThreshold(\n uint256 spot,\n uint128 minPrice,\n uint128 maxPrice,\n uint256 threshold\n ) internal pure returns (bool) {\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\n return (spot > upperBound || spot < lowerBound);\n }\n\n /**\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\n * @param currentPrice The current on-chain price\n * @param proposedPrice The keeper's proposed price\n * @return True if drift exceeds deadband\n */\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\n if (currentPrice == 0 || proposedPrice == 0) return false;\n uint256 diff = currentPrice > proposedPrice\n ? uint256(currentPrice - proposedPrice)\n : uint256(proposedPrice - currentPrice);\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\n }\n\n /**\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMin The new minimum price\n */\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\n emit MinPriceUpdated(asset, state.minPrice, newMin);\n state.minPrice = newMin;\n }\n\n /**\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMax The new maximum price\n */\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\n state.maxPrice = newMax;\n }\n\n /**\n * @dev Writes both lower and upper bounded prices to transient storage\n * @param asset The underlying asset address\n * @param minPrice The resolved lower (collateral) price to cache\n * @param maxPrice The resolved upper (debt) price to cache\n */\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\n }\n\n /**\n * @dev Reads a cached final price from transient storage\n * @param asset The underlying asset address\n * @return minPrice The cached minimum price, or 0 on cache miss\n * @return maxPrice The cached maximum price, or 0 on cache miss\n */\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\n ensureNonzeroAddress(vToken);\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev Reverts if the market has not been initialized via setTokenConfig\n * @param asset The underlying asset address\n * @return state The market protection state storage pointer\n */\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\n state = assetProtectionConfig[asset];\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\n }\n\n /**\n * @notice Fetches the current spot price for an asset from the ResilientOracle\n * @param asset The underlying asset address\n * @return The current spot price\n */\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n /**\n * @dev Safely casts a uint256 to uint128, reverting on overflow\n * @param value The value to cast\n * @return The value as uint128\n */\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\n return uint128(value);\n }\n}\n" + }, + "contracts/hardhat-dependency-compiler/@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport '@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol';\n" + }, + "contracts/interfaces/FeedRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface FeedRegistryInterface {\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n function decimalsByName(string memory base, string memory quote) external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAccountant {\n function getRateSafe() external view returns (uint256);\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/IAsBNB.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNB {\n function minter() external view returns (address);\n function decimals() external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNBMinter {\n function convertToTokens(uint256 amount) external view returns (uint256);\n}\n" + }, + "contracts/interfaces/ICappedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ICappedOracle {\n function updateSnapshot() external;\n}\n" + }, + "contracts/interfaces/IDeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface IDeviationBoundedOracle {\n // --- Enums ---\n\n /// @notice Identifies whether a price bound is a minimum or maximum\n enum PriceBoundType {\n MIN,\n MAX\n }\n\n // --- Structs ---\n\n /// @notice Per-asset protection state tracking the min/max price window\n struct MarketProtectionState {\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\n uint128 minPrice;\n /// @notice Highest price observed in the current window\n uint128 maxPrice;\n /// @notice Whether protected price is currently active\n bool isProtectedPriceActive;\n /// @notice Whether this market is whitelisted for bounded pricing\n bool isBoundedPricingEnabled;\n /// @notice Timestamp of the last protection trigger — reset on every trigger\n uint64 lastProtectionTriggeredAt;\n /// @notice Minimum time protection stays active after last trigger\n uint64 cooldownPeriod;\n /// @notice The underlying asset address, used to verify initialization\n address asset;\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\n uint128 triggerThreshold;\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\n uint128 resetThreshold;\n }\n\n // --- Events ---\n\n /// @notice Emitted when protection is initialized for an asset\n event ProtectionInitialized(\n address indexed asset,\n uint128 minPrice,\n uint128 maxPrice,\n uint64 cooldownPeriod,\n uint256 triggerThreshold\n );\n\n /// @notice Emitted when protection mode is triggered for an asset\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\n\n /// @notice Emitted when protection mode is disabled for an asset\n event ProtectedPriceDisabled(address indexed asset);\n\n /// @notice Emitted when the keeper updates the minimum price for an asset\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\n\n /// @notice Emitted when the keeper updates the maximum price for an asset\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\n\n /// @notice Emitted when the entry threshold is updated for an asset\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when the exit threshold is updated for an asset\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\n\n /// @notice Emitted when the cooldown period is updated for an asset\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\n\n /// @notice Emitted when an asset's whitelist status changes\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\n\n // --- Errors ---\n\n /// @notice Thrown when trying to initialize protection for an asset that is not initialized\n error MarketNotInitialized(address asset);\n\n /// @notice Thrown when trying to initialize an already initialized market\n error MarketAlreadyInitialized(address asset);\n\n /// @notice Thrown when trying to disable protection that is not active\n error ProtectedPriceInactive(address asset);\n\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\n\n /// @notice Thrown when trying to disable protection before price range has converged\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\n\n /// @notice Thrown when keeper tries to set minPrice above current spot\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\n\n /// @notice Thrown when keeper tries to set maxPrice below current spot\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\n\n /// @notice Thrown when threshold is set below the minimum allowed value\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\n\n /// @notice Thrown when threshold is set above the maximum allowed value\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\n\n /// @notice Thrown when a price exceeds uint128 max\n error PriceExceedsUint128(uint256 price);\n\n /// @notice Thrown when a zero price is provided where a non-zero price is required\n error ZeroPriceNotAllowed();\n\n /// @notice Thrown when trying to initialize protection for VAI\n error VAINotAllowed();\n\n /// @notice Thrown when trying to update for an asset with active protection\n error ProtectedPriceActive(address asset);\n\n /// @notice Thrown when the lengths of the arrays are not equal\n error InvalidArrayLength();\n\n /// @notice Thrown when the exit threshold is set above the deviation threshold\n error InvalidResetThreshold(uint256 resetThreshold);\n\n // --- Non-view price functions (update window + trigger protection) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- State update (call before view price reads to populate transient cache) ---\n\n /**\n * @notice Updates the protection state for a given vToken, caching the resolved price\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\n * reads in the same transaction are served from transient storage.\n * @param vToken vToken address\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external;\n\n // --- View price functions (read stored/cached state only) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return price The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return price The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- Keeper functions ---\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMin is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external;\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMax is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external;\n\n /**\n * @notice Disables protection mode for a given asset once conditions are met\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n * @custom:event ProtectedPriceDisabled\n */\n function disableActiveProtection(address asset) external;\n\n // --- Admin functions (governance-gated) ---\n\n /**\n * @notice Initializes protection parameters for a new asset and whitelists it\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\n * confirming the oracle is live for this asset before it is listed.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @custom:access Only Governance\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold\n ) external;\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds; must be non-zero\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\n\n /**\n * @notice Sets whether bounded pricing is enabled for an asset\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\n\n // --- View helpers ---\n\n /**\n * @notice Returns the full protection state for an asset\n * @param asset The underlying asset address\n * @return minPrice Lowest price observed in the current window\n * @return maxPrice Highest price observed in the current window\n * @return isProtectedPriceActive Whether protected price is currently active\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\n * @return cooldownPeriod Minimum time protection stays active after last trigger\n * @return assetAddr The underlying asset address stored in the struct\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\n */\n function assetProtectionConfig(\n address asset\n )\n external\n view\n returns (\n uint128 minPrice,\n uint128 maxPrice,\n bool isProtectedPriceActive,\n bool isBoundedPricingEnabled,\n uint64 lastProtectionTriggeredAt,\n uint64 cooldownPeriod,\n address assetAddr,\n uint128 triggerThreshold,\n uint128 resetThreshold\n );\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool);\n\n /**\n * @notice Checks if protection is currently active for an asset\n * @param asset The underlying asset address\n * @return True if protected price is active\n */\n function isProtectedPriceActive(address asset) external view returns (bool);\n\n /**\n * @notice Checks if protection can be exited for a given asset\n * @param asset The underlying asset address\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\n */\n function canExitProtection(address asset) external view returns (bool);\n\n /**\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\n * @param index Array index\n * @return The asset address at the given index\n */\n function allAssets(uint256 index) external view returns (address);\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory);\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's proposed window minimum prices\n * @param proposedMaxs Keeper's proposed window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\n}\n" + }, + "contracts/interfaces/IERC4626.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IERC4626 {\n function convertToAssets(uint256 shares) 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\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256);\n\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/ISfrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISfrxEthFraxOracle {\n function getPrices() external view returns (bool _isbadData, uint256 _priceLow, uint256 _priceHigh);\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/IZkETH.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface IZkETH {\n function LSTPerToken() 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 BoundValidatorInterface {\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool);\n}\n" + }, + "contracts/interfaces/PublicResolverInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface PublicResolverInterface {\n function addr(bytes32 node) external view returns (address payable);\n}\n" + }, + "contracts/interfaces/SIDRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface SIDRegistryInterface {\n function resolver(bytes32 node) external view returns (address);\n}\n" + }, + "contracts/interfaces/VBep20Interface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\ninterface VBep20Interface is IERC20Metadata {\n /**\n * @notice Underlying asset for this VToken\n */\n function underlying() external view returns (address);\n}\n" + }, + "contracts/lib/Transient.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nlibrary Transient {\n /**\n * @notice Cache the asset price into transient storage\n * @param key address of the asset\n * @param value asset price\n */\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n tstore(slot, value)\n }\n }\n\n /**\n * @notice Read cached price from transient storage\n * @param key address of the asset\n * @return value cached asset price\n */\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/oracles/AnkrBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title AnkrBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of ankrBNB asset\n */\ncontract AnkrBNBOracle 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 Constructor for the implementation contract.\n constructor(\n address ankrBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n ankrBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of BNB for 1 ankrBNB\n * @return amount The amount of BNB for ankrBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IAnkrBNB(CORRELATED_TOKEN).sharesToBonds(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/AsBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title asBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of asBNB asset\n */\ncontract AsBNBOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address asBNB,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n asBNB,\n slisBNB,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of slisBNB for 1 asBNB\n * @return price The amount of slisBNB for asBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n IAsBNBMinter minter = IAsBNBMinter(IAsBNB(CORRELATED_TOKEN).minter());\n return minter.convertToTokens(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/SIDRegistryInterface.sol\";\nimport \"../interfaces/FeedRegistryInterface.sol\";\nimport \"../interfaces/PublicResolverInterface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title BinanceOracle\n * @author Venus\n * @notice This oracle fetches price of assets from Binance.\n */\ncontract BinanceOracle is AccessControlledV8, OracleInterface {\n /// @notice Used to fetch feed registry address.\n address public sidRegistryAddress;\n\n /// @notice Set this as asset address for BNB. This is the underlying address for vBNB\n address public constant BNB_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Max stale period configuration for assets\n mapping(string => uint256) public maxStalePeriod;\n\n /// @notice Override symbols to be compatible with Binance feed registry\n mapping(string => string) public symbols;\n\n /// @notice Used to fetch price of assets used directly when space ID is not supported by current chain.\n address public feedRegistryAddress;\n\n /// @notice Emits when asset stale period is updated.\n event MaxStalePeriodAdded(string indexed asset, uint256 maxStalePeriod);\n\n /// @notice Emits when symbol of the asset is updated.\n event SymbolOverridden(string indexed symbol, string overriddenSymbol);\n\n /// @notice Emits when address of feed registry is updated.\n event FeedRegistryUpdated(address indexed oldFeedRegistry, address indexed newFeedRegistry);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _sidRegistryAddress Address of SID registry\n * @param _acm Address of the access control manager contract\n */\n function initialize(address _sidRegistryAddress, address _acm) external initializer {\n sidRegistryAddress = _sidRegistryAddress;\n __AccessControlled_init(_acm);\n }\n\n /**\n * @notice Used to set the max stale period of an asset\n * @param symbol The symbol of the asset\n * @param _maxStalePeriod The max stake period\n */\n function setMaxStalePeriod(string memory symbol, uint256 _maxStalePeriod) external {\n _checkAccessAllowed(\"setMaxStalePeriod(string,uint256)\");\n if (_maxStalePeriod == 0) revert(\"stale period can't be zero\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n maxStalePeriod[symbol] = _maxStalePeriod;\n emit MaxStalePeriodAdded(symbol, _maxStalePeriod);\n }\n\n /**\n * @notice Used to override a symbol when fetching price\n * @param symbol The symbol to override\n * @param overrideSymbol The symbol after override\n */\n function setSymbolOverride(string calldata symbol, string calldata overrideSymbol) external {\n _checkAccessAllowed(\"setSymbolOverride(string,string)\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n symbols[symbol] = overrideSymbol;\n emit SymbolOverridden(symbol, overrideSymbol);\n }\n\n /**\n * @notice Used to set feed registry address when current chain does not support space ID.\n * @param newfeedRegistryAddress Address of new feed registry.\n */\n function setFeedRegistryAddress(\n address newfeedRegistryAddress\n ) external notNullAddress(newfeedRegistryAddress) onlyOwner {\n if (sidRegistryAddress != address(0)) revert(\"sidRegistryAddress must be zero\");\n emit FeedRegistryUpdated(feedRegistryAddress, newfeedRegistryAddress);\n feedRegistryAddress = newfeedRegistryAddress;\n }\n\n /**\n * @notice Uses Space ID to fetch the feed registry address\n * @return feedRegistryAddress Address of binance oracle feed registry.\n */\n function getFeedRegistryAddress() public view returns (address) {\n bytes32 nodeHash = 0x94fe3821e0768eb35012484db4df61890f9a6ca5bfa984ef8ff717e73139faff;\n\n SIDRegistryInterface sidRegistry = SIDRegistryInterface(sidRegistryAddress);\n address publicResolverAddress = sidRegistry.resolver(nodeHash);\n PublicResolverInterface publicResolver = PublicResolverInterface(publicResolverAddress);\n\n return publicResolver.addr(nodeHash);\n }\n\n /**\n * @notice Gets the price of a asset from the binance oracle\n * @param asset Address of the asset\n * @return Price in USD\n */\n function getPrice(address asset) public view returns (uint256) {\n string memory symbol;\n uint256 decimals;\n\n if (asset == BNB_ADDR) {\n symbol = \"BNB\";\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n symbol = token.symbol();\n decimals = token.decimals();\n }\n\n string memory overrideSymbol = symbols[symbol];\n\n if (bytes(overrideSymbol).length != 0) {\n symbol = overrideSymbol;\n }\n\n return _getPrice(symbol, decimals);\n }\n\n function _getPrice(string memory symbol, uint256 decimals) internal view returns (uint256) {\n FeedRegistryInterface feedRegistry;\n\n if (sidRegistryAddress != address(0)) {\n // If sidRegistryAddress is available, fetch feedRegistryAddress from sidRegistry\n feedRegistry = FeedRegistryInterface(getFeedRegistryAddress());\n } else {\n // Use feedRegistry directly if sidRegistryAddress is not available\n feedRegistry = FeedRegistryInterface(feedRegistryAddress);\n }\n\n (, int256 answer, , uint256 updatedAt, ) = feedRegistry.latestRoundDataByName(symbol, \"USD\");\n if (answer <= 0) revert(\"invalid binance oracle price\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n if (deltaTime > maxStalePeriod[symbol]) revert(\"binance oracle price expired\");\n\n uint256 decimalDelta = feedRegistry.decimalsByName(symbol, \"USD\");\n return (uint256(answer) * (10 ** (18 - decimalDelta))) * (10 ** (18 - decimals));\n }\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 IStaderStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address bnbx,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n bnbx,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertBnbXToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BoundValidator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title BoundValidator\n * @author Venus\n * @notice The BoundValidator contract is used to validate prices fetched from two different sources.\n * Each asset has an upper and lower bound ratio set in the config. In order for a price to be valid\n * it must fall within this range of the validator price.\n */\ncontract BoundValidator is AccessControlledV8, BoundValidatorInterface {\n struct ValidateConfig {\n /// @notice asset address\n address asset;\n /// @notice Upper bound of deviation between reported price and anchor price,\n /// beyond which the reported price will be invalidated\n uint256 upperBoundRatio;\n /// @notice Lower bound of deviation between reported price and anchor price,\n /// below which the reported price will be invalidated\n uint256 lowerBoundRatio;\n }\n\n /// @notice validation configs by asset\n mapping(address => ValidateConfig) public validateConfigs;\n\n /// @notice Emit this event when new validation configs are added\n event ValidateConfigAdded(address indexed asset, uint256 indexed upperBound, uint256 indexed lowerBound);\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Add multiple validation configs at the same time\n * @param configs Array of validation configs\n * @custom:access Only Governance\n * @custom:error Zero length error is thrown if length of the config array is 0\n * @custom:event Emits ValidateConfigAdded for each validation config that is successfully set\n */\n function setValidateConfigs(ValidateConfig[] memory configs) external {\n uint256 length = configs.length;\n if (length == 0) revert(\"invalid validate config length\");\n for (uint256 i; i < length; ++i) {\n setValidateConfig(configs[i]);\n }\n }\n\n /**\n * @notice Add a single validation config\n * @param config Validation config struct\n * @custom:access Only Governance\n * @custom:error Null address error is thrown if asset address is null\n * @custom:error Range error thrown if bound ratio is not positive\n * @custom:error Range error thrown if lower bound is greater than or equal to upper bound\n * @custom:event Emits ValidateConfigAdded when a validation config is successfully set\n */\n function setValidateConfig(ValidateConfig memory config) public {\n _checkAccessAllowed(\"setValidateConfig(ValidateConfig)\");\n\n if (config.asset == address(0)) revert(\"asset can't be zero address\");\n if (config.upperBoundRatio == 0 || config.lowerBoundRatio == 0) revert(\"bound must be positive\");\n if (config.upperBoundRatio <= config.lowerBoundRatio) revert(\"upper bound must be higher than lowner bound\");\n validateConfigs[config.asset] = config;\n emit ValidateConfigAdded(config.asset, config.upperBoundRatio, config.lowerBoundRatio);\n }\n\n /**\n * @notice Test reported asset price against anchor price\n * @param asset asset address\n * @param reportedPrice The price to be tested\n * @custom:error Missing error thrown if asset config is not set\n * @custom:error Price error thrown if anchor price is not valid\n */\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reportedPrice,\n uint256 anchorPrice\n ) public view virtual override returns (bool) {\n if (validateConfigs[asset].upperBoundRatio == 0) revert(\"validation config not exist\");\n if (anchorPrice == 0) revert(\"anchor price is not valid\");\n return _isWithinAnchor(asset, reportedPrice, anchorPrice);\n }\n\n /**\n * @notice Test whether the reported price is within the valid bounds\n * @param asset Asset address\n * @param reportedPrice The price to be tested\n * @param anchorPrice The reported price must be within the the valid bounds of this price\n */\n function _isWithinAnchor(address asset, uint256 reportedPrice, uint256 anchorPrice) private view returns (bool) {\n if (reportedPrice != 0) {\n // we need to multiply anchorPrice by 1e18 to make the ratio 18 decimals\n uint256 anchorRatio = (anchorPrice * 1e18) / reportedPrice;\n uint256 upperBoundAnchorRatio = validateConfigs[asset].upperBoundRatio;\n uint256 lowerBoundAnchorRatio = validateConfigs[asset].lowerBoundRatio;\n return anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio;\n }\n return false;\n }\n\n // BoundValidator is to get inherited, so it's a good practice to add some storage gaps like\n // OpenZepplin proposed in their contracts: https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n // solhint-disable-next-line\n uint256[49] private __gap;\n}\n" + }, + "contracts/oracles/ChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title ChainlinkOracle\n * @author Venus\n * @notice This oracle fetches prices of assets from the Chainlink oracle.\n */\ncontract ChainlinkOracle is AccessControlledV8, OracleInterface {\n struct TokenConfig {\n /// @notice Underlying token address, which can't be a null address\n /// @notice Used to check if a token is supported\n /// @notice 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB address for native tokens\n /// (e.g BNB for BNB chain, ETH for Ethereum network)\n address asset;\n /// @notice Chainlink feed address\n address feed;\n /// @notice Price expiration period of this asset\n uint256 maxStalePeriod;\n }\n\n /// @notice Set this as asset address for native token on each chain.\n /// This is the underlying address for vBNB on BNB chain or an underlying asset for a native market on any chain.\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Manually set an override price, useful under extenuating conditions such as price feed failure\n mapping(address => uint256) public prices;\n\n /// @notice Token config by assets\n mapping(address => TokenConfig) public tokenConfigs;\n\n /// @notice Emit when a price is manually set\n event PricePosted(address indexed asset, uint256 previousPriceMantissa, uint256 newPriceMantissa);\n\n /// @notice Emit when a token config is added\n event TokenConfigAdded(address indexed asset, address feed, uint256 maxStalePeriod);\n\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Manually set the price of a given asset\n * @param asset Asset address\n * @param price Asset price in 18 decimals\n * @custom:access Only Governance\n * @custom:event Emits PricePosted event on successfully setup of asset price\n */\n function setDirectPrice(address asset, uint256 price) external notNullAddress(asset) {\n _checkAccessAllowed(\"setDirectPrice(address,uint256)\");\n\n uint256 previousPriceMantissa = prices[asset];\n prices[asset] = price;\n emit PricePosted(asset, previousPriceMantissa, price);\n }\n\n /**\n * @notice Add multiple token configs at the same time\n * @param tokenConfigs_ config array\n * @custom:access Only Governance\n * @custom:error Zero length error thrown, if length of the array in parameter is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Add single token config. asset & feed cannot be null addresses and maxStalePeriod must be positive\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error NotNullAddress error is thrown if token feed address is null\n * @custom:error Range error is thrown if maxStale period of token is not greater than zero\n * @custom:event Emits TokenConfigAdded event on successfully setting of the token config\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.feed) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n if (tokenConfig.maxStalePeriod == 0) revert(\"stale period can't be zero\");\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(tokenConfig.asset, tokenConfig.feed, tokenConfig.maxStalePeriod);\n }\n\n /**\n * @notice Gets the price of a asset from the chainlink oracle\n * @param asset Address of the asset\n * @return Price in USD from Chainlink or a manually set price for the asset\n */\n function getPrice(address asset) public view virtual returns (uint256) {\n uint256 decimals;\n\n if (asset == NATIVE_TOKEN_ADDR) {\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n decimals = token.decimals();\n }\n\n return _getPriceInternal(asset, decimals);\n }\n\n /**\n * @notice Gets the Chainlink price for a given asset\n * @param asset address of the asset\n * @param decimals decimals of the asset\n * @return price Asset price in USD or a manually set price of the asset\n */\n function _getPriceInternal(address asset, uint256 decimals) internal view returns (uint256 price) {\n uint256 tokenPrice = prices[asset];\n if (tokenPrice != 0) {\n price = tokenPrice;\n } else {\n price = _getChainlinkPrice(asset);\n }\n\n uint256 decimalDelta = 18 - decimals;\n return price * (10 ** decimalDelta);\n }\n\n /**\n * @notice Get the Chainlink price for an asset, revert if token config doesn't exist\n * @dev The precision of the price feed is used to ensure the returned price has 18 decimals of precision\n * @param asset Address of the asset\n * @return price Price in USD, with 18 decimals of precision\n * @custom:error NotNullAddress error is thrown if the asset address is null\n * @custom:error Price error is thrown if the Chainlink price of asset is not greater than zero\n * @custom:error Timing error is thrown if current timestamp is less than the last updatedAt timestamp\n * @custom:error Timing error is thrown if time difference between current time and last updated time\n * is greater than maxStalePeriod\n */\n function _getChainlinkPrice(\n address asset\n ) private view notNullAddress(tokenConfigs[asset].asset) returns (uint256) {\n TokenConfig memory tokenConfig = tokenConfigs[asset];\n AggregatorV3Interface feed = AggregatorV3Interface(tokenConfig.feed);\n\n // note: maxStalePeriod cannot be 0\n uint256 maxStalePeriod = tokenConfig.maxStalePeriod;\n\n // Chainlink USD-denominated feeds store answers at 8 decimals, mostly\n uint256 decimalDelta = 18 - feed.decimals();\n\n (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();\n if (answer <= 0) revert(\"chainlink price must be positive\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n\n if (deltaTime > maxStalePeriod) revert(\"chainlink price expired\");\n\n return uint256(answer) * (10 ** decimalDelta);\n }\n}\n" + }, + "contracts/oracles/common/CorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../../interfaces/OracleInterface.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { SECONDS_PER_YEAR } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { ICappedOracle } from \"../../interfaces/ICappedOracle.sol\";\nimport { IAccessControlManagerV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.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, ICappedOracle {\n /// @notice Address of the correlated token\n address public immutable CORRELATED_TOKEN;\n\n /// @notice Address of the underlying token\n address public immutable UNDERLYING_TOKEN;\n\n /// @notice Address of Resilient Oracle\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Address of the AccessControlManager contract\n IAccessControlManagerV8 public immutable ACCESS_CONTROL_MANAGER;\n\n //// @notice Growth rate percentage in seconds. Ex: 1e18 is 100%\n uint256 public growthRatePerSecond;\n\n /// @notice Snapshot update interval\n uint256 public snapshotInterval;\n\n /// @notice Last stored snapshot maximum exchange rate\n uint256 public snapshotMaxExchangeRate;\n\n /// @notice Last stored snapshot timestamp\n uint256 public snapshotTimestamp;\n\n /// @notice Gap to add when updating the snapshot\n uint256 public snapshotGap;\n\n /// @notice Emitted when the snapshot is updated\n event SnapshotUpdated(uint256 indexed maxExchangeRate, uint256 indexed timestamp);\n\n /// @notice Emitted when the growth rate is updated\n event GrowthRateUpdated(\n uint256 indexed oldGrowthRatePerSecond,\n uint256 indexed newGrowthRatePerSecond,\n uint256 indexed oldSnapshotInterval,\n uint256 newSnapshotInterval\n );\n\n /// @notice Emitted when the snapshot gap is updated\n event SnapshotGapUpdated(uint256 indexed oldSnapshotGap, uint256 indexed newSnapshotGap);\n\n /// @notice Thrown if the token address is invalid\n error InvalidTokenAddress();\n\n /// @notice Thrown if the growth rate is invalid\n error InvalidGrowthRate();\n\n /// @notice Thrown if the initial snapshot is invalid\n error InvalidInitialSnapshot();\n\n /// @notice Thrown if the max snapshot exchange rate is invalid\n error InvalidSnapshotMaxExchangeRate();\n\n /// @notice @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:error InvalidInitialSnapshot error is thrown if the initial snapshot values are invalid\n */\n constructor(\n address _correlatedToken,\n address _underlyingToken,\n address _resilientOracle,\n uint256 _annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 _initialSnapshotMaxExchangeRate,\n uint256 _initialSnapshotTimestamp,\n address _accessControlManager,\n uint256 _snapshotGap\n ) {\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n if ((_initialSnapshotMaxExchangeRate == 0 || _initialSnapshotTimestamp == 0) && _snapshotInterval > 0) {\n revert InvalidInitialSnapshot();\n }\n\n ensureNonzeroAddress(_correlatedToken);\n ensureNonzeroAddress(_underlyingToken);\n ensureNonzeroAddress(_resilientOracle);\n ensureNonzeroAddress(_accessControlManager);\n\n CORRELATED_TOKEN = _correlatedToken;\n UNDERLYING_TOKEN = _underlyingToken;\n RESILIENT_ORACLE = ResilientOracleInterface(_resilientOracle);\n snapshotInterval = _snapshotInterval;\n\n snapshotMaxExchangeRate = _initialSnapshotMaxExchangeRate;\n snapshotTimestamp = _initialSnapshotTimestamp;\n snapshotGap = _snapshotGap;\n\n ACCESS_CONTROL_MANAGER = IAccessControlManagerV8(_accessControlManager);\n }\n\n /**\n * @notice Directly sets the snapshot exchange rate and timestamp\n * @param _snapshotMaxExchangeRate The exchange rate to set\n * @param _snapshotTimestamp The timestamp to set\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n */\n function setSnapshot(uint256 _snapshotMaxExchangeRate, uint256 _snapshotTimestamp) external {\n _checkAccessAllowed(\"setSnapshot(uint256,uint256)\");\n\n snapshotMaxExchangeRate = _snapshotMaxExchangeRate;\n snapshotTimestamp = _snapshotTimestamp;\n\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Sets the growth rate and snapshot interval\n * @param _annualGrowthRate The annual growth rate to set\n * @param _snapshotInterval The snapshot interval to set\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:event Emits GrowthRateUpdated event on successful update of the growth rate\n */\n function setGrowthRate(uint256 _annualGrowthRate, uint256 _snapshotInterval) external {\n _checkAccessAllowed(\"setGrowthRate(uint256,uint256)\");\n uint256 oldGrowthRatePerSecond = growthRatePerSecond;\n\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n emit GrowthRateUpdated(oldGrowthRatePerSecond, growthRatePerSecond, snapshotInterval, _snapshotInterval);\n\n snapshotInterval = _snapshotInterval;\n }\n\n /**\n * @notice Sets the snapshot gap\n * @param _snapshotGap The snapshot gap to set\n * @custom:event Emits SnapshotGapUpdated event on successful update of the snapshot gap\n */\n function setSnapshotGap(uint256 _snapshotGap) external {\n _checkAccessAllowed(\"setSnapshotGap(uint256)\");\n\n emit SnapshotGapUpdated(snapshotGap, _snapshotGap);\n\n snapshotGap = _snapshotGap;\n }\n\n /**\n * @notice Returns if the price is capped\n * @return isCapped Boolean indicating if the price is capped\n */\n function isCapped() external view virtual returns (bool) {\n if (snapshotInterval == 0) {\n return false;\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n if (maxAllowedExchangeRate == 0) {\n return false;\n }\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n return exchangeRate > maxAllowedExchangeRate;\n }\n\n /**\n * @notice Updates the snapshot price and timestamp\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n * @custom:error InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero\n */\n function updateSnapshot() public override {\n if (block.timestamp - snapshotTimestamp < snapshotInterval || snapshotInterval == 0) return;\n\n uint256 exchangeRate = getUnderlyingAmount();\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n snapshotMaxExchangeRate =\n (exchangeRate > maxAllowedExchangeRate ? maxAllowedExchangeRate : exchangeRate) +\n snapshotGap;\n snapshotTimestamp = block.timestamp;\n\n if (snapshotMaxExchangeRate == 0) revert InvalidSnapshotMaxExchangeRate();\n\n RESILIENT_ORACLE.updateAssetPrice(UNDERLYING_TOKEN);\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Fetches the price of the token\n * @param asset Address of the token\n * @return price The price of the token in scaled decimal places. It can be capped\n * to a maximum value taking into account the growth rate\n * @custom:error InvalidTokenAddress error is thrown if the token address is invalid\n */\n function getPrice(address asset) public view override returns (uint256) {\n if (asset != CORRELATED_TOKEN) revert InvalidTokenAddress();\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n if (snapshotInterval == 0) {\n return _calculatePrice(exchangeRate);\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n uint256 finalExchangeRate = (exchangeRate > maxAllowedExchangeRate && maxAllowedExchangeRate != 0)\n ? maxAllowedExchangeRate\n : exchangeRate;\n\n return _calculatePrice(finalExchangeRate);\n }\n\n /**\n * @notice Gets the maximum allowed exchange rate for token\n * @return maxExchangeRate Maximum allowed exchange rate\n */\n function getMaxAllowedExchangeRate() public view returns (uint256) {\n uint256 timeElapsed = block.timestamp - snapshotTimestamp;\n uint256 maxExchangeRate = snapshotMaxExchangeRate +\n (snapshotMaxExchangeRate * growthRatePerSecond * timeElapsed) /\n 1e18;\n return maxExchangeRate;\n }\n\n /**\n * @notice Gets the underlying amount for correlated token\n * @return underlyingAmount Amount of underlying token\n */\n function getUnderlyingAmount() public view virtual returns (uint256);\n\n /**\n * @notice Fetches price of the token based on an underlying exchange rate\n * @param exchangeRate The underlying exchange rate to use\n * @return price The price of the token in scaled decimal places\n */\n function _calculatePrice(uint256 exchangeRate) internal view returns (uint256) {\n uint256 underlyingUSDPrice = RESILIENT_ORACLE.getPrice(UNDERLYING_TOKEN);\n\n IERC20Metadata token = IERC20Metadata(CORRELATED_TOKEN);\n uint256 decimals = token.decimals();\n\n return (exchangeRate * underlyingUSDPrice) / (10 ** decimals);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n * @custom:error Unauthorized error is thrown if the call is not allowed\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = ACCESS_CONTROL_MANAGER.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "contracts/oracles/ERC4626Oracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IERC4626 } from \"../interfaces/IERC4626.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ERC4626Oracle\n * @author Venus\n * @notice This oracle fetches the price of ERC4626 tokens\n */\ncontract ERC4626Oracle is CorrelatedTokenOracle {\n uint256 public immutable ONE_CORRELATED_TOKEN;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ONE_CORRELATED_TOKEN = 10 ** IERC4626(correlatedToken).decimals();\n }\n\n /**\n * @notice Fetches the amount of underlying token for 1 correlated token\n * @return amount The amount of underlying token for correlated token\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IERC4626(CORRELATED_TOKEN).convertToAssets(ONE_CORRELATED_TOKEN);\n }\n}\n" + }, + "contracts/oracles/EtherfiAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title EtherfiAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of any Ether.fi asset that uses\n * Accountant contracts to derive the underlying price\n */\ncontract EtherfiAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Fetches the conversion rate from the ACCOUNTANT contract\n * @return amount Amount of WBTC\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\n }\n}\n" + }, + "contracts/oracles/mocks/MockAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IAccountant.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAccountant is IAccountant, Ownable {\n uint256 public rate;\n\n constructor() Ownable() {}\n\n function setRate(uint256 _rate) external onlyOwner {\n rate = _rate;\n }\n\n function getRateSafe() external view override returns (uint256) {\n return rate;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceFeedRegistry.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/FeedRegistryInterface.sol\";\n\ncontract MockBinanceFeedRegistry is FeedRegistryInterface {\n mapping(string => uint256) public assetPrices;\n\n function setAssetPrice(string memory base, uint256 price) external {\n assetPrices[base] = price;\n }\n\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n override\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n quote;\n return (0, int256(assetPrices[base]), 0, block.timestamp - 10, 0);\n }\n\n function decimalsByName(string memory base, string memory quote) external view override returns (uint8) {\n return 8;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockBinanceOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n constructor() {}\n\n function initialize() public initializer {}\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockChainlinkOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n //set price in 6 decimal precision\n constructor() {}\n\n function initialize() public initializer {\n __Ownable_init();\n }\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n //https://compound.finance/docs/prices\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockPendlePtOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IPendlePtOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockPendlePtOracle is IPendlePtOracle, Ownable {\n mapping(address => mapping(uint32 => uint256)) public ptToAssetRate;\n mapping(address => mapping(uint32 => uint256)) public ptToSyRate;\n\n constructor() Ownable() {}\n\n function setPtToAssetRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToAssetRate[market][duration] = rate;\n }\n\n function setPtToSyRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToSyRate[market][duration] = rate;\n }\n\n function getPtToAssetRate(address market, uint32 duration) external view returns (uint256) {\n return ptToAssetRate[market][duration];\n }\n\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256) {\n return ptToSyRate[market][duration];\n }\n\n function getOracleState(\n address /* market */,\n uint32 /* duration */\n )\n external\n pure\n returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied)\n {\n return (false, 0, true);\n }\n}\n" + }, + "contracts/oracles/mocks/MockSFrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/ISfrxEthFraxOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSfrxEthFraxOracle is ISfrxEthFraxOracle, Ownable {\n bool public isBadData;\n uint256 public priceLow;\n uint256 public priceHigh;\n\n constructor() Ownable() {}\n\n function setPrices(bool _isBadData, uint256 _priceLow, uint256 _priceHigh) external onlyOwner {\n isBadData = _isBadData;\n priceLow = _priceLow;\n priceHigh = _priceHigh;\n }\n\n function getPrices() external view override returns (bool, uint256, uint256) {\n return (isBadData, priceLow, priceHigh);\n }\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 OracleInterface public immutable INTERMEDIATE_ORACLE;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n address intermediateOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 scaled by the underlying token decimals\n */\n function getUnderlyingAmount() public 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 (underlyingAmount * (10 ** correlatedDecimals)) / (10 ** (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\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title PendleOracle\n * @author Venus\n * @notice This oracle fetches the price of a pendle token\n * @dev As a base price the oracle uses either the price of the Pendle\n * market's asset (in this case PT_TO_ASSET rate should be used) or\n * the price of the Pendle market's interest bearing token (e.g. wstETH\n * for stETH; in this case PT_TO_SY rate should be used). Technically,\n * interest bearing token is different from standardized yield (SY) token,\n * but since SY is a wrapper around an interest bearing token, we can safely\n * assume the prices of the two are equal. This is not always true for asset\n * price though: using PT_TO_ASSET rate assumes that the yield token can\n * be seamlessly redeemed for the underlying asset. In reality, this might\n * not always be the case. For more details, see\n * https://docs.pendle.finance/Developers/Contracts/StandardizedYield\n */\ncontract PendleOracle is CorrelatedTokenOracle {\n struct ConstructorParams {\n /// @notice Pendle market\n address market;\n /// @notice Pendle oracle\n address ptOracle;\n /// @notice Either PT_TO_ASSET or PT_TO_SY\n RateKind rateKind;\n /// @notice Pendle PT token\n address ptToken;\n /// @notice Underlying token, can be either the market's asset or the interest bearing token\n address underlyingToken;\n /// @notice Resilient oracle to get the underlying token price from\n address resilientOracle;\n /// @notice TWAP duration to call Pendle oracle with\n uint32 twapDuration;\n /// @notice Annual growth rate of the underlying token\n uint256 annualGrowthRate;\n /// @notice Snapshot interval for the oracle\n uint256 snapshotInterval;\n /// @notice Initial exchange rate of the underlying token\n uint256 initialSnapshotMaxExchangeRate;\n /// @notice Initial timestamp of the underlying token\n uint256 initialSnapshotTimestamp;\n /// @notice Access control manager\n address accessControlManager;\n /// @notice Gap to add when updating the snapshot\n uint256 snapshotGap;\n }\n\n /// @notice Which asset to use as a base for the returned PT\n /// price. Can be either a standardized yield token (SY), in\n /// this case PT/SY price is returned, or the Pendle\n /// market's asset directly.\n enum RateKind {\n PT_TO_ASSET,\n PT_TO_SY\n }\n\n /// @notice Address of the PT oracle\n IPendlePtOracle public immutable PT_ORACLE;\n\n /// @notice Whether to use PT/SY (standardized yield token) rate\n /// or PT/market asset rate\n RateKind public immutable RATE_KIND;\n\n /// @notice Address of the market\n address public immutable MARKET;\n\n /// @notice Twap duration for the oracle\n uint32 public immutable TWAP_DURATION;\n\n /// @notice Decimals of the underlying token\n /// @dev We make an assumption that the underlying decimals will\n /// not change throughout the lifetime of the Pendle market\n uint8 public immutable UNDERLYING_DECIMALS;\n\n /// @notice Thrown if the duration is invalid\n error InvalidDuration();\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidDuration Thrown if the duration is invalid\n */\n constructor(\n ConstructorParams memory params\n )\n CorrelatedTokenOracle(\n params.ptToken,\n params.underlyingToken,\n params.resilientOracle,\n params.annualGrowthRate,\n params.snapshotInterval,\n params.initialSnapshotMaxExchangeRate,\n params.initialSnapshotTimestamp,\n params.accessControlManager,\n params.snapshotGap\n )\n {\n ensureNonzeroAddress(params.market);\n ensureNonzeroAddress(params.ptOracle);\n ensureNonzeroValue(params.twapDuration);\n\n MARKET = params.market;\n PT_ORACLE = IPendlePtOracle(params.ptOracle);\n RATE_KIND = params.rateKind;\n TWAP_DURATION = params.twapDuration;\n UNDERLYING_DECIMALS = IERC20Metadata(UNDERLYING_TOKEN).decimals();\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 /// @notice Fetches the amount of underlying token for 1 PT\n /// @return amount The amount of underlying token (either the market's asset\n /// or the yield token) for 1 PT, adjusted for decimals such that the result\n /// has the same precision as the underlying token\n function getUnderlyingAmount() public view override returns (uint256) {\n uint256 rate;\n if (RATE_KIND == RateKind.PT_TO_SY) {\n rate = PT_ORACLE.getPtToSyRate(MARKET, TWAP_DURATION);\n } else {\n rate = PT_ORACLE.getPtToAssetRate(MARKET, TWAP_DURATION);\n }\n return ((10 ** UNDERLYING_DECIMALS) * rate) / 1e18;\n }\n}\n" + }, + "contracts/oracles/SequencerChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.25;\n\nimport { ChainlinkOracle } from \"./ChainlinkOracle.sol\";\nimport { AggregatorV3Interface } from \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\n\n/**\n @title Sequencer Chain Link Oracle\n @notice Oracle to fetch price using chainlink oracles on L2s with sequencer\n*/\ncontract SequencerChainlinkOracle is ChainlinkOracle {\n /// @notice L2 Sequencer feed\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n AggregatorV3Interface public immutable sequencer;\n\n /// @notice L2 Sequencer grace period\n uint256 public constant GRACE_PERIOD_TIME = 3600;\n\n /**\n @notice Contract constructor\n @param _sequencer L2 sequencer\n @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(AggregatorV3Interface _sequencer) ChainlinkOracle() {\n require(address(_sequencer) != address(0), \"zero address\");\n\n sequencer = _sequencer;\n }\n\n /// @inheritdoc ChainlinkOracle\n function getPrice(address asset) public view override returns (uint) {\n if (!isSequencerActive()) revert(\"L2 sequencer unavailable\");\n return super.getPrice(asset);\n }\n\n function isSequencerActive() internal view returns (bool) {\n // answer from oracle is a variable with a value of either 1 or 0\n // 0: The sequencer is up\n // 1: The sequencer is down\n // startedAt: This timestamp indicates when the sequencer changed status\n (, int256 answer, uint256 startedAt, , ) = sequencer.latestRoundData();\n if (block.timestamp - startedAt <= GRACE_PERIOD_TIME || answer == 1) return false;\n return true;\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 constructor(\n address sFrax,\n address frax,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n sFrax,\n frax,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public 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 { ISfrxEthFraxOracle } from \"../interfaces/ISfrxEthFraxOracle.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title SFrxETHOracle\n * @author Venus\n * @notice This oracle fetches the price of sfrxETH\n */\ncontract SFrxETHOracle is AccessControlledV8, OracleInterface {\n /// @notice Address of SfrxEthFraxOracle\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ISfrxEthFraxOracle public immutable SFRXETH_FRAX_ORACLE;\n\n /// @notice Address of sfrxETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable SFRXETH;\n\n /// @notice Maximum allowed price difference\n uint256 public maxAllowedPriceDifference;\n\n /// @notice Emits when the maximum allowed price difference is updated\n event MaxAllowedPriceDifferenceUpdated(uint256 oldMaxAllowedPriceDifference, uint256 newMaxAllowedPriceDifference);\n\n /// @notice Thrown if the price data is invalid\n error BadPriceData();\n\n /// @notice Thrown if the price difference exceeds the allowed limit\n error PriceDifferenceExceeded();\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 /// @custom:error ZeroAddressNotAllowed is thrown when `_sfrxEthFraxOracle` or `_sfrxETH` are the zero address\n constructor(address _sfrxEthFraxOracle, address _sfrxETH) {\n ensureNonzeroAddress(_sfrxEthFraxOracle);\n ensureNonzeroAddress(_sfrxETH);\n\n SFRXETH_FRAX_ORACLE = ISfrxEthFraxOracle(_sfrxEthFraxOracle);\n SFRXETH = _sfrxETH;\n\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _acm Address of the access control manager contract\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function initialize(address _acm, uint256 _maxAllowedPriceDifference) external initializer {\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n __AccessControlled_init(_acm);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Sets the maximum allowed price difference\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function setMaxAllowedPriceDifference(uint256 _maxAllowedPriceDifference) external {\n _checkAccessAllowed(\"setMaxAllowedPriceDifference(uint256)\");\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n emit MaxAllowedPriceDifferenceUpdated(maxAllowedPriceDifference, _maxAllowedPriceDifference);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Fetches the USD price of sfrxETH\n * @param asset Address of the sfrxETH token\n * @return price The price scaled by 1e18\n * @custom:error InvalidTokenAddress is thrown when the `asset` is not the sfrxETH token (`SFRXETH`)\n * @custom:error BadPriceData is thrown if the `SFRXETH_FRAX_ORACLE` oracle informs it has bad data\n * @custom:error ZeroValueNotAllowed is thrown if the prices (low or high, in USD) are zero\n * @custom:error PriceDifferenceExceeded is thrown if priceHigh/priceLow is greater than `maxAllowedPriceDifference`\n */\n function getPrice(address asset) external view returns (uint256) {\n if (asset != SFRXETH) revert InvalidTokenAddress();\n\n (bool isBadData, uint256 priceLow, uint256 priceHigh) = SFRXETH_FRAX_ORACLE.getPrices();\n\n if (isBadData) revert BadPriceData();\n\n // calculate price in USD\n uint256 priceHighInUSD = (EXP_SCALE ** 2) / priceLow;\n uint256 priceLowInUSD = (EXP_SCALE ** 2) / priceHigh;\n\n ensureNonzeroValue(priceHighInUSD);\n ensureNonzeroValue(priceLowInUSD);\n\n // validate price difference\n uint256 difference = (priceHighInUSD * EXP_SCALE) / priceLowInUSD;\n if (difference > maxAllowedPriceDifference) revert PriceDifferenceExceeded();\n\n // calculate and return average price\n return (priceHighInUSD + priceLowInUSD) / 2;\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 ISynclubStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n slisBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertSnBnbToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/StableUsdtPriceFeed.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title StableUsdtPriceFeed\n * @dev This contract is used to get the price of USDT from a Resilient Oracle\n * and bounds the price to a certain range.\n */\ncontract StableUsdtPriceFeed {\n ResilientOracleInterface public resilientOracle;\n\n address public constant USDT_TOKEN_ADDR = 0x55d398326f99059fF775485246999027B3197955;\n uint256 public constant UPPER_BOUND = 1020000000000000000; // 1.02 USD\n uint256 public constant LOWER_BOUND = 980000000000000000; // 0.98 USD\n\n constructor(address _resilientOracle) {\n require(_resilientOracle != address(0), \"Zero address provided\");\n resilientOracle = ResilientOracleInterface(_resilientOracle);\n }\n\n function latestAnswer() external view returns (int256 answer) {\n // get price\n uint256 price = getPrice();\n // cast price to int256\n answer = int256(price);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n // get price\n uint256 _answer = getPrice();\n // mock timestamp to latest block timestamp\n uint256 timestamp = block.timestamp;\n // mock roundId to timestamp\n roundId = uint80(timestamp);\n return (roundId, int256(_answer), timestamp, timestamp, roundId);\n }\n\n function decimals() external pure returns (uint8) {\n return 18;\n }\n\n function description() external pure returns (string memory) {\n return \"Stabilized USDT Price Feed\";\n }\n\n function version() external pure returns (uint256) {\n return 1;\n }\n\n /**\n * @dev Get the price from the Resilient Oracle, and bound it to the range\n * @return price The price of USDT in 18 decimals\n */\n function getPrice() private view returns (uint256 price) {\n // get USDT price (18 decimals)\n price = resilientOracle.getPrice(USDT_TOKEN_ADDR);\n price = price < LOWER_BOUND ? LOWER_BOUND : (price > UPPER_BOUND ? UPPER_BOUND : price);\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 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 constructor(\n address stakePool,\n address stkBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n stkBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 * @custom:error PoolTokenSupplyIsZero error is thrown if the pool token supply is zero\n */\n function getUnderlyingAmount() public 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 constructor(\n address wbeth,\n address eth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wbeth,\n eth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public view override returns (uint256) {\n return IWBETH(CORRELATED_TOKEN).exchangeRate();\n }\n}\n" + }, + "contracts/oracles/WeETHAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title WeETHAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of Ether.fi tokens based on an `Accountant` contract (i.e. weETHs and weETHk)\n */\ncontract WeETHAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address weethLRT,\n address weth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weethLRT,\n weth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Gets the WETH for 1 weETH LRT\n * @return amount Amount of WETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\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 IEtherFiLiquidityPool public immutable LIQUIDITY_POOL;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address liquidityPool,\n address weETH,\n address eETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weETH,\n eETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return LIQUIDITY_POOL.amountForShare(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/WstETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\nimport { IStETH } from \"../interfaces/IStETH.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title WstETHOracle\n * @author Venus\n * @notice Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle.\n */\ncontract WstETHOracle is OracleInterface {\n /// @notice A flag assuming 1:1 price equivalence between stETH/ETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n bool public immutable ASSUME_STETH_ETH_EQUIVALENCE;\n\n /// @notice Address of stETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n IStETH public immutable STETH;\n\n /// @notice Address of wstETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WSTETH_ADDRESS;\n\n /// @notice Address of WETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WETH_ADDRESS;\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 Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address wstETHAddress,\n address wETHAddress,\n address stETHAddress,\n address resilientOracleAddress,\n bool assumeEquivalence\n ) {\n ensureNonzeroAddress(wstETHAddress);\n ensureNonzeroAddress(wETHAddress);\n ensureNonzeroAddress(stETHAddress);\n ensureNonzeroAddress(resilientOracleAddress);\n WSTETH_ADDRESS = wstETHAddress;\n WETH_ADDRESS = wETHAddress;\n STETH = IStETH(stETHAddress);\n RESILIENT_ORACLE = OracleInterface(resilientOracleAddress);\n ASSUME_STETH_ETH_EQUIVALENCE = assumeEquivalence;\n }\n\n /**\n * @notice Gets the USD price of wstETH asset\n * @dev Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle\n * @param asset Address of wstETH\n * @return wstETH Price in USD scaled by 1e18\n */\n function getPrice(address asset) public view returns (uint256) {\n if (asset != WSTETH_ADDRESS) revert(\"wrong wstETH address\");\n\n // get stETH amount for 1 wstETH scaled by 1e18\n uint256 stETHAmount = STETH.getPooledEthByShares(1 ether);\n\n // price is scaled 1e18 (oracle returns 36 - asset decimal scale)\n uint256 stETHUSDPrice = RESILIENT_ORACLE.getPrice(ASSUME_STETH_ETH_EQUIVALENCE ? WETH_ADDRESS : address(STETH));\n\n // stETHAmount (for 1 wstETH) * stETHUSDPrice / 1e18\n return (stETHAmount * stETHUSDPrice) / 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\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.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 Address of stETH\n IStETH public immutable STETH;\n\n /// @notice Constructor for the implementation contract.\n /// @dev The underlyingToken must be correlated so that 1 underlyingToken is equal to 1 stETH, because\n /// getUnderlyingAmount() implicitly assumes that\n constructor(\n address stETH,\n address wstETH,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wstETH,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(stETH);\n STETH = IStETH(stETH);\n }\n\n /**\n * @notice Gets the amount of underlyingToken for 1 wstETH, assuming that 1 underlyingToken is equivalent to 1 stETH\n * @return amount Amount of underlyingToken\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return STETH.getPooledEthByShares(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/ZkETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IZkETH } from \"../interfaces/IZkETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ZkETHOracle\n * @author Venus\n * @notice This oracle fetches the price of zkETH\n */\ncontract ZkETHOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address zkETH,\n address rzkETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n zkETH,\n rzkETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Gets the amount of rzkETH for 1 zkETH\n * @return amount Amount of rzkETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IZkETH(CORRELATED_TOKEN).LSTPerToken();\n }\n}\n" + }, + "contracts/ReferenceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2025 Venus\npragma solidity 0.8.25;\n\nimport { Ownable2StepUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { ResilientOracleInterface, OracleInterface } from \"./interfaces/OracleInterface.sol\";\n\n/**\n * @title ReferenceOracle\n * @author Venus\n * @notice Reference oracle is the oracle that is not used for production but required for\n * price monitoring. This oracle contains some extra configurations for assets required to\n * compute reference prices of their derivative assets (OneJump, ERC4626, Pendle, etc.)\n */\ncontract ReferenceOracle is Ownable2StepUpgradeable, OracleInterface {\n struct ExternalPrice {\n /// @notice asset address\n address asset;\n /// @notice price of the asset from an external source\n uint256 price;\n }\n\n /// @notice Slot to temporarily store price information from external sources\n /// like CMC/Coingecko, useful to compute prices of derivative assets based on\n /// prices of the base assets with no on chain price information\n bytes32 public constant PRICES_SLOT = keccak256(abi.encode(\"venus-protocol/oracle/ReferenceOracle/prices\"));\n\n /// @notice Resilient oracle address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Oracle configuration for assets\n mapping(address => OracleInterface) public oracles;\n\n /// @notice Event emitted when an oracle is set\n event OracleConfigured(address indexed asset, address indexed oracle);\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param resilientOracle Resilient oracle address\n * @custom:error ZeroAddressNotAllowed is thrown if resilient oracle address is null\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface resilientOracle) {\n ensureNonzeroAddress(address(resilientOracle));\n RESILIENT_ORACLE = resilientOracle;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n */\n function initialize() external initializer {\n __Ownable2Step_init();\n }\n\n /**\n * @notice Sets an oracle to use for a specific asset\n * @dev The production resilientOracle will be used if zero address is passed\n * @param asset Asset address\n * @param oracle Oracle address\n * @custom:access Only owner\n * @custom:error ZeroAddressNotAllowed is thrown if asset address is null\n * @custom:event Emits OracleConfigured event\n */\n function setOracle(address asset, OracleInterface oracle) external onlyOwner {\n ensureNonzeroAddress(asset);\n oracles[asset] = OracleInterface(oracle);\n emit OracleConfigured(asset, address(oracle));\n }\n\n /**\n * @notice Gets price of the asset assuming other assets have the defined price\n * @param asset asset address\n * @param externalPrices an array of prices for other assets\n * @return USD price in scaled decimal places\n */\n function getPriceAssuming(address asset, ExternalPrice[] memory externalPrices) external returns (uint256) {\n uint256 externalPricesCount = externalPrices.length;\n for (uint256 i = 0; i < externalPricesCount; ++i) {\n _storeExternalPrice(externalPrices[i].asset, externalPrices[i].price);\n }\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return USD price in scaled decimal places\n */\n function getPrice(address asset) external view override returns (uint256) {\n return _getPrice(asset);\n }\n\n function _storeExternalPrice(address asset, uint256 price) internal {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n tstore(slot, price)\n }\n }\n\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 externalPrice = _loadExternalPrice(asset);\n if (externalPrice != 0) {\n return externalPrice;\n }\n OracleInterface oracle = oracles[asset];\n if (oracle != OracleInterface(address(0))) {\n return oracle.getPrice(asset);\n }\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n function _loadExternalPrice(address asset) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/ResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity 0.8.25;\n\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { OracleInterface, ResilientOracleInterface, BoundValidatorInterface } from \"./interfaces/OracleInterface.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { ICappedOracle } from \"./interfaces/ICappedOracle.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title ResilientOracle\n * @author Venus\n * @notice The Resilient Oracle is the main contract that the protocol uses to fetch prices of assets.\n *\n * DeFi protocols are vulnerable to price oracle failures including oracle manipulation and incorrectly\n * reported prices. If only one oracle is used, this creates a single point of failure and opens a vector\n * for attacking the protocol.\n *\n * The Resilient Oracle uses multiple sources and fallback mechanisms to provide accurate prices and protect\n * the protocol from oracle attacks.\n *\n * For every market (vToken) we configure the main, pivot and fallback oracles. The oracles are configured per\n * vToken's underlying asset address. The main oracle oracle is the most trustworthy price source, the pivot\n * oracle is used as a loose sanity checker and the fallback oracle is used as a backup price source.\n *\n * To validate prices returned from two oracles, we use an upper and lower bound ratio that is set for every\n * market. The upper bound ratio represents the deviation between reported price (the price that’s being\n * validated) and the anchor price (the price we are validating against) above which the reported price will\n * be invalidated. The lower bound ratio presents the deviation between reported price and anchor price below\n * which the reported price will be invalidated. So for oracle price to be considered valid the below statement\n * should be true:\n\n```\nanchorRatio = anchorPrice/reporterPrice\nisValid = anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio\n```\n\n * In most cases, Chainlink is used as the main oracle, other oracles are used as the pivot oracle depending\n * on which supports the given market and Binance oracle is used as the fallback oracle.\n *\n * For a fetched price to be valid it must be positive and not stagnant. If the price is invalid then we consider the\n * oracle to be stagnant and treat it like it's disabled.\n */\ncontract ResilientOracle is PausableUpgradeable, AccessControlledV8, ResilientOracleInterface {\n /**\n * @dev Oracle roles:\n * **main**: The most trustworthy price source\n * **pivot**: Price oracle used as a loose sanity checker\n * **fallback**: The backup source when main oracle price is invalidated\n */\n enum OracleRole {\n MAIN,\n PIVOT,\n FALLBACK\n }\n\n struct TokenConfig {\n /// @notice asset address\n address asset;\n /// @notice `oracles` stores the oracles based on their role in the following order:\n /// [main, pivot, fallback],\n /// It can be indexed with the corresponding enum OracleRole value\n address[3] oracles;\n /// @notice `enableFlagsForOracles` stores the enabled state\n /// for each oracle in the same order as `oracles`\n bool[3] enableFlagsForOracles;\n /// @notice `cachingEnabled` is a flag that indicates whether the asset price should be cached\n bool cachingEnabled;\n }\n\n uint256 public constant INVALID_PRICE = 0;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Slot to cache the asset's price, used for transient storage\n /// custom:storage-location erc7201:venus-protocol/oracle/ResilientOracle/cache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/ResilientOracle/cache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant CACHE_SLOT = 0x4e99ec55972332f5e0ef9c6623192c0401b609161bffae64d9ccdd7ad6cc7800;\n\n /// @notice Bound validator contract address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n BoundValidatorInterface public immutable boundValidator;\n\n mapping(address => TokenConfig) private tokenConfigs;\n\n event TokenConfigAdded(\n address indexed asset,\n address indexed mainOracle,\n address indexed pivotOracle,\n address fallbackOracle\n );\n\n /// Event emitted when an oracle is set\n event OracleSet(address indexed asset, address indexed oracle, uint256 indexed role);\n\n /// Event emitted when an oracle is enabled or disabled\n event OracleEnabled(address indexed asset, uint256 indexed role, bool indexed enable);\n\n /// Event emitted when an asset cachingEnabled flag is set\n event CachedEnabled(address indexed asset, bool indexed enabled);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /**\n * @notice Checks whether token config exists by checking whether asset is null address\n * @dev address can't be null, so it's suitable to be used to check the validity of the config\n * @param asset asset address\n */\n modifier checkTokenConfigExistence(address asset) {\n if (tokenConfigs[asset].asset == address(0)) revert(\"token config must exist\");\n _;\n }\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @dev nativeMarketAddress can be address(0) if on the chain we do not support native market\n /// (e.g vETH on ethereum would not be supported, only vWETH)\n /// @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n /// @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain).\n /// Set to address(0) of VAI is not existent.\n /// @param _boundValidator Address of the bound validator contract\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address nativeMarketAddress,\n address vaiAddress,\n BoundValidatorInterface _boundValidator\n ) notNullAddress(address(_boundValidator)) {\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n boundValidator = _boundValidator;\n\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin and sets the BoundValidator contract address\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n __Pausable_init();\n }\n\n /**\n * @notice Pauses oracle\n * @custom:access Only Governance\n */\n function pause() external {\n _checkAccessAllowed(\"pause()\");\n _pause();\n }\n\n /**\n * @notice Unpauses oracle\n * @custom:access Only Governance\n */\n function unpause() external {\n _checkAccessAllowed(\"unpause()\");\n _unpause();\n }\n\n /**\n * @notice Batch sets token configs\n * @param tokenConfigs_ Token config array\n * @custom:access Only Governance\n * @custom:error Throws a length error if the length of the token configs array is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Sets oracle for a given asset and role.\n * @dev Supplied asset **must** exist and main oracle may not be null\n * @param asset Asset address\n * @param oracle Oracle address\n * @param role Oracle role\n * @custom:access Only Governance\n * @custom:error Null address error if main-role oracle address is null\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleSet event with asset address, oracle address and role of the oracle for the asset\n */\n function setOracle(\n address asset,\n address oracle,\n OracleRole role\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"setOracle(address,address,uint8)\");\n if (oracle == address(0) && role == OracleRole.MAIN) revert(\"can't set zero address to main oracle\");\n tokenConfigs[asset].oracles[uint256(role)] = oracle;\n emit OracleSet(asset, oracle, uint256(role));\n }\n\n /**\n * @notice Enables/ disables oracle for the input asset. Token config for the input asset **must** exist\n * @dev Configuration for the asset **must** already exist and the asset cannot be 0 address\n * @param asset Asset address\n * @param role Oracle role\n * @param enable Enabled boolean of the oracle\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleEnabled event with asset address, role of the oracle and enabled flag\n */\n function enableOracle(\n address asset,\n OracleRole role,\n bool enable\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"enableOracle(address,uint8,bool)\");\n tokenConfigs[asset].enableFlagsForOracles[uint256(role)] = enable;\n emit OracleEnabled(asset, uint256(role), enable);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getUnderlyingPrice\n * @param vToken vToken address\n */\n function updatePrice(address vToken) external override {\n address asset = _getUnderlyingAsset(vToken);\n _updateAssetPrice(asset);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getPrice\n * @param asset asset address\n */\n function updateAssetPrice(address asset) external {\n _updateAssetPrice(asset);\n }\n\n /**\n * @dev Gets token config by asset address\n * @param asset asset address\n * @return tokenConfig Config for the asset\n */\n function getTokenConfig(address asset) external view returns (TokenConfig memory) {\n return tokenConfigs[asset];\n }\n\n /**\n * @notice Gets price of the underlying asset for a given vToken. Validation flow:\n * - Check if the oracle is paused globally\n * - Validate price from main oracle against pivot oracle\n * - Validate price from fallback oracle against pivot oracle if the first validation failed\n * - Validate price from main oracle against fallback oracle if the second validation failed\n * In the case that the pivot oracle is not available but main price is available and validation is successful,\n * main oracle price is returned.\n * @param vToken vToken address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getUnderlyingPrice(address vToken) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n\n address asset = _getUnderlyingAsset(vToken);\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getPrice(address asset) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n return _getPrice(asset);\n }\n\n /**\n * @notice Sets/resets single token configs.\n * @dev main oracle **must not** be a null address\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress is thrown if asset address is null\n * @custom:error NotNullAddress is thrown if main-role oracle address for asset is null\n * @custom:event Emits TokenConfigAdded event when the asset config is set successfully by the authorized account\n * @custom:event Emits CachedEnabled event when the asset cachingEnabled flag is set successfully\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.oracles[uint256(OracleRole.MAIN)]) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(\n tokenConfig.asset,\n tokenConfig.oracles[uint256(OracleRole.MAIN)],\n tokenConfig.oracles[uint256(OracleRole.PIVOT)],\n tokenConfig.oracles[uint256(OracleRole.FALLBACK)]\n );\n emit CachedEnabled(tokenConfig.asset, tokenConfig.cachingEnabled);\n }\n\n /**\n * @notice Gets oracle and enabled status by asset address\n * @param asset asset address\n * @param role Oracle role\n * @return oracle Oracle address based on role\n * @return enabled Enabled flag of the oracle based on token config\n */\n function getOracle(address asset, OracleRole role) public view returns (address oracle, bool enabled) {\n oracle = tokenConfigs[asset].oracles[uint256(role)];\n enabled = tokenConfigs[asset].enableFlagsForOracles[uint256(role)];\n }\n\n /**\n * @notice Updates the capped oracle snapshot.\n * @dev Cache the asset price and return if already cached\n * @param asset asset address\n */\n function _updateAssetPrice(address asset) internal {\n if (Transient.readCachedPrice(CACHE_SLOT, asset) != 0) {\n return;\n }\n\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracle != address(0) && mainOracleEnabled) {\n // if main oracle is not CorrelatedTokenOracle it will revert so we need to catch the revert\n try ICappedOracle(mainOracle).updateSnapshot() {} catch {}\n }\n\n if (_isCacheEnabled(asset)) {\n uint256 price = _getPrice(asset);\n Transient.cachePrice(CACHE_SLOT, asset, price);\n }\n }\n\n /**\n * @notice Gets price for the provided asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 pivotPrice = INVALID_PRICE;\n uint256 price;\n\n price = Transient.readCachedPrice(CACHE_SLOT, asset);\n if (price != 0) {\n return price;\n }\n\n // Get pivot oracle price, Invalid price if not available or error\n (address pivotOracle, bool pivotOracleEnabled) = getOracle(asset, OracleRole.PIVOT);\n if (pivotOracleEnabled && pivotOracle != address(0)) {\n try OracleInterface(pivotOracle).getPrice(asset) returns (uint256 pricePivot) {\n pivotPrice = pricePivot;\n } catch {}\n }\n\n // Compare main price and pivot price, return main price and if validation was successful\n // note: In case pivot oracle is not available but main price is available and\n // validation is successful, the main oracle price is returned.\n (uint256 mainPrice, bool validatedPivotMain) = _getMainOraclePrice(\n asset,\n pivotPrice,\n pivotOracleEnabled && pivotOracle != address(0)\n );\n if (mainPrice != INVALID_PRICE && validatedPivotMain) return mainPrice;\n\n // Compare fallback and pivot if main oracle comparision fails with pivot\n // Return fallback price when fallback price is validated successfully with pivot oracle\n (uint256 fallbackPrice, bool validatedPivotFallback) = _getFallbackOraclePrice(asset, pivotPrice);\n if (fallbackPrice != INVALID_PRICE && validatedPivotFallback) return fallbackPrice;\n\n // Lastly compare main price and fallback price\n if (\n mainPrice != INVALID_PRICE &&\n fallbackPrice != INVALID_PRICE &&\n boundValidator.validatePriceWithAnchorPrice(asset, mainPrice, fallbackPrice)\n ) {\n return mainPrice;\n }\n\n revert(\"invalid resilient oracle price\");\n }\n\n /**\n * @notice Gets a price for the provided asset\n * @dev This function won't revert when price is 0, because the fallback oracle may still be\n * able to fetch a correct price\n * @param asset asset address\n * @param pivotPrice Pivot oracle price\n * @param pivotEnabled If pivot oracle is not empty and enabled\n * @return price USD price in scaled decimals\n * e.g. asset decimals is 8 then price is returned as 10**18 * 10**(18-8) = 10**28 decimals\n * @return pivotValidated Boolean representing if the validation of main oracle price\n * and pivot oracle price were successful\n * @custom:error Invalid price error is thrown if main oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if main oracle is not enabled or main oracle\n * address is null\n */\n function _getMainOraclePrice(\n address asset,\n uint256 pivotPrice,\n bool pivotEnabled\n ) internal view returns (uint256, bool) {\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracleEnabled && mainOracle != address(0)) {\n try OracleInterface(mainOracle).getPrice(asset) returns (uint256 mainOraclePrice) {\n if (!pivotEnabled) {\n return (mainOraclePrice, true);\n }\n if (pivotPrice == INVALID_PRICE) {\n return (mainOraclePrice, false);\n }\n return (\n mainOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, mainOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function won't revert when the price is 0 because getPrice checks if price is > 0\n * @param asset asset address\n * @return price USD price in 18 decimals\n * @return pivotValidated Boolean representing if the validation of fallback oracle price\n * and pivot oracle price were successfully\n * @custom:error Invalid price error is thrown if fallback oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if fallback oracle is not enabled or fallback oracle\n * address is null\n */\n function _getFallbackOraclePrice(address asset, uint256 pivotPrice) private view returns (uint256, bool) {\n (address fallbackOracle, bool fallbackEnabled) = getOracle(asset, OracleRole.FALLBACK);\n if (fallbackEnabled && fallbackOracle != address(0)) {\n try OracleInterface(fallbackOracle).getPrice(asset) returns (uint256 fallbackOraclePrice) {\n if (pivotPrice == INVALID_PRICE) {\n return (fallbackOraclePrice, false);\n }\n return (\n fallbackOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, fallbackOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view notNullAddress(vToken) returns (address asset) {\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev This function checks if the asset price should be cached\n * @param asset asset address\n * @return bool true if caching is enabled, false otherwise\n */\n function _isCacheEnabled(address asset) private view returns (bool) {\n return tokenConfigs[asset].cachingEnabled;\n }\n}\n" + }, + "contracts/test/BEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract BEP20Harness is ERC20 {\n uint8 public decimalsInternal = 18;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) {\n decimalsInternal = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return decimalsInternal;\n }\n}\n" + }, + "contracts/test/DeviationBoundedOracleCaller.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IDeviationBoundedOracle } from \"../interfaces/IDeviationBoundedOracle.sol\";\n\n/// @notice Test helper that batches DeviationBoundedOracle calls in a single transaction\n/// so transient storage (tstore/tload) cache can be tested.\ncontract DeviationBoundedOracleCaller {\n IDeviationBoundedOracle public immutable oracle;\n\n constructor(address _oracle) {\n oracle = IDeviationBoundedOracle(_oracle);\n }\n\n function updateAndGetCollateralPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPriceView(vToken);\n }\n\n function updateAndGetDebtPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateAndGetBothPrices(address vToken) external returns (uint256 collateral, uint256 debt) {\n oracle.updateProtectionState(vToken);\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateThenNonViewCollateral(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPrice(vToken);\n }\n\n function twoConsecutiveNonViewCollateral(address vToken) external returns (uint256 first, uint256 second) {\n first = oracle.getBoundedCollateralPrice(vToken);\n second = oracle.getBoundedCollateralPrice(vToken);\n }\n\n /// @notice Non-view wrapper so smock records oracle calls made by the view functions.\n function getViewPricesWithoutUpdateNonView(address vToken) external returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n /// @notice Calls updateProtectionState on vTokenA, then getBoundedCollateralPriceView on vTokenB.\n function updateAViewB(address vTokenA, address vTokenB) external returns (uint256) {\n oracle.updateProtectionState(vTokenA);\n return oracle.getBoundedCollateralPriceView(vTokenB);\n }\n}\n" + }, + "contracts/test/MockAnkrBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAnkrBNB is ERC20, Ownable, IAnkrBNB {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setSharesToBonds(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function sharesToBonds(uint256 amount) external view override returns (uint256) {\n return (amount * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, IAnkrBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAsBNB is ERC20, Ownable, IAsBNB {\n uint8 private immutable _decimals;\n address public minter;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals_,\n address minter_\n ) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n minter = minter_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setMinter(address minter_) external onlyOwner {\n minter = minter_;\n }\n\n function decimals() public view virtual override(ERC20, IAsBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\n\ncontract MockAsBNBMinter is IAsBNBMinter {\n function convertToTokens(uint256 _amount) external pure override returns (uint256) {\n return _amount;\n }\n}\n" + }, + "contracts/test/MockCallPrice.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\ninterface CorrelatedTokenOracleInterface {\n function updateSnapshot() external;\n function getPrice(address asset) external view returns (uint256);\n}\n\ncontract MockCallPrice {\n function getMultiPrice(CorrelatedTokenOracleInterface oracle, address asset) public returns (uint256, uint256) {\n oracle.updateSnapshot();\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n\n function getUnderlyingPriceResilientOracle(\n ResilientOracleInterface oracle,\n address vToken\n ) public returns (uint256, uint256) {\n oracle.updatePrice(vToken);\n oracle.updatePrice(vToken);\n return (oracle.getUnderlyingPrice(vToken), oracle.getUnderlyingPrice(vToken));\n }\n\n function getAssetPriceResilientOracle(\n ResilientOracleInterface oracle,\n address asset\n ) public returns (uint256, uint256) {\n oracle.updateAssetPrice(asset);\n oracle.updateAssetPrice(asset);\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n}\n" + }, + "contracts/test/MockEtherFiLiquidityPool.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/IEtherFiLiquidityPool.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockEtherFiLiquidityPool is IEtherFiLiquidityPool, Ownable {\n /// @notice The amount of eETH per weETH scaled by 1e18\n uint256 public amountPerShare;\n\n constructor() Ownable() {}\n\n function setAmountPerShare(uint256 _amountPerShare) external onlyOwner {\n amountPerShare = _amountPerShare;\n }\n\n function amountForShare(uint256 _share) external view override returns (uint256) {\n return (_share * amountPerShare) / 1e18;\n }\n}\n" + }, + "contracts/test/MockSFrax.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ISFrax } from \"../interfaces/ISFrax.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSFrax is ERC20, Ownable, ISFrax {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function convertToAssets(uint256 shares) external view override returns (uint256) {\n return (shares * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, ISFrax) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockSimpleOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/OracleInterface.sol\";\n\ncontract MockSimpleOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n constructor() {\n //\n }\n\n function getUnderlyingPrice(address vToken) external view returns (uint256) {\n return prices[vToken];\n }\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n\ncontract MockBoundValidator is BoundValidatorInterface {\n mapping(address => bool) public validateResults;\n bool public twapUpdated;\n\n constructor() {\n //\n }\n\n function validatePriceWithAnchorPrice(\n address vToken,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[vToken];\n }\n\n function validateAssetPriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[asset];\n }\n\n function setValidateResult(address token, bool pass) public {\n validateResults[token] = pass;\n }\n}\n" + }, + "contracts/test/MockV3Aggregator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol\";\n\n/**\n * @title MockV3Aggregator\n * @notice Based on the FluxAggregator contract\n * @notice Use this contract when you need to test\n * other contract's ability to read data from an\n * aggregator contract, but how the aggregator got\n * its answer is unimportant\n */\ncontract MockV3Aggregator is AggregatorV2V3Interface {\n uint256 public constant version = 0;\n\n uint8 public decimals;\n int256 public latestAnswer;\n uint256 public latestTimestamp;\n uint256 public latestRound;\n\n mapping(uint256 => int256) public getAnswer;\n mapping(uint256 => uint256) public getTimestamp;\n mapping(uint256 => uint256) private getStartedAt;\n\n constructor(uint8 _decimals, int256 _initialAnswer) {\n decimals = _decimals;\n updateAnswer(_initialAnswer);\n }\n\n function getRoundData(\n uint80 _roundId\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (_roundId, getAnswer[_roundId], getStartedAt[_roundId], getTimestamp[_roundId], _roundId);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (\n uint80(latestRound),\n getAnswer[latestRound],\n getStartedAt[latestRound],\n getTimestamp[latestRound],\n uint80(latestRound)\n );\n }\n\n function description() external pure returns (string memory) {\n return \"v0.6/tests/MockV3Aggregator.sol\";\n }\n\n function updateAnswer(int256 _answer) public {\n latestAnswer = _answer;\n latestTimestamp = block.timestamp;\n latestRound++;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = block.timestamp;\n getStartedAt[latestRound] = block.timestamp;\n }\n\n function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public {\n latestRound = _roundId;\n latestAnswer = _answer;\n latestTimestamp = _timestamp;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = _timestamp;\n getStartedAt[latestRound] = _startedAt;\n }\n}\n" + }, + "contracts/test/MockWBETH.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IWBETH } from \"../interfaces/IWBETH.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockWBETH is ERC20, Ownable, IWBETH {\n uint8 private immutable _decimals;\n uint256 public override exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setExchangeRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function decimals() public view virtual override(ERC20, IWBETH) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/oracles/MockCorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"../../oracles/common/CorrelatedTokenOracle.sol\";\n\ncontract MockCorrelatedTokenOracle is CorrelatedTokenOracle {\n uint256 public mockUnderlyingAmount;\n\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n snapshotGap\n )\n {}\n\n function setMockUnderlyingAmount(uint256 amount) external {\n mockUnderlyingAmount = amount;\n }\n\n function getUnderlyingAmount() public view override returns (uint256) {\n return mockUnderlyingAmount;\n }\n}\n" + }, + "contracts/test/oracles/MockERC20.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MockERC20 is ERC20 {\n constructor(string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) {\n _mint(msg.sender, 100000 * 10 ** uint256(decimals));\n }\n}\n" + }, + "contracts/test/oracles/MockResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/OracleInterface.sol\";\n\ncontract MockOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n" + }, + "contracts/test/PancakePairHarness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\n// a library for performing various math operations\n\nlibrary Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n //solhint-disable-next-line state-visibility\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n\ncontract PancakePairHarness {\n using UQ112x112 for uint224;\n\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) external {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"PancakeV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n unchecked {\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n }\n\n function currentBlockTimestamp() external view returns (uint32) {\n return uint32(block.timestamp % 2 ** 32);\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n}\n" + }, + "contracts/test/VBEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"./BEP20Harness.sol\";\n\ncontract VBEP20Harness is BEP20Harness {\n /**\n * @notice Underlying asset for this VToken\n */\n address public underlying;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals,\n address underlying_\n ) BEP20Harness(name_, symbol_, decimals) {\n underlying = underlying_;\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor (address initialOwner) {\n _transferOwnership(initialOwner);\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 called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing 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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol": { + "content": "// 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 IBeacon {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.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 *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\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 /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view virtual returns (address) {\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(Address.isContract(IBeacon(newBeacon).implementation()), \"ERC1967: beacon implementation is not a contract\");\n StorageSlot.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(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overriden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./TransparentUpgradeableProxy.sol\";\nimport \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n\n constructor (address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Returns the current implementation of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"implementation()\")) == 0x5c60da1b\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"5c60da1b\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Returns the current admin of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"admin()\")) == 0xf851a440\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"f851a440\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Changes the admin of `proxy` to `newAdmin`.\n *\n * Requirements:\n *\n * - This contract must be the current admin of `proxy`.\n */\n function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {\n proxy.changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {\n proxy.upgradeTo(implementation);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See\n * {TransparentUpgradeableProxy-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgradeAndCall(\n TransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\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 *\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \"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(\n address target,\n bytes memory data,\n uint256 value\n ) 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 require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(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 require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(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 require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason 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 // 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\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}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\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 * ```\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`, and `uint256`._\n */\nlibrary StorageSlot {\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 /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\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 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 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 assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\n address internal immutable _ADMIN;\n\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _ADMIN = admin_;\n\n // still store it to work with EIP-1967\n bytes32 slot = _ADMIN_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, admin_)\n }\n emit AdminChanged(address(0), admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n\n function _getAdmin() internal view virtual override returns (address) {\n return _ADMIN;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "evmVersion": "cancun", + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": ["ast"] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} From f0dab6fa3ca54f7ed7fb05837f1c8123a56653fa Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Fri, 1 May 2026 15:32:53 +0530 Subject: [PATCH 27/30] fix: upgrade DBO implementation --- ...DeviationBoundedOracle_Implementation.json | 378 ++++++++++++------ .../b08018e2eab5f4ca5e3ba0c1798444d8.json | 349 ++++++++++++++++ 2 files changed, 611 insertions(+), 116 deletions(-) create mode 100644 deployments/bsctestnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json diff --git a/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json b/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json index 83454975..0c27e876 100644 --- a/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json +++ b/deployments/bsctestnet/DeviationBoundedOracle_Implementation.json @@ -1,5 +1,5 @@ { - "address": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "address": "0x90c9756446ebA9E1762811c239Fe10029019e35e", "abi": [ { "inputs": [ @@ -48,6 +48,17 @@ "name": "InvalidArrayLength", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, { "inputs": [ { @@ -269,6 +280,31 @@ "name": "BoundedPricingWhitelistUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -729,6 +765,11 @@ "internalType": "uint128", "name": "resetThreshold", "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" } ], "stateMutability": "view", @@ -1078,6 +1119,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1122,29 +1181,41 @@ { "inputs": [ { - "internalType": "address", - "name": "asset", - "type": "address" - }, - { - "internalType": "uint64", - "name": "cooldownPeriod", - "type": "uint64" - }, - { - "internalType": "uint256", - "name": "triggerThreshold", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "resetThreshold", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "enableBoundedPricing", - "type": "bool" + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" } ], "name": "setTokenConfig", @@ -1155,29 +1226,41 @@ { "inputs": [ { - "internalType": "address[]", - "name": "assets", - "type": "address[]" - }, - { - "internalType": "uint64[]", - "name": "cooldownPeriods", - "type": "uint64[]" - }, - { - "internalType": "uint256[]", - "name": "triggerThresholds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "resetThresholds", - "type": "uint256[]" - }, - { - "internalType": "bool[]", - "name": "enableBoundedPricings", - "type": "bool[]" + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" } ], "name": "setTokenConfigs", @@ -1185,6 +1268,36 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1261,30 +1374,30 @@ "type": "function" } ], - "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", + "transactionHash": "0xb6c6a5a64618e32b7b9f1301c4fb1dcdcbbaa9663a1a654fe445bb34708b9450", "receipt": { "to": null, - "from": "0x4cD6300F5cb8D6BbA5E646131c3522664C10dF11", - "contractAddress": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "from": "0xe2a089cA69a90f1E27E723EFD339Cff4c4701AcC", + "contractAddress": "0x90c9756446ebA9E1762811c239Fe10029019e35e", "transactionIndex": 0, - "gasUsed": "2732766", - "logsBloom": "0x00001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000080000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000", - "blockHash": "0xe8cdcc52471fd12f9e4d6481b36353ea749f57b055d4d3a7d5a83101d8075b09", - "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", + "gasUsed": "2869841", + "logsBloom": "0x00000000000000000000000000000000000080004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0x19e89674081d676bfe8e6d4f611299347cfdb923db79beff1749838ea5053c37", + "transactionHash": "0xb6c6a5a64618e32b7b9f1301c4fb1dcdcbbaa9663a1a654fe445bb34708b9450", "logs": [ { "transactionIndex": 0, - "blockNumber": 102770915, - "transactionHash": "0xa57bd48729d98923806b3c69c044f4ba4880e57819510f1507ea82bc637669fe", - "address": "0x28f9576ec8D73331CDa7F0A6fAc88b0cA4D41e3f", + "blockNumber": 104860903, + "transactionHash": "0xb6c6a5a64618e32b7b9f1301c4fb1dcdcbbaa9663a1a654fe445bb34708b9450", + "address": "0x90c9756446ebA9E1762811c239Fe10029019e35e", "topics": ["0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498"], "data": "0x00000000000000000000000000000000000000000000000000000000000000ff", "logIndex": 0, - "blockHash": "0xe8cdcc52471fd12f9e4d6481b36353ea749f57b055d4d3a7d5a83101d8075b09" + "blockHash": "0x19e89674081d676bfe8e6d4f611299347cfdb923db79beff1749838ea5053c37" } ], - "blockNumber": 102770915, - "cumulativeGasUsed": "2732766", + "blockNumber": 104860903, + "cumulativeGasUsed": "2869841", "status": 1, "byzantium": true }, @@ -1294,10 +1407,10 @@ "0x5fFbE5302BadED40941A403228E6AD03f93752d9" ], "numDeployments": 1, - "solcInputHash": "4e92f74ff4913274028244b68ad09cb7", - "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"_resilientOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nativeMarketAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vaiAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"}],\"name\":\"CooldownNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMaxPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMinPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"InvalidResetThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketNotInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"PriceExceedsUint128\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentRangeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"PriceRangeNotConverged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximum\",\"type\":\"uint256\"}],\"name\":\"ThresholdAboveMaximum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"ThresholdBelowMinimum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"calledContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"methodSignature\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VAINotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPriceNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"BoundedPricingWhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldCooldown\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"CooldownPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMax\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"MaxPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMin\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"MinPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"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\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"}],\"name\":\"ProtectionInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectionModeExited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spotPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"}],\"name\":\"ProtectionTriggered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldExitThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newExitThreshold\",\"type\":\"uint256\"}],\"name\":\"ResetThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"TriggerThresholdSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLATERAL_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEBT_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEEPER_DEADBAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ADDR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RESILIENT_ORACLE\",\"outputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allAssets\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"assetProtectionConfig\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"currentlyUsingProtectedPrice\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isBoundedPricingEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"triggerThreshold\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"resetThreshold\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"canExitProtection\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMins\",\"type\":\"uint128[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMaxs\",\"type\":\"uint128[]\"}],\"name\":\"checkAndGetWindowDrift\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"needsMinUpdate\",\"type\":\"bool[]\"},{\"internalType\":\"bool[]\",\"name\":\"needsMaxUpdate\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"currentlyUsingProtectedPrice\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"exitProtectionMode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllBoundedPricingEnabledAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPricesView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitializedAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"isBoundedPricingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeMarket\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setAssetBoundedPricingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"setCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"newTriggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newResetThreshold\",\"type\":\"uint256\"}],\"name\":\"setThresholds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"}],\"name\":\"setTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint64[]\",\"name\":\"cooldownPeriods\",\"type\":\"uint64[]\"},{\"internalType\":\"uint256[]\",\"name\":\"triggerThresholds\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"resetThresholds\",\"type\":\"uint256[]\"},{\"internalType\":\"bool[]\",\"name\":\"enableBoundedPricings\",\"type\":\"bool[]\"}],\"name\":\"setTokenConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"updateMaxPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"updateMinPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"updateProtectionState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vai\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"canExitProtection(address)\":{\"details\":\"Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if protection can be disabled\"}},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"custom:error\":\"InvalidArrayLength if the input array lengths do not match\",\"details\":\"Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\",\"params\":{\"assets\":\"Array of asset addresses to check\",\"proposedMaxs\":\"Keeper's off-chain window maximum prices\",\"proposedMins\":\"Keeper's off-chain window minimum prices\"},\"returns\":{\"needsMaxUpdate\":\"Whether maxPrice drift exceeds deadband for each asset\",\"needsMinUpdate\":\"Whether minPrice drift exceeds deadband for each asset\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"params\":{\"_resilientOracle\":\"Address of the ResilientOracle contract\",\"nativeMarketAddress\":\"The address of a native market (for bsc it would be vBNB address)\",\"vaiAddress\":\"The address of the VAI token, or address(0) if VAI is not deployed on the chain.\"}},\"currentlyUsingProtectedPrice(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is currently using the protected price instead of spot\"}},\"exitProtectionMode(address)\":{\"custom:access\":\"Only authorized monitor/keeper addresses\",\"custom:error\":\"ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold\",\"custom:event\":\"ProtectionModeExited\",\"details\":\"Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"}},\"getAllBoundedPricingEnabledAssets()\":{\"details\":\"Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.\",\"returns\":{\"_0\":\"result Array of whitelisted asset addresses\"}},\"getBoundedCollateralPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedCollateralPriceView(address)\":{\"details\":\"Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns min(spot, windowMin) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedDebtPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedDebtPriceView(address)\":{\"details\":\"Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns max(spot, windowMax) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPrices(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPricesView(address)\":{\"details\":\"Reads from transient cache first; falls back to ResilientOracle on cache miss.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getInitializedAssets()\":{\"returns\":{\"_0\":\"Array of all initialized asset addresses\"}},\"initialize(address)\":{\"params\":{\"accessControlManager_\":\"Address of the access control manager contract\"}},\"isBoundedPricingEnabled(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is whitelisted\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setAccessControlManager(address)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"Emits NewAccessControlManager event\",\"details\":\"Admin function to set address of AccessControlManager\",\"params\":{\"accessControlManager_\":\"The new address of the AccessControlManager\"}},\"setAssetBoundedPricingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ProtectedPriceActive if trying to disable an asset while protection is active\",\"custom:event\":\"BoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether bounded pricing should be enabled for the asset\"}},\"setCooldownPeriod(address,uint64)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"CooldownPeriodSet\",\"params\":{\"asset\":\"The underlying asset address\",\"newCooldown\":\"The new cooldown period in seconds\"}},\"setThresholds(address,uint256,uint256)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\",\"custom:event\":\"TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed\",\"params\":{\"asset\":\"The underlying asset address\",\"newResetThreshold\":\"The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\",\"newTriggerThreshold\":\"The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\"}},\"setTokenConfig(address,uint64,uint256,uint256,bool)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"ProtectionInitializedBoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"cooldownPeriod\":\"Minimum time protection stays active after last trigger\",\"enableBoundedPricing\":\"Whether to enable bounded pricing immediately upon initialization\",\"resetThreshold\":\"Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\",\"triggerThreshold\":\"Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\"}},\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"InvalidArrayLength if array lengths do not match\",\"custom:event\":\"ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset\",\"params\":{\"assets\":\"Array of underlying asset addresses\",\"cooldownPeriods\":\"Array of cooldown periods (seconds)\",\"enableBoundedPricings\":\"Array of whether to enable bounded pricing per asset\",\"resetThresholds\":\"Array of reset thresholds (mantissa)\",\"triggerThresholds\":\"Array of trigger thresholds (mantissa)\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"updateMaxPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MaxPriceUpdated\",\"details\":\"Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMax\":\"The new maximum price\"}},\"updateMinPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MinPriceUpdated\",\"details\":\"Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMin\":\"The new minimum price\"}},\"updateProtectionState(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls.\",\"params\":{\"vToken\":\"vToken address\"}}},\"stateVariables\":{\"COLLATERAL_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/cache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"DEBT_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"RESILIENT_ORACLE\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"nativeMarket\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"vai\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"}},\"title\":\"DeviationBoundedOracle\",\"version\":1},\"userdoc\":{\"errors\":{\"CooldownNotElapsed(address,uint64,uint64)\":[{\"notice\":\"Thrown when trying to disable protection before cooldown has elapsed\"}],\"InvalidArrayLength()\":[{\"notice\":\"Thrown when the lengths of the arrays are not equal\"}],\"InvalidMaxPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set maxPrice below current spot\"}],\"InvalidMinPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set minPrice above current spot\"}],\"InvalidResetThreshold(uint256)\":[{\"notice\":\"Thrown when the exit threshold is set above the deviation threshold\"}],\"MarketAlreadyInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize an already initialized market\"}],\"MarketNotInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize protection for an asset that is not initialized\"}],\"PriceExceedsUint128(uint256)\":[{\"notice\":\"Thrown when a price exceeds uint128 max\"}],\"PriceRangeNotConverged(address,uint256,uint256)\":[{\"notice\":\"Thrown when trying to disable protection before price range has converged\"}],\"ProtectedPriceActive(address)\":[{\"notice\":\"Thrown when trying to update for an asset with active protection\"}],\"ProtectedPriceInactive(address)\":[{\"notice\":\"Thrown when trying to disable protection that is not active\"}],\"ThresholdAboveMaximum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set above the maximum allowed value\"}],\"ThresholdBelowMinimum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set below the minimum allowed value\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"Thrown when the action is prohibited by AccessControlManager\"}],\"VAINotAllowed()\":[{\"notice\":\"Thrown when trying to initialize protection for VAI\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}],\"ZeroPriceNotAllowed()\":[{\"notice\":\"Thrown when a zero price is provided where a non-zero price is required\"}],\"ZeroValueNotAllowed()\":[{\"notice\":\"Thrown if the supplied value is 0 where it is not allowed\"}]},\"events\":{\"BoundedPricingWhitelistUpdated(address,bool)\":{\"notice\":\"Emitted when an asset's whitelist status changes\"},\"CooldownPeriodSet(address,uint64,uint64)\":{\"notice\":\"Emitted when the cooldown period is updated for an asset\"},\"MaxPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the maximum price for an asset\"},\"MinPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the minimum price for an asset\"},\"NewAccessControlManager(address,address)\":{\"notice\":\"Emitted when access control manager contract address is changed\"},\"ProtectionInitialized(address,uint128,uint128,uint64,uint256)\":{\"notice\":\"Emitted when protection is initialized for an asset\"},\"ProtectionModeExited(address)\":{\"notice\":\"Emitted when protection mode is disabled for an asset\"},\"ProtectionTriggered(address,uint256,uint128,uint128)\":{\"notice\":\"Emitted when protection mode is triggered for an asset\"},\"ResetThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the exit threshold is updated for an asset\"},\"TriggerThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the entry threshold is updated for an asset\"}},\"kind\":\"user\",\"methods\":{\"COLLATERAL_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final collateral prices within a transaction\"},\"DEBT_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final debt prices within a transaction\"},\"KEEPER_DEADBAND()\":{\"notice\":\"Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\"},\"MAX_THRESHOLD()\":{\"notice\":\"Maximum allowed threshold value (50%)\"},\"MIN_THRESHOLD()\":{\"notice\":\"Minimum allowed threshold value (5%) to account for keeper deadband\"},\"NATIVE_TOKEN_ADDR()\":{\"notice\":\"Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens\"},\"RESILIENT_ORACLE()\":{\"notice\":\"Resilient Oracle used to fetch spot prices\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"allAssets(uint256)\":{\"notice\":\"Append-only array of all assets ever initialized, used for enumeration\"},\"assetProtectionConfig(address)\":{\"notice\":\"Per-asset protection state\"},\"canExitProtection(address)\":{\"notice\":\"Checks if protection can be exited for an asset\"},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"notice\":\"Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values\"},\"constructor\":{\"notice\":\"Constructor for the implementation contract. Sets immutable variables.\"},\"currentlyUsingProtectedPrice(address)\":{\"notice\":\"Checks if the asset is currently using the protected (bounded) price\"},\"exitProtectionMode(address)\":{\"notice\":\"Exits protection mode for a given asset\"},\"getAllBoundedPricingEnabledAssets()\":{\"notice\":\"Returns all currently whitelisted asset addresses\"},\"getBoundedCollateralPrice(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken, updating protection state\"},\"getBoundedCollateralPriceView(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken (view variant)\"},\"getBoundedDebtPrice(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken, updating protection state\"},\"getBoundedDebtPriceView(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken (view variant)\"},\"getBoundedPrices(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken, updating protection state\"},\"getBoundedPricesView(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken (view variant)\"},\"getInitializedAssets()\":{\"notice\":\"Returns all asset addresses that have ever been initialized\"},\"initialize(address)\":{\"notice\":\"Initializes the contract admin\"},\"isBoundedPricingEnabled(address)\":{\"notice\":\"Checks if an asset is whitelisted for bounded pricing\"},\"nativeMarket()\":{\"notice\":\"Native market address\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of AccessControlManager\"},\"setAssetBoundedPricingEnabled(address,bool)\":{\"notice\":\"Sets whether an asset is enabled for bounded pricing\"},\"setCooldownPeriod(address,uint64)\":{\"notice\":\"Sets the cooldown period for an asset\"},\"setThresholds(address,uint256,uint256)\":{\"notice\":\"Sets the trigger and reset thresholds for an asset\"},\"setTokenConfig(address,uint64,uint256,uint256,bool)\":{\"notice\":\"Initializes protection for a new asset\"},\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\":{\"notice\":\"Batch-initializes protection for multiple assets in a single transaction\"},\"updateMaxPrice(address,uint128)\":{\"notice\":\"Updates the maximum price in the rolling window for a given asset\"},\"updateMinPrice(address,uint128)\":{\"notice\":\"Updates the minimum price in the rolling window for a given asset\"},\"updateProtectionState(address)\":{\"notice\":\"Fetches the spot price, updates the protection window, and caches the resolved bounded prices in transient storage for the duration of the transaction.\"},\"vai()\":{\"notice\":\"VAI address\"}},\"notice\":\"The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeviationBoundedOracle.sol\":\"DeviationBoundedOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./OwnableUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\\n address private _pendingOwner;\\n\\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n function __Ownable2Step_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable2Step_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the address of the pending owner.\\n */\\n function pendingOwner() public view virtual returns (address) {\\n return _pendingOwner;\\n }\\n\\n /**\\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual override onlyOwner {\\n _pendingOwner = newOwner;\\n emit OwnershipTransferStarted(owner(), newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual override {\\n delete _pendingOwner;\\n super._transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev The new owner accepts the ownership transfer.\\n */\\n function acceptOwnership() public virtual {\\n address sender = _msgSender();\\n require(pendingOwner() == sender, \\\"Ownable2Step: caller is not the new owner\\\");\\n _transferOwnership(sender);\\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\",\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal onlyInitializing {\\n _transferOwnership(_msgSender());\\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 require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\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 require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\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 /**\\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\",\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// 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 IAccessControl {\\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\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\nimport \\\"./IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title AccessControlledV8\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\\n /// @notice Access control manager contract\\n IAccessControlManagerV8 internal _accessControlManager;\\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 /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /// @notice Thrown when the action is prohibited by AccessControlManager\\n error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\\n __Ownable2Step_init();\\n __AccessControlled_init_unchained(accessControlManager_);\\n }\\n\\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Sets the address of AccessControlManager\\n * @dev Admin function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n * @custom:event Emits NewAccessControlManager event\\n * @custom:access Only Governance\\n */\\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV8) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert Unauthorized(msg.sender, address(this), signature);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe0fd441c84ac907cabc88db69ef04f6d7532d770c7e6a1dfe6e7d6305debb49\",\"license\":\"BSD-3-Clause\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/access/IAccessControl.sol\\\";\\n\\n/**\\n * @title IAccessControlManagerV8\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\\n */\\ninterface IAccessControlManagerV8 is IAccessControl {\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xaa29b098440d0b3a131c5ecdf25ce548790c1b5ac7bf9b5c0264b6af6f7a1e0b\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0x14de93ead464da249af31bea0e3bcfb62ec693bea3475fb4d90f055ac81dc5eb\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0xdb88e14d50dd21889ca3329d755673d022c47e8da005b6a545c7f69c2c4b7b86\",\"license\":\"BSD-3-Clause\"},\"contracts/DeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { VBep20Interface } from \\\"./interfaces/VBep20Interface.sol\\\";\\nimport { ResilientOracleInterface } from \\\"./interfaces/OracleInterface.sol\\\";\\nimport { IDeviationBoundedOracle } from \\\"./interfaces/IDeviationBoundedOracle.sol\\\";\\nimport { AccessControlledV8 } from \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\\\";\\nimport { EXP_SCALE } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { Transient } from \\\"./lib/Transient.sol\\\";\\n\\n/**\\n * @title DeviationBoundedOracle\\n * @author Venus\\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\\n *\\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\\n * significantly from the window bounds, protection mode activates automatically and conservative\\n * pricing kicks in:\\n * - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low\\n * - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high\\n *\\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\\n * off-chain monitoring systems.\\n *\\n * The oracle exposes both view and non-view price functions. The non-view variants update the\\n * price window and trigger protection. The view variants read stored state only. A transient\\n * price cache avoids redundant ResilientOracle calls within the same transaction when\\n * updateProtectionState is called before the view price reads.\\n */\\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\\n uint256 public constant MIN_THRESHOLD = 5e16;\\n\\n /// @notice Maximum allowed threshold value (50%)\\n uint256 public constant MAX_THRESHOLD = 50e16;\\n\\n /// @notice Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\\n uint256 public constant KEEPER_DEADBAND = 5e16;\\n\\n /// @notice Resilient Oracle used to fetch spot prices\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\\n\\n /// @notice Native market address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable nativeMarket;\\n\\n /// @notice VAI address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable vai;\\n\\n /// @notice Transient storage slot for caching final collateral prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/cache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\\n 0x818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200;\\n\\n /// @notice Transient storage slot for caching final debt prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\\n\\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\\n /// and can serve as any underlying asset of a market that supports native tokens\\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\\n\\n /// @notice Per-asset protection state\\n mapping(address => MarketProtectionState) public assetProtectionConfig;\\n\\n /// @notice Append-only array of all assets ever initialized, used for enumeration\\n address[] public allAssets;\\n\\n /// @notice Storage gap for upgrades\\n uint256[48] private __gap;\\n\\n /**\\n * @notice Constructor for the implementation contract. Sets immutable variables.\\n * @param _resilientOracle Address of the ResilientOracle contract\\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\\n ensureNonzeroAddress(address(_resilientOracle));\\n ensureNonzeroAddress(nativeMarketAddress);\\n RESILIENT_ORACLE = _resilientOracle;\\n nativeMarket = nativeMarketAddress;\\n vai = vaiAddress;\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract admin\\n * @param accessControlManager_ Address of the access control manager contract\\n */\\n function initialize(address accessControlManager_) external initializer {\\n __AccessControlled_init(accessControlManager_);\\n }\\n\\n // ----- Non-view price functions (update window + trigger protection) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (lower) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (higher) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns both conservative prices in a single call.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\\n * bounded prices in transient storage for the duration of the transaction.\\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\\n * instead of querying ResilientOracle again, keeping those functions as `view` and\\n * avoiding redundant oracle calls.\\n * @param vToken vToken address\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external {\\n _updateAndGetBoundedPrices(vToken);\\n }\\n\\n // ----- View price functions (read stored/cached state only) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\\n * in the same transaction). Falls back to ResilientOracle on cache miss.\\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first (populated by a prior updateProtectionState call\\n * in the same transaction). Falls back to ResilientOracle on cache miss.\\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\\n (, debtPrice) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _computeBoundedPrices(vToken);\\n }\\n\\n // ----- Keeper functions -----\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\\n * Constraint: newMin must be at or below the current spot price.\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external {\\n _checkAccessAllowed(\\\"updateMinPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\\n }\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\\n * Constraint: newMax must be at or above the current spot price.\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external {\\n _checkAccessAllowed(\\\"updateMaxPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\\n }\\n\\n /**\\n * @notice Exits protection mode for a given asset\\n * @dev Called by the keeper/monitor after confirming price has normalised.\\n * Enforces two conditions on-chain:\\n * 1. Cooldown period has elapsed since the last trigger\\n * 2. Price range has converged below the exit threshold\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external {\\n _checkAccessAllowed(\\\"exitProtectionMode(address)\\\");\\n ensureNonzeroAddress(asset);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\\n\\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\\n }\\n\\n // exit protected price if price range has converged below exit threshold\\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\\n if (rangeRatio >= state.resetThreshold) {\\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\\n }\\n\\n state.currentlyUsingProtectedPrice = false;\\n state.lastProtectionTriggeredAt = 0;\\n emit ProtectionModeExited(asset);\\n }\\n\\n // ----- Admin functions (governance-gated) -----\\n\\n /**\\n * @notice Initializes protection for a new asset\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:access Only Governance\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) external {\\n _checkAccessAllowed(\\\"setTokenConfig(address,uint64,uint256,uint256,bool)\\\");\\n _setTokenConfig(asset, cooldownPeriod, triggerThreshold, resetThreshold, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Batch-initializes protection for multiple assets in a single transaction\\n * @param assets Array of underlying asset addresses\\n * @param cooldownPeriods Array of cooldown periods (seconds)\\n * @param triggerThresholds Array of trigger thresholds (mantissa)\\n * @param resetThresholds Array of reset thresholds (mantissa)\\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if array lengths do not match\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(\\n address[] calldata assets,\\n uint64[] calldata cooldownPeriods,\\n uint256[] calldata triggerThresholds,\\n uint256[] calldata resetThresholds,\\n bool[] calldata enableBoundedPricings\\n ) external {\\n _checkAccessAllowed(\\\"setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])\\\");\\n uint256 len = assets.length;\\n if (\\n len == 0 ||\\n len != cooldownPeriods.length ||\\n len != triggerThresholds.length ||\\n len != resetThresholds.length ||\\n len != enableBoundedPricings.length\\n ) revert InvalidArrayLength();\\n\\n for (uint256 i; i < len; ++i) {\\n _setTokenConfig(\\n assets[i],\\n cooldownPeriods[i],\\n triggerThresholds[i],\\n resetThresholds[i],\\n enableBoundedPricings[i]\\n );\\n }\\n }\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds\\n * @custom:access Only Governance\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\\n _checkAccessAllowed(\\\"setCooldownPeriod(address,uint64)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newCooldown);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\\n state.cooldownPeriod = newCooldown;\\n }\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\\n _checkAccessAllowed(\\\"setThresholds(address,uint256,uint256)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newTriggerThreshold);\\n ensureNonzeroValue(newResetThreshold);\\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (newTriggerThreshold != state.triggerThreshold) {\\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\\n state.triggerThreshold = uint128(newTriggerThreshold);\\n }\\n if (newResetThreshold != state.resetThreshold) {\\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\\n state.resetThreshold = uint128(newResetThreshold);\\n }\\n }\\n\\n /**\\n * @notice Sets whether an asset is enabled for bounded pricing\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setAssetBoundedPricingEnabled(address,bool)\\\");\\n ensureNonzeroAddress(asset);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!enabled && state.currentlyUsingProtectedPrice) {\\n revert ProtectedPriceActive(asset);\\n }\\n\\n if (state.isBoundedPricingEnabled == enabled) return;\\n\\n // reset the window if re-enabling\\n if (enabled) {\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n _setMinPrice(state, asset, spotU128);\\n _setMaxPrice(state, asset, spotU128);\\n }\\n\\n state.isBoundedPricingEnabled = enabled;\\n emit BoundedPricingWhitelistUpdated(asset, enabled);\\n }\\n\\n // ----- View helpers -----\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory) {\\n return allAssets;\\n }\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\\n }\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\\n }\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\\n * Gas-free for off-chain callers.\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\\n uint256 len = allAssets.length;\\n address[] memory temp = new address[](len);\\n uint256 count;\\n for (uint256 i; i < len; ++i) {\\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\\n temp[count++] = allAssets[i];\\n }\\n }\\n address[] memory result = new address[](count);\\n for (uint256 i; i < count; ++i) {\\n result[i] = temp[i];\\n }\\n return result;\\n }\\n\\n /**\\n * @notice Checks if protection can be exited for an asset\\n * @dev Returns true when both conditions are met:\\n * 1. Cooldown period has elapsed since last trigger\\n * 2. Price range has converged below exit threshold\\n * @param asset The underlying asset address\\n * @return True if protection can be disabled\\n */\\n function canExitProtection(address asset) external view returns (bool) {\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n return\\n state.currentlyUsingProtectedPrice &&\\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\\n }\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\\n * from the keeper's proposed window values\\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's off-chain window minimum prices\\n * @param proposedMaxs Keeper's off-chain window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\\n uint256 len = assets.length;\\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\\n\\n needsMinUpdate = new bool[](len);\\n needsMaxUpdate = new bool[](len);\\n\\n for (uint256 i; i < len; ++i) {\\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\\n }\\n }\\n\\n // ----- Internal functions -----\\n\\n /**\\n * @notice Initializes protection parameters and price window for a single asset\\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\\n * spot so the window expands naturally as prices move. Can only be called once per asset.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n */\\n function _setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) internal {\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(cooldownPeriod);\\n ensureNonzeroValue(triggerThreshold);\\n ensureNonzeroValue(resetThreshold);\\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\\n if (asset == vai) revert VAINotAllowed();\\n\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n\\n assetProtectionConfig[asset] = MarketProtectionState({\\n minPrice: spotU128,\\n maxPrice: spotU128,\\n currentlyUsingProtectedPrice: false,\\n isBoundedPricingEnabled: enableBoundedPricing,\\n lastProtectionTriggeredAt: 0,\\n cooldownPeriod: cooldownPeriod,\\n asset: asset,\\n triggerThreshold: uint128(triggerThreshold),\\n resetThreshold: uint128(resetThreshold)\\n });\\n\\n allAssets.push(asset);\\n\\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Validates and applies a keeper-provided min or max price update\\n * @param asset The underlying asset address\\n * @param newPrice The new price value to set\\n * @param boundType Whether this is a MIN or MAX bound update\\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is at or above maxPrice\\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is at or below minPrice\\n */\\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\\n ensureNonzeroAddress(asset);\\n if (newPrice == 0) revert ZeroPriceNotAllowed();\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n uint256 currentSpot = _fetchSpotPrice(asset);\\n if (boundType == PriceBoundType.MIN) {\\n if (newPrice >= state.maxPrice || uint256(newPrice) > currentSpot)\\n revert InvalidMinPrice(asset, newPrice, currentSpot);\\n _setMinPrice(state, asset, newPrice);\\n } else if (boundType == PriceBoundType.MAX) {\\n if (newPrice <= state.minPrice || uint256(newPrice) < currentSpot)\\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\\n _setMaxPrice(state, asset, newPrice);\\n }\\n }\\n\\n /**\\n * @notice Shared non-view logic for all bounded price functions.\\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n */\\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // return early if failure from resilient oracle to prevent cold SLOAD\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) {\\n _setCachedPrices(asset, spot, spot);\\n return (spot, spot);\\n }\\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\\n _setCachedPrices(asset, minPrice, maxPrice);\\n }\\n\\n /**\\n * @dev Expands the price window toward extremes if the spot price is a new min or max\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n */\\n function _expandPriceWindow(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset\\n ) internal returns (uint128, uint128, bool) {\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 currentMin = state.minPrice;\\n uint128 currentMax = state.maxPrice;\\n bool windowExpanded;\\n if (spotU128 < currentMin) {\\n _setMinPrice(state, asset, spotU128);\\n currentMin = spotU128;\\n windowExpanded = true;\\n }\\n if (spotU128 > currentMax) {\\n _setMaxPrice(state, asset, spotU128);\\n currentMax = spotU128;\\n windowExpanded = true;\\n }\\n return (currentMin, currentMax, windowExpanded);\\n }\\n\\n /**\\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\\n */\\n function _checkAndTriggerProtection(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset,\\n bool windowExpanded\\n ) internal returns (bool triggered) {\\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\\n if (enteringProtection || windowExpanded) {\\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\\n }\\n if (enteringProtection) {\\n state.currentlyUsingProtectedPrice = true;\\n }\\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\\n return true;\\n }\\n if (state.currentlyUsingProtectedPrice) return true;\\n }\\n\\n /**\\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\\n * When protection is inactive: both return spot.\\n * @param protectionActive Whether the market protection window is currently active\\n * @param spot The current spot price\\n * @param windowMin The lower bound of the price window\\n * @param windowMax The upper bound of the price window\\n * @return minPrice The resolved lower-bound (collateral) price\\n * @return maxPrice The resolved upper-bound (debt) price\\n */\\n function _resolveBoundedPrices(\\n bool protectionActive,\\n uint256 spot,\\n uint256 windowMin,\\n uint256 windowMax\\n ) internal pure returns (uint256, uint256) {\\n if (!protectionActive) return (spot, spot);\\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\\n }\\n\\n /**\\n * @notice Shared view logic for all bounded price view functions.\\n * Checks transient cache first for an early return; on miss, fetches from oracle\\n * and computes both prices without state mutations.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // Cache miss \\u2014 fetch from oracle and compute without state mutations\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) return (spot, spot);\\n\\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\\n\\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\\n\\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\\n }\\n\\n /**\\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\\n * Formula: \\\\((maxPrice - minPrice) / minPrice\\\\), scaled by `EXP_SCALE`.\\n * Used to measure how much the window has converged -- compared against `resetThreshold`\\n * to determine whether the price window is tight enough to exit protection mode.\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @return The scaled bound ratio \\\\(((max - min) * EXP_SCALE) / min\\\\)\\n */\\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\\n uint256 range = uint256(maxPrice) - uint256(minPrice);\\n return (range * EXP_SCALE) / uint256(minPrice);\\n }\\n\\n /**\\n * @notice Checks if the spot price has deviated beyond the threshold from the window bounds\\n * @dev Pump detection: spot > minPrice * (1 + threshold)\\n * Crash detection: spot < maxPrice * (1 - threshold)\\n * @param spot The current spot price\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @param threshold The deviation threshold (mantissa)\\n * @return True if deviation is triggered\\n */\\n function _exceedsDeviationThreshold(\\n uint256 spot,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint256 threshold\\n ) internal pure returns (bool) {\\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\\n return (spot > upperBound || spot < lowerBound);\\n }\\n\\n /**\\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\\n * @param currentPrice The current on-chain price\\n * @param proposedPrice The keeper's proposed price\\n * @return True if drift exceeds deadband\\n */\\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\\n if (currentPrice == 0 || proposedPrice == 0) return false;\\n uint256 diff = currentPrice > proposedPrice\\n ? uint256(currentPrice - proposedPrice)\\n : uint256(proposedPrice - currentPrice);\\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\\n }\\n\\n /**\\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMin The new minimum price\\n */\\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\\n emit MinPriceUpdated(asset, state.minPrice, newMin);\\n state.minPrice = newMin;\\n }\\n\\n /**\\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMax The new maximum price\\n */\\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\\n state.maxPrice = newMax;\\n }\\n\\n /**\\n * @dev Writes both lower and upper bounded prices to transient storage\\n * @param asset The underlying asset address\\n * @param minPrice The resolved lower (collateral) price to cache\\n * @param maxPrice The resolved upper (debt) price to cache\\n */\\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\\n }\\n\\n /**\\n * @dev Reads a cached final price from transient storage\\n * @param asset The underlying asset address\\n * @return minPrice The cached minimum price, or 0 on cache miss\\n * @return maxPrice The cached maximum price, or 0 on cache miss\\n */\\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\\n }\\n\\n /**\\n * @dev This function returns the underlying asset of a vToken\\n * @param vToken vToken address\\n * @return asset underlying asset address\\n */\\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\\n ensureNonzeroAddress(vToken);\\n if (vToken == nativeMarket) {\\n asset = NATIVE_TOKEN_ADDR;\\n } else if (vToken == vai) {\\n asset = vai;\\n } else {\\n asset = VBep20Interface(vToken).underlying();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the market has not been initialized via setTokenConfig\\n * @param asset The underlying asset address\\n * @return state The market protection state storage pointer\\n */\\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\\n state = assetProtectionConfig[asset];\\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\\n }\\n\\n /**\\n * @notice Fetches the current spot price for an asset from the ResilientOracle\\n * @param asset The underlying asset address\\n * @return The current spot price\\n */\\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\\n return RESILIENT_ORACLE.getPrice(asset);\\n }\\n\\n /**\\n * @dev Safely casts a uint256 to uint128, reverting on overflow\\n * @param value The value to cast\\n * @return The value as uint128\\n */\\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\\n return uint128(value);\\n }\\n}\\n\",\"keccak256\":\"0xbd8ad8239c2003615cc63f663ff64bc00a41b85a1c01e6b2decc8627c45789e3\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/IDeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IDeviationBoundedOracle {\\n // --- Enums ---\\n\\n /// @notice Identifies whether a price bound is a minimum or maximum\\n enum PriceBoundType {\\n MIN,\\n MAX\\n }\\n\\n // --- Structs ---\\n\\n /// @notice Per-asset protection state tracking the min/max price window\\n struct MarketProtectionState {\\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\\n uint128 minPrice;\\n /// @notice Highest price observed in the current window\\n uint128 maxPrice;\\n /// @notice Whether protected price is currently being used\\n bool currentlyUsingProtectedPrice;\\n /// @notice Whether this market is whitelisted for bounded pricing\\n bool isBoundedPricingEnabled;\\n /// @notice Timestamp of the last protection trigger \\u2014 reset on every trigger\\n uint64 lastProtectionTriggeredAt;\\n /// @notice Minimum time protection stays active after last trigger\\n uint64 cooldownPeriod;\\n /// @notice The underlying asset address, used to verify initialization\\n address asset;\\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\\n uint128 triggerThreshold;\\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\\n uint128 resetThreshold;\\n }\\n\\n // --- Events ---\\n\\n /// @notice Emitted when protection is initialized for an asset\\n event ProtectionInitialized(\\n address indexed asset,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold\\n );\\n\\n /// @notice Emitted when protection mode is triggered for an asset\\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\\n\\n /// @notice Emitted when protection mode is disabled for an asset\\n event ProtectionModeExited(address indexed asset);\\n\\n /// @notice Emitted when the keeper updates the minimum price for an asset\\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\\n\\n /// @notice Emitted when the keeper updates the maximum price for an asset\\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\\n\\n /// @notice Emitted when the entry threshold is updated for an asset\\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\\n\\n /// @notice Emitted when the exit threshold is updated for an asset\\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\\n\\n /// @notice Emitted when the cooldown period is updated for an asset\\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\\n\\n /// @notice Emitted when an asset's whitelist status changes\\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\\n\\n // --- Errors ---\\n\\n /// @notice Thrown when trying to initialize protection for an asset that is not initialized\\n error MarketNotInitialized(address asset);\\n\\n /// @notice Thrown when trying to initialize an already initialized market\\n error MarketAlreadyInitialized(address asset);\\n\\n /// @notice Thrown when trying to disable protection that is not active\\n error ProtectedPriceInactive(address asset);\\n\\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\\n\\n /// @notice Thrown when trying to disable protection before price range has converged\\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\\n\\n /// @notice Thrown when keeper tries to set minPrice above current spot\\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\\n\\n /// @notice Thrown when keeper tries to set maxPrice below current spot\\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\\n\\n /// @notice Thrown when threshold is set below the minimum allowed value\\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\\n\\n /// @notice Thrown when threshold is set above the maximum allowed value\\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\\n\\n /// @notice Thrown when a price exceeds uint128 max\\n error PriceExceedsUint128(uint256 price);\\n\\n /// @notice Thrown when a zero price is provided where a non-zero price is required\\n error ZeroPriceNotAllowed();\\n\\n /// @notice Thrown when trying to initialize protection for VAI\\n error VAINotAllowed();\\n\\n /// @notice Thrown when trying to update for an asset with active protection\\n error ProtectedPriceActive(address asset);\\n\\n /// @notice Thrown when the lengths of the arrays are not equal\\n error InvalidArrayLength();\\n\\n /// @notice Thrown when the exit threshold is set above the deviation threshold\\n error InvalidResetThreshold(uint256 resetThreshold);\\n\\n // --- Non-view price functions (update window + trigger protection) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- State update (call before view price reads to populate transient cache) ---\\n\\n /**\\n * @notice Updates the protection state for a given vToken, caching the resolved price\\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\\n * reads in the same transaction are served from transient storage.\\n * @param vToken vToken address\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external;\\n\\n // --- View price functions (read stored/cached state only) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return price The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return price The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first; falls back to ResilientOracle on cache miss.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- Keeper functions ---\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMin is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external;\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMax is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external;\\n\\n /**\\n * @notice Exits protection mode for a given asset once conditions are met\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external;\\n\\n // --- Admin functions (governance-gated) ---\\n\\n /**\\n * @notice Initializes protection parameters for a new asset\\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\\n * confirming the oracle is live for this asset before it is listed.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after the last trigger, in seconds\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @custom:access Only Governance\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing\\n ) external;\\n\\n /**\\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\\n * @param assets Array of underlying asset addresses\\n * @param cooldownPeriods Array of cooldown periods (seconds)\\n * @param triggerThresholds Array of trigger thresholds (mantissa)\\n * @param resetThresholds Array of reset thresholds (mantissa)\\n * @param enableBoundedPricings Array of whether to enable bounded pricing per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if array lengths do not match\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(\\n address[] calldata assets,\\n uint64[] calldata cooldownPeriods,\\n uint256[] calldata triggerThresholds,\\n uint256[] calldata resetThresholds,\\n bool[] calldata enableBoundedPricings\\n ) external;\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds; must be non-zero\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\\n\\n /**\\n * @notice Sets whether bounded pricing is enabled for an asset\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\\n\\n // --- View helpers ---\\n\\n /**\\n * @notice Returns the full protection state for an asset\\n * @param asset The underlying asset address\\n * @return minPrice Lowest price observed in the current window\\n * @return maxPrice Highest price observed in the current window\\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\\n * @return cooldownPeriod Minimum time protection stays active after last trigger\\n * @return assetAddr The underlying asset address stored in the struct\\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\\n */\\n function assetProtectionConfig(\\n address asset\\n )\\n external\\n view\\n returns (\\n uint128 minPrice,\\n uint128 maxPrice,\\n bool currentlyUsingProtectedPrice,\\n bool isBoundedPricingEnabled,\\n uint64 lastProtectionTriggeredAt,\\n uint64 cooldownPeriod,\\n address assetAddr,\\n uint128 triggerThreshold,\\n uint128 resetThreshold\\n );\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if protection can be exited for a given asset\\n * @param asset The underlying asset address\\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\\n */\\n function canExitProtection(address asset) external view returns (bool);\\n\\n /**\\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\\n * @param index Array index\\n * @return The asset address at the given index\\n */\\n function allAssets(uint256 index) external view returns (address);\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory);\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's proposed window minimum prices\\n * @param proposedMaxs Keeper's proposed window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\\n}\\n\",\"keccak256\":\"0x085d9a9abab4d4b594e958b7b74c5ccacd312a860627fd6e339aacf745549d18\",\"license\":\"BSD-3-Clause\"},\"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 BoundValidatorInterface {\\n function validatePriceWithAnchorPrice(\\n address asset,\\n uint256 reporterPrice,\\n uint256 anchorPrice\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd3bbb7c9eef19e8f467342df6034ef95399a00964646fb8c82b438968ae3a8c0\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/VBep20Interface.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\ninterface VBep20Interface is IERC20Metadata {\\n /**\\n * @notice Underlying asset for this VToken\\n */\\n function underlying() external view returns (address);\\n}\\n\",\"keccak256\":\"0x6e71c3df86501df5c0e4bace1333c0c91f9f9cced252a54fb99eeda219b789d5\",\"license\":\"BSD-3-Clause\"},\"contracts/lib/Transient.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nlibrary Transient {\\n /**\\n * @notice Cache the asset price into transient storage\\n * @param key address of the asset\\n * @param value asset price\\n */\\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n tstore(slot, value)\\n }\\n }\\n\\n /**\\n * @notice Read cached price from transient storage\\n * @param key address of the asset\\n * @return value cached asset price\\n */\\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n value := tload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x60d7133a48a757ee777cb9230e890ef489ffc33dcea9dadfcf5a8b72f9dd43aa\",\"license\":\"BSD-3-Clause\"}},\"version\":1}", - "bytecode": "0x60e060405234801561000f575f80fd5b506040516131da3803806131da83398101604081905261002e91610163565b61003783610069565b61004082610069565b6001600160a01b0380841660805282811660a052811660c052610061610093565b5050506101ad565b6001600160a01b038116610090576040516342bcdf7f60e11b815260040160405180910390fd5b50565b5f54610100900460ff16156100fe5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610090575f80fd5b5f805f60608486031215610175575f80fd5b83516101808161014f565b60208501519093506101918161014f565b60408501519092506101a28161014f565b809150509250925092565b60805160a05160c051612fe06101fa5f395f818161053601528181611d0c01528181612357015261239101525f818161043e015261230301525f81816104af01526119660152612fe05ff3fe608060405234801561000f575f80fd5b506004361061023f575f3560e01c80638cf38bb111610135578063bd11c4c0116100b4578063e2201bb811610079578063e2201bb81461067d578063e30c397814610690578063e40c2fed146106a1578063f2fde38b146106b4578063f4ee807a146106c7575f80fd5b8063bd11c4c0146103c2578063c382175714610558578063c4d66de814610644578063cf1412c014610657578063dcc889621461066a575f80fd5b8063a9534f8a116100fa578063a9534f8a146104d1578063a9c3cab1146104ec578063b4a0bdf3146104ff578063b540894f14610510578063b62e4c9214610531575f80fd5b80638cf38bb1146104605780638da5cb5b14610473578063969f58d314610484578063a31ebe5814610497578063a4edcd4c146104aa575f80fd5b8063578e5c22116101c15780637f5e1328116101865780637f5e1328146103c25780637fa6ea50146103d05780638769b231146103f857806388142b6b146104265780638a2f7f6d14610439575f80fd5b8063578e5c2214610331578063715018a61461035c57806376489e381461036457806377c9e613146103a757806379ba5097146103ba575f80fd5b80631be74faf116102075780631be74faf146102db57806323013b83146102f05780633b4ecdb2146103035780634912c4521461030b57806352a6bce31461031e575f80fd5b806308af5431146102435780630a5fa04d146102655780630e32cb861461028c5780631169d5a6146102a157806315a53122146102c8575b5f80fd5b6102526706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102527f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b61029f61029a366004612885565b6106da565b005b6102527f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20081565b61029f6102d63660046128b6565b6106ee565b6102e361073b565b60405161025c91906128e9565b61029f6102fe366004612942565b6108ee565b6102e3610a1a565b61029f610319366004612979565b610a7a565b61025261032c366004612885565b610c74565b61034461033f3660046129ab565b610c85565b6040516001600160a01b03909116815260200161025c565b61029f610cad565b610397610372366004612885565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b604051901515815260200161025c565b61029f6103b53660046129d8565b610cc0565b61029f610cf5565b61025266b1a2bc2ec5000081565b6103e36103de366004612885565b610d6c565b6040805192835260208301919091520161025c565b610397610406366004612885565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b6103e3610434366004612885565b610d80565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61029f61046e366004612885565b610d8b565b6033546001600160a01b0316610344565b61029f6104923660046128b6565b610f5d565b61029f6104a5366004612a31565b610fa7565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61034473bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b61029f6104fa366004612885565b61107a565b6097546001600160a01b0316610344565b61052361051e366004612aa2565b611088565b60405161025c929190612b70565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b6105db610566366004612885565b60c96020525f908152604090208054600182015460028301546003909301546001600160801b0380841694600160801b9485900482169460ff808616956101008104909116946001600160401b03620100008304811695600160501b90930416936001600160a01b0316928183169291041689565b604080516001600160801b039a8b168152988a1660208a01529615159688019690965293151560608701526001600160401b039283166080870152911660a08501526001600160a01b031660c0840152831660e08301529091166101008201526101200161025c565b61029f610652366004612885565b61124e565b610252610665366004612885565b61135b565b610397610678366004612885565b61136c565b61025261068b366004612885565b6113f8565b6065546001600160a01b0316610344565b6102526106af366004612885565b611402565b61029f6106c2366004612885565b61140c565b61029f6106d5366004612b9d565b61147d565b6106e26115ba565b6106eb81611614565b50565b61072c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e7431323829008152506116d2565b61073782825f611769565b5050565b60ca546060905f816001600160401b0381111561075a5761075a612c82565b604051908082528060200260200182016040528015610783578160200160208202803683370190505b5090505f805b838110156108495760c95f60ca83815481106107a7576107a7612c96565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108415760ca81815481106107ef576107ef612c96565b5f918252602090912001546001600160a01b0316838361080e81612cbe565b94508151811061082057610820612c96565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610789565b505f816001600160401b0381111561086357610863612c82565b60405190808252806020026020018201604052801561088c578160200160208202803683370190505b5090505f5b828110156108e5578381815181106108ab576108ab612c96565b60200260200101518282815181106108c5576108c5612c96565b6001600160a01b0390921660209283029190910190910152600101610891565b50949350505050565b61090f6040518060600160405280602b8152602001612ec8602b91396116d2565b610918826118d1565b5f610922836118f8565b9050811580156109365750600181015460ff165b15610964576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff1615150361098557505050565b81156109b7575f61099d61099885611945565b6119d7565b90506109aa828583611a07565b6109b5828583611a77565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a0d90851515815260200190565b60405180910390a2505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610a7057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a52575b5050505050905090565b610a9b604051806060016040528060268152602001612ef3602691396116d2565b610aa4836118d1565b610aad82611aeb565b610ab681611aeb565b66b1a2bc2ec50000821015610aee57604051630f4d736160e01b81526004810183905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000821115610b28576040516350ddbb7560e11b8152600481018390526706f05b59d3b20000602482015260440161095b565b818110610b4b57604051632021db5560e21b81526004810182905260240161095b565b5f610b55846118f8565b60038101549091506001600160801b03168314610bdd576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610c6e57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b0291161790555b50505050565b5f610c7e82611b0b565b9392505050565b60ca8181548110610c94575f80fd5b5f918252602090912001546001600160a01b0316905081565b610cb56115ba565b610cbe5f611be9565b565b610ce1604051806060016040528060338152602001612f19603391396116d2565b610cee8585858585611c02565b5050505050565b60655433906001600160a01b03168114610d635760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161095b565b6106eb81611be9565b5f80610d7783611b0b565b91509150915091565b5f80610d7783612090565b610dc96040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f646528616464726573732900000000008152506116d2565b610dd2816118d1565b5f610ddc826118f8565b600181015490915060ff16610e0f57604051638e001e1f60e01b81526001600160a01b038316600482015260240161095b565b6001810154610e36906001600160401b03600160501b820481169162010000900416612cd6565b421015610e8b576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b909204909116604482015260640161095b565b80545f90610eac906001600160801b0380821691600160801b9004166121cf565b6003830154909150600160801b90046001600160801b03168110610f105760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b0316604482015260640161095b565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b610f9b6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e7431323829008152506116d2565b61073782826001611769565b610fc8604051806060016040528060218152602001612f4c602191396116d2565b610fd1826118d1565b610fe3816001600160401b0316611aeb565b5f610fed836118f8565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b61108381611b0b565b505050565b60608086858114158061109b5750808414155b156110b957604051634ec4810560e11b815260040160405180910390fd5b806001600160401b038111156110d1576110d1612c82565b6040519080825280602002602001820160405280156110fa578160200160208202803683370190505b509250806001600160401b0381111561111557611115612c82565b60405190808252806020026020018201604052801561113e578160200160208202803683370190505b5091505f5b81811015611241575f60c95f8c8c8581811061116157611161612c96565b90506020020160208101906111769190612885565b6001600160a01b0316815260208101919091526040015f2080549091506111cc906001600160801b03168a8a858181106111b2576111b2612c96565b90506020020160208101906111c79190612ce9565b612217565b8583815181106111de576111de612c96565b91151560209283029190910190910152805461121690600160801b90046001600160801b03168888858181106111b2576111b2612c96565b84838151811061122857611228612c96565b9115156020928302919091019091015250600101611143565b5050965096945050505050565b5f54610100900460ff161580801561126c57505f54600160ff909116105b806112855750303b15801561128557505f5460ff166001145b6112e85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161095b565b5f805460ff191660011790558015611309575f805461ff0019166101001790555b611312826122c0565b8015610737575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f61136582611b0b565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156113bd575060018101546113b9906001600160401b03600160501b820481169162010000900416612cd6565b4210155b8015610c7e5750600381015481546001600160801b03600160801b928390048116926113f09280831692919004166121cf565b109392505050565b5f610c7e82612090565b5f61136582612090565b6114146115ba565b606580546001600160a01b0383166001600160a01b031990911681179091556114456033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61149e6040518060600160405280603e8152602001612f6d603e91396116d2565b888015806114ac5750808814155b806114b75750808614155b806114c25750808414155b806114cd5750808214155b156114eb57604051634ec4810560e11b815260040160405180910390fd5b5f5b818110156115ac576115a48c8c8381811061150a5761150a612c96565b905060200201602081019061151f9190612885565b8b8b8481811061153157611531612c96565b90506020020160208101906115469190612d02565b8a8a8581811061155857611558612c96565b9050602002013589898681811061157157611571612c96565b9050602002013588888781811061158a5761158a612c96565b905060200201602081019061159f9190612d1b565b611c02565b6001016114ed565b505050505050505050505050565b6033546001600160a01b03163314610cbe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b6001600160a01b0381166116785760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161095b565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910161134f565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab906117049033908690600401612d64565b602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117439190612d87565b90508061073757333083604051634a3fa29360e01b815260040161095b93929190612da2565b611772836118d1565b816001600160801b03165f0361179b5760405163a2b326dd60e01b815260040160405180910390fd5b5f6117a5846118f8565b90505f6117b185611945565b90505f8360018111156117c6576117c6612dcd565b036118495781546001600160801b03600160801b90910481169085161015806117f7575080846001600160801b0316115b156118395760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b611844828686611a07565b610cee565b600183600181111561185d5761185d612dcd565b03610cee5781546001600160801b03908116908516111580611887575080846001600160801b0316105b156118c657604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b610cee828686611a77565b6001600160a01b0381166106eb576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c9602052604090206002810154909116611940576040516349c9b68960e11b81526001600160a01b038316600482015260240161095b565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612de1565b92915050565b5f6001600160801b03821115611a035760405163339718d960e11b81526004810183905260240161095b565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b805f036106eb5760405163273e150360e21b815260040160405180910390fd5b5f805f611b17846122f7565b9050611b2281612415565b90935091508215801590611b3557508115155b15611b405750915091565b5f611b4a82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff16611b8c57611b81838384612474565b509485945092505050565b5f805f611b9a8486886124ca565b9250925092505f611bad8587898561254b565b9050611bcd8187866001600160801b0316866001600160801b0316612652565b9099509750611bdd878a8a612474565b50505050505050915091565b606580546001600160a01b03191690556106eb8161268f565b611c0b856118d1565b611c1d846001600160401b0316611aeb565b611c2683611aeb565b611c2f82611aeb565b6001600160a01b038581165f90815260c960205260409020600201541615611c7557604051630d8cdd9d60e01b81526001600160a01b038616600482015260240161095b565b66b1a2bc2ec50000831015611cad57604051630f4d736160e01b81526004810184905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000831115611ce7576040516350ddbb7560e11b8152600481018490526706f05b59d3b20000602482015260440161095b565b828210611d0a57604051632021db5560e21b81526004810183905260240161095b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611d5c5760405163c992a64b60e01b815260040160405180910390fd5b5f611d6961099887611945565b9050604051806101200160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200183151581526020015f6001600160401b03168152602001866001600160401b03168152602001876001600160a01b03168152602001856001600160801b03168152602001846001600160801b031681525060c95f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b0316021790555090505060ca86908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b68283888860405161203b94939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2856001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd83604051612080911515815260200190565b60405180910390a2505050505050565b5f805f61209c846122f7565b90506120a781612415565b909350915082158015906120ba57508115155b156120c55750915091565b5f6120cf82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661210657509485945092505050565b5f612110836119d7565b82549091505f906001600160801b031684106121365782546001600160801b0316612138565b815b83549091505f90600160801b90046001600160801b0316851161216c578354600160801b90046001600160801b031661216e565b825b60018501549091505f9060ff168061219e5750600385015461219e908790859085906001600160801b03166126e0565b90506121be8187856001600160801b0316856001600160801b0316612652565b909b909a5098505050505050505050565b5f806121e76001600160801b03808616908516612df8565b90506001600160801b038416612205670de0b6b3a764000083612e0b565b61220f9190612e22565b949350505050565b5f6001600160801b038316158061223557506001600160801b038216155b1561224157505f6119d1565b5f826001600160801b0316846001600160801b031611612273576122658484612e41565b6001600160801b0316612287565b61227d8385612e41565b6001600160801b03165b905066b1a2bc2ec500006001600160801b0385166122ad670de0b6b3a764000084612e0b565b6122b79190612e22565b11949350505050565b5f54610100900460ff166122e65760405162461bcd60e51b815260040161095b90612e61565b6122ee61275f565b6106eb8161278d565b5f612301826118d1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603612355575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036123b557507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612eac565b5f806124417f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200846127b3565b915061246d7f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600846127b3565b9050915091565b61249f7f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20084846127fb565b6110837f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084836127fb565b5f805f806124d7866119d7565b87549091506001600160801b0380821691600160801b90048116905f90841683111561250f576125088a8986611a07565b5082915060015b816001600160801b0316846001600160801b0316111561253b576125348a8986611a77565b5082905060015b9199909850909650945050505050565b835460038501545f916125779186916001600160801b0380821692600160801b909204811691166126e0565b1561263a57600185015460ff1615808061258e5750825b156125b95760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b80156125d0576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a2600191505061220f565b600185015460ff161561220f57506001949350505050565b5f8085612663575083905080612686565b8385106126705783612672565b845b83861161267f5783612681565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006126f58482612cd6565b612708906001600160801b038816612e0b565b6127129190612e22565b90505f670de0b6b3a76400006127288582612df8565b61273b906001600160801b038816612e0b565b6127459190612e22565b90508187118061275457508087105b979650505050505050565b5f54610100900460ff166127855760405162461bcd60e51b815260040161095b90612e61565b610cbe612842565b5f54610100900460ff166106e25760405162461bcd60e51b815260040161095b90612e61565b5f8083836040516020016127da9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f83836040516020016128219291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff166128685760405162461bcd60e51b815260040161095b90612e61565b610cbe33611be9565b6001600160a01b03811681146106eb575f80fd5b5f60208284031215612895575f80fd5b8135610c7e81612871565b80356001600160801b0381168114611940575f80fd5b5f80604083850312156128c7575f80fd5b82356128d281612871565b91506128e0602084016128a0565b90509250929050565b602080825282518282018190525f9190848201906040850190845b818110156129295783516001600160a01b031683529284019291840191600101612904565b50909695505050505050565b80151581146106eb575f80fd5b5f8060408385031215612953575f80fd5b823561295e81612871565b9150602083013561296e81612935565b809150509250929050565b5f805f6060848603121561298b575f80fd5b833561299681612871565b95602085013595506040909401359392505050565b5f602082840312156129bb575f80fd5b5035919050565b80356001600160401b0381168114611940575f80fd5b5f805f805f60a086880312156129ec575f80fd5b85356129f781612871565b9450612a05602087016129c2565b935060408601359250606086013591506080860135612a2381612935565b809150509295509295909350565b5f8060408385031215612a42575f80fd5b8235612a4d81612871565b91506128e0602084016129c2565b5f8083601f840112612a6b575f80fd5b5081356001600160401b03811115612a81575f80fd5b6020830191508360208260051b8501011115612a9b575f80fd5b9250929050565b5f805f805f8060608789031215612ab7575f80fd5b86356001600160401b0380821115612acd575f80fd5b612ad98a838b01612a5b565b90985096506020890135915080821115612af1575f80fd5b612afd8a838b01612a5b565b90965094506040890135915080821115612b15575f80fd5b50612b2289828a01612a5b565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612b65578151151587529582019590820190600101612b47565b509495945050505050565b604081525f612b826040830185612b34565b8281036020840152612b948185612b34565b95945050505050565b5f805f805f805f805f8060a08b8d031215612bb6575f80fd5b8a356001600160401b0380821115612bcc575f80fd5b612bd88e838f01612a5b565b909c509a5060208d0135915080821115612bf0575f80fd5b612bfc8e838f01612a5b565b909a50985060408d0135915080821115612c14575f80fd5b612c208e838f01612a5b565b909850965060608d0135915080821115612c38575f80fd5b612c448e838f01612a5b565b909650945060808d0135915080821115612c5c575f80fd5b50612c698d828e01612a5b565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612ccf57612ccf612caa565b5060010190565b808201808211156119d1576119d1612caa565b5f60208284031215612cf9575f80fd5b610c7e826128a0565b5f60208284031215612d12575f80fd5b610c7e826129c2565b5f60208284031215612d2b575f80fd5b8135610c7e81612935565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061220f90830184612d36565b5f60208284031215612d97575f80fd5b8151610c7e81612935565b6001600160a01b038481168252831660208201526060604082018190525f90612b9490830184612d36565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612df1575f80fd5b5051919050565b818103818111156119d1576119d1612caa565b80820281158282048414176119d1576119d1612caa565b5f82612e3c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160801b0382811682821603908082111561136557611365612caa565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612ebc575f80fd5b8151610c7e8161287156fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e66696728616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429736574546f6b656e436f6e6669677328616464726573735b5d2c75696e7436345b5d2c75696e743235365b5d2c75696e743235365b5d2c626f6f6c5b5d29a26469706673582212200b0f1b644e888914e3b4b2add80a376b34c39798a4ea6a946e169ae33aada4b164736f6c63430008190033", - "deployedBytecode": "0x608060405234801561000f575f80fd5b506004361061023f575f3560e01c80638cf38bb111610135578063bd11c4c0116100b4578063e2201bb811610079578063e2201bb81461067d578063e30c397814610690578063e40c2fed146106a1578063f2fde38b146106b4578063f4ee807a146106c7575f80fd5b8063bd11c4c0146103c2578063c382175714610558578063c4d66de814610644578063cf1412c014610657578063dcc889621461066a575f80fd5b8063a9534f8a116100fa578063a9534f8a146104d1578063a9c3cab1146104ec578063b4a0bdf3146104ff578063b540894f14610510578063b62e4c9214610531575f80fd5b80638cf38bb1146104605780638da5cb5b14610473578063969f58d314610484578063a31ebe5814610497578063a4edcd4c146104aa575f80fd5b8063578e5c22116101c15780637f5e1328116101865780637f5e1328146103c25780637fa6ea50146103d05780638769b231146103f857806388142b6b146104265780638a2f7f6d14610439575f80fd5b8063578e5c2214610331578063715018a61461035c57806376489e381461036457806377c9e613146103a757806379ba5097146103ba575f80fd5b80631be74faf116102075780631be74faf146102db57806323013b83146102f05780633b4ecdb2146103035780634912c4521461030b57806352a6bce31461031e575f80fd5b806308af5431146102435780630a5fa04d146102655780630e32cb861461028c5780631169d5a6146102a157806315a53122146102c8575b5f80fd5b6102526706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102527f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b61029f61029a366004612885565b6106da565b005b6102527f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20081565b61029f6102d63660046128b6565b6106ee565b6102e361073b565b60405161025c91906128e9565b61029f6102fe366004612942565b6108ee565b6102e3610a1a565b61029f610319366004612979565b610a7a565b61025261032c366004612885565b610c74565b61034461033f3660046129ab565b610c85565b6040516001600160a01b03909116815260200161025c565b61029f610cad565b610397610372366004612885565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b604051901515815260200161025c565b61029f6103b53660046129d8565b610cc0565b61029f610cf5565b61025266b1a2bc2ec5000081565b6103e36103de366004612885565b610d6c565b6040805192835260208301919091520161025c565b610397610406366004612885565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b6103e3610434366004612885565b610d80565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61029f61046e366004612885565b610d8b565b6033546001600160a01b0316610344565b61029f6104923660046128b6565b610f5d565b61029f6104a5366004612a31565b610fa7565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b61034473bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b61029f6104fa366004612885565b61107a565b6097546001600160a01b0316610344565b61052361051e366004612aa2565b611088565b60405161025c929190612b70565b6103447f000000000000000000000000000000000000000000000000000000000000000081565b6105db610566366004612885565b60c96020525f908152604090208054600182015460028301546003909301546001600160801b0380841694600160801b9485900482169460ff808616956101008104909116946001600160401b03620100008304811695600160501b90930416936001600160a01b0316928183169291041689565b604080516001600160801b039a8b168152988a1660208a01529615159688019690965293151560608701526001600160401b039283166080870152911660a08501526001600160a01b031660c0840152831660e08301529091166101008201526101200161025c565b61029f610652366004612885565b61124e565b610252610665366004612885565b61135b565b610397610678366004612885565b61136c565b61025261068b366004612885565b6113f8565b6065546001600160a01b0316610344565b6102526106af366004612885565b611402565b61029f6106c2366004612885565b61140c565b61029f6106d5366004612b9d565b61147d565b6106e26115ba565b6106eb81611614565b50565b61072c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e7431323829008152506116d2565b61073782825f611769565b5050565b60ca546060905f816001600160401b0381111561075a5761075a612c82565b604051908082528060200260200182016040528015610783578160200160208202803683370190505b5090505f805b838110156108495760c95f60ca83815481106107a7576107a7612c96565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108415760ca81815481106107ef576107ef612c96565b5f918252602090912001546001600160a01b0316838361080e81612cbe565b94508151811061082057610820612c96565b60200260200101906001600160a01b031690816001600160a01b0316815250505b600101610789565b505f816001600160401b0381111561086357610863612c82565b60405190808252806020026020018201604052801561088c578160200160208202803683370190505b5090505f5b828110156108e5578381815181106108ab576108ab612c96565b60200260200101518282815181106108c5576108c5612c96565b6001600160a01b0390921660209283029190910190910152600101610891565b50949350505050565b61090f6040518060600160405280602b8152602001612ec8602b91396116d2565b610918826118d1565b5f610922836118f8565b9050811580156109365750600181015460ff165b15610964576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff1615150361098557505050565b81156109b7575f61099d61099885611945565b6119d7565b90506109aa828583611a07565b6109b5828583611a77565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a0d90851515815260200190565b60405180910390a2505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610a7057602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610a52575b5050505050905090565b610a9b604051806060016040528060268152602001612ef3602691396116d2565b610aa4836118d1565b610aad82611aeb565b610ab681611aeb565b66b1a2bc2ec50000821015610aee57604051630f4d736160e01b81526004810183905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000821115610b28576040516350ddbb7560e11b8152600481018390526706f05b59d3b20000602482015260440161095b565b818110610b4b57604051632021db5560e21b81526004810182905260240161095b565b5f610b55846118f8565b60038101549091506001600160801b03168314610bdd576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610c6e57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b0291161790555b50505050565b5f610c7e82611b0b565b9392505050565b60ca8181548110610c94575f80fd5b5f918252602090912001546001600160a01b0316905081565b610cb56115ba565b610cbe5f611be9565b565b610ce1604051806060016040528060338152602001612f19603391396116d2565b610cee8585858585611c02565b5050505050565b60655433906001600160a01b03168114610d635760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b606482015260840161095b565b6106eb81611be9565b5f80610d7783611b0b565b91509150915091565b5f80610d7783612090565b610dc96040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f646528616464726573732900000000008152506116d2565b610dd2816118d1565b5f610ddc826118f8565b600181015490915060ff16610e0f57604051638e001e1f60e01b81526001600160a01b038316600482015260240161095b565b6001810154610e36906001600160401b03600160501b820481169162010000900416612cd6565b421015610e8b576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b909204909116604482015260640161095b565b80545f90610eac906001600160801b0380821691600160801b9004166121cf565b6003830154909150600160801b90046001600160801b03168110610f105760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b0316604482015260640161095b565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b610f9b6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e7431323829008152506116d2565b61073782826001611769565b610fc8604051806060016040528060218152602001612f4c602191396116d2565b610fd1826118d1565b610fe3816001600160401b0316611aeb565b5f610fed836118f8565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b61108381611b0b565b505050565b60608086858114158061109b5750808414155b156110b957604051634ec4810560e11b815260040160405180910390fd5b806001600160401b038111156110d1576110d1612c82565b6040519080825280602002602001820160405280156110fa578160200160208202803683370190505b509250806001600160401b0381111561111557611115612c82565b60405190808252806020026020018201604052801561113e578160200160208202803683370190505b5091505f5b81811015611241575f60c95f8c8c8581811061116157611161612c96565b90506020020160208101906111769190612885565b6001600160a01b0316815260208101919091526040015f2080549091506111cc906001600160801b03168a8a858181106111b2576111b2612c96565b90506020020160208101906111c79190612ce9565b612217565b8583815181106111de576111de612c96565b91151560209283029190910190910152805461121690600160801b90046001600160801b03168888858181106111b2576111b2612c96565b84838151811061122857611228612c96565b9115156020928302919091019091015250600101611143565b5050965096945050505050565b5f54610100900460ff161580801561126c57505f54600160ff909116105b806112855750303b15801561128557505f5460ff166001145b6112e85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161095b565b5f805460ff191660011790558015611309575f805461ff0019166101001790555b611312826122c0565b8015610737575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f61136582611b0b565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156113bd575060018101546113b9906001600160401b03600160501b820481169162010000900416612cd6565b4210155b8015610c7e5750600381015481546001600160801b03600160801b928390048116926113f09280831692919004166121cf565b109392505050565b5f610c7e82612090565b5f61136582612090565b6114146115ba565b606580546001600160a01b0383166001600160a01b031990911681179091556114456033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b61149e6040518060600160405280603e8152602001612f6d603e91396116d2565b888015806114ac5750808814155b806114b75750808614155b806114c25750808414155b806114cd5750808214155b156114eb57604051634ec4810560e11b815260040160405180910390fd5b5f5b818110156115ac576115a48c8c8381811061150a5761150a612c96565b905060200201602081019061151f9190612885565b8b8b8481811061153157611531612c96565b90506020020160208101906115469190612d02565b8a8a8581811061155857611558612c96565b9050602002013589898681811061157157611571612c96565b9050602002013588888781811061158a5761158a612c96565b905060200201602081019061159f9190612d1b565b611c02565b6001016114ed565b505050505050505050505050565b6033546001600160a01b03163314610cbe5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161095b565b6001600160a01b0381166116785760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b606482015260840161095b565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa0910161134f565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab906117049033908690600401612d64565b602060405180830381865afa15801561171f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117439190612d87565b90508061073757333083604051634a3fa29360e01b815260040161095b93929190612da2565b611772836118d1565b816001600160801b03165f0361179b5760405163a2b326dd60e01b815260040160405180910390fd5b5f6117a5846118f8565b90505f6117b185611945565b90505f8360018111156117c6576117c6612dcd565b036118495781546001600160801b03600160801b90910481169085161015806117f7575080846001600160801b0316115b156118395760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b611844828686611a07565b610cee565b600183600181111561185d5761185d612dcd565b03610cee5781546001600160801b03908116908516111580611887575080846001600160801b0316105b156118c657604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b03851660248201526044810182905260640161095b565b610cee828686611a77565b6001600160a01b0381166106eb576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c9602052604090206002810154909116611940576040516349c9b68960e11b81526001600160a01b038316600482015260240161095b565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa1580156119ad573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612de1565b92915050565b5f6001600160801b03821115611a035760405163339718d960e11b81526004810183905260240161095b565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b805f036106eb5760405163273e150360e21b815260040160405180910390fd5b5f805f611b17846122f7565b9050611b2281612415565b90935091508215801590611b3557508115155b15611b405750915091565b5f611b4a82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff16611b8c57611b81838384612474565b509485945092505050565b5f805f611b9a8486886124ca565b9250925092505f611bad8587898561254b565b9050611bcd8187866001600160801b0316866001600160801b0316612652565b9099509750611bdd878a8a612474565b50505050505050915091565b606580546001600160a01b03191690556106eb8161268f565b611c0b856118d1565b611c1d846001600160401b0316611aeb565b611c2683611aeb565b611c2f82611aeb565b6001600160a01b038581165f90815260c960205260409020600201541615611c7557604051630d8cdd9d60e01b81526001600160a01b038616600482015260240161095b565b66b1a2bc2ec50000831015611cad57604051630f4d736160e01b81526004810184905266b1a2bc2ec50000602482015260440161095b565b6706f05b59d3b20000831115611ce7576040516350ddbb7560e11b8152600481018490526706f05b59d3b20000602482015260440161095b565b828210611d0a57604051632021db5560e21b81526004810183905260240161095b565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b031603611d5c5760405163c992a64b60e01b815260040160405180910390fd5b5f611d6961099887611945565b9050604051806101200160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200183151581526020015f6001600160401b03168152602001866001600160401b03168152602001876001600160a01b03168152602001856001600160801b03168152602001846001600160801b031681525060c95f886001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b0316021790555090505060ca86908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550856001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b68283888860405161203b94939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2856001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd83604051612080911515815260200190565b60405180910390a2505050505050565b5f805f61209c846122f7565b90506120a781612415565b909350915082158015906120ba57508115155b156120c55750915091565b5f6120cf82611945565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661210657509485945092505050565b5f612110836119d7565b82549091505f906001600160801b031684106121365782546001600160801b0316612138565b815b83549091505f90600160801b90046001600160801b0316851161216c578354600160801b90046001600160801b031661216e565b825b60018501549091505f9060ff168061219e5750600385015461219e908790859085906001600160801b03166126e0565b90506121be8187856001600160801b0316856001600160801b0316612652565b909b909a5098505050505050505050565b5f806121e76001600160801b03808616908516612df8565b90506001600160801b038416612205670de0b6b3a764000083612e0b565b61220f9190612e22565b949350505050565b5f6001600160801b038316158061223557506001600160801b038216155b1561224157505f6119d1565b5f826001600160801b0316846001600160801b031611612273576122658484612e41565b6001600160801b0316612287565b61227d8385612e41565b6001600160801b03165b905066b1a2bc2ec500006001600160801b0385166122ad670de0b6b3a764000084612e0b565b6122b79190612e22565b11949350505050565b5f54610100900460ff166122e65760405162461bcd60e51b815260040161095b90612e61565b6122ee61275f565b6106eb8161278d565b5f612301826118d1565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603612355575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036123b557507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156123f1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119d19190612eac565b5f806124417f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb200846127b3565b915061246d7f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600846127b3565b9050915091565b61249f7f818cfa9b1e1b1cc716656acdb79a94121ed79bfb196bf958683ed2a3277cb20084846127fb565b6110837f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084836127fb565b5f805f806124d7866119d7565b87549091506001600160801b0380821691600160801b90048116905f90841683111561250f576125088a8986611a07565b5082915060015b816001600160801b0316846001600160801b0316111561253b576125348a8986611a77565b5082905060015b9199909850909650945050505050565b835460038501545f916125779186916001600160801b0380821692600160801b909204811691166126e0565b1561263a57600185015460ff1615808061258e5750825b156125b95760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b80156125d0576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a2600191505061220f565b600185015460ff161561220f57506001949350505050565b5f8085612663575083905080612686565b8385106126705783612672565b845b83861161267f5783612681565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006126f58482612cd6565b612708906001600160801b038816612e0b565b6127129190612e22565b90505f670de0b6b3a76400006127288582612df8565b61273b906001600160801b038816612e0b565b6127459190612e22565b90508187118061275457508087105b979650505050505050565b5f54610100900460ff166127855760405162461bcd60e51b815260040161095b90612e61565b610cbe612842565b5f54610100900460ff166106e25760405162461bcd60e51b815260040161095b90612e61565b5f8083836040516020016127da9291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f83836040516020016128219291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff166128685760405162461bcd60e51b815260040161095b90612e61565b610cbe33611be9565b6001600160a01b03811681146106eb575f80fd5b5f60208284031215612895575f80fd5b8135610c7e81612871565b80356001600160801b0381168114611940575f80fd5b5f80604083850312156128c7575f80fd5b82356128d281612871565b91506128e0602084016128a0565b90509250929050565b602080825282518282018190525f9190848201906040850190845b818110156129295783516001600160a01b031683529284019291840191600101612904565b50909695505050505050565b80151581146106eb575f80fd5b5f8060408385031215612953575f80fd5b823561295e81612871565b9150602083013561296e81612935565b809150509250929050565b5f805f6060848603121561298b575f80fd5b833561299681612871565b95602085013595506040909401359392505050565b5f602082840312156129bb575f80fd5b5035919050565b80356001600160401b0381168114611940575f80fd5b5f805f805f60a086880312156129ec575f80fd5b85356129f781612871565b9450612a05602087016129c2565b935060408601359250606086013591506080860135612a2381612935565b809150509295509295909350565b5f8060408385031215612a42575f80fd5b8235612a4d81612871565b91506128e0602084016129c2565b5f8083601f840112612a6b575f80fd5b5081356001600160401b03811115612a81575f80fd5b6020830191508360208260051b8501011115612a9b575f80fd5b9250929050565b5f805f805f8060608789031215612ab7575f80fd5b86356001600160401b0380821115612acd575f80fd5b612ad98a838b01612a5b565b90985096506020890135915080821115612af1575f80fd5b612afd8a838b01612a5b565b90965094506040890135915080821115612b15575f80fd5b50612b2289828a01612a5b565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612b65578151151587529582019590820190600101612b47565b509495945050505050565b604081525f612b826040830185612b34565b8281036020840152612b948185612b34565b95945050505050565b5f805f805f805f805f8060a08b8d031215612bb6575f80fd5b8a356001600160401b0380821115612bcc575f80fd5b612bd88e838f01612a5b565b909c509a5060208d0135915080821115612bf0575f80fd5b612bfc8e838f01612a5b565b909a50985060408d0135915080821115612c14575f80fd5b612c208e838f01612a5b565b909850965060608d0135915080821115612c38575f80fd5b612c448e838f01612a5b565b909650945060808d0135915080821115612c5c575f80fd5b50612c698d828e01612a5b565b915080935050809150509295989b9194979a5092959850565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612ccf57612ccf612caa565b5060010190565b808201808211156119d1576119d1612caa565b5f60208284031215612cf9575f80fd5b610c7e826128a0565b5f60208284031215612d12575f80fd5b610c7e826129c2565b5f60208284031215612d2b575f80fd5b8135610c7e81612935565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061220f90830184612d36565b5f60208284031215612d97575f80fd5b8151610c7e81612935565b6001600160a01b038481168252831660208201526060604082018190525f90612b9490830184612d36565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612df1575f80fd5b5051919050565b818103818111156119d1576119d1612caa565b80820281158282048414176119d1576119d1612caa565b5f82612e3c57634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160801b0382811682821603908082111561136557611365612caa565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b5f60208284031215612ebc575f80fd5b8151610c7e8161287156fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e66696728616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429736574546f6b656e436f6e6669677328616464726573735b5d2c75696e7436345b5d2c75696e743235365b5d2c75696e743235365b5d2c626f6f6c5b5d29a26469706673582212200b0f1b644e888914e3b4b2add80a376b34c39798a4ea6a946e169ae33aada4b164736f6c63430008190033", + "solcInputHash": "b08018e2eab5f4ca5e3ba0c1798444d8", + "metadata": "{\"compiler\":{\"version\":\"0.8.25+commit.b61c2a91\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"_resilientOracle\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"nativeMarketAddress\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"vaiAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"}],\"name\":\"CooldownNotElapsed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"action\",\"type\":\"uint8\"}],\"name\":\"InvalidKeeperAction\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMaxPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"},{\"internalType\":\"uint256\",\"name\":\"currentSpot\",\"type\":\"uint256\"}],\"name\":\"InvalidMinPrice\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"InvalidResetThreshold\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketAlreadyInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"MarketNotInitialized\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"price\",\"type\":\"uint256\"}],\"name\":\"PriceExceedsUint128\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"currentRangeRatio\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"}],\"name\":\"PriceRangeNotConverged\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceActive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectedPriceInactive\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"maximum\",\"type\":\"uint256\"}],\"name\":\"ThresholdAboveMaximum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"threshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"minimum\",\"type\":\"uint256\"}],\"name\":\"ThresholdBelowMinimum\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"calledContract\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"methodSignature\",\"type\":\"string\"}],\"name\":\"Unauthorized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VAINotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroAddressNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroPriceNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroValueNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"BoundedPricingWhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"oldEnabled\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"newEnabled\",\"type\":\"bool\"}],\"name\":\"CachingEnabledUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oldCooldown\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"CooldownPeriodSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMax\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"MaxPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"oldMin\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"MinPriceUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldAccessControlManager\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAccessControlManager\",\"type\":\"address\"}],\"name\":\"NewAccessControlManager\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferStarted\",\"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\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"}],\"name\":\"ProtectionInitialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"ProtectionModeExited\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"spotPrice\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"}],\"name\":\"ProtectionTriggered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldExitThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newExitThreshold\",\"type\":\"uint256\"}],\"name\":\"ResetThresholdSet\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldThreshold\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newThreshold\",\"type\":\"uint256\"}],\"name\":\"TriggerThresholdSet\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"COLLATERAL_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEBT_PRICE_CACHE_SLOT\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"KEEPER_DEADBAND\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MAX_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MIN_THRESHOLD\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NATIVE_TOKEN_ADDR\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RESILIENT_ORACLE\",\"outputs\":[{\"internalType\":\"contract ResilientOracleInterface\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"acceptOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"accessControlManager\",\"outputs\":[{\"internalType\":\"contract IAccessControlManagerV8\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"allAssets\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"assetProtectionConfig\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"minPrice\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"maxPrice\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"currentlyUsingProtectedPrice\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"isBoundedPricingEnabled\",\"type\":\"bool\"},{\"internalType\":\"uint64\",\"name\":\"lastProtectionTriggeredAt\",\"type\":\"uint64\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"triggerThreshold\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"resetThreshold\",\"type\":\"uint128\"},{\"internalType\":\"bool\",\"name\":\"cachingEnabled\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"canExitProtection\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"assets\",\"type\":\"address[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMins\",\"type\":\"uint128[]\"},{\"internalType\":\"uint128[]\",\"name\":\"proposedMaxs\",\"type\":\"uint128[]\"}],\"name\":\"checkAndGetWindowDrift\",\"outputs\":[{\"internalType\":\"bool[]\",\"name\":\"needsMinUpdate\",\"type\":\"bool[]\"},{\"internalType\":\"bool[]\",\"name\":\"needsMaxUpdate\",\"type\":\"bool[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"currentlyUsingProtectedPrice\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"exitProtectionMode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllBoundedPricingEnabledAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedCollateralPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedDebtPriceView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPrices\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"getBoundedPricesView\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"collateralPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"debtPrice\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInitializedAssets\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"}],\"name\":\"isBoundedPricingEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nativeMarket\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"accessControlManager_\",\"type\":\"address\"}],\"name\":\"setAccessControlManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setAssetBoundedPricingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"enabled\",\"type\":\"bool\"}],\"name\":\"setCachingEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"newCooldown\",\"type\":\"uint64\"}],\"name\":\"setCooldownPeriod\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"newTriggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"newResetThreshold\",\"type\":\"uint256\"}],\"name\":\"setThresholds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableCaching\",\"type\":\"bool\"}],\"internalType\":\"struct IDeviationBoundedOracle.TokenConfigInput\",\"name\":\"tokenConfig_\",\"type\":\"tuple\"}],\"name\":\"setTokenConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"cooldownPeriod\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"triggerThreshold\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"resetThreshold\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"enableBoundedPricing\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"enableCaching\",\"type\":\"bool\"}],\"internalType\":\"struct IDeviationBoundedOracle.TokenConfigInput[]\",\"name\":\"tokenConfigs_\",\"type\":\"tuple[]\"}],\"name\":\"setTokenConfigs\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"enum IDeviationBoundedOracle.KeeperAction\",\"name\":\"action\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"internalType\":\"struct IDeviationBoundedOracle.KeeperActionItem[]\",\"name\":\"actions\",\"type\":\"tuple[]\"}],\"name\":\"syncPriceBoundsAndProtections\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMax\",\"type\":\"uint128\"}],\"name\":\"updateMaxPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"asset\",\"type\":\"address\"},{\"internalType\":\"uint128\",\"name\":\"newMin\",\"type\":\"uint128\"}],\"name\":\"updateMinPrice\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"vToken\",\"type\":\"address\"}],\"name\":\"updateProtectionState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"vai\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Venus\",\"events\":{\"Initialized(uint8)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"}},\"kind\":\"dev\",\"methods\":{\"acceptOwnership()\":{\"details\":\"The new owner accepts the ownership transfer.\"},\"canExitProtection(address)\":{\"details\":\"Returns true when both conditions are met: 1. Cooldown period has elapsed since last trigger 2. Price range has converged below exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if protection can be disabled\"}},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"custom:error\":\"InvalidArrayLength if the input array lengths do not match\",\"details\":\"Allows the keeper to identify stale windows in a single call, avoiding N individual reads. Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\",\"params\":{\"assets\":\"Array of asset addresses to check\",\"proposedMaxs\":\"Keeper's off-chain window maximum prices\",\"proposedMins\":\"Keeper's off-chain window minimum prices\"},\"returns\":{\"needsMaxUpdate\":\"Whether maxPrice drift exceeds deadband for each asset\",\"needsMinUpdate\":\"Whether minPrice drift exceeds deadband for each asset\"}},\"constructor\":{\"custom:oz-upgrades-unsafe-allow\":\"constructor\",\"params\":{\"_resilientOracle\":\"Address of the ResilientOracle contract\",\"nativeMarketAddress\":\"The address of a native market (for bsc it would be vBNB address)\",\"vaiAddress\":\"The address of the VAI token, or address(0) if VAI is not deployed on the chain.\"}},\"currentlyUsingProtectedPrice(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is currently using the protected price instead of spot\"}},\"exitProtectionMode(address)\":{\"custom:access\":\"Only authorized monitor/keeper addresses\",\"custom:error\":\"ProtectedPriceInactive if protection is not currently activeCooldownNotElapsed if cooldown period has not elapsedPriceRangeNotConverged if window range is still above exit threshold\",\"custom:event\":\"ProtectionModeExited\",\"details\":\"Called by the keeper/monitor after confirming price has normalised. Enforces two conditions on-chain: 1. Cooldown period has elapsed since the last trigger 2. Price range has converged below the exit threshold\",\"params\":{\"asset\":\"The underlying asset address\"}},\"getAllBoundedPricingEnabledAssets()\":{\"details\":\"Iterates the append-only allAssets array and filters by isBoundedPricingEnabled. Gas-free for off-chain callers.\",\"returns\":{\"_0\":\"result Array of whitelisted asset addresses\"}},\"getBoundedCollateralPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (lower) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedCollateralPriceView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns min(spot, windowMin) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\"}},\"getBoundedDebtPrice(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns the conservative (higher) price when protection is active. Used by keepers or direct callers who want atomic update + read.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedDebtPriceView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns max(spot, windowMax) when protection is active, spot otherwise.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPrices(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Fetches spot from ResilientOracle, updates the price window, checks trigger, and returns both conservative prices in a single call.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getBoundedPricesView(address)\":{\"details\":\"Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; falls back to ResilientOracle on cache miss or when caching is disabled.\",\"params\":{\"vToken\":\"vToken address\"},\"returns\":{\"collateralPrice\":\"The bounded collateral price\",\"debtPrice\":\"The bounded debt price\"}},\"getInitializedAssets()\":{\"returns\":{\"_0\":\"Array of all initialized asset addresses\"}},\"initialize(address)\":{\"params\":{\"accessControlManager_\":\"Address of the access control manager contract\"}},\"isBoundedPricingEnabled(address)\":{\"params\":{\"asset\":\"The underlying asset address\"},\"returns\":{\"_0\":\"True if the asset is whitelisted\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"pendingOwner()\":{\"details\":\"Returns the address of the pending owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"setAccessControlManager(address)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"Emits NewAccessControlManager event\",\"details\":\"Admin function to set address of AccessControlManager\",\"params\":{\"accessControlManager_\":\"The new address of the AccessControlManager\"}},\"setAssetBoundedPricingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ProtectedPriceActive if trying to disable an asset while protection is active\",\"custom:event\":\"BoundedPricingWhitelistUpdated\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether bounded pricing should be enabled for the asset\"}},\"setCachingEnabled(address,bool)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"MarketNotInitialized if the asset has not been initialized\",\"custom:event\":\"CachingEnabledUpdated\",\"details\":\"When disabled, each view/non-view price call recomputes bounded prices from the live spot instead of reading or writing the transient slots. The initial value is set via the `enableCaching` argument of `setTokenConfig`.\",\"params\":{\"asset\":\"The underlying asset address\",\"enabled\":\"Whether transient caching is enabled for this asset\"}},\"setCooldownPeriod(address,uint64)\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"CooldownPeriodSet\",\"params\":{\"asset\":\"The underlying asset address\",\"newCooldown\":\"The new cooldown period in seconds\"}},\"setThresholds(address,uint256,uint256)\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"ThresholdBelowMinimum if newTriggerThreshold is below 5%ThresholdAboveMaximum if newTriggerThreshold is above 50%InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\",\"custom:event\":\"TriggerThresholdSet if the trigger threshold changedResetThresholdSet if the reset threshold changed\",\"params\":{\"asset\":\"The underlying asset address\",\"newResetThreshold\":\"The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\",\"newTriggerThreshold\":\"The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\"}},\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\":{\"custom:access\":\"Only Governance\",\"custom:event\":\"ProtectionInitializedBoundedPricingWhitelistUpdated\",\"params\":{\"tokenConfig_\":\"Token config input for the asset\"}},\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\":{\"custom:access\":\"Only Governance\",\"custom:error\":\"InvalidArrayLength if the input array is empty\",\"custom:event\":\"ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset\",\"params\":{\"tokenConfigs_\":\"Array of token config inputs, one per asset\"}},\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:error\":\"InvalidKeeperAction if an item carries an unsupported action enum value\",\"custom:event\":\"MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\",\"details\":\"Each item is processed in array order; any item revert rolls back the whole batch. `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. Empty `actions` is a no-op success.\",\"params\":{\"actions\":\"The list of keeper actions to apply\"}},\"transferOwnership(address)\":{\"details\":\"Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. Can only be called by the current owner.\"},\"updateMaxPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MaxPriceUpdated\",\"details\":\"Called by the keeper to push corrected max values from the off-chain sliding window. Constraint: newMax must be at or above the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMax\":\"The new maximum price\"}},\"updateMinPrice(address,uint128)\":{\"custom:access\":\"Only authorized keeper addresses\",\"custom:event\":\"MinPriceUpdated\",\"details\":\"Called by the keeper to push corrected min values from the off-chain sliding window. Constraint: newMin must be at or below the current spot price.\",\"params\":{\"asset\":\"The underlying asset address\",\"newMin\":\"The new minimum price\"}},\"updateProtectionState(address)\":{\"custom:event\":\"MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold\",\"details\":\"Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls. The transient cache is only populated when the asset's `cachingEnabled` flag is `true`. When caching is disabled, view price reads fall through to live recomputation. Permissionless: anyone can call this, both for gas optimisation and to ensure every caller in the same transaction reads the correct, up-to-date bounded price.\",\"params\":{\"vToken\":\"vToken address\"}}},\"stateVariables\":{\"COLLATERAL_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"DEBT_PRICE_CACHE_SLOT\":{\"details\":\"custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1)) & ~bytes32(uint256(0xff))\"},\"RESILIENT_ORACLE\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"nativeMarket\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"},\"vai\":{\"custom:oz-upgrades-unsafe-allow\":\"state-variable-immutable\"}},\"title\":\"DeviationBoundedOracle\",\"version\":1},\"userdoc\":{\"errors\":{\"CooldownNotElapsed(address,uint64,uint64)\":[{\"notice\":\"Thrown when trying to disable protection before cooldown has elapsed\"}],\"InvalidArrayLength()\":[{\"notice\":\"Thrown when the lengths of the arrays are not equal\"}],\"InvalidKeeperAction(uint8)\":[{\"notice\":\"Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\"}],\"InvalidMaxPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set maxPrice below current spot\"}],\"InvalidMinPrice(address,uint128,uint256)\":[{\"notice\":\"Thrown when keeper tries to set minPrice above current spot\"}],\"InvalidResetThreshold(uint256)\":[{\"notice\":\"Thrown when the exit threshold is set at or above the trigger threshold\"}],\"MarketAlreadyInitialized(address)\":[{\"notice\":\"Thrown when trying to initialize an already initialized market\"}],\"MarketNotInitialized(address)\":[{\"notice\":\"Thrown when trying to use or update protection for an asset that has not been initialized\"}],\"PriceExceedsUint128(uint256)\":[{\"notice\":\"Thrown when a price exceeds uint128 max\"}],\"PriceRangeNotConverged(address,uint256,uint256)\":[{\"notice\":\"Thrown when trying to disable protection before price range has converged\"}],\"ProtectedPriceActive(address)\":[{\"notice\":\"Thrown when trying to disable bounded pricing for an asset while protection is active\"}],\"ProtectedPriceInactive(address)\":[{\"notice\":\"Thrown when trying to disable protection that is not active\"}],\"ThresholdAboveMaximum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set above the maximum allowed value\"}],\"ThresholdBelowMinimum(uint256,uint256)\":[{\"notice\":\"Thrown when threshold is set below the minimum allowed value\"}],\"Unauthorized(address,address,string)\":[{\"notice\":\"Thrown when the action is prohibited by AccessControlManager\"}],\"VAINotAllowed()\":[{\"notice\":\"Thrown when trying to initialize protection for VAI\"}],\"ZeroAddressNotAllowed()\":[{\"notice\":\"Thrown if the supplied address is a zero address where it is not allowed\"}],\"ZeroPriceNotAllowed()\":[{\"notice\":\"Thrown when a zero price is provided where a non-zero price is required\"}],\"ZeroValueNotAllowed()\":[{\"notice\":\"Thrown if the supplied value is 0 where it is not allowed\"}]},\"events\":{\"BoundedPricingWhitelistUpdated(address,bool)\":{\"notice\":\"Emitted when an asset's whitelist status changes\"},\"CachingEnabledUpdated(address,bool,bool)\":{\"notice\":\"Emitted when the per-asset transient caching flag is toggled\"},\"CooldownPeriodSet(address,uint64,uint64)\":{\"notice\":\"Emitted when the cooldown period is updated for an asset\"},\"MaxPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the maximum price for an asset\"},\"MinPriceUpdated(address,uint128,uint128)\":{\"notice\":\"Emitted when the keeper updates the minimum price for an asset\"},\"NewAccessControlManager(address,address)\":{\"notice\":\"Emitted when access control manager contract address is changed\"},\"ProtectionInitialized(address,uint128,uint128,uint64,uint256)\":{\"notice\":\"Emitted when protection is initialized for an asset\"},\"ProtectionModeExited(address)\":{\"notice\":\"Emitted when protection mode is disabled for an asset\"},\"ProtectionTriggered(address,uint256,uint128,uint128)\":{\"notice\":\"Emitted when protection mode is triggered for an asset\"},\"ResetThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the exit threshold is updated for an asset\"},\"TriggerThresholdSet(address,uint256,uint256)\":{\"notice\":\"Emitted when the entry threshold is updated for an asset\"}},\"kind\":\"user\",\"methods\":{\"COLLATERAL_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final collateral prices within a transaction\"},\"DEBT_PRICE_CACHE_SLOT()\":{\"notice\":\"Transient storage slot for caching final debt prices within a transaction\"},\"KEEPER_DEADBAND()\":{\"notice\":\"Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\"},\"MAX_THRESHOLD()\":{\"notice\":\"Maximum allowed threshold value (50%)\"},\"MIN_THRESHOLD()\":{\"notice\":\"Minimum allowed threshold value (5%) to account for keeper deadband\"},\"NATIVE_TOKEN_ADDR()\":{\"notice\":\"Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc) and can serve as any underlying asset of a market that supports native tokens\"},\"RESILIENT_ORACLE()\":{\"notice\":\"Resilient Oracle used to fetch spot prices\"},\"accessControlManager()\":{\"notice\":\"Returns the address of the access control manager contract\"},\"allAssets(uint256)\":{\"notice\":\"Append-only array of all assets ever initialized, used for enumeration\"},\"assetProtectionConfig(address)\":{\"notice\":\"Per-asset protection state\"},\"canExitProtection(address)\":{\"notice\":\"Checks if protection can be exited for an asset\"},\"checkAndGetWindowDrift(address[],uint128[],uint128[])\":{\"notice\":\"Batch-checks which assets' on-chain min/max have drifted beyond the deadband from the keeper's proposed window values\"},\"constructor\":{\"notice\":\"Constructor for the implementation contract. Sets immutable variables.\"},\"currentlyUsingProtectedPrice(address)\":{\"notice\":\"Checks if the asset is currently using the protected (bounded) price\"},\"exitProtectionMode(address)\":{\"notice\":\"Exits protection mode for a given asset\"},\"getAllBoundedPricingEnabledAssets()\":{\"notice\":\"Returns all currently whitelisted asset addresses\"},\"getBoundedCollateralPrice(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken, updating protection state\"},\"getBoundedCollateralPriceView(address)\":{\"notice\":\"Gets the bounded collateral price for a given vToken (view variant)\"},\"getBoundedDebtPrice(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken, updating protection state\"},\"getBoundedDebtPriceView(address)\":{\"notice\":\"Gets the bounded debt price for a given vToken (view variant)\"},\"getBoundedPrices(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken, updating protection state\"},\"getBoundedPricesView(address)\":{\"notice\":\"Gets both the bounded collateral and debt prices for a given vToken (view variant)\"},\"getInitializedAssets()\":{\"notice\":\"Returns all asset addresses that have ever been initialized\"},\"initialize(address)\":{\"notice\":\"Initializes the contract admin\"},\"isBoundedPricingEnabled(address)\":{\"notice\":\"Checks if an asset is whitelisted for bounded pricing\"},\"nativeMarket()\":{\"notice\":\"Native market address\"},\"setAccessControlManager(address)\":{\"notice\":\"Sets the address of AccessControlManager\"},\"setAssetBoundedPricingEnabled(address,bool)\":{\"notice\":\"Sets whether an asset is enabled for bounded pricing\"},\"setCachingEnabled(address,bool)\":{\"notice\":\"Toggles transient caching of the bounded (collateral, debt) pair for an asset\"},\"setCooldownPeriod(address,uint64)\":{\"notice\":\"Sets the cooldown period for an asset\"},\"setThresholds(address,uint256,uint256)\":{\"notice\":\"Sets the trigger and reset thresholds for an asset\"},\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\":{\"notice\":\"Initializes protection for a new asset\"},\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\":{\"notice\":\"Batch-initializes protection for multiple assets in a single transaction\"},\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\":{\"notice\":\"Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\"},\"updateMaxPrice(address,uint128)\":{\"notice\":\"Updates the maximum price in the rolling window for a given asset\"},\"updateMinPrice(address,uint128)\":{\"notice\":\"Updates the minimum price in the rolling window for a given asset\"},\"updateProtectionState(address)\":{\"notice\":\"Fetches the spot price, updates the protection window, and caches the resolved collateral and debt prices in transient storage for the duration of the transaction.\"},\"vai()\":{\"notice\":\"VAI address\"}},\"notice\":\"The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations. It maintains a per-market rolling min/max price window. When the current spot price deviates significantly from the window bounds, protection mode activates automatically and conservative pricing kicks in: - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high This protects against instantaneous or short-duration price manipulation attacks on low-liquidity collateral tokens. Sustained attacks beyond the window period are expected to be handled by off-chain monitoring systems. The oracle exposes both view and non-view price functions. The non-view variants update the price window and trigger protection. The view variants read stored state only. A transient price cache avoids redundant ResilientOracle calls within the same transaction when updateProtectionState is called before the view price reads.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/DeviationBoundedOracle.sol\":\"DeviationBoundedOracle\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./OwnableUpgradeable.sol\\\";\\nimport {Initializable} from \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module which provides access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership} and {acceptOwnership}.\\n *\\n * This module is used through inheritance. It will make available all functions\\n * from parent (Ownable).\\n */\\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\\n address private _pendingOwner;\\n\\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\\n\\n function __Ownable2Step_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable2Step_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev Returns the address of the pending owner.\\n */\\n function pendingOwner() public view virtual returns (address) {\\n return _pendingOwner;\\n }\\n\\n /**\\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual override onlyOwner {\\n _pendingOwner = newOwner;\\n emit OwnershipTransferStarted(owner(), newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual override {\\n delete _pendingOwner;\\n super._transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev The new owner accepts the ownership transfer.\\n */\\n function acceptOwnership() public virtual {\\n address sender = _msgSender();\\n require(pendingOwner() == sender, \\\"Ownable2Step: caller is not the new owner\\\");\\n _transferOwnership(sender);\\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\",\"keccak256\":\"0x9140dabc466abab21b48b72dbda26736b1183a310d0e677d3719d201df026510\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n function __Ownable_init() internal onlyInitializing {\\n __Ownable_init_unchained();\\n }\\n\\n function __Ownable_init_unchained() internal onlyInitializing {\\n _transferOwnership(_msgSender());\\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 require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\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 require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\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 /**\\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\",\"keccak256\":\"0x359a1ab89b46b9aba7bcad3fb651924baf4893d15153049b9976b0fc9be1358e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x89be10e757d242e9b18d5a32c9fbe2019f6d63052bbe46397a430a1d60d7f794\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x9c80f545915582e63fe206c6ce27cbe85a86fc10b9cd2a0e8c9488fb7c2ee422\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// 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\",\"keccak256\":\"0x75097e35253e7fb282ee4d7f27a80eaacfa759923185bf17302a89cbc059c5ef\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// 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 IAccessControl {\\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\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x287b55befed2961a7eabd7d7b1b2839cbca8a5b80ef8dcbb25ed3d4c2002c305\",\"license\":\"MIT\"},\"@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\",\"keccak256\":\"0x8de418a5503946cabe331f35fe242d3201a73f67f77aaeb7110acb1f30423aca\",\"license\":\"MIT\"},\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\\\";\\n\\nimport \\\"./IAccessControlManagerV8.sol\\\";\\n\\n/**\\n * @title AccessControlledV8\\n * @author Venus\\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\\n */\\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\\n /// @notice Access control manager contract\\n IAccessControlManagerV8 internal _accessControlManager;\\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 /// @notice Emitted when access control manager contract address is changed\\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\\n\\n /// @notice Thrown when the action is prohibited by AccessControlManager\\n error Unauthorized(address sender, address calledContract, string methodSignature);\\n\\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\\n __Ownable2Step_init();\\n __AccessControlled_init_unchained(accessControlManager_);\\n }\\n\\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Sets the address of AccessControlManager\\n * @dev Admin function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n * @custom:event Emits NewAccessControlManager event\\n * @custom:access Only Governance\\n */\\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\\n _setAccessControlManager(accessControlManager_);\\n }\\n\\n /**\\n * @notice Returns the address of the access control manager contract\\n */\\n function accessControlManager() external view returns (IAccessControlManagerV8) {\\n return _accessControlManager;\\n }\\n\\n /**\\n * @dev Internal function to set address of AccessControlManager\\n * @param accessControlManager_ The new address of the AccessControlManager\\n */\\n function _setAccessControlManager(address accessControlManager_) internal {\\n require(address(accessControlManager_) != address(0), \\\"invalid acess control manager address\\\");\\n address oldAccessControlManager = address(_accessControlManager);\\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\\n }\\n\\n /**\\n * @notice Reverts if the call is not allowed by AccessControlManager\\n * @param signature Method signature\\n */\\n function _checkAccessAllowed(string memory signature) internal view {\\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\\n\\n if (!isAllowedToCall) {\\n revert Unauthorized(msg.sender, address(this), signature);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xfe0fd441c84ac907cabc88db69ef04f6d7532d770c7e6a1dfe6e7d6305debb49\",\"license\":\"BSD-3-Clause\"},\"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/access/IAccessControl.sol\\\";\\n\\n/**\\n * @title IAccessControlManagerV8\\n * @author Venus\\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\\n */\\ninterface IAccessControlManagerV8 is IAccessControl {\\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\\n\\n function revokeCallPermission(\\n address contractAddress,\\n string calldata functionSig,\\n address accountToRevoke\\n ) external;\\n\\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\\n\\n function hasPermission(\\n address account,\\n address contractAddress,\\n string calldata functionSig\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xaa29b098440d0b3a131c5ecdf25ce548790c1b5ac7bf9b5c0264b6af6f7a1e0b\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0x14de93ead464da249af31bea0e3bcfb62ec693bea3475fb4d90f055ac81dc5eb\",\"license\":\"BSD-3-Clause\"},\"@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\",\"keccak256\":\"0xdb88e14d50dd21889ca3329d755673d022c47e8da005b6a545c7f69c2c4b7b86\",\"license\":\"BSD-3-Clause\"},\"contracts/DeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\nimport { VBep20Interface } from \\\"./interfaces/VBep20Interface.sol\\\";\\nimport { ResilientOracleInterface } from \\\"./interfaces/OracleInterface.sol\\\";\\nimport { IDeviationBoundedOracle } from \\\"./interfaces/IDeviationBoundedOracle.sol\\\";\\nimport { AccessControlledV8 } from \\\"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\\\";\\nimport { EXP_SCALE } from \\\"@venusprotocol/solidity-utilities/contracts/constants.sol\\\";\\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \\\"@venusprotocol/solidity-utilities/contracts/validators.sol\\\";\\nimport { Transient } from \\\"./lib/Transient.sol\\\";\\n\\n/**\\n * @title DeviationBoundedOracle\\n * @author Venus\\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\\n *\\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\\n * significantly from the window bounds, protection mode activates automatically and conservative\\n * pricing kicks in:\\n * - Collateral is valued at min(spot, windowMin) \\u2014 caps collateral value at recent window low\\n * - Debt is valued at max(spot, windowMax) \\u2014 floors debt value at recent window high\\n *\\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\\n * off-chain monitoring systems.\\n *\\n * The oracle exposes both view and non-view price functions. The non-view variants update the\\n * price window and trigger protection. The view variants read stored state only. A transient\\n * price cache avoids redundant ResilientOracle calls within the same transaction when\\n * updateProtectionState is called before the view price reads.\\n */\\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\\n uint256 public constant MIN_THRESHOLD = 5e16;\\n\\n /// @notice Maximum allowed threshold value (50%)\\n uint256 public constant MAX_THRESHOLD = 50e16;\\n\\n /// @notice Keeper deadband threshold (5%) \\u2014 min/max corrections below this are suppressed\\n uint256 public constant KEEPER_DEADBAND = 5e16;\\n\\n /// @notice Resilient Oracle used to fetch spot prices\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\\n\\n /// @notice Native market address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable nativeMarket;\\n\\n /// @notice VAI address\\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\\n address public immutable vai;\\n\\n /// @notice Transient storage slot for caching final collateral prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\\n 0x7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf7000;\\n\\n /// @notice Transient storage slot for caching final debt prices within a transaction\\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\\n /// keccak256(abi.encode(uint256(keccak256(\\\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\\\")) - 1))\\n /// & ~bytes32(uint256(0xff))\\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\\n\\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\\n /// and can serve as any underlying asset of a market that supports native tokens\\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\\n\\n /// @notice Per-asset protection state\\n mapping(address => MarketProtectionState) public assetProtectionConfig;\\n\\n /// @notice Append-only array of all assets ever initialized, used for enumeration\\n address[] public allAssets;\\n\\n /// @notice Storage gap for upgrades\\n uint256[48] private __gap;\\n\\n /**\\n * @notice Constructor for the implementation contract. Sets immutable variables.\\n * @param _resilientOracle Address of the ResilientOracle contract\\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\\n * @custom:oz-upgrades-unsafe-allow constructor\\n */\\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\\n ensureNonzeroAddress(address(_resilientOracle));\\n ensureNonzeroAddress(nativeMarketAddress);\\n RESILIENT_ORACLE = _resilientOracle;\\n nativeMarket = nativeMarketAddress;\\n vai = vaiAddress;\\n _disableInitializers();\\n }\\n\\n /**\\n * @notice Initializes the contract admin\\n * @param accessControlManager_ Address of the access control manager contract\\n */\\n function initialize(address accessControlManager_) external initializer {\\n __AccessControlled_init(accessControlManager_);\\n }\\n\\n // ----- Non-view price functions (update window + trigger protection) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (lower) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns the conservative (higher) price when protection is active.\\n * Used by keepers or direct callers who want atomic update + read.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\\n * and returns both conservative prices in a single call.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _updateAndGetBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\\n * collateral and debt prices in transient storage for the duration of the transaction.\\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\\n * instead of querying ResilientOracle again, keeping those functions as `view` and\\n * avoiding redundant oracle calls.\\n * The transient cache is only populated when the asset's `cachingEnabled` flag is `true`.\\n * When caching is disabled, view price reads fall through to live recomputation.\\n * Permissionless: anyone can call this, both for gas optimisation and to ensure every\\n * caller in the same transaction reads the correct, up-to-date bounded price.\\n * @param vToken vToken address\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external {\\n _updateAndGetBoundedPrices(vToken);\\n }\\n\\n // ----- View price functions (read stored/cached state only) -----\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\\n * to ResilientOracle on cache miss or when caching is disabled.\\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\\n (collateralPrice, ) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\\n * to ResilientOracle on cache miss or when caching is disabled.\\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\\n (, debtPrice) = _computeBoundedPrices(vToken);\\n }\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\\n return _computeBoundedPrices(vToken);\\n }\\n\\n // ----- Keeper functions -----\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\\n * Constraint: newMin must be at or below the current spot price.\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external {\\n _checkAccessAllowed(\\\"updateMinPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\\n }\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\\n * Constraint: newMax must be at or above the current spot price.\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price\\n * @custom:access Only authorized keeper addresses\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external {\\n _checkAccessAllowed(\\\"updateMaxPrice(address,uint128)\\\");\\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\\n }\\n\\n /**\\n * @notice Exits protection mode for a given asset\\n * @dev Called by the keeper/monitor after confirming price has normalised.\\n * Enforces two conditions on-chain:\\n * 1. Cooldown period has elapsed since the last trigger\\n * 2. Price range has converged below the exit threshold\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external {\\n _checkAccessAllowed(\\\"exitProtectionMode(address)\\\");\\n _exitProtectionMode(asset);\\n }\\n\\n /**\\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\\n * Empty `actions` is a no-op success.\\n * @param actions The list of keeper actions to apply\\n * @custom:access Only authorized keeper addresses\\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\\n */\\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external {\\n _checkAccessAllowed(\\\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\\\");\\n uint256 len = actions.length;\\n for (uint256 i; i < len; ++i) {\\n KeeperActionItem calldata item = actions[i];\\n if (item.action == KeeperAction.SetMinPrice) {\\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MIN);\\n } else if (item.action == KeeperAction.SetMaxPrice) {\\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MAX);\\n } else if (item.action == KeeperAction.ExitProtectionMode) {\\n _exitProtectionMode(item.asset);\\n } else {\\n revert InvalidKeeperAction(uint8(item.action));\\n }\\n }\\n }\\n\\n // ----- Admin functions (governance-gated) -----\\n\\n /**\\n * @notice Initializes protection for a new asset\\n * @param tokenConfig_ Token config input for the asset\\n * @custom:access Only Governance\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external {\\n _checkAccessAllowed(\\\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\\\");\\n _setTokenConfig(\\n tokenConfig_.asset,\\n tokenConfig_.cooldownPeriod,\\n tokenConfig_.triggerThreshold,\\n tokenConfig_.resetThreshold,\\n tokenConfig_.enableBoundedPricing,\\n tokenConfig_.enableCaching\\n );\\n }\\n\\n /**\\n * @notice Batch-initializes protection for multiple assets in a single transaction\\n * @param tokenConfigs_ Array of token config inputs, one per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if the input array is empty\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external {\\n _checkAccessAllowed(\\\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\\\");\\n uint256 len = tokenConfigs_.length;\\n if (len == 0) revert InvalidArrayLength();\\n\\n for (uint256 i; i < len; ++i) {\\n TokenConfigInput calldata tokenConfig = tokenConfigs_[i];\\n _setTokenConfig(\\n tokenConfig.asset,\\n tokenConfig.cooldownPeriod,\\n tokenConfig.triggerThreshold,\\n tokenConfig.resetThreshold,\\n tokenConfig.enableBoundedPricing,\\n tokenConfig.enableCaching\\n );\\n }\\n }\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds\\n * @custom:access Only Governance\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\\n _checkAccessAllowed(\\\"setCooldownPeriod(address,uint64)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newCooldown);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\\n state.cooldownPeriod = newCooldown;\\n }\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\\n _checkAccessAllowed(\\\"setThresholds(address,uint256,uint256)\\\");\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(newTriggerThreshold);\\n ensureNonzeroValue(newResetThreshold);\\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (newTriggerThreshold != state.triggerThreshold) {\\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\\n state.triggerThreshold = uint128(newTriggerThreshold);\\n }\\n if (newResetThreshold != state.resetThreshold) {\\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\\n state.resetThreshold = uint128(newResetThreshold);\\n }\\n }\\n\\n /**\\n * @notice Sets whether an asset is enabled for bounded pricing\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setAssetBoundedPricingEnabled(address,bool)\\\");\\n ensureNonzeroAddress(asset);\\n\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!enabled && state.currentlyUsingProtectedPrice) {\\n revert ProtectedPriceActive(asset);\\n }\\n\\n if (state.isBoundedPricingEnabled == enabled) return;\\n\\n // reset the window if re-enabling\\n if (enabled) {\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n _setMinPrice(state, asset, spotU128);\\n _setMaxPrice(state, asset, spotU128);\\n }\\n\\n state.isBoundedPricingEnabled = enabled;\\n emit BoundedPricingWhitelistUpdated(asset, enabled);\\n }\\n\\n /**\\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\\n * live spot instead of reading or writing the transient slots. The initial value is\\n * set via the `enableCaching` argument of `setTokenConfig`.\\n * @param asset The underlying asset address\\n * @param enabled Whether transient caching is enabled for this asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CachingEnabledUpdated\\n */\\n function setCachingEnabled(address asset, bool enabled) external {\\n _checkAccessAllowed(\\\"setCachingEnabled(address,bool)\\\");\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n emit CachingEnabledUpdated(asset, state.cachingEnabled, enabled);\\n state.cachingEnabled = enabled;\\n }\\n\\n // ----- View helpers -----\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory) {\\n return allAssets;\\n }\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\\n }\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\\n }\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\\n * Gas-free for off-chain callers.\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\\n uint256 len = allAssets.length;\\n address[] memory temp = new address[](len);\\n uint256 count;\\n for (uint256 i; i < len; ++i) {\\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\\n temp[count++] = allAssets[i];\\n }\\n }\\n address[] memory result = new address[](count);\\n for (uint256 i; i < count; ++i) {\\n result[i] = temp[i];\\n }\\n return result;\\n }\\n\\n /**\\n * @notice Checks if protection can be exited for an asset\\n * @dev Returns true when both conditions are met:\\n * 1. Cooldown period has elapsed since last trigger\\n * 2. Price range has converged below exit threshold\\n * @param asset The underlying asset address\\n * @return True if protection can be disabled\\n */\\n function canExitProtection(address asset) external view returns (bool) {\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n return\\n state.currentlyUsingProtectedPrice &&\\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\\n }\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\\n * from the keeper's proposed window values\\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's off-chain window minimum prices\\n * @param proposedMaxs Keeper's off-chain window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\\n uint256 len = assets.length;\\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\\n\\n needsMinUpdate = new bool[](len);\\n needsMaxUpdate = new bool[](len);\\n\\n for (uint256 i; i < len; ++i) {\\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\\n }\\n }\\n\\n // ----- Internal functions -----\\n\\n /**\\n * @notice Initializes protection parameters and price window for a single asset\\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\\n * spot so the window expands naturally as prices move. Can only be called once per asset.\\n * @param asset The underlying asset address\\n * @param cooldownPeriod Minimum time protection stays active after last trigger\\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\\n * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n */\\n function _setTokenConfig(\\n address asset,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold,\\n uint256 resetThreshold,\\n bool enableBoundedPricing,\\n bool enableCaching\\n ) internal {\\n ensureNonzeroAddress(asset);\\n ensureNonzeroValue(cooldownPeriod);\\n ensureNonzeroValue(triggerThreshold);\\n ensureNonzeroValue(resetThreshold);\\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\\n if (asset == vai) revert VAINotAllowed();\\n\\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\\n\\n assetProtectionConfig[asset] = MarketProtectionState({\\n minPrice: spotU128,\\n maxPrice: spotU128,\\n currentlyUsingProtectedPrice: false,\\n isBoundedPricingEnabled: enableBoundedPricing,\\n lastProtectionTriggeredAt: 0,\\n cooldownPeriod: cooldownPeriod,\\n asset: asset,\\n triggerThreshold: uint128(triggerThreshold),\\n resetThreshold: uint128(resetThreshold),\\n cachingEnabled: enableCaching\\n });\\n\\n allAssets.push(asset);\\n\\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\\n }\\n\\n /**\\n * @notice Validates and applies a keeper-provided min or max price update\\n * @param asset The underlying asset address\\n * @param newPrice The new price value to set\\n * @param boundType Whether this is a MIN or MAX bound update\\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is strictly above maxPrice\\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is strictly below minPrice\\n */\\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\\n ensureNonzeroAddress(asset);\\n if (newPrice == 0) revert ZeroPriceNotAllowed();\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n uint256 currentSpot = _fetchSpotPrice(asset);\\n if (boundType == PriceBoundType.MIN) {\\n if (newPrice > state.maxPrice || uint256(newPrice) > currentSpot)\\n revert InvalidMinPrice(asset, newPrice, currentSpot);\\n _setMinPrice(state, asset, newPrice);\\n } else if (boundType == PriceBoundType.MAX) {\\n if (newPrice < state.minPrice || uint256(newPrice) < currentSpot)\\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\\n _setMaxPrice(state, asset, newPrice);\\n }\\n }\\n\\n /**\\n * @notice Clears protection for an asset once cooldown has elapsed and the window has converged\\n * @dev Shared body of `exitProtectionMode` and the ExitProtectionMode branch of `syncPriceBoundsAndProtections`.\\n * Callers are responsible for ACM gating before invoking this helper.\\n * @param asset The underlying asset address\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n */\\n function _exitProtectionMode(address asset) internal {\\n ensureNonzeroAddress(asset);\\n MarketProtectionState storage state = _ensureInitialized(asset);\\n\\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\\n\\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\\n }\\n\\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\\n if (rangeRatio >= state.resetThreshold) {\\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\\n }\\n\\n state.currentlyUsingProtectedPrice = false;\\n state.lastProtectionTriggeredAt = 0;\\n emit ProtectionModeExited(asset);\\n }\\n\\n /**\\n * @notice Shared non-view logic for all bounded price functions.\\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n */\\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // return early if failure from resilient oracle to prevent cold SLOAD\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) {\\n _setCachedPrices(asset, spot, spot);\\n return (spot, spot);\\n }\\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\\n _setCachedPrices(asset, minPrice, maxPrice);\\n }\\n\\n /**\\n * @dev Expands the price window toward extremes if the spot price is a new min or max\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n */\\n function _expandPriceWindow(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset\\n ) internal returns (uint128, uint128, bool) {\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 currentMin = state.minPrice;\\n uint128 currentMax = state.maxPrice;\\n bool windowExpanded;\\n if (spotU128 < currentMin) {\\n _setMinPrice(state, asset, spotU128);\\n currentMin = spotU128;\\n windowExpanded = true;\\n }\\n if (spotU128 > currentMax) {\\n _setMaxPrice(state, asset, spotU128);\\n currentMax = spotU128;\\n windowExpanded = true;\\n }\\n return (currentMin, currentMax, windowExpanded);\\n }\\n\\n /**\\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\\n * @param state The market protection state\\n * @param spot The current spot price\\n * @param asset The underlying asset address (for event emission)\\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\\n */\\n function _checkAndTriggerProtection(\\n MarketProtectionState storage state,\\n uint256 spot,\\n address asset,\\n bool windowExpanded\\n ) internal returns (bool triggered) {\\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\\n if (enteringProtection || windowExpanded) {\\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\\n }\\n if (enteringProtection) {\\n state.currentlyUsingProtectedPrice = true;\\n }\\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\\n return true;\\n }\\n if (state.currentlyUsingProtectedPrice) return true;\\n }\\n\\n /**\\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\\n * When protection is inactive: both return spot.\\n * @param protectionActive Whether the market protection window is currently active\\n * @param spot The current spot price\\n * @param windowMin The lower bound of the price window\\n * @param windowMax The upper bound of the price window\\n * @return minPrice The resolved lower-bound (collateral) price\\n * @return maxPrice The resolved upper-bound (debt) price\\n */\\n function _resolveBoundedPrices(\\n bool protectionActive,\\n uint256 spot,\\n uint256 windowMin,\\n uint256 windowMax\\n ) internal pure returns (uint256, uint256) {\\n if (!protectionActive) return (spot, spot);\\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\\n }\\n\\n /**\\n * @notice Shared view logic for all bounded price view functions.\\n * Checks transient cache first for an early return; on miss, fetches from oracle\\n * and computes both prices without state mutations.\\n * @param vToken vToken address\\n * @return minPrice The bounded lower (collateral) price\\n * @return maxPrice The bounded upper (debt) price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n address asset = _getUnderlyingAsset(vToken);\\n\\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\\n (minPrice, maxPrice) = _getCachedPrices(asset);\\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\\n\\n // Cache miss \\u2014 fetch from oracle and compute without state mutations\\n uint256 spot = _fetchSpotPrice(asset);\\n MarketProtectionState storage state = assetProtectionConfig[asset];\\n if (!state.isBoundedPricingEnabled) return (spot, spot);\\n\\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\\n uint128 spotU128 = _safeToUint128(spot);\\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\\n\\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\\n\\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\\n }\\n\\n /**\\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\\n * Formula: \\\\((maxPrice - minPrice) / minPrice\\\\), scaled by `EXP_SCALE`.\\n * Used to measure how much the window has converged -- compared against `resetThreshold`\\n * to determine whether the price window is tight enough to exit protection mode.\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @return The scaled bound ratio \\\\(((max - min) * EXP_SCALE) / min\\\\)\\n */\\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\\n uint256 range = uint256(maxPrice) - uint256(minPrice);\\n return (range * EXP_SCALE) / uint256(minPrice);\\n }\\n\\n /**\\n * @notice Checks whether the spot price has moved beyond the threshold relative to the\\n * opposite window bound \\u2014 i.e. `spot > minPrice * (1 + threshold)` or\\n * `spot < maxPrice * (1 - threshold)`.\\n * @dev Pump detection: spot > minPrice * (1 + threshold)\\n * Crash detection: spot < maxPrice * (1 - threshold)\\n * @param spot The current spot price\\n * @param minPrice The minimum price in the window\\n * @param maxPrice The maximum price in the window\\n * @param threshold The deviation threshold (mantissa)\\n * @return True if deviation is triggered\\n */\\n function _exceedsDeviationThreshold(\\n uint256 spot,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint256 threshold\\n ) internal pure returns (bool) {\\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\\n return (spot > upperBound || spot < lowerBound);\\n }\\n\\n /**\\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\\n * @param currentPrice The current on-chain price\\n * @param proposedPrice The keeper's proposed price\\n * @return True if drift exceeds deadband\\n */\\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\\n if (currentPrice == 0 || proposedPrice == 0) return false;\\n uint256 diff = currentPrice > proposedPrice\\n ? uint256(currentPrice - proposedPrice)\\n : uint256(proposedPrice - currentPrice);\\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\\n }\\n\\n /**\\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMin The new minimum price\\n */\\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\\n emit MinPriceUpdated(asset, state.minPrice, newMin);\\n state.minPrice = newMin;\\n }\\n\\n /**\\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\\n * @param state The market protection state\\n * @param asset The underlying asset address (for event emission)\\n * @param newMax The new maximum price\\n */\\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\\n state.maxPrice = newMax;\\n }\\n\\n /**\\n * @dev Writes both lower and upper bounded prices to transient storage. No-ops when the\\n * asset's `cachingEnabled` flag is `false`, so callers that disable caching always\\n * fall through to live recomputation on subsequent reads.\\n * @param asset The underlying asset address\\n * @param minPrice The resolved lower (collateral) price to cache\\n * @param maxPrice The resolved upper (debt) price to cache\\n */\\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\\n if (!assetProtectionConfig[asset].cachingEnabled) return;\\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\\n }\\n\\n /**\\n * @dev Reads a cached final price from transient storage. Returns `(0, 0)` when the\\n * asset's `cachingEnabled` flag is `false`, which callers already treat as a cache\\n * miss and handle via live recomputation.\\n * @param asset The underlying asset address\\n * @return minPrice The cached minimum price, or 0 on cache miss\\n * @return maxPrice The cached maximum price, or 0 on cache miss\\n */\\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\\n if (!assetProtectionConfig[asset].cachingEnabled) return (0, 0);\\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\\n }\\n\\n /**\\n * @dev This function returns the underlying asset of a vToken\\n * @param vToken vToken address\\n * @return asset underlying asset address\\n */\\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\\n ensureNonzeroAddress(vToken);\\n if (vToken == nativeMarket) {\\n asset = NATIVE_TOKEN_ADDR;\\n } else if (vToken == vai) {\\n asset = vai;\\n } else {\\n asset = VBep20Interface(vToken).underlying();\\n }\\n }\\n\\n /**\\n * @dev Reverts if the market has not been initialized via setTokenConfig\\n * @param asset The underlying asset address\\n * @return state The market protection state storage pointer\\n */\\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\\n state = assetProtectionConfig[asset];\\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\\n }\\n\\n /**\\n * @notice Fetches the current spot price for an asset from the ResilientOracle\\n * @param asset The underlying asset address\\n * @return The current spot price\\n */\\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\\n return RESILIENT_ORACLE.getPrice(asset);\\n }\\n\\n /**\\n * @dev Safely casts a uint256 to uint128, reverting on overflow\\n * @param value The value to cast\\n * @return The value as uint128\\n */\\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\\n return uint128(value);\\n }\\n}\\n\",\"keccak256\":\"0x753d4b0caf8d71739c8615b1cdcc751f45576182ab82cd5859102c16e4402e0d\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/IDeviationBoundedOracle.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity 0.8.25;\\n\\ninterface IDeviationBoundedOracle {\\n // --- Enums ---\\n\\n /// @notice Identifies whether a price bound is a minimum or maximum\\n enum PriceBoundType {\\n MIN,\\n MAX\\n }\\n\\n /// @notice Identifies which keeper action a single syncPriceBoundsAndProtections item performs\\n enum KeeperAction {\\n SetMinPrice,\\n SetMaxPrice,\\n ExitProtectionMode\\n }\\n\\n // --- Structs ---\\n\\n /// @notice Per-asset protection state tracking the min/max price window\\n struct MarketProtectionState {\\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\\n uint128 minPrice;\\n /// @notice Highest price observed in the current window\\n uint128 maxPrice;\\n /// @notice Whether protected price is currently being used\\n bool currentlyUsingProtectedPrice;\\n /// @notice Whether this market is whitelisted for bounded pricing\\n bool isBoundedPricingEnabled;\\n /// @notice Timestamp of the last protection trigger \\u2014 reset on every trigger\\n uint64 lastProtectionTriggeredAt;\\n /// @notice Minimum time protection stays active after last trigger\\n uint64 cooldownPeriod;\\n /// @notice The underlying asset address, used to verify initialization\\n address asset;\\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\\n uint128 triggerThreshold;\\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\\n uint128 resetThreshold;\\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n bool cachingEnabled;\\n }\\n\\n /// @notice One item in an syncPriceBoundsAndProtections payload\\n /// @dev `value` is interpreted per-action: the new bound price for SetMinPrice / SetMaxPrice, ignored for ExitProtectionMode\\n struct KeeperActionItem {\\n address asset;\\n KeeperAction action;\\n uint256 value;\\n }\\n\\n /// @notice One item in a setTokenConfigs payload\\n struct TokenConfigInput {\\n /// @notice The underlying asset address\\n address asset;\\n /// @notice Minimum time protection stays active after the last trigger (seconds)\\n uint64 cooldownPeriod;\\n /// @notice Entry deviation threshold (mantissa). Must be between 5% and 50%.\\n uint256 triggerThreshold;\\n /// @notice Exit deviation threshold (mantissa). Must be non-zero and below triggerThreshold.\\n uint256 resetThreshold;\\n /// @notice Whether to enable bounded pricing immediately upon initialization\\n bool enableBoundedPricing;\\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\\n bool enableCaching;\\n }\\n\\n // --- Events ---\\n\\n /// @notice Emitted when protection is initialized for an asset\\n event ProtectionInitialized(\\n address indexed asset,\\n uint128 minPrice,\\n uint128 maxPrice,\\n uint64 cooldownPeriod,\\n uint256 triggerThreshold\\n );\\n\\n /// @notice Emitted when protection mode is triggered for an asset\\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\\n\\n /// @notice Emitted when protection mode is disabled for an asset\\n event ProtectionModeExited(address indexed asset);\\n\\n /// @notice Emitted when the keeper updates the minimum price for an asset\\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\\n\\n /// @notice Emitted when the keeper updates the maximum price for an asset\\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\\n\\n /// @notice Emitted when the entry threshold is updated for an asset\\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\\n\\n /// @notice Emitted when the exit threshold is updated for an asset\\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\\n\\n /// @notice Emitted when the cooldown period is updated for an asset\\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\\n\\n /// @notice Emitted when an asset's whitelist status changes\\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\\n\\n /// @notice Emitted when the per-asset transient caching flag is toggled\\n event CachingEnabledUpdated(address indexed asset, bool oldEnabled, bool newEnabled);\\n\\n // --- Errors ---\\n\\n /// @notice Thrown when trying to use or update protection for an asset that has not been initialized\\n error MarketNotInitialized(address asset);\\n\\n /// @notice Thrown when trying to initialize an already initialized market\\n error MarketAlreadyInitialized(address asset);\\n\\n /// @notice Thrown when trying to disable protection that is not active\\n error ProtectedPriceInactive(address asset);\\n\\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\\n\\n /// @notice Thrown when trying to disable protection before price range has converged\\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\\n\\n /// @notice Thrown when keeper tries to set minPrice above current spot\\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\\n\\n /// @notice Thrown when keeper tries to set maxPrice below current spot\\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\\n\\n /// @notice Thrown when threshold is set below the minimum allowed value\\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\\n\\n /// @notice Thrown when threshold is set above the maximum allowed value\\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\\n\\n /// @notice Thrown when a price exceeds uint128 max\\n error PriceExceedsUint128(uint256 price);\\n\\n /// @notice Thrown when a zero price is provided where a non-zero price is required\\n error ZeroPriceNotAllowed();\\n\\n /// @notice Thrown when trying to initialize protection for VAI\\n error VAINotAllowed();\\n\\n /// @notice Thrown when trying to disable bounded pricing for an asset while protection is active\\n error ProtectedPriceActive(address asset);\\n\\n /// @notice Thrown when the lengths of the arrays are not equal\\n error InvalidArrayLength();\\n\\n /// @notice Thrown when the exit threshold is set at or above the trigger threshold\\n error InvalidResetThreshold(uint256 resetThreshold);\\n\\n /// @notice Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\\n error InvalidKeeperAction(uint8 action);\\n\\n // --- Non-view price functions (update window + trigger protection) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- State update (call before view price reads to populate transient cache) ---\\n\\n /**\\n * @notice Updates the protection state for a given vToken, caching the resolved collateral and debt prices\\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\\n * reads in the same transaction are served from transient storage. The transient\\n * cache is only populated when the asset's `cachingEnabled` flag is `true`.\\n * @param vToken vToken address\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event MinPriceUpdated if a new window minimum is recorded\\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\\n */\\n function updateProtectionState(address vToken) external;\\n\\n // --- View price functions (read stored/cached state only) ---\\n\\n /**\\n * @notice Gets the bounded collateral price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return price The bounded collateral price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets the bounded debt price for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return price The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\\n\\n /**\\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\\n * falls back to ResilientOracle on cache miss or when caching is disabled.\\n * @param vToken vToken address\\n * @return collateralPrice The bounded collateral price\\n * @return debtPrice The bounded debt price\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\\n */\\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\\n\\n // --- Keeper functions ---\\n\\n /**\\n * @notice Updates the minimum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMin is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\\n * @custom:event MinPriceUpdated\\n */\\n function updateMinPrice(address asset, uint128 newMin) external;\\n\\n /**\\n * @notice Updates the maximum price in the rolling window for a given asset\\n * @param asset The underlying asset address\\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\\n * @custom:access Only authorized keeper addresses\\n * @custom:error ZeroPriceNotAllowed if newMax is zero\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\\n * @custom:event MaxPriceUpdated\\n */\\n function updateMaxPrice(address asset, uint128 newMax) external;\\n\\n /**\\n * @notice Exits protection mode for a given asset once conditions are met\\n * @param asset The underlying asset address\\n * @custom:access Only authorized monitor/keeper addresses\\n * @custom:error ProtectedPriceInactive if protection is not currently active\\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\\n * @custom:event ProtectionModeExited\\n */\\n function exitProtectionMode(address asset) external;\\n\\n /**\\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\\n * Empty `actions` is a no-op success.\\n * @param actions The list of keeper actions to apply\\n * @custom:access Only authorized keeper addresses\\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\\n * @custom:error PriceExceedsUint128 if a SetMin/SetMax item value overflows uint128\\n * @custom:error ZeroPriceNotAllowed if a SetMin/SetMax item value is zero\\n * @custom:error MarketNotInitialized if any referenced asset has not been initialized\\n * @custom:error InvalidMinPrice if a SetMinPrice item violates the spot/maxPrice constraints\\n * @custom:error InvalidMaxPrice if a SetMaxPrice item violates the spot/minPrice constraints\\n * @custom:error ProtectedPriceInactive if an ExitProtectionMode item targets an asset whose protection is not active\\n * @custom:error CooldownNotElapsed if an ExitProtectionMode item is submitted before cooldown elapsed\\n * @custom:error PriceRangeNotConverged if an ExitProtectionMode item is submitted before window convergence\\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\\n */\\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external;\\n\\n // --- Admin functions (governance-gated) ---\\n\\n /**\\n * @notice Initializes protection parameters for a new asset\\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\\n * confirming the oracle is live for this asset before it is listed.\\n * @param tokenConfig_ Token config input for the asset\\n * @custom:access Only Governance\\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\\n * @custom:error VAINotAllowed if asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\\n * @custom:event ProtectionInitialized\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external;\\n\\n /**\\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\\n * @param tokenConfigs_ Array of token config inputs, one per asset\\n * @custom:access Only Governance\\n * @custom:error InvalidArrayLength if the input array is empty\\n * @custom:error ZeroAddressNotAllowed if any asset is the zero address\\n * @custom:error ZeroValueNotAllowed if any cooldownPeriod, triggerThreshold, or resetThreshold is zero\\n * @custom:error MarketAlreadyInitialized if any asset has already been initialized\\n * @custom:error ThresholdBelowMinimum if any triggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if any triggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if any resetThreshold is at or above its triggerThreshold\\n * @custom:error VAINotAllowed if any asset is the VAI token\\n * @custom:error PriceExceedsUint128 if the spot price for any asset overflows uint128\\n * @custom:event ProtectionInitialized for each asset\\n * @custom:event BoundedPricingWhitelistUpdated for each asset\\n */\\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external;\\n\\n /**\\n * @notice Sets the cooldown period for an asset\\n * @param asset The underlying asset address\\n * @param newCooldown The new cooldown period in seconds; must be non-zero\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CooldownPeriodSet\\n */\\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\\n\\n /**\\n * @notice Sets the trigger and reset thresholds for an asset\\n * @param asset The underlying asset address\\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\\n * @custom:event TriggerThresholdSet if the trigger threshold changed\\n * @custom:event ResetThresholdSet if the reset threshold changed\\n */\\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\\n\\n /**\\n * @notice Sets whether bounded pricing is enabled for an asset\\n * @param asset The underlying asset address\\n * @param enabled Whether bounded pricing should be enabled for the asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\\n * @custom:event BoundedPricingWhitelistUpdated\\n */\\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\\n\\n /**\\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\\n * live spot instead of reading or writing the transient slots. The initial value is\\n * set via the `enableCaching` argument of `setTokenConfig`.\\n * @param asset The underlying asset address\\n * @param enabled Whether transient caching is enabled for this asset\\n * @custom:access Only Governance\\n * @custom:error MarketNotInitialized if the asset has not been initialized\\n * @custom:event CachingEnabledUpdated\\n */\\n function setCachingEnabled(address asset, bool enabled) external;\\n\\n // --- View helpers ---\\n\\n /**\\n * @notice Returns the full protection state for an asset\\n * @param asset The underlying asset address\\n * @return minPrice Lowest price observed in the current window\\n * @return maxPrice Highest price observed in the current window\\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\\n * @return cooldownPeriod Minimum time protection stays active after last trigger\\n * @return assetAddr The underlying asset address stored in the struct\\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\\n * @return cachingEnabled Whether transient caching of the bounded pair is enabled for the asset\\n */\\n function assetProtectionConfig(\\n address asset\\n )\\n external\\n view\\n returns (\\n uint128 minPrice,\\n uint128 maxPrice,\\n bool currentlyUsingProtectedPrice,\\n bool isBoundedPricingEnabled,\\n uint64 lastProtectionTriggeredAt,\\n uint64 cooldownPeriod,\\n address assetAddr,\\n uint128 triggerThreshold,\\n uint128 resetThreshold,\\n bool cachingEnabled\\n );\\n\\n /**\\n * @notice Checks if an asset is whitelisted for bounded pricing\\n * @param asset The underlying asset address\\n * @return True if the asset is whitelisted\\n */\\n function isBoundedPricingEnabled(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if the asset is currently using the protected (bounded) price\\n * @param asset The underlying asset address\\n * @return True if the asset is currently using the protected price instead of spot\\n */\\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\\n\\n /**\\n * @notice Checks if protection can be exited for a given asset\\n * @param asset The underlying asset address\\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\\n */\\n function canExitProtection(address asset) external view returns (bool);\\n\\n /**\\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\\n * @param index Array index\\n * @return The asset address at the given index\\n */\\n function allAssets(uint256 index) external view returns (address);\\n\\n /**\\n * @notice Returns all currently whitelisted asset addresses\\n * @return result Array of whitelisted asset addresses\\n */\\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\\n\\n /**\\n * @notice Returns all asset addresses that have ever been initialized\\n * @return Array of all initialized asset addresses\\n */\\n function getInitializedAssets() external view returns (address[] memory);\\n\\n /**\\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\\n * @param assets Array of asset addresses to check\\n * @param proposedMins Keeper's proposed window minimum prices\\n * @param proposedMaxs Keeper's proposed window maximum prices\\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\\n * @custom:error InvalidArrayLength if the input array lengths do not match\\n */\\n function checkAndGetWindowDrift(\\n address[] calldata assets,\\n uint128[] calldata proposedMins,\\n uint128[] calldata proposedMaxs\\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\\n}\\n\",\"keccak256\":\"0xe223d88c17c0d752fdb33fa223b63ce124a798512f3d69f3800e9508e7dff931\",\"license\":\"BSD-3-Clause\"},\"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 BoundValidatorInterface {\\n function validatePriceWithAnchorPrice(\\n address asset,\\n uint256 reporterPrice,\\n uint256 anchorPrice\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xd3bbb7c9eef19e8f467342df6034ef95399a00964646fb8c82b438968ae3a8c0\",\"license\":\"BSD-3-Clause\"},\"contracts/interfaces/VBep20Interface.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nimport \\\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\\\";\\n\\ninterface VBep20Interface is IERC20Metadata {\\n /**\\n * @notice Underlying asset for this VToken\\n */\\n function underlying() external view returns (address);\\n}\\n\",\"keccak256\":\"0x6e71c3df86501df5c0e4bace1333c0c91f9f9cced252a54fb99eeda219b789d5\",\"license\":\"BSD-3-Clause\"},\"contracts/lib/Transient.sol\":{\"content\":\"// SPDX-License-Identifier: BSD-3-Clause\\npragma solidity ^0.8.25;\\n\\nlibrary Transient {\\n /**\\n * @notice Cache the asset price into transient storage\\n * @param key address of the asset\\n * @param value asset price\\n */\\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n tstore(slot, value)\\n }\\n }\\n\\n /**\\n * @notice Read cached price from transient storage\\n * @param key address of the asset\\n * @return value cached asset price\\n */\\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\\n assembly (\\\"memory-safe\\\") {\\n value := tload(slot)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x60d7133a48a757ee777cb9230e890ef489ffc33dcea9dadfcf5a8b72f9dd43aa\",\"license\":\"BSD-3-Clause\"}},\"version\":1}", + "bytecode": "0x60e060405234801561000f575f80fd5b5060405161345438038061345483398101604081905261002e91610163565b61003783610069565b61004082610069565b6001600160a01b0380841660805282811660a052811660c052610061610093565b5050506101ad565b6001600160a01b038116610090576040516342bcdf7f60e11b815260040160405180910390fd5b50565b5f54610100900460ff16156100fe5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161461014d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b6001600160a01b0381168114610090575f80fd5b5f805f60608486031215610175575f80fd5b83516101808161014f565b60208501519093506101918161014f565b60408501519092506101a28161014f565b809150509250925092565b60805160a05160c05161325a6101fa5f395f818161058501528181611c610152818161258001526125ba01525f818161048d015261252c01525f81816104fe01526119d2015261325a5ff3fe608060405234801561000f575f80fd5b5060043610610255575f3560e01c806388142b6b11610140578063b540894f116100bf578063cf1412c011610084578063cf1412c0146106ba578063dcc88962146106cd578063e2201bb8146106e0578063e30c3978146106f3578063e40c2fed14610704578063f2fde38b14610717575f80fd5b8063b540894f1461055f578063b62e4c9214610580578063bd11c4c0146103fe578063c3821757146105a7578063c4d66de8146106a7575f80fd5b8063a31ebe5811610105578063a31ebe58146104e6578063a4edcd4c146104f9578063a9534f8a14610520578063a9c3cab11461053b578063b4a0bdf31461054e575f80fd5b806388142b6b146104755780638a2f7f6d146104885780638cf38bb1146104af5780638da5cb5b146104c2578063969f58d3146104d3575f80fd5b80634912c452116101d757806376489e381161019c57806376489e38146103b357806379ba5097146103f65780637f5e1328146103fe5780637fa6ea501461040c578063870dc597146104345780638769b23114610447575f80fd5b80634912c4521461034757806352a6bce31461035a578063578e5c221461036d5780636121316814610398578063715018a6146103ab575f80fd5b80631be74faf1161021d5780631be74faf146102f157806323013b83146103065780632f7b5dd7146103195780633b4ecdb21461032c578063412b6ec714610334575f80fd5b806308af5431146102595780630a5fa04d1461027b5780630e32cb86146102a25780631169d5a6146102b757806315a53122146102de575b5f80fd5b6102686706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102687f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b6102b56102b0366004612b01565b61072a565b005b6102687f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700081565b6102b56102ec366004612b32565b61073e565b6102f961078b565b6040516102729190612b65565b6102b5610314366004612bbe565b61093e565b6102b5610327366004612bf5565b610a6a565b6102f9610b33565b6102b5610342366004612bbe565b610b93565b6102b5610355366004612c63565b610c43565b610268610368366004612b01565b610e3c565b61038061037b366004612c95565b610e4d565b6040516001600160a01b039091168152602001610272565b6102b56103a6366004612cac565b610e75565b6102b5610ea6565b6103e66103c1366004612b01565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b6040519015158152602001610272565b6102b5610eb9565b61026866b1a2bc2ec5000081565b61041f61041a366004612b01565b610f30565b60408051928352602083019190915201610272565b6102b5610442366004612cc2565b610f44565b6103e6610455366004612b01565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b61041f610483366004612b01565b6110af565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6102b56104bd366004612b01565b6110ba565b6033546001600160a01b0316610380565b6102b56104e1366004612b32565b611101565b6102b56104f4366004612d34565b61114b565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b61038073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6102b5610549366004612b01565b61121e565b6097546001600160a01b0316610380565b61057261056d366004612da5565b61122c565b604051610272929190612e73565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6106326105b5366004612b01565b60c96020525f9081526040902080546001820154600283015460038401546004909401546001600160801b0380851695600160801b9586900482169560ff8087169661010081048216966001600160401b03620100008304811697600160501b90930416956001600160a01b03909116948082169490041691168a565b604080516001600160801b039b8c168152998b1660208b01529715159789019790975294151560608801526001600160401b0393841660808801529290911660a08601526001600160a01b031660c0850152841660e08401529290921661010082015290151561012082015261014001610272565b6102b56106b5366004612b01565b6113f2565b6102686106c8366004612b01565b6114ff565b6103e66106db366004612b01565b611510565b6102686106ee366004612b01565b61159c565b6065546001600160a01b0316610380565b610268610712366004612b01565b6115a6565b6102b5610725366004612b01565b6115b0565b610732611621565b61073b8161167b565b50565b61077c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e743132382900815250611739565b61078782825f6117d0565b5050565b60ca546060905f816001600160401b038111156107aa576107aa612ea0565b6040519080825280602002602001820160405280156107d3578160200160208202803683370190505b5090505f805b838110156108995760c95f60ca83815481106107f7576107f7612eb4565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108915760ca818154811061083f5761083f612eb4565b5f918252602090912001546001600160a01b0316838361085e81612edc565b94508151811061087057610870612eb4565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016107d9565b505f816001600160401b038111156108b3576108b3612ea0565b6040519080825280602002602001820160405280156108dc578160200160208202803683370190505b5090505f5b82811015610935578381815181106108fb576108fb612eb4565b602002602001015182828151811061091557610915612eb4565b6001600160a01b03909216602092830291909101909101526001016108e1565b50949350505050565b61095f6040518060600160405280602b8152602001613104602b9139611739565b6109688261193d565b5f61097283611964565b9050811580156109865750600181015460ff165b156109b4576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff161515036109d557505050565b8115610a07575f6109ed6109e8856119b1565b611a43565b90506109fa828583611a73565b610a05828583611ae3565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a5d90851515815260200190565b60405180910390a2505050565b610a8b6040518060600160405280603d815260200161312f603d9139611739565b805f819003610aad57604051634ec4810560e11b815260040160405180910390fd5b5f5b81811015610b2d5736848483818110610aca57610aca612eb4565b60c002919091019150610b249050610ae56020830183612b01565b610af56040840160208501612ef4565b60408401356060850135610b0f60a0870160808801612f0d565b610b1f60c0880160a08901612f0d565b611b57565b50600101610aaf565b50505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610b8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b6b575b5050505050905090565b610bd16040518060400160405280601f81526020017f73657443616368696e67456e61626c656428616464726573732c626f6f6c2900815250611739565b5f610bdb83611964565b60048101546040805160ff9092161515825284151560208301529192506001600160a01b038516917f80b87a057217c1d7743a43adf6fcf8a06553fde1205440ebbfb539f6f0e04424910160405180910390a2600401805460ff191691151591909117905550565b610c6460405180606001604052806026815260200161316c60269139611739565b610c6d8361193d565b610c768261200e565b610c7f8161200e565b66b1a2bc2ec50000821015610cb757604051630f4d736160e01b81526004810183905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000821115610cf1576040516350ddbb7560e11b8152600481018390526706f05b59d3b2000060248201526044016109ab565b818110610d1457604051632021db5560e21b8152600481018290526024016109ab565b5f610d1e84611964565b60038101549091506001600160801b03168314610da6576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610b2d57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b02911617905550505050565b5f610e468261202e565b9392505050565b60ca8181548110610e5c575f80fd5b5f918252602090912001546001600160a01b0316905081565b610e966040518060600160405280603a8152602001613192603a9139611739565b61073b610ae56020830183612b01565b610eae611621565b610eb75f61210c565b565b60655433906001600160a01b03168114610f275760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109ab565b61073b8161210c565b5f80610f3b8361202e565b91509150915091565b610f656040518060600160405280603881526020016131cc60389139611739565b805f5b81811015610b2d5736848483818110610f8357610f83612eb4565b6060029190910191505f9050610f9f6040830160208401612f3c565b6002811115610fb057610fb0612f28565b03610fdd57610fd8610fc56020830183612b01565b610fd28360400135611a43565b5f6117d0565b6110a6565b6001610fef6040830160208401612f3c565b600281111561100057611000612f28565b0361102957610fd86110156020830183612b01565b6110228360400135611a43565b60016117d0565b600261103b6040830160208401612f3c565b600281111561104c5761104c612f28565b0361106657610fd86110616020830183612b01565b612125565b6110766040820160208301612f3c565b600281111561108757611087612f28565b604051635374467d60e11b815260ff90911660048201526024016109ab565b50600101610f68565b5f80610f3b836122b9565b6110f86040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f64652861646472657373290000000000815250611739565b61073b81612125565b61113f6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e743132382900815250611739565b610787828260016117d0565b61116c60405180606001604052806021815260200161320460219139611739565b6111758261193d565b611187816001600160401b031661200e565b5f61119183611964565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b6112278161202e565b505050565b60608086858114158061123f5750808414155b1561125d57604051634ec4810560e11b815260040160405180910390fd5b806001600160401b0381111561127557611275612ea0565b60405190808252806020026020018201604052801561129e578160200160208202803683370190505b509250806001600160401b038111156112b9576112b9612ea0565b6040519080825280602002602001820160405280156112e2578160200160208202803683370190505b5091505f5b818110156113e5575f60c95f8c8c8581811061130557611305612eb4565b905060200201602081019061131a9190612b01565b6001600160a01b0316815260208101919091526040015f208054909150611370906001600160801b03168a8a8581811061135657611356612eb4565b905060200201602081019061136b9190612f5a565b6123f8565b85838151811061138257611382612eb4565b9115156020928302919091019091015280546113ba90600160801b90046001600160801b031688888581811061135657611356612eb4565b8483815181106113cc576113cc612eb4565b91151560209283029190910190910152506001016112e7565b5050965096945050505050565b5f54610100900460ff161580801561141057505f54600160ff909116105b806114295750303b15801561142957505f5460ff166001145b61148c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109ab565b5f805460ff1916600117905580156114ad575f805461ff0019166101001790555b6114b6826124a1565b8015610787575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f6115098261202e565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156115615750600181015461155d906001600160401b03600160501b820481169162010000900416612f73565b4210155b8015610e465750600381015481546001600160801b03600160801b928390048116926115949280831692919004166124d8565b109392505050565b5f610e46826122b9565b5f611509826122b9565b6115b8611621565b606580546001600160a01b0383166001600160a01b031990911681179091556115e96033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b03163314610eb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ab565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b60648201526084016109ab565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa091016114f3565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab9061176b9033908690600401612fb4565b602060405180830381865afa158015611786573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612fd7565b90508061078757333083604051634a3fa29360e01b81526004016109ab93929190612ff2565b6117d98361193d565b816001600160801b03165f036118025760405163a2b326dd60e01b815260040160405180910390fd5b5f61180c84611964565b90505f611818856119b1565b90505f83600181111561182d5761182d612f28565b036118af5781546001600160801b03600160801b9091048116908516118061185d575080846001600160801b0316115b1561189f5760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b6118aa828686611a73565b611936565b60018360018111156118c3576118c3612f28565b036119365781546001600160801b0390811690851610806118ec575080846001600160801b0316105b1561192b57604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b611936828686611ae3565b5050505050565b6001600160a01b03811661073b576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c96020526040902060028101549091166119ac576040516349c9b68960e11b81526001600160a01b03831660048201526024016109ab565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa158015611a19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d919061301d565b92915050565b5f6001600160801b03821115611a6f5760405163339718d960e11b8152600481018390526024016109ab565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b611b608661193d565b611b72856001600160401b031661200e565b611b7b8461200e565b611b848361200e565b6001600160a01b038681165f90815260c960205260409020600201541615611bca57604051630d8cdd9d60e01b81526001600160a01b03871660048201526024016109ab565b66b1a2bc2ec50000841015611c0257604051630f4d736160e01b81526004810185905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000841115611c3c576040516350ddbb7560e11b8152600481018590526706f05b59d3b2000060248201526044016109ab565b838310611c5f57604051632021db5560e21b8152600481018490526024016109ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603611cb15760405163c992a64b60e01b815260040160405180910390fd5b5f611cbe6109e8886119b1565b9050604051806101400160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200184151581526020015f6001600160401b03168152602001876001600160401b03168152602001886001600160a01b03168152602001866001600160801b03168152602001856001600160801b0316815260200183151581525060c95f896001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b03160217905550610120820151816004015f6101000a81548160ff02191690831515021790555090505060ca87908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550866001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b682838989604051611fb894939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2866001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd84604051611ffd911515815260200190565b60405180910390a250505050505050565b805f0361073b5760405163273e150360e21b815260040160405180910390fd5b5f805f61203a84612520565b90506120458161263e565b9093509150821580159061205857508115155b156120635750915091565b5f61206d826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff166120af576120a48383846126c9565b509485945092505050565b5f805f6120bd848688612746565b9250925092505f6120d0858789856127c7565b90506120f08187866001600160801b0316866001600160801b03166128ce565b9099509750612100878a8a6126c9565b50505050505050915091565b606580546001600160a01b031916905561073b8161290b565b61212e8161193d565b5f61213882611964565b600181015490915060ff1661216b57604051638e001e1f60e01b81526001600160a01b03831660048201526024016109ab565b6001810154612192906001600160401b03600160501b820481169162010000900416612f73565b4210156121e7576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b90920490911660448201526064016109ab565b80545f90612208906001600160801b0380821691600160801b9004166124d8565b6003830154909150600160801b90046001600160801b0316811061226c5760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b031660448201526064016109ab565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b5f805f6122c584612520565b90506122d08161263e565b909350915082158015906122e357508115155b156122ee5750915091565b5f6122f8826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661232f57509485945092505050565b5f61233983611a43565b82549091505f906001600160801b0316841061235f5782546001600160801b0316612361565b815b83549091505f90600160801b90046001600160801b03168511612395578354600160801b90046001600160801b0316612397565b825b60018501549091505f9060ff16806123c7575060038501546123c7908790859085906001600160801b031661295c565b90506123e78187856001600160801b0316856001600160801b03166128ce565b909b909a5098505050505050505050565b5f6001600160801b038316158061241657506001600160801b038216155b1561242257505f611a3d565b5f826001600160801b0316846001600160801b031611612454576124468484613034565b6001600160801b0316612468565b61245e8385613034565b6001600160801b03165b905066b1a2bc2ec500006001600160801b03851661248e670de0b6b3a764000084613054565b612498919061306b565b11949350505050565b5f54610100900460ff166124c75760405162461bcd60e51b81526004016109ab9061308a565b6124cf6129db565b61073b81612a09565b5f806124f06001600160801b038086169085166130d5565b90506001600160801b03841661250e670de0b6b3a764000083613054565b612518919061306b565b949350505050565b5f61252a8261193d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361257e575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036125de57507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561261a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d91906130e8565b6001600160a01b0381165f90815260c96020526040812060040154819060ff1661266c57505f928392509050565b6126967f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700084612a2f565b91506126c27f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084612a2f565b9050915091565b6001600160a01b0383165f90815260c9602052604090206004015460ff166126f057505050565b61271b7f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf70008484612a77565b6112277f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb89706008483612a77565b5f805f8061275386611a43565b87549091506001600160801b0380821691600160801b90048116905f90841683111561278b576127848a8986611a73565b5082915060015b816001600160801b0316846001600160801b031611156127b7576127b08a8986611ae3565b5082905060015b9199909850909650945050505050565b835460038501545f916127f39186916001600160801b0380821692600160801b9092048116911661295c565b156128b657600185015460ff1615808061280a5750825b156128355760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b801561284c576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a26001915050612518565b600185015460ff161561251857506001949350505050565b5f80856128df575083905080612902565b8385106128ec57836128ee565b845b8386116128fb57836128fd565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006129718482612f73565b612984906001600160801b038816613054565b61298e919061306b565b90505f670de0b6b3a76400006129a485826130d5565b6129b7906001600160801b038816613054565b6129c1919061306b565b9050818711806129d057508087105b979650505050505050565b5f54610100900460ff16612a015760405162461bcd60e51b81526004016109ab9061308a565b610eb7612abe565b5f54610100900460ff166107325760405162461bcd60e51b81526004016109ab9061308a565b5f808383604051602001612a569291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f8383604051602001612a9d9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff16612ae45760405162461bcd60e51b81526004016109ab9061308a565b610eb73361210c565b6001600160a01b038116811461073b575f80fd5b5f60208284031215612b11575f80fd5b8135610e4681612aed565b80356001600160801b03811681146119ac575f80fd5b5f8060408385031215612b43575f80fd5b8235612b4e81612aed565b9150612b5c60208401612b1c565b90509250929050565b602080825282518282018190525f9190848201906040850190845b81811015612ba55783516001600160a01b031683529284019291840191600101612b80565b50909695505050505050565b801515811461073b575f80fd5b5f8060408385031215612bcf575f80fd5b8235612bda81612aed565b91506020830135612bea81612bb1565b809150509250929050565b5f8060208385031215612c06575f80fd5b82356001600160401b0380821115612c1c575f80fd5b818501915085601f830112612c2f575f80fd5b813581811115612c3d575f80fd5b86602060c083028501011115612c51575f80fd5b60209290920196919550909350505050565b5f805f60608486031215612c75575f80fd5b8335612c8081612aed565b95602085013595506040909401359392505050565b5f60208284031215612ca5575f80fd5b5035919050565b5f60c08284031215612cbc575f80fd5b50919050565b5f8060208385031215612cd3575f80fd5b82356001600160401b0380821115612ce9575f80fd5b818501915085601f830112612cfc575f80fd5b813581811115612d0a575f80fd5b866020606083028501011115612c51575f80fd5b80356001600160401b03811681146119ac575f80fd5b5f8060408385031215612d45575f80fd5b8235612d5081612aed565b9150612b5c60208401612d1e565b5f8083601f840112612d6e575f80fd5b5081356001600160401b03811115612d84575f80fd5b6020830191508360208260051b8501011115612d9e575f80fd5b9250929050565b5f805f805f8060608789031215612dba575f80fd5b86356001600160401b0380821115612dd0575f80fd5b612ddc8a838b01612d5e565b90985096506020890135915080821115612df4575f80fd5b612e008a838b01612d5e565b90965094506040890135915080821115612e18575f80fd5b50612e2589828a01612d5e565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612e68578151151587529582019590820190600101612e4a565b509495945050505050565b604081525f612e856040830185612e37565b8281036020840152612e978185612e37565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612eed57612eed612ec8565b5060010190565b5f60208284031215612f04575f80fd5b610e4682612d1e565b5f60208284031215612f1d575f80fd5b8135610e4681612bb1565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612f4c575f80fd5b813560038110610e46575f80fd5b5f60208284031215612f6a575f80fd5b610e4682612b1c565b80820180821115611a3d57611a3d612ec8565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061251890830184612f86565b5f60208284031215612fe7575f80fd5b8151610e4681612bb1565b6001600160a01b038481168252831660208201526060604082018190525f90612e9790830184612f86565b5f6020828403121561302d575f80fd5b5051919050565b6001600160801b0382811682821603908082111561150957611509612ec8565b8082028115828204841417611a3d57611a3d612ec8565b5f8261308557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81810381811115611a3d57611a3d612ec8565b5f602082840312156130f8575f80fd5b8151610e4681612aed56fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c29736574546f6b656e436f6e666967732828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c295b5d297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e6669672828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c292973796e635072696365426f756e6473416e6450726f74656374696f6e732828616464726573732c75696e74382c75696e74323536295b5d29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429a264697066735822122007b4cdcf907b0609fb9db3ddc0f71466578874b106706d462bbd01df9551438864736f6c63430008190033", + "deployedBytecode": "0x608060405234801561000f575f80fd5b5060043610610255575f3560e01c806388142b6b11610140578063b540894f116100bf578063cf1412c011610084578063cf1412c0146106ba578063dcc88962146106cd578063e2201bb8146106e0578063e30c3978146106f3578063e40c2fed14610704578063f2fde38b14610717575f80fd5b8063b540894f1461055f578063b62e4c9214610580578063bd11c4c0146103fe578063c3821757146105a7578063c4d66de8146106a7575f80fd5b8063a31ebe5811610105578063a31ebe58146104e6578063a4edcd4c146104f9578063a9534f8a14610520578063a9c3cab11461053b578063b4a0bdf31461054e575f80fd5b806388142b6b146104755780638a2f7f6d146104885780638cf38bb1146104af5780638da5cb5b146104c2578063969f58d3146104d3575f80fd5b80634912c452116101d757806376489e381161019c57806376489e38146103b357806379ba5097146103f65780637f5e1328146103fe5780637fa6ea501461040c578063870dc597146104345780638769b23114610447575f80fd5b80634912c4521461034757806352a6bce31461035a578063578e5c221461036d5780636121316814610398578063715018a6146103ab575f80fd5b80631be74faf1161021d5780631be74faf146102f157806323013b83146103065780632f7b5dd7146103195780633b4ecdb21461032c578063412b6ec714610334575f80fd5b806308af5431146102595780630a5fa04d1461027b5780630e32cb86146102a25780631169d5a6146102b757806315a53122146102de575b5f80fd5b6102686706f05b59d3b2000081565b6040519081526020015b60405180910390f35b6102687f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060081565b6102b56102b0366004612b01565b61072a565b005b6102687f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700081565b6102b56102ec366004612b32565b61073e565b6102f961078b565b6040516102729190612b65565b6102b5610314366004612bbe565b61093e565b6102b5610327366004612bf5565b610a6a565b6102f9610b33565b6102b5610342366004612bbe565b610b93565b6102b5610355366004612c63565b610c43565b610268610368366004612b01565b610e3c565b61038061037b366004612c95565b610e4d565b6040516001600160a01b039091168152602001610272565b6102b56103a6366004612cac565b610e75565b6102b5610ea6565b6103e66103c1366004612b01565b6001600160a01b03165f90815260c96020526040902060010154610100900460ff1690565b6040519015158152602001610272565b6102b5610eb9565b61026866b1a2bc2ec5000081565b61041f61041a366004612b01565b610f30565b60408051928352602083019190915201610272565b6102b5610442366004612cc2565b610f44565b6103e6610455366004612b01565b6001600160a01b03165f90815260c9602052604090206001015460ff1690565b61041f610483366004612b01565b6110af565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6102b56104bd366004612b01565b6110ba565b6033546001600160a01b0316610380565b6102b56104e1366004612b32565b611101565b6102b56104f4366004612d34565b61114b565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b61038073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb81565b6102b5610549366004612b01565b61121e565b6097546001600160a01b0316610380565b61057261056d366004612da5565b61122c565b604051610272929190612e73565b6103807f000000000000000000000000000000000000000000000000000000000000000081565b6106326105b5366004612b01565b60c96020525f9081526040902080546001820154600283015460038401546004909401546001600160801b0380851695600160801b9586900482169560ff8087169661010081048216966001600160401b03620100008304811697600160501b90930416956001600160a01b03909116948082169490041691168a565b604080516001600160801b039b8c168152998b1660208b01529715159789019790975294151560608801526001600160401b0393841660808801529290911660a08601526001600160a01b031660c0850152841660e08401529290921661010082015290151561012082015261014001610272565b6102b56106b5366004612b01565b6113f2565b6102686106c8366004612b01565b6114ff565b6103e66106db366004612b01565b611510565b6102686106ee366004612b01565b61159c565b6065546001600160a01b0316610380565b610268610712366004612b01565b6115a6565b6102b5610725366004612b01565b6115b0565b610732611621565b61073b8161167b565b50565b61077c6040518060400160405280601f81526020017f7570646174654d696e507269636528616464726573732c75696e743132382900815250611739565b61078782825f6117d0565b5050565b60ca546060905f816001600160401b038111156107aa576107aa612ea0565b6040519080825280602002602001820160405280156107d3578160200160208202803683370190505b5090505f805b838110156108995760c95f60ca83815481106107f7576107f7612eb4565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206001015460ff61010090910416156108915760ca818154811061083f5761083f612eb4565b5f918252602090912001546001600160a01b0316838361085e81612edc565b94508151811061087057610870612eb4565b60200260200101906001600160a01b031690816001600160a01b0316815250505b6001016107d9565b505f816001600160401b038111156108b3576108b3612ea0565b6040519080825280602002602001820160405280156108dc578160200160208202803683370190505b5090505f5b82811015610935578381815181106108fb576108fb612eb4565b602002602001015182828151811061091557610915612eb4565b6001600160a01b03909216602092830291909101909101526001016108e1565b50949350505050565b61095f6040518060600160405280602b8152602001613104602b9139611739565b6109688261193d565b5f61097283611964565b9050811580156109865750600181015460ff165b156109b4576040516310ce5af160e11b81526001600160a01b03841660048201526024015b60405180910390fd5b8115158160010160019054906101000a900460ff161515036109d557505050565b8115610a07575f6109ed6109e8856119b1565b611a43565b90506109fa828583611a73565b610a05828583611ae3565b505b6001810180548315156101000261ff00199091161790556040516001600160a01b038416907fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd90610a5d90851515815260200190565b60405180910390a2505050565b610a8b6040518060600160405280603d815260200161312f603d9139611739565b805f819003610aad57604051634ec4810560e11b815260040160405180910390fd5b5f5b81811015610b2d5736848483818110610aca57610aca612eb4565b60c002919091019150610b249050610ae56020830183612b01565b610af56040840160208501612ef4565b60408401356060850135610b0f60a0870160808801612f0d565b610b1f60c0880160a08901612f0d565b611b57565b50600101610aaf565b50505050565b606060ca805480602002602001604051908101604052809291908181526020018280548015610b8957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311610b6b575b5050505050905090565b610bd16040518060400160405280601f81526020017f73657443616368696e67456e61626c656428616464726573732c626f6f6c2900815250611739565b5f610bdb83611964565b60048101546040805160ff9092161515825284151560208301529192506001600160a01b038516917f80b87a057217c1d7743a43adf6fcf8a06553fde1205440ebbfb539f6f0e04424910160405180910390a2600401805460ff191691151591909117905550565b610c6460405180606001604052806026815260200161316c60269139611739565b610c6d8361193d565b610c768261200e565b610c7f8161200e565b66b1a2bc2ec50000821015610cb757604051630f4d736160e01b81526004810183905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000821115610cf1576040516350ddbb7560e11b8152600481018390526706f05b59d3b2000060248201526044016109ab565b818110610d1457604051632021db5560e21b8152600481018290526024016109ab565b5f610d1e84611964565b60038101549091506001600160801b03168314610da6576003810154604080516001600160801b039092168252602082018590526001600160a01b038616917f605baae98875f2133a40a8d489531e195b473e8cdb0c860a2d2b51d430eff588910160405180910390a26003810180546001600160801b0319166001600160801b0385161790555b6003810154600160801b90046001600160801b03168214610b2d57600381015460408051600160801b9092046001600160801b03168252602082018490526001600160a01b038616917f75c087963c80520a0d86e6333991c95d79462341f6960f2904396c23def23dd4910160405180910390a26003810180546001600160801b03808516600160801b02911617905550505050565b5f610e468261202e565b9392505050565b60ca8181548110610e5c575f80fd5b5f918252602090912001546001600160a01b0316905081565b610e966040518060600160405280603a8152602001613192603a9139611739565b61073b610ae56020830183612b01565b610eae611621565b610eb75f61210c565b565b60655433906001600160a01b03168114610f275760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084016109ab565b61073b8161210c565b5f80610f3b8361202e565b91509150915091565b610f656040518060600160405280603881526020016131cc60389139611739565b805f5b81811015610b2d5736848483818110610f8357610f83612eb4565b6060029190910191505f9050610f9f6040830160208401612f3c565b6002811115610fb057610fb0612f28565b03610fdd57610fd8610fc56020830183612b01565b610fd28360400135611a43565b5f6117d0565b6110a6565b6001610fef6040830160208401612f3c565b600281111561100057611000612f28565b0361102957610fd86110156020830183612b01565b6110228360400135611a43565b60016117d0565b600261103b6040830160208401612f3c565b600281111561104c5761104c612f28565b0361106657610fd86110616020830183612b01565b612125565b6110766040820160208301612f3c565b600281111561108757611087612f28565b604051635374467d60e11b815260ff90911660048201526024016109ab565b50600101610f68565b5f80610f3b836122b9565b6110f86040518060400160405280601b81526020017f6578697450726f74656374696f6e4d6f64652861646472657373290000000000815250611739565b61073b81612125565b61113f6040518060400160405280601f81526020017f7570646174654d6178507269636528616464726573732c75696e743132382900815250611739565b610787828260016117d0565b61116c60405180606001604052806021815260200161320460219139611739565b6111758261193d565b611187816001600160401b031661200e565b5f61119183611964565b6001810154604080516001600160401b03600160501b9093048316815291851660208301529192506001600160a01b038516917f890c8f3ce148a0c50a68d44c085aa3228b8e72273a03dba4ecfd402f94033c1e910160405180910390a260010180546001600160401b03909216600160501b0267ffffffffffffffff60501b1990921691909117905550565b6112278161202e565b505050565b60608086858114158061123f5750808414155b1561125d57604051634ec4810560e11b815260040160405180910390fd5b806001600160401b0381111561127557611275612ea0565b60405190808252806020026020018201604052801561129e578160200160208202803683370190505b509250806001600160401b038111156112b9576112b9612ea0565b6040519080825280602002602001820160405280156112e2578160200160208202803683370190505b5091505f5b818110156113e5575f60c95f8c8c8581811061130557611305612eb4565b905060200201602081019061131a9190612b01565b6001600160a01b0316815260208101919091526040015f208054909150611370906001600160801b03168a8a8581811061135657611356612eb4565b905060200201602081019061136b9190612f5a565b6123f8565b85838151811061138257611382612eb4565b9115156020928302919091019091015280546113ba90600160801b90046001600160801b031688888581811061135657611356612eb4565b8483815181106113cc576113cc612eb4565b91151560209283029190910190910152506001016112e7565b5050965096945050505050565b5f54610100900460ff161580801561141057505f54600160ff909116105b806114295750303b15801561142957505f5460ff166001145b61148c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016109ab565b5f805460ff1916600117905580156114ad575f805461ff0019166101001790555b6114b6826124a1565b8015610787575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15050565b5f6115098261202e565b5092915050565b6001600160a01b0381165f90815260c960205260408120600181015460ff1680156115615750600181015461155d906001600160401b03600160501b820481169162010000900416612f73565b4210155b8015610e465750600381015481546001600160801b03600160801b928390048116926115949280831692919004166124d8565b109392505050565b5f610e46826122b9565b5f611509826122b9565b6115b8611621565b606580546001600160a01b0383166001600160a01b031990911681179091556115e96033546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6033546001600160a01b03163314610eb75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109ab565b6001600160a01b0381166116df5760405162461bcd60e51b815260206004820152602560248201527f696e76616c696420616365737320636f6e74726f6c206d616e61676572206164604482015264647265737360d81b60648201526084016109ab565b609780546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f66fd58e82f7b31a2a5c30e0888f3093efe4e111b00cd2b0c31fe014601293aa091016114f3565b6097546040516318c5e8ab60e01b81525f916001600160a01b0316906318c5e8ab9061176b9033908690600401612fb4565b602060405180830381865afa158015611786573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117aa9190612fd7565b90508061078757333083604051634a3fa29360e01b81526004016109ab93929190612ff2565b6117d98361193d565b816001600160801b03165f036118025760405163a2b326dd60e01b815260040160405180910390fd5b5f61180c84611964565b90505f611818856119b1565b90505f83600181111561182d5761182d612f28565b036118af5781546001600160801b03600160801b9091048116908516118061185d575080846001600160801b0316115b1561189f5760405160016203590160e31b031981526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b6118aa828686611a73565b611936565b60018360018111156118c3576118c3612f28565b036119365781546001600160801b0390811690851610806118ec575080846001600160801b0316105b1561192b57604051636df018fb60e11b81526001600160a01b03861660048201526001600160801b0385166024820152604481018290526064016109ab565b611936828686611ae3565b5050505050565b6001600160a01b03811661073b576040516342bcdf7f60e11b815260040160405180910390fd5b6001600160a01b038082165f90815260c96020526040902060028101549091166119ac576040516349c9b68960e11b81526001600160a01b03831660048201526024016109ab565b919050565b6040516341976e0960e01b81526001600160a01b0382811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906341976e0990602401602060405180830381865afa158015611a19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d919061301d565b92915050565b5f6001600160801b03821115611a6f5760405163339718d960e11b8152600481018390526024016109ab565b5090565b8254604080516001600160801b03928316815291831660208301526001600160a01b038416917f532579a79f45c3e02b749f0817d46bab6b256e8d1dae660d2f432d8032f21f2d910160405180910390a282546001600160801b0319166001600160801b03919091161790915550565b825460408051600160801b9092046001600160801b039081168352831660208301526001600160a01b038416917f067a69521c594f269500a8d1fd306d6cade49e09512a3fdf637a16aa1694dd88910160405180910390a282546001600160801b03918216600160801b0291161790915550565b611b608661193d565b611b72856001600160401b031661200e565b611b7b8461200e565b611b848361200e565b6001600160a01b038681165f90815260c960205260409020600201541615611bca57604051630d8cdd9d60e01b81526001600160a01b03871660048201526024016109ab565b66b1a2bc2ec50000841015611c0257604051630f4d736160e01b81526004810185905266b1a2bc2ec5000060248201526044016109ab565b6706f05b59d3b20000841115611c3c576040516350ddbb7560e11b8152600481018590526706f05b59d3b2000060248201526044016109ab565b838310611c5f57604051632021db5560e21b8152600481018490526024016109ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031603611cb15760405163c992a64b60e01b815260040160405180910390fd5b5f611cbe6109e8886119b1565b9050604051806101400160405280826001600160801b03168152602001826001600160801b031681526020015f1515815260200184151581526020015f6001600160401b03168152602001876001600160401b03168152602001886001600160a01b03168152602001866001600160801b03168152602001856001600160801b0316815260200183151581525060c95f896001600160a01b03166001600160a01b031681526020019081526020015f205f820151815f015f6101000a8154816001600160801b0302191690836001600160801b031602179055506020820151815f0160106101000a8154816001600160801b0302191690836001600160801b031602179055506040820151816001015f6101000a81548160ff02191690831515021790555060608201518160010160016101000a81548160ff02191690831515021790555060808201518160010160026101000a8154816001600160401b0302191690836001600160401b0316021790555060a082015181600101600a6101000a8154816001600160401b0302191690836001600160401b0316021790555060c0820151816002015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060e0820151816003015f6101000a8154816001600160801b0302191690836001600160801b031602179055506101008201518160030160106101000a8154816001600160801b0302191690836001600160801b03160217905550610120820151816004015f6101000a81548160ff02191690831515021790555090505060ca87908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550866001600160a01b03167feaeb53cd979b528911d7ed793f11a25e44e5076bef70f458f60049acb4c322b682838989604051611fb894939291906001600160801b0394851681529290931660208301526001600160401b03166040820152606081019190915260800190565b60405180910390a2866001600160a01b03167fde52a1c70ed1ca343b25cca640873d949641bd6ec7a2c2d0e67374ce54ff89cd84604051611ffd911515815260200190565b60405180910390a250505050505050565b805f0361073b5760405163273e150360e21b815260040160405180910390fd5b5f805f61203a84612520565b90506120458161263e565b9093509150821580159061205857508115155b156120635750915091565b5f61206d826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff166120af576120a48383846126c9565b509485945092505050565b5f805f6120bd848688612746565b9250925092505f6120d0858789856127c7565b90506120f08187866001600160801b0316866001600160801b03166128ce565b9099509750612100878a8a6126c9565b50505050505050915091565b606580546001600160a01b031916905561073b8161290b565b61212e8161193d565b5f61213882611964565b600181015490915060ff1661216b57604051638e001e1f60e01b81526001600160a01b03831660048201526024016109ab565b6001810154612192906001600160401b03600160501b820481169162010000900416612f73565b4210156121e7576001810154604051630874f3a160e01b81526001600160a01b03841660048201526001600160401b0362010000830481166024830152600160501b90920490911660448201526064016109ab565b80545f90612208906001600160801b0380821691600160801b9004166124d8565b6003830154909150600160801b90046001600160801b0316811061226c5760038201546040516311c9371560e01b81526001600160a01b038516600482015260248101839052600160801b9091046001600160801b031660448201526064016109ab565b60018201805469ffffffffffffffff00ff191690556040516001600160a01b038416907f6977cf3ab0aaccc6ceeb77ddaf93b2e1f1b9e6c7e39c7fb08314efbbea365741905f90a2505050565b5f805f6122c584612520565b90506122d08161263e565b909350915082158015906122e357508115155b156122ee5750915091565b5f6122f8826119b1565b6001600160a01b0383165f90815260c960205260409020600181015491925090610100900460ff1661232f57509485945092505050565b5f61233983611a43565b82549091505f906001600160801b0316841061235f5782546001600160801b0316612361565b815b83549091505f90600160801b90046001600160801b03168511612395578354600160801b90046001600160801b0316612397565b825b60018501549091505f9060ff16806123c7575060038501546123c7908790859085906001600160801b031661295c565b90506123e78187856001600160801b0316856001600160801b03166128ce565b909b909a5098505050505050505050565b5f6001600160801b038316158061241657506001600160801b038216155b1561242257505f611a3d565b5f826001600160801b0316846001600160801b031611612454576124468484613034565b6001600160801b0316612468565b61245e8385613034565b6001600160801b03165b905066b1a2bc2ec500006001600160801b03851661248e670de0b6b3a764000084613054565b612498919061306b565b11949350505050565b5f54610100900460ff166124c75760405162461bcd60e51b81526004016109ab9061308a565b6124cf6129db565b61073b81612a09565b5f806124f06001600160801b038086169085166130d5565b90506001600160801b03841661250e670de0b6b3a764000083613054565b612518919061306b565b949350505050565b5f61252a8261193d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361257e575073bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036125de57507f0000000000000000000000000000000000000000000000000000000000000000919050565b816001600160a01b0316636f307dc36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561261a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3d91906130e8565b6001600160a01b0381165f90815260c96020526040812060040154819060ff1661266c57505f928392509050565b6126967f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf700084612a2f565b91506126c27f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb897060084612a2f565b9050915091565b6001600160a01b0383165f90815260c9602052604090206004015460ff166126f057505050565b61271b7f7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf70008484612a77565b6112277f84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb89706008483612a77565b5f805f8061275386611a43565b87549091506001600160801b0380821691600160801b90048116905f90841683111561278b576127848a8986611a73565b5082915060015b816001600160801b0316846001600160801b031611156127b7576127b08a8986611ae3565b5082905060015b9199909850909650945050505050565b835460038501545f916127f39186916001600160801b0380821692600160801b9092048116911661295c565b156128b657600185015460ff1615808061280a5750825b156128355760018601805469ffffffffffffffff0000191662010000426001600160401b0316021790555b801561284c576001868101805460ff191690911790555b8554604080518781526001600160801b038084166020830152600160801b909304909216908201526001600160a01b038516907f0e25941e7a04e3bd937c28c403c9431e5fe5cf87df19322b5352bf457f8b1c5f9060600160405180910390a26001915050612518565b600185015460ff161561251857506001949350505050565b5f80856128df575083905080612902565b8385106128ec57836128ee565b845b8386116128fb57836128fd565b855b915091505b94509492505050565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f80670de0b6b3a76400006129718482612f73565b612984906001600160801b038816613054565b61298e919061306b565b90505f670de0b6b3a76400006129a485826130d5565b6129b7906001600160801b038816613054565b6129c1919061306b565b9050818711806129d057508087105b979650505050505050565b5f54610100900460ff16612a015760405162461bcd60e51b81526004016109ab9061308a565b610eb7612abe565b5f54610100900460ff166107325760405162461bcd60e51b81526004016109ab9061308a565b5f808383604051602001612a569291909182526001600160a01b0316602082015260400190565b60408051601f1981840301815291905280516020909101205c949350505050565b5f8383604051602001612a9d9291909182526001600160a01b0316602082015260400190565b60405160208183030381529060405280519060200120905081815d50505050565b5f54610100900460ff16612ae45760405162461bcd60e51b81526004016109ab9061308a565b610eb73361210c565b6001600160a01b038116811461073b575f80fd5b5f60208284031215612b11575f80fd5b8135610e4681612aed565b80356001600160801b03811681146119ac575f80fd5b5f8060408385031215612b43575f80fd5b8235612b4e81612aed565b9150612b5c60208401612b1c565b90509250929050565b602080825282518282018190525f9190848201906040850190845b81811015612ba55783516001600160a01b031683529284019291840191600101612b80565b50909695505050505050565b801515811461073b575f80fd5b5f8060408385031215612bcf575f80fd5b8235612bda81612aed565b91506020830135612bea81612bb1565b809150509250929050565b5f8060208385031215612c06575f80fd5b82356001600160401b0380821115612c1c575f80fd5b818501915085601f830112612c2f575f80fd5b813581811115612c3d575f80fd5b86602060c083028501011115612c51575f80fd5b60209290920196919550909350505050565b5f805f60608486031215612c75575f80fd5b8335612c8081612aed565b95602085013595506040909401359392505050565b5f60208284031215612ca5575f80fd5b5035919050565b5f60c08284031215612cbc575f80fd5b50919050565b5f8060208385031215612cd3575f80fd5b82356001600160401b0380821115612ce9575f80fd5b818501915085601f830112612cfc575f80fd5b813581811115612d0a575f80fd5b866020606083028501011115612c51575f80fd5b80356001600160401b03811681146119ac575f80fd5b5f8060408385031215612d45575f80fd5b8235612d5081612aed565b9150612b5c60208401612d1e565b5f8083601f840112612d6e575f80fd5b5081356001600160401b03811115612d84575f80fd5b6020830191508360208260051b8501011115612d9e575f80fd5b9250929050565b5f805f805f8060608789031215612dba575f80fd5b86356001600160401b0380821115612dd0575f80fd5b612ddc8a838b01612d5e565b90985096506020890135915080821115612df4575f80fd5b612e008a838b01612d5e565b90965094506040890135915080821115612e18575f80fd5b50612e2589828a01612d5e565b979a9699509497509295939492505050565b5f815180845260208085019450602084015f5b83811015612e68578151151587529582019590820190600101612e4a565b509495945050505050565b604081525f612e856040830185612e37565b8281036020840152612e978185612e37565b95945050505050565b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f60018201612eed57612eed612ec8565b5060010190565b5f60208284031215612f04575f80fd5b610e4682612d1e565b5f60208284031215612f1d575f80fd5b8135610e4681612bb1565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612f4c575f80fd5b813560038110610e46575f80fd5b5f60208284031215612f6a575f80fd5b610e4682612b1c565b80820180821115611a3d57611a3d612ec8565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b6001600160a01b03831681526040602082018190525f9061251890830184612f86565b5f60208284031215612fe7575f80fd5b8151610e4681612bb1565b6001600160a01b038481168252831660208201526060604082018190525f90612e9790830184612f86565b5f6020828403121561302d575f80fd5b5051919050565b6001600160801b0382811682821603908082111561150957611509612ec8565b8082028115828204841417611a3d57611a3d612ec8565b5f8261308557634e487b7160e01b5f52601260045260245ffd5b500490565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b81810381811115611a3d57611a3d612ec8565b5f602082840312156130f8575f80fd5b8151610e4681612aed56fe7365744173736574426f756e64656450726963696e67456e61626c656428616464726573732c626f6f6c29736574546f6b656e436f6e666967732828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c295b5d297365745468726573686f6c647328616464726573732c75696e743235362c75696e7432353629736574546f6b656e436f6e6669672828616464726573732c75696e7436342c75696e743235362c75696e743235362c626f6f6c2c626f6f6c292973796e635072696365426f756e6473416e6450726f74656374696f6e732828616464726573732c75696e74382c75696e74323536295b5d29736574436f6f6c646f776e506572696f6428616464726573732c75696e74363429a264697066735822122007b4cdcf907b0609fb9db3ddc0f71466578874b106706d462bbd01df9551438864736f6c63430008190033", "devdoc": { "author": "Venus", "events": { @@ -1374,7 +1487,7 @@ } }, "getBoundedCollateralPriceView(address)": { - "details": "Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns min(spot, windowMin) when protection is active, spot otherwise.", + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns min(spot, windowMin) when protection is active, spot otherwise.", "params": { "vToken": "vToken address" }, @@ -1393,7 +1506,7 @@ } }, "getBoundedDebtPriceView(address)": { - "details": "Reads from transient cache first (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss. Returns max(spot, windowMax) when protection is active, spot otherwise.", + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true` (populated by a prior updateProtectionState call in the same transaction). Falls back to ResilientOracle on cache miss or when caching is disabled. Returns max(spot, windowMax) when protection is active, spot otherwise.", "params": { "vToken": "vToken address" }, @@ -1413,7 +1526,7 @@ } }, "getBoundedPricesView(address)": { - "details": "Reads from transient cache first; falls back to ResilientOracle on cache miss.", + "details": "Reads from transient cache first when the asset's `cachingEnabled` flag is `true`; falls back to ResilientOracle on cache miss or when caching is disabled.", "params": { "vToken": "vToken address" }, @@ -1466,6 +1579,16 @@ "enabled": "Whether bounded pricing should be enabled for the asset" } }, + "setCachingEnabled(address,bool)": { + "custom:access": "Only Governance", + "custom:error": "MarketNotInitialized if the asset has not been initialized", + "custom:event": "CachingEnabledUpdated", + "details": "When disabled, each view/non-view price call recomputes bounded prices from the live spot instead of reading or writing the transient slots. The initial value is set via the `enableCaching` argument of `setTokenConfig`.", + "params": { + "asset": "The underlying asset address", + "enabled": "Whether transient caching is enabled for this asset" + } + }, "setCooldownPeriod(address,uint64)": { "custom:access": "Only Governance", "custom:event": "CooldownPeriodSet", @@ -1484,27 +1607,28 @@ "newTriggerThreshold": "The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold." } }, - "setTokenConfig(address,uint64,uint256,uint256,bool)": { + "setTokenConfig((address,uint64,uint256,uint256,bool,bool))": { "custom:access": "Only Governance", "custom:event": "ProtectionInitializedBoundedPricingWhitelistUpdated", "params": { - "asset": "The underlying asset address", - "cooldownPeriod": "Minimum time protection stays active after last trigger", - "enableBoundedPricing": "Whether to enable bounded pricing immediately upon initialization", - "resetThreshold": "Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.", - "triggerThreshold": "Deviation threshold that activates protection (mantissa). Must be between 5% and 50%." + "tokenConfig_": "Token config input for the asset" } }, - "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])": { + "setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])": { "custom:access": "Only Governance", - "custom:error": "InvalidArrayLength if array lengths do not match", + "custom:error": "InvalidArrayLength if the input array is empty", "custom:event": "ProtectionInitialized for each assetBoundedPricingWhitelistUpdated for each asset", "params": { - "assets": "Array of underlying asset addresses", - "cooldownPeriods": "Array of cooldown periods (seconds)", - "enableBoundedPricings": "Array of whether to enable bounded pricing per asset", - "resetThresholds": "Array of reset thresholds (mantissa)", - "triggerThresholds": "Array of trigger thresholds (mantissa)" + "tokenConfigs_": "Array of token config inputs, one per asset" + } + }, + "syncPriceBoundsAndProtections((address,uint8,uint256)[])": { + "custom:access": "Only authorized keeper addresses", + "custom:error": "InvalidKeeperAction if an item carries an unsupported action enum value", + "custom:event": "MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited", + "details": "Each item is processed in array order; any item revert rolls back the whole batch. `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode. Empty `actions` is a no-op success.", + "params": { + "actions": "The list of keeper actions to apply" } }, "transferOwnership(address)": { @@ -1530,7 +1654,7 @@ }, "updateProtectionState(address)": { "custom:event": "MinPriceUpdated if a new window minimum is recordedMaxPriceUpdated if a new window maximum is recordedProtectionTriggered if the spot price deviates beyond the threshold", - "details": "Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls.", + "details": "Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before liquidity calculations). Subsequent calls to getBoundedCollateralPriceView / getBoundedDebtPriceView within the same transaction will read from the transient cache instead of querying ResilientOracle again, keeping those functions as `view` and avoiding redundant oracle calls. The transient cache is only populated when the asset's `cachingEnabled` flag is `true`. When caching is disabled, view price reads fall through to live recomputation. Permissionless: anyone can call this, both for gas optimisation and to ensure every caller in the same transaction reads the correct, up-to-date bounded price.", "params": { "vToken": "vToken address" } @@ -1538,7 +1662,7 @@ }, "stateVariables": { "COLLATERAL_PRICE_CACHE_SLOT": { - "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/cache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/cache\")) - 1)) & ~bytes32(uint256(0xff))" + "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\")) - 1)) & ~bytes32(uint256(0xff))" }, "DEBT_PRICE_CACHE_SLOT": { "details": "custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1)) & ~bytes32(uint256(0xff))" @@ -1568,6 +1692,11 @@ "notice": "Thrown when the lengths of the arrays are not equal" } ], + "InvalidKeeperAction(uint8)": [ + { + "notice": "Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value" + } + ], "InvalidMaxPrice(address,uint128,uint256)": [ { "notice": "Thrown when keeper tries to set maxPrice below current spot" @@ -1580,7 +1709,7 @@ ], "InvalidResetThreshold(uint256)": [ { - "notice": "Thrown when the exit threshold is set above the deviation threshold" + "notice": "Thrown when the exit threshold is set at or above the trigger threshold" } ], "MarketAlreadyInitialized(address)": [ @@ -1590,7 +1719,7 @@ ], "MarketNotInitialized(address)": [ { - "notice": "Thrown when trying to initialize protection for an asset that is not initialized" + "notice": "Thrown when trying to use or update protection for an asset that has not been initialized" } ], "PriceExceedsUint128(uint256)": [ @@ -1605,7 +1734,7 @@ ], "ProtectedPriceActive(address)": [ { - "notice": "Thrown when trying to update for an asset with active protection" + "notice": "Thrown when trying to disable bounded pricing for an asset while protection is active" } ], "ProtectedPriceInactive(address)": [ @@ -1653,6 +1782,9 @@ "BoundedPricingWhitelistUpdated(address,bool)": { "notice": "Emitted when an asset's whitelist status changes" }, + "CachingEnabledUpdated(address,bool,bool)": { + "notice": "Emitted when the per-asset transient caching flag is toggled" + }, "CooldownPeriodSet(address,uint64,uint64)": { "notice": "Emitted when the cooldown period is updated for an asset" }, @@ -1767,18 +1899,24 @@ "setAssetBoundedPricingEnabled(address,bool)": { "notice": "Sets whether an asset is enabled for bounded pricing" }, + "setCachingEnabled(address,bool)": { + "notice": "Toggles transient caching of the bounded (collateral, debt) pair for an asset" + }, "setCooldownPeriod(address,uint64)": { "notice": "Sets the cooldown period for an asset" }, "setThresholds(address,uint256,uint256)": { "notice": "Sets the trigger and reset thresholds for an asset" }, - "setTokenConfig(address,uint64,uint256,uint256,bool)": { + "setTokenConfig((address,uint64,uint256,uint256,bool,bool))": { "notice": "Initializes protection for a new asset" }, - "setTokenConfigs(address[],uint64[],uint256[],uint256[],bool[])": { + "setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])": { "notice": "Batch-initializes protection for multiple assets in a single transaction" }, + "syncPriceBoundsAndProtections((address,uint8,uint256)[])": { + "notice": "Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check" + }, "updateMaxPrice(address,uint128)": { "notice": "Updates the maximum price in the rolling window for a given asset" }, @@ -1786,7 +1924,7 @@ "notice": "Updates the minimum price in the rolling window for a given asset" }, "updateProtectionState(address)": { - "notice": "Fetches the spot price, updates the protection window, and caches the resolved bounded prices in transient storage for the duration of the transaction." + "notice": "Fetches the spot price, updates the protection window, and caches the resolved collateral and debt prices in transient storage for the duration of the transaction." }, "vai()": { "notice": "VAI address" @@ -1798,7 +1936,7 @@ "storageLayout": { "storage": [ { - "astId": 246, + "astId": 349, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "_initialized", "offset": 0, @@ -1806,7 +1944,7 @@ "type": "t_uint8" }, { - "astId": 249, + "astId": 352, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "_initializing", "offset": 1, @@ -1814,7 +1952,7 @@ "type": "t_bool" }, { - "astId": 788, + "astId": 1019, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "__gap", "offset": 0, @@ -1822,7 +1960,7 @@ "type": "t_array(t_uint256)50_storage" }, { - "astId": 118, + "astId": 221, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "_owner", "offset": 0, @@ -1830,7 +1968,7 @@ "type": "t_address" }, { - "astId": 238, + "astId": 341, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "__gap", "offset": 0, @@ -1838,7 +1976,7 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 11, + "astId": 114, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "_pendingOwner", "offset": 0, @@ -1846,7 +1984,7 @@ "type": "t_address" }, { - "astId": 105, + "astId": 208, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "__gap", "offset": 0, @@ -1854,15 +1992,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 979, + "astId": 1940, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "_accessControlManager", "offset": 0, "slot": "151", - "type": "t_contract(IAccessControlManagerV8)1164" + "type": "t_contract(IAccessControlManagerV8)2125" }, { - "astId": 984, + "astId": 1945, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "__gap", "offset": 0, @@ -1870,15 +2008,15 @@ "type": "t_array(t_uint256)49_storage" }, { - "astId": 1281, + "astId": 2242, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "assetProtectionConfig", "offset": 0, "slot": "201", - "type": "t_mapping(t_address,t_struct(MarketProtectionState)3209_storage)" + "type": "t_mapping(t_address,t_struct(MarketProtectionState)5622_storage)" }, { - "astId": 1285, + "astId": 2246, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "allAssets", "offset": 0, @@ -1886,7 +2024,7 @@ "type": "t_array(t_address)dyn_storage" }, { - "astId": 1290, + "astId": 2251, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "__gap", "offset": 0, @@ -1929,24 +2067,24 @@ "label": "bool", "numberOfBytes": "1" }, - "t_contract(IAccessControlManagerV8)1164": { + "t_contract(IAccessControlManagerV8)2125": { "encoding": "inplace", "label": "contract IAccessControlManagerV8", "numberOfBytes": "20" }, - "t_mapping(t_address,t_struct(MarketProtectionState)3209_storage)": { + "t_mapping(t_address,t_struct(MarketProtectionState)5622_storage)": { "encoding": "mapping", "key": "t_address", "label": "mapping(address => struct IDeviationBoundedOracle.MarketProtectionState)", "numberOfBytes": "32", - "value": "t_struct(MarketProtectionState)3209_storage" + "value": "t_struct(MarketProtectionState)5622_storage" }, - "t_struct(MarketProtectionState)3209_storage": { + "t_struct(MarketProtectionState)5622_storage": { "encoding": "inplace", "label": "struct IDeviationBoundedOracle.MarketProtectionState", "members": [ { - "astId": 3184, + "astId": 5594, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "minPrice", "offset": 0, @@ -1954,7 +2092,7 @@ "type": "t_uint128" }, { - "astId": 3187, + "astId": 5597, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "maxPrice", "offset": 16, @@ -1962,7 +2100,7 @@ "type": "t_uint128" }, { - "astId": 3190, + "astId": 5600, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "currentlyUsingProtectedPrice", "offset": 0, @@ -1970,7 +2108,7 @@ "type": "t_bool" }, { - "astId": 3193, + "astId": 5603, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "isBoundedPricingEnabled", "offset": 1, @@ -1978,7 +2116,7 @@ "type": "t_bool" }, { - "astId": 3196, + "astId": 5606, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "lastProtectionTriggeredAt", "offset": 2, @@ -1986,7 +2124,7 @@ "type": "t_uint64" }, { - "astId": 3199, + "astId": 5609, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "cooldownPeriod", "offset": 10, @@ -1994,7 +2132,7 @@ "type": "t_uint64" }, { - "astId": 3202, + "astId": 5612, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "asset", "offset": 0, @@ -2002,7 +2140,7 @@ "type": "t_address" }, { - "astId": 3205, + "astId": 5615, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "triggerThreshold", "offset": 0, @@ -2010,15 +2148,23 @@ "type": "t_uint128" }, { - "astId": 3208, + "astId": 5618, "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", "label": "resetThreshold", "offset": 16, "slot": "3", "type": "t_uint128" + }, + { + "astId": 5621, + "contract": "contracts/DeviationBoundedOracle.sol:DeviationBoundedOracle", + "label": "cachingEnabled", + "offset": 0, + "slot": "4", + "type": "t_bool" } ], - "numberOfBytes": "128" + "numberOfBytes": "160" }, "t_uint128": { "encoding": "inplace", diff --git a/deployments/bsctestnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json b/deployments/bsctestnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json new file mode 100644 index 00000000..0355b9cb --- /dev/null +++ b/deployments/bsctestnet/solcInputs/b08018e2eab5f4ca5e3ba0c1798444d8.json @@ -0,0 +1,349 @@ +{ + "language": "Solidity", + "sources": { + "@chainlink/contracts/src/v0.8/interfaces/AggregatorInterface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface AggregatorInterface {\n function latestAnswer() external view returns (int256);\n\n function latestTimestamp() external view returns (uint256);\n\n function latestRound() external view returns (uint256);\n\n function getAnswer(uint256 roundId) external view returns (int256);\n\n function getTimestamp(uint256 roundId) external view returns (uint256);\n\n event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);\n\n event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);\n}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./AggregatorInterface.sol\";\nimport \"./AggregatorV3Interface.sol\";\n\ninterface AggregatorV2V3Interface is AggregatorInterface, AggregatorV3Interface {}\n" + }, + "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\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 (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n\n function latestRoundData()\n external\n view\n returns (\n uint80 roundId,\n int256 answer,\n uint256 startedAt,\n uint256 updatedAt,\n uint80 answeredInRound\n );\n}\n" + }, + "@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable2Step.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./OwnableUpgradeable.sol\";\nimport {Initializable} from \"../proxy/utils/Initializable.sol\";\n\n/**\n * @dev Contract module which provides access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership} and {acceptOwnership}.\n *\n * This module is used through inheritance. It will make available all functions\n * from parent (Ownable).\n */\nabstract contract Ownable2StepUpgradeable is Initializable, OwnableUpgradeable {\n address private _pendingOwner;\n\n event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);\n\n function __Ownable2Step_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable2Step_init_unchained() internal onlyInitializing {\n }\n /**\n * @dev Returns the address of the pending owner.\n */\n function pendingOwner() public view virtual returns (address) {\n return _pendingOwner;\n }\n\n /**\n * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual override onlyOwner {\n _pendingOwner = newOwner;\n emit OwnershipTransferStarted(owner(), newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual override {\n delete _pendingOwner;\n super._transferOwnership(newOwner);\n }\n\n /**\n * @dev The new owner accepts the ownership transfer.\n */\n function acceptOwnership() public virtual {\n address sender = _msgSender();\n require(pendingOwner() == sender, \"Ownable2Step: caller is not the new owner\");\n _transferOwnership(sender);\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" + }, + "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.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 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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 OwnableUpgradeable is Initializable, ContextUpgradeable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n function __Ownable_init() internal onlyInitializing {\n __Ownable_init_unchained();\n }\n\n function __Ownable_init_unchained() internal onlyInitializing {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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 /**\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" + }, + "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol": { + "content": "// 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" + }, + "@openzeppelin/contracts/access/IAccessControl.sol": { + "content": "// 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 IAccessControl {\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" + }, + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\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 require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "@openzeppelin/contracts/token/ERC20/ERC20.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\nimport \"./extensions/IERC20Metadata.sol\";\nimport \"../../utils/Context.sol\";\n\n/**\n * @dev Implementation of the {IERC20} interface.\n *\n * This implementation is agnostic to the way tokens are created. This means\n * that a supply mechanism has to be added in a derived contract using {_mint}.\n * For a generic mechanism see {ERC20PresetMinterPauser}.\n *\n * TIP: For a detailed writeup see our guide\n * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How\n * to implement supply mechanisms].\n *\n * The default value of {decimals} is 18. To change this, you should override\n * this function so it returns a different value.\n *\n * We have followed general OpenZeppelin Contracts guidelines: functions revert\n * instead returning `false` on failure. This behavior is nonetheless\n * conventional and does not conflict with the expectations of ERC20\n * applications.\n *\n * Additionally, an {Approval} event is emitted on calls to {transferFrom}.\n * This allows applications to reconstruct the allowance for all accounts just\n * by listening to said events. Other implementations of the EIP may not emit\n * these events, as it isn't required by the specification.\n *\n * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}\n * functions have been added to mitigate the well-known issues around setting\n * allowances. See {IERC20-approve}.\n */\ncontract ERC20 is Context, IERC20, IERC20Metadata {\n mapping(address => uint256) private _balances;\n\n mapping(address => mapping(address => uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n /**\n * @dev Sets the values for {name} and {symbol}.\n *\n * All two of these values are immutable: they can only be set once during\n * construction.\n */\n constructor(string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n\n /**\n * @dev Returns the name of the token.\n */\n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n /**\n * @dev Returns the symbol of the token, usually a shorter version of the\n * name.\n */\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n /**\n * @dev Returns the number of decimals used to get its user representation.\n * For example, if `decimals` equals `2`, a balance of `505` tokens should\n * be displayed to a user as `5.05` (`505 / 10 ** 2`).\n *\n * Tokens usually opt for a value of 18, imitating the relationship between\n * Ether and Wei. This is the default value returned by this function, unless\n * it's overridden.\n *\n * NOTE: This information is only used for _display_ purposes: it in\n * no way affects any of the arithmetic of the contract, including\n * {IERC20-balanceOf} and {IERC20-transfer}.\n */\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n /**\n * @dev See {IERC20-totalSupply}.\n */\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n /**\n * @dev See {IERC20-balanceOf}.\n */\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n /**\n * @dev See {IERC20-transfer}.\n *\n * Requirements:\n *\n * - `to` cannot be the zero address.\n * - the caller must have a balance of at least `amount`.\n */\n function transfer(address to, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _transfer(owner, to, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-allowance}.\n */\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n /**\n * @dev See {IERC20-approve}.\n *\n * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on\n * `transferFrom`. This is semantically equivalent to an infinite approval.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, amount);\n return true;\n }\n\n /**\n * @dev See {IERC20-transferFrom}.\n *\n * Emits an {Approval} event indicating the updated allowance. This is not\n * required by the EIP. See the note at the beginning of {ERC20}.\n *\n * NOTE: Does not update the allowance if the current allowance\n * is the maximum `uint256`.\n *\n * Requirements:\n *\n * - `from` and `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n * - the caller must have allowance for ``from``'s tokens of at least\n * `amount`.\n */\n function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {\n address spender = _msgSender();\n _spendAllowance(from, spender, amount);\n _transfer(from, to, amount);\n return true;\n }\n\n /**\n * @dev Atomically increases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n */\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n address owner = _msgSender();\n _approve(owner, spender, allowance(owner, spender) + addedValue);\n return true;\n }\n\n /**\n * @dev Atomically decreases the allowance granted to `spender` by the caller.\n *\n * This is an alternative to {approve} that can be used as a mitigation for\n * problems described in {IERC20-approve}.\n *\n * Emits an {Approval} event indicating the updated allowance.\n *\n * Requirements:\n *\n * - `spender` cannot be the zero address.\n * - `spender` must have allowance for the caller of at least\n * `subtractedValue`.\n */\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n address owner = _msgSender();\n uint256 currentAllowance = allowance(owner, spender);\n require(currentAllowance >= subtractedValue, \"ERC20: decreased allowance below zero\");\n unchecked {\n _approve(owner, spender, currentAllowance - subtractedValue);\n }\n\n return true;\n }\n\n /**\n * @dev Moves `amount` of tokens from `from` to `to`.\n *\n * This internal function is equivalent to {transfer}, and can be used to\n * e.g. implement automatic token fees, slashing mechanisms, etc.\n *\n * Emits a {Transfer} event.\n *\n * Requirements:\n *\n * - `from` cannot be the zero address.\n * - `to` cannot be the zero address.\n * - `from` must have a balance of at least `amount`.\n */\n function _transfer(address from, address to, uint256 amount) internal virtual {\n require(from != address(0), \"ERC20: transfer from the zero address\");\n require(to != address(0), \"ERC20: transfer to the zero address\");\n\n _beforeTokenTransfer(from, to, amount);\n\n uint256 fromBalance = _balances[from];\n require(fromBalance >= amount, \"ERC20: transfer amount exceeds balance\");\n unchecked {\n _balances[from] = fromBalance - amount;\n // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by\n // decrementing then incrementing.\n _balances[to] += amount;\n }\n\n emit Transfer(from, to, amount);\n\n _afterTokenTransfer(from, to, amount);\n }\n\n /** @dev Creates `amount` tokens and assigns them to `account`, increasing\n * the total supply.\n *\n * Emits a {Transfer} event with `from` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n */\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _beforeTokenTransfer(address(0), account, amount);\n\n _totalSupply += amount;\n unchecked {\n // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.\n _balances[account] += amount;\n }\n emit Transfer(address(0), account, amount);\n\n _afterTokenTransfer(address(0), account, amount);\n }\n\n /**\n * @dev Destroys `amount` tokens from `account`, reducing the\n * total supply.\n *\n * Emits a {Transfer} event with `to` set to the zero address.\n *\n * Requirements:\n *\n * - `account` cannot be the zero address.\n * - `account` must have at least `amount` tokens.\n */\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n _beforeTokenTransfer(account, address(0), amount);\n\n uint256 accountBalance = _balances[account];\n require(accountBalance >= amount, \"ERC20: burn amount exceeds balance\");\n unchecked {\n _balances[account] = accountBalance - amount;\n // Overflow not possible: amount <= accountBalance <= totalSupply.\n _totalSupply -= amount;\n }\n\n emit Transfer(account, address(0), amount);\n\n _afterTokenTransfer(account, address(0), amount);\n }\n\n /**\n * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.\n *\n * This internal function is equivalent to `approve`, and can be used to\n * e.g. set automatic allowances for certain subsystems, etc.\n *\n * Emits an {Approval} event.\n *\n * Requirements:\n *\n * - `owner` cannot be the zero address.\n * - `spender` cannot be the zero address.\n */\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n\n /**\n * @dev Updates `owner` s allowance for `spender` based on spent `amount`.\n *\n * Does not update the allowance amount in case of infinite allowance.\n * Revert if not enough allowance is available.\n *\n * Might emit an {Approval} event.\n */\n function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {\n uint256 currentAllowance = allowance(owner, spender);\n if (currentAllowance != type(uint256).max) {\n require(currentAllowance >= amount, \"ERC20: insufficient allowance\");\n unchecked {\n _approve(owner, spender, currentAllowance - amount);\n }\n }\n }\n\n /**\n * @dev Hook that is called before any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * will be transferred to `to`.\n * - when `from` is zero, `amount` tokens will be minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens will be burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n\n /**\n * @dev Hook that is called after any transfer of tokens. This includes\n * minting and burning.\n *\n * Calling conditions:\n *\n * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens\n * has been transferred to `to`.\n * - when `from` is zero, `amount` tokens have been minted for `to`.\n * - when `to` is zero, `amount` of ``from``'s tokens have been burned.\n * - `from` and `to` are never both zero.\n *\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\n */\n function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}\n}\n" + }, + "@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" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\";\nimport \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\n\nimport \"./IAccessControlManagerV8.sol\";\n\n/**\n * @title AccessControlledV8\n * @author Venus\n * @notice This contract is helper between access control manager and actual contract. This contract further inherited by other contract (using solidity 0.8.13)\n * to integrate access controlled mechanism. It provides initialise methods and verifying access methods.\n */\nabstract contract AccessControlledV8 is Initializable, Ownable2StepUpgradeable {\n /// @notice Access control manager contract\n IAccessControlManagerV8 internal _accessControlManager;\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 /// @notice Emitted when access control manager contract address is changed\n event NewAccessControlManager(address oldAccessControlManager, address newAccessControlManager);\n\n /// @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n function __AccessControlled_init(address accessControlManager_) internal onlyInitializing {\n __Ownable2Step_init();\n __AccessControlled_init_unchained(accessControlManager_);\n }\n\n function __AccessControlled_init_unchained(address accessControlManager_) internal onlyInitializing {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Sets the address of AccessControlManager\n * @dev Admin function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n * @custom:event Emits NewAccessControlManager event\n * @custom:access Only Governance\n */\n function setAccessControlManager(address accessControlManager_) external onlyOwner {\n _setAccessControlManager(accessControlManager_);\n }\n\n /**\n * @notice Returns the address of the access control manager contract\n */\n function accessControlManager() external view returns (IAccessControlManagerV8) {\n return _accessControlManager;\n }\n\n /**\n * @dev Internal function to set address of AccessControlManager\n * @param accessControlManager_ The new address of the AccessControlManager\n */\n function _setAccessControlManager(address accessControlManager_) internal {\n require(address(accessControlManager_) != address(0), \"invalid acess control manager address\");\n address oldAccessControlManager = address(_accessControlManager);\n _accessControlManager = IAccessControlManagerV8(accessControlManager_);\n emit NewAccessControlManager(oldAccessControlManager, accessControlManager_);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = _accessControlManager.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/access/IAccessControl.sol\";\n\n/**\n * @title IAccessControlManagerV8\n * @author Venus\n * @notice Interface implemented by the `AccessControlManagerV8` contract.\n */\ninterface IAccessControlManagerV8 is IAccessControl {\n function giveCallPermission(address contractAddress, string calldata functionSig, address accountToPermit) external;\n\n function revokeCallPermission(\n address contractAddress,\n string calldata functionSig,\n address accountToRevoke\n ) external;\n\n function isAllowedToCall(address account, string calldata functionSig) external view returns (bool);\n\n function hasPermission(\n address account,\n address contractAddress,\n string calldata functionSig\n ) external view 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/DeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { ResilientOracleInterface } from \"./interfaces/OracleInterface.sol\";\nimport { IDeviationBoundedOracle } from \"./interfaces/IDeviationBoundedOracle.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title DeviationBoundedOracle\n * @author Venus\n * @notice The DeviationBoundedOracle provides manipulation-resistant pricing for lending operations.\n *\n * It maintains a per-market rolling min/max price window. When the current spot price deviates\n * significantly from the window bounds, protection mode activates automatically and conservative\n * pricing kicks in:\n * - Collateral is valued at min(spot, windowMin) — caps collateral value at recent window low\n * - Debt is valued at max(spot, windowMax) — floors debt value at recent window high\n *\n * This protects against instantaneous or short-duration price manipulation attacks on low-liquidity\n * collateral tokens. Sustained attacks beyond the window period are expected to be handled by\n * off-chain monitoring systems.\n *\n * The oracle exposes both view and non-view price functions. The non-view variants update the\n * price window and trigger protection. The view variants read stored state only. A transient\n * price cache avoids redundant ResilientOracle calls within the same transaction when\n * updateProtectionState is called before the view price reads.\n */\ncontract DeviationBoundedOracle is AccessControlledV8, IDeviationBoundedOracle {\n /// @notice Minimum allowed threshold value (5%) to account for keeper deadband\n uint256 public constant MIN_THRESHOLD = 5e16;\n\n /// @notice Maximum allowed threshold value (50%)\n uint256 public constant MAX_THRESHOLD = 50e16;\n\n /// @notice Keeper deadband threshold (5%) — min/max corrections below this are suppressed\n uint256 public constant KEEPER_DEADBAND = 5e16;\n\n /// @notice Resilient Oracle used to fetch spot prices\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Transient storage slot for caching final collateral prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/collateralCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/collateralCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant COLLATERAL_PRICE_CACHE_SLOT =\n 0x7bd9fcecef8429101f34baefb335883a97edd91e0d8fdc455d73ab727abf7000;\n\n /// @notice Transient storage slot for caching final debt prices within a transaction\n /// @dev custom:storage-location erc7201:venus-protocol/oracle/DeviationBoundedOracle/debtCache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/DeviationBoundedOracle/debtCache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant DEBT_PRICE_CACHE_SLOT = 0x84d6ca795decc666d3d1d524cbbadd8a1e0e0279db766fe7a1b41b1eb8970600;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Per-asset protection state\n mapping(address => MarketProtectionState) public assetProtectionConfig;\n\n /// @notice Append-only array of all assets ever initialized, used for enumeration\n address[] public allAssets;\n\n /// @notice Storage gap for upgrades\n uint256[48] private __gap;\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param _resilientOracle Address of the ResilientOracle contract\n * @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n * @param vaiAddress The address of the VAI token, or address(0) if VAI is not deployed on the chain.\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface _resilientOracle, address nativeMarketAddress, address vaiAddress) {\n ensureNonzeroAddress(address(_resilientOracle));\n ensureNonzeroAddress(nativeMarketAddress);\n RESILIENT_ORACLE = _resilientOracle;\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n // ----- Non-view price functions (update window + trigger protection) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (lower) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice) {\n (collateralPrice, ) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns the conservative (higher) price when protection is active.\n * Used by keepers or direct callers who want atomic update + read.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice) {\n (, debtPrice) = _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @dev Fetches spot from ResilientOracle, updates the price window, checks trigger,\n * and returns both conservative prices in a single call.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice) {\n return _updateAndGetBoundedPrices(vToken);\n }\n\n /**\n * @notice Fetches the spot price, updates the protection window, and caches the resolved\n * collateral and debt prices in transient storage for the duration of the transaction.\n * @dev Call this once per vToken at the start of a transaction (e.g. from PolicyFacet before\n * liquidity calculations). Subsequent calls to getBoundedCollateralPriceView /\n * getBoundedDebtPriceView within the same transaction will read from the transient cache\n * instead of querying ResilientOracle again, keeping those functions as `view` and\n * avoiding redundant oracle calls.\n * The transient cache is only populated when the asset's `cachingEnabled` flag is `true`.\n * When caching is disabled, view price reads fall through to live recomputation.\n * Permissionless: anyone can call this, both for gas optimisation and to ensure every\n * caller in the same transaction reads the correct, up-to-date bounded price.\n * @param vToken vToken address\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external {\n _updateAndGetBoundedPrices(vToken);\n }\n\n // ----- View price functions (read stored/cached state only) -----\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\n * to ResilientOracle on cache miss or when caching is disabled.\n * Returns min(spot, windowMin) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 collateralPrice) {\n (collateralPrice, ) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`\n * (populated by a prior updateProtectionState call in the same transaction). Falls back\n * to ResilientOracle on cache miss or when caching is disabled.\n * Returns max(spot, windowMax) when protection is active, spot otherwise.\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 debtPrice) {\n (, debtPrice) = _computeBoundedPrices(vToken);\n }\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice) {\n return _computeBoundedPrices(vToken);\n }\n\n // ----- Keeper functions -----\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected min values from the off-chain sliding window.\n * Constraint: newMin must be at or below the current spot price.\n * @param asset The underlying asset address\n * @param newMin The new minimum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external {\n _checkAccessAllowed(\"updateMinPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMin, PriceBoundType.MIN);\n }\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @dev Called by the keeper to push corrected max values from the off-chain sliding window.\n * Constraint: newMax must be at or above the current spot price.\n * @param asset The underlying asset address\n * @param newMax The new maximum price\n * @custom:access Only authorized keeper addresses\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external {\n _checkAccessAllowed(\"updateMaxPrice(address,uint128)\");\n _validateAndUpdateBound(asset, newMax, PriceBoundType.MAX);\n }\n\n /**\n * @notice Exits protection mode for a given asset\n * @dev Called by the keeper/monitor after confirming price has normalised.\n * Enforces two conditions on-chain:\n * 1. Cooldown period has elapsed since the last trigger\n * 2. Price range has converged below the exit threshold\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if window range is still above exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external {\n _checkAccessAllowed(\"exitProtectionMode(address)\");\n _exitProtectionMode(asset);\n }\n\n /**\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\n * Empty `actions` is a no-op success.\n * @param actions The list of keeper actions to apply\n * @custom:access Only authorized keeper addresses\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\n */\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external {\n _checkAccessAllowed(\"syncPriceBoundsAndProtections((address,uint8,uint256)[])\");\n uint256 len = actions.length;\n for (uint256 i; i < len; ++i) {\n KeeperActionItem calldata item = actions[i];\n if (item.action == KeeperAction.SetMinPrice) {\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MIN);\n } else if (item.action == KeeperAction.SetMaxPrice) {\n _validateAndUpdateBound(item.asset, _safeToUint128(item.value), PriceBoundType.MAX);\n } else if (item.action == KeeperAction.ExitProtectionMode) {\n _exitProtectionMode(item.asset);\n } else {\n revert InvalidKeeperAction(uint8(item.action));\n }\n }\n }\n\n // ----- Admin functions (governance-gated) -----\n\n /**\n * @notice Initializes protection for a new asset\n * @param tokenConfig_ Token config input for the asset\n * @custom:access Only Governance\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external {\n _checkAccessAllowed(\"setTokenConfig((address,uint64,uint256,uint256,bool,bool))\");\n _setTokenConfig(\n tokenConfig_.asset,\n tokenConfig_.cooldownPeriod,\n tokenConfig_.triggerThreshold,\n tokenConfig_.resetThreshold,\n tokenConfig_.enableBoundedPricing,\n tokenConfig_.enableCaching\n );\n }\n\n /**\n * @notice Batch-initializes protection for multiple assets in a single transaction\n * @param tokenConfigs_ Array of token config inputs, one per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if the input array is empty\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external {\n _checkAccessAllowed(\"setTokenConfigs((address,uint64,uint256,uint256,bool,bool)[])\");\n uint256 len = tokenConfigs_.length;\n if (len == 0) revert InvalidArrayLength();\n\n for (uint256 i; i < len; ++i) {\n TokenConfigInput calldata tokenConfig = tokenConfigs_[i];\n _setTokenConfig(\n tokenConfig.asset,\n tokenConfig.cooldownPeriod,\n tokenConfig.triggerThreshold,\n tokenConfig.resetThreshold,\n tokenConfig.enableBoundedPricing,\n tokenConfig.enableCaching\n );\n }\n }\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds\n * @custom:access Only Governance\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external {\n _checkAccessAllowed(\"setCooldownPeriod(address,uint64)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newCooldown);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CooldownPeriodSet(asset, state.cooldownPeriod, newCooldown);\n state.cooldownPeriod = newCooldown;\n }\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external {\n _checkAccessAllowed(\"setThresholds(address,uint256,uint256)\");\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(newTriggerThreshold);\n ensureNonzeroValue(newResetThreshold);\n if (newTriggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(newTriggerThreshold, MIN_THRESHOLD);\n if (newTriggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(newTriggerThreshold, MAX_THRESHOLD);\n if (newResetThreshold >= newTriggerThreshold) revert InvalidResetThreshold(newResetThreshold);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (newTriggerThreshold != state.triggerThreshold) {\n emit TriggerThresholdSet(asset, state.triggerThreshold, newTriggerThreshold);\n state.triggerThreshold = uint128(newTriggerThreshold);\n }\n if (newResetThreshold != state.resetThreshold) {\n emit ResetThresholdSet(asset, state.resetThreshold, newResetThreshold);\n state.resetThreshold = uint128(newResetThreshold);\n }\n }\n\n /**\n * @notice Sets whether an asset is enabled for bounded pricing\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setAssetBoundedPricingEnabled(address,bool)\");\n ensureNonzeroAddress(asset);\n\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!enabled && state.currentlyUsingProtectedPrice) {\n revert ProtectedPriceActive(asset);\n }\n\n if (state.isBoundedPricingEnabled == enabled) return;\n\n // reset the window if re-enabling\n if (enabled) {\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n _setMinPrice(state, asset, spotU128);\n _setMaxPrice(state, asset, spotU128);\n }\n\n state.isBoundedPricingEnabled = enabled;\n emit BoundedPricingWhitelistUpdated(asset, enabled);\n }\n\n /**\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\n * live spot instead of reading or writing the transient slots. The initial value is\n * set via the `enableCaching` argument of `setTokenConfig`.\n * @param asset The underlying asset address\n * @param enabled Whether transient caching is enabled for this asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CachingEnabledUpdated\n */\n function setCachingEnabled(address asset, bool enabled) external {\n _checkAccessAllowed(\"setCachingEnabled(address,bool)\");\n MarketProtectionState storage state = _ensureInitialized(asset);\n emit CachingEnabledUpdated(asset, state.cachingEnabled, enabled);\n state.cachingEnabled = enabled;\n }\n\n // ----- View helpers -----\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory) {\n return allAssets;\n }\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].isBoundedPricingEnabled;\n }\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool) {\n return assetProtectionConfig[asset].currentlyUsingProtectedPrice;\n }\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @dev Iterates the append-only allAssets array and filters by isBoundedPricingEnabled.\n * Gas-free for off-chain callers.\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory) {\n uint256 len = allAssets.length;\n address[] memory temp = new address[](len);\n uint256 count;\n for (uint256 i; i < len; ++i) {\n if (assetProtectionConfig[allAssets[i]].isBoundedPricingEnabled) {\n temp[count++] = allAssets[i];\n }\n }\n address[] memory result = new address[](count);\n for (uint256 i; i < count; ++i) {\n result[i] = temp[i];\n }\n return result;\n }\n\n /**\n * @notice Checks if protection can be exited for an asset\n * @dev Returns true when both conditions are met:\n * 1. Cooldown period has elapsed since last trigger\n * 2. Price range has converged below exit threshold\n * @param asset The underlying asset address\n * @return True if protection can be disabled\n */\n function canExitProtection(address asset) external view returns (bool) {\n MarketProtectionState storage state = assetProtectionConfig[asset];\n return\n state.currentlyUsingProtectedPrice &&\n block.timestamp >= uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod) &&\n _computePriceBoundRatio(state.minPrice, state.maxPrice) < state.resetThreshold;\n }\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the deadband\n * from the keeper's proposed window values\n * @dev Allows the keeper to identify stale windows in a single call, avoiding N individual reads.\n * Drift formula: |onChain - proposed| / onChain (scaled by EXP_SCALE)\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's off-chain window minimum prices\n * @param proposedMaxs Keeper's off-chain window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate) {\n uint256 len = assets.length;\n if (len != proposedMins.length || len != proposedMaxs.length) revert InvalidArrayLength();\n\n needsMinUpdate = new bool[](len);\n needsMaxUpdate = new bool[](len);\n\n for (uint256 i; i < len; ++i) {\n MarketProtectionState storage state = assetProtectionConfig[assets[i]];\n needsMinUpdate[i] = _exceedsCorrectionDeadband(state.minPrice, proposedMins[i]);\n needsMaxUpdate[i] = _exceedsCorrectionDeadband(state.maxPrice, proposedMaxs[i]);\n }\n }\n\n // ----- Internal functions -----\n\n /**\n * @notice Initializes protection parameters and price window for a single asset\n * @dev Fetches the current spot price from ResilientOracle to seed the initial min/max window,\n * confirming the oracle is live for this asset before it is listed. Both bounds start at\n * spot so the window expands naturally as prices move. Can only be called once per asset.\n * @param asset The underlying asset address\n * @param cooldownPeriod Minimum time protection stays active after last trigger\n * @param triggerThreshold Deviation threshold that activates protection (mantissa). Must be between 5% and 50%.\n * @param resetThreshold Deviation threshold below which protection can be exited (mantissa). Must be non-zero and below triggerThreshold.\n * @param enableBoundedPricing Whether to enable bounded pricing immediately upon initialization\n * @param enableCaching Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n */\n function _setTokenConfig(\n address asset,\n uint64 cooldownPeriod,\n uint256 triggerThreshold,\n uint256 resetThreshold,\n bool enableBoundedPricing,\n bool enableCaching\n ) internal {\n ensureNonzeroAddress(asset);\n ensureNonzeroValue(cooldownPeriod);\n ensureNonzeroValue(triggerThreshold);\n ensureNonzeroValue(resetThreshold);\n if (assetProtectionConfig[asset].asset != address(0)) revert MarketAlreadyInitialized(asset);\n if (triggerThreshold < MIN_THRESHOLD) revert ThresholdBelowMinimum(triggerThreshold, MIN_THRESHOLD);\n if (triggerThreshold > MAX_THRESHOLD) revert ThresholdAboveMaximum(triggerThreshold, MAX_THRESHOLD);\n if (resetThreshold >= triggerThreshold) revert InvalidResetThreshold(resetThreshold);\n if (asset == vai) revert VAINotAllowed();\n\n uint128 spotU128 = _safeToUint128(_fetchSpotPrice(asset));\n\n assetProtectionConfig[asset] = MarketProtectionState({\n minPrice: spotU128,\n maxPrice: spotU128,\n currentlyUsingProtectedPrice: false,\n isBoundedPricingEnabled: enableBoundedPricing,\n lastProtectionTriggeredAt: 0,\n cooldownPeriod: cooldownPeriod,\n asset: asset,\n triggerThreshold: uint128(triggerThreshold),\n resetThreshold: uint128(resetThreshold),\n cachingEnabled: enableCaching\n });\n\n allAssets.push(asset);\n\n emit ProtectionInitialized(asset, spotU128, spotU128, cooldownPeriod, triggerThreshold);\n emit BoundedPricingWhitelistUpdated(asset, enableBoundedPricing);\n }\n\n /**\n * @notice Validates and applies a keeper-provided min or max price update\n * @param asset The underlying asset address\n * @param newPrice The new price value to set\n * @param boundType Whether this is a MIN or MAX bound update\n * @custom:error ZeroPriceNotAllowed if newPrice is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if boundType is MIN and newPrice exceeds the current spot or is strictly above maxPrice\n * @custom:error InvalidMaxPrice if boundType is MAX and newPrice is below the current spot or is strictly below minPrice\n */\n function _validateAndUpdateBound(address asset, uint128 newPrice, PriceBoundType boundType) internal {\n ensureNonzeroAddress(asset);\n if (newPrice == 0) revert ZeroPriceNotAllowed();\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n uint256 currentSpot = _fetchSpotPrice(asset);\n if (boundType == PriceBoundType.MIN) {\n if (newPrice > state.maxPrice || uint256(newPrice) > currentSpot)\n revert InvalidMinPrice(asset, newPrice, currentSpot);\n _setMinPrice(state, asset, newPrice);\n } else if (boundType == PriceBoundType.MAX) {\n if (newPrice < state.minPrice || uint256(newPrice) < currentSpot)\n revert InvalidMaxPrice(asset, newPrice, currentSpot);\n _setMaxPrice(state, asset, newPrice);\n }\n }\n\n /**\n * @notice Clears protection for an asset once cooldown has elapsed and the window has converged\n * @dev Shared body of `exitProtectionMode` and the ExitProtectionMode branch of `syncPriceBoundsAndProtections`.\n * Callers are responsible for ACM gating before invoking this helper.\n * @param asset The underlying asset address\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if cooldown period has not elapsed\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n */\n function _exitProtectionMode(address asset) internal {\n ensureNonzeroAddress(asset);\n MarketProtectionState storage state = _ensureInitialized(asset);\n\n if (!state.currentlyUsingProtectedPrice) revert ProtectedPriceInactive(asset);\n\n if (block.timestamp < uint256(state.lastProtectionTriggeredAt) + uint256(state.cooldownPeriod)) {\n revert CooldownNotElapsed(asset, state.lastProtectionTriggeredAt, state.cooldownPeriod);\n }\n\n uint256 rangeRatio = _computePriceBoundRatio(state.minPrice, state.maxPrice);\n if (rangeRatio >= state.resetThreshold) {\n revert PriceRangeNotConverged(asset, rangeRatio, state.resetThreshold);\n }\n\n state.currentlyUsingProtectedPrice = false;\n state.lastProtectionTriggeredAt = 0;\n emit ProtectionModeExited(asset);\n }\n\n /**\n * @notice Shared non-view logic for all bounded price functions.\n * Fetches spot, updates window, triggers protection if needed, and returns both bounded prices.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n */\n function _updateAndGetBoundedPrices(address vToken) internal returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // return early if failure from resilient oracle to prevent cold SLOAD\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) {\n _setCachedPrices(asset, spot, spot);\n return (spot, spot);\n }\n (uint128 updatedMin, uint128 updatedMax, bool windowExpanded) = _expandPriceWindow(state, spot, asset);\n bool protectionActive = _checkAndTriggerProtection(state, spot, asset, windowExpanded);\n (minPrice, maxPrice) = _resolveBoundedPrices(protectionActive, spot, uint256(updatedMin), uint256(updatedMax));\n _setCachedPrices(asset, minPrice, maxPrice);\n }\n\n /**\n * @dev Expands the price window toward extremes if the spot price is a new min or max\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n */\n function _expandPriceWindow(\n MarketProtectionState storage state,\n uint256 spot,\n address asset\n ) internal returns (uint128, uint128, bool) {\n uint128 spotU128 = _safeToUint128(spot);\n uint128 currentMin = state.minPrice;\n uint128 currentMax = state.maxPrice;\n bool windowExpanded;\n if (spotU128 < currentMin) {\n _setMinPrice(state, asset, spotU128);\n currentMin = spotU128;\n windowExpanded = true;\n }\n if (spotU128 > currentMax) {\n _setMaxPrice(state, asset, spotU128);\n currentMax = spotU128;\n windowExpanded = true;\n }\n return (currentMin, currentMax, windowExpanded);\n }\n\n /**\n * @dev Checks if the spot price has deviated beyond the threshold and triggers protection.\n * `lastProtectionTriggeredAt` is reset only on the first trigger or when the price has made a\n * genuine new extreme this update (windowExpanded == true). Recovery within the existing window\n * keeps the cooldown ticking so `exitProtectionMode` remains reachable.\n * @param state The market protection state\n * @param spot The current spot price\n * @param asset The underlying asset address (for event emission)\n * @param windowExpanded True if `_expandPriceWindow` recorded a new low or new high this call\n */\n function _checkAndTriggerProtection(\n MarketProtectionState storage state,\n uint256 spot,\n address asset,\n bool windowExpanded\n ) internal returns (bool triggered) {\n if (_exceedsDeviationThreshold(spot, state.minPrice, state.maxPrice, state.triggerThreshold)) {\n bool enteringProtection = !state.currentlyUsingProtectedPrice;\n if (enteringProtection || windowExpanded) {\n state.lastProtectionTriggeredAt = uint64(block.timestamp);\n }\n if (enteringProtection) {\n state.currentlyUsingProtectedPrice = true;\n }\n emit ProtectionTriggered(asset, spot, state.minPrice, state.maxPrice);\n return true;\n }\n if (state.currentlyUsingProtectedPrice) return true;\n }\n\n /**\n * @notice Resolves the final bounded collateral and debt prices given a spot, window bounds, and protection flag.\n * @dev When protection is active: collateral = min(spot, windowMin), debt = max(spot, windowMax).\n * When protection is inactive: both return spot.\n * @param protectionActive Whether the market protection window is currently active\n * @param spot The current spot price\n * @param windowMin The lower bound of the price window\n * @param windowMax The upper bound of the price window\n * @return minPrice The resolved lower-bound (collateral) price\n * @return maxPrice The resolved upper-bound (debt) price\n */\n function _resolveBoundedPrices(\n bool protectionActive,\n uint256 spot,\n uint256 windowMin,\n uint256 windowMax\n ) internal pure returns (uint256, uint256) {\n if (!protectionActive) return (spot, spot);\n return (spot < windowMin ? spot : windowMin, spot > windowMax ? spot : windowMax);\n }\n\n /**\n * @notice Shared view logic for all bounded price view functions.\n * Checks transient cache first for an early return; on miss, fetches from oracle\n * and computes both prices without state mutations.\n * @param vToken vToken address\n * @return minPrice The bounded lower (collateral) price\n * @return maxPrice The bounded upper (debt) price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function _computeBoundedPrices(address vToken) internal view returns (uint256 minPrice, uint256 maxPrice) {\n address asset = _getUnderlyingAsset(vToken);\n\n // Early return if both prices were cached by a prior updateProtectionState call in this tx\n (minPrice, maxPrice) = _getCachedPrices(asset);\n if (minPrice != 0 && maxPrice != 0) return (minPrice, maxPrice);\n\n // Cache miss — fetch from oracle and compute without state mutations\n uint256 spot = _fetchSpotPrice(asset);\n MarketProtectionState storage state = assetProtectionConfig[asset];\n if (!state.isBoundedPricingEnabled) return (spot, spot);\n\n // Mirror _expandPriceWindow logic: compute what the window would be after expansion\n uint128 spotU128 = _safeToUint128(spot);\n uint128 windowMin128 = spot < uint256(state.minPrice) ? spotU128 : state.minPrice;\n uint128 windowMax128 = spot > uint256(state.maxPrice) ? spotU128 : state.maxPrice;\n\n bool shouldProtect = state.currentlyUsingProtectedPrice ||\n _exceedsDeviationThreshold(spot, windowMin128, windowMax128, state.triggerThreshold);\n\n (minPrice, maxPrice) = _resolveBoundedPrices(shouldProtect, spot, uint256(windowMin128), uint256(windowMax128));\n }\n\n /**\n * @dev Computes the relative spread between the price window bounds as a ratio scaled by EXP_SCALE.\n * Formula: \\((maxPrice - minPrice) / minPrice\\), scaled by `EXP_SCALE`.\n * Used to measure how much the window has converged -- compared against `resetThreshold`\n * to determine whether the price window is tight enough to exit protection mode.\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @return The scaled bound ratio \\(((max - min) * EXP_SCALE) / min\\)\n */\n function _computePriceBoundRatio(uint128 minPrice, uint128 maxPrice) internal pure returns (uint256) {\n uint256 range = uint256(maxPrice) - uint256(minPrice);\n return (range * EXP_SCALE) / uint256(minPrice);\n }\n\n /**\n * @notice Checks whether the spot price has moved beyond the threshold relative to the\n * opposite window bound — i.e. `spot > minPrice * (1 + threshold)` or\n * `spot < maxPrice * (1 - threshold)`.\n * @dev Pump detection: spot > minPrice * (1 + threshold)\n * Crash detection: spot < maxPrice * (1 - threshold)\n * @param spot The current spot price\n * @param minPrice The minimum price in the window\n * @param maxPrice The maximum price in the window\n * @param threshold The deviation threshold (mantissa)\n * @return True if deviation is triggered\n */\n function _exceedsDeviationThreshold(\n uint256 spot,\n uint128 minPrice,\n uint128 maxPrice,\n uint256 threshold\n ) internal pure returns (bool) {\n uint256 upperBound = (uint256(minPrice) * (EXP_SCALE + threshold)) / EXP_SCALE;\n uint256 lowerBound = (uint256(maxPrice) * (EXP_SCALE - threshold)) / EXP_SCALE;\n return (spot > upperBound || spot < lowerBound);\n }\n\n /**\n * @dev Returns true if the relative drift between onChain and proposed exceeds KEEPER_DEADBAND\n * @param currentPrice The current on-chain price\n * @param proposedPrice The keeper's proposed price\n * @return True if drift exceeds deadband\n */\n function _exceedsCorrectionDeadband(uint128 currentPrice, uint128 proposedPrice) internal pure returns (bool) {\n if (currentPrice == 0 || proposedPrice == 0) return false;\n uint256 diff = currentPrice > proposedPrice\n ? uint256(currentPrice - proposedPrice)\n : uint256(proposedPrice - currentPrice);\n return (diff * EXP_SCALE) / uint256(currentPrice) > KEEPER_DEADBAND;\n }\n\n /**\n * @dev Sets the minimum price in the window and emits MinPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMin The new minimum price\n */\n function _setMinPrice(MarketProtectionState storage state, address asset, uint128 newMin) internal {\n emit MinPriceUpdated(asset, state.minPrice, newMin);\n state.minPrice = newMin;\n }\n\n /**\n * @dev Sets the maximum price in the window and emits MaxPriceUpdated\n * @param state The market protection state\n * @param asset The underlying asset address (for event emission)\n * @param newMax The new maximum price\n */\n function _setMaxPrice(MarketProtectionState storage state, address asset, uint128 newMax) internal {\n emit MaxPriceUpdated(asset, state.maxPrice, newMax);\n state.maxPrice = newMax;\n }\n\n /**\n * @dev Writes both lower and upper bounded prices to transient storage. No-ops when the\n * asset's `cachingEnabled` flag is `false`, so callers that disable caching always\n * fall through to live recomputation on subsequent reads.\n * @param asset The underlying asset address\n * @param minPrice The resolved lower (collateral) price to cache\n * @param maxPrice The resolved upper (debt) price to cache\n */\n function _setCachedPrices(address asset, uint256 minPrice, uint256 maxPrice) internal {\n if (!assetProtectionConfig[asset].cachingEnabled) return;\n Transient.cachePrice(COLLATERAL_PRICE_CACHE_SLOT, asset, minPrice);\n Transient.cachePrice(DEBT_PRICE_CACHE_SLOT, asset, maxPrice);\n }\n\n /**\n * @dev Reads a cached final price from transient storage. Returns `(0, 0)` when the\n * asset's `cachingEnabled` flag is `false`, which callers already treat as a cache\n * miss and handle via live recomputation.\n * @param asset The underlying asset address\n * @return minPrice The cached minimum price, or 0 on cache miss\n * @return maxPrice The cached maximum price, or 0 on cache miss\n */\n function _getCachedPrices(address asset) internal view returns (uint256 minPrice, uint256 maxPrice) {\n if (!assetProtectionConfig[asset].cachingEnabled) return (0, 0);\n minPrice = Transient.readCachedPrice(COLLATERAL_PRICE_CACHE_SLOT, asset);\n maxPrice = Transient.readCachedPrice(DEBT_PRICE_CACHE_SLOT, asset);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view returns (address asset) {\n ensureNonzeroAddress(vToken);\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev Reverts if the market has not been initialized via setTokenConfig\n * @param asset The underlying asset address\n * @return state The market protection state storage pointer\n */\n function _ensureInitialized(address asset) internal view returns (MarketProtectionState storage state) {\n state = assetProtectionConfig[asset];\n if (state.asset == address(0)) revert MarketNotInitialized(asset);\n }\n\n /**\n * @notice Fetches the current spot price for an asset from the ResilientOracle\n * @param asset The underlying asset address\n * @return The current spot price\n */\n function _fetchSpotPrice(address asset) internal view returns (uint256) {\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n /**\n * @dev Safely casts a uint256 to uint128, reverting on overflow\n * @param value The value to cast\n * @return The value as uint128\n */\n function _safeToUint128(uint256 value) internal pure returns (uint128) {\n if (value > type(uint128).max) revert PriceExceedsUint128(value);\n return uint128(value);\n }\n}\n" + }, + "contracts/hardhat-dependency-compiler/@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport '@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol';\n" + }, + "contracts/hardhat-dependency-compiler/hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: UNLICENSED\npragma solidity >0.0.0;\nimport 'hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol';\n" + }, + "contracts/interfaces/FeedRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface FeedRegistryInterface {\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);\n\n function decimalsByName(string memory base, string memory quote) external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAccountant {\n function getRateSafe() external view returns (uint256);\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/IAsBNB.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNB {\n function minter() external view returns (address);\n function decimals() external view returns (uint8);\n}\n" + }, + "contracts/interfaces/IAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IAsBNBMinter {\n function convertToTokens(uint256 amount) external view returns (uint256);\n}\n" + }, + "contracts/interfaces/ICappedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ICappedOracle {\n function updateSnapshot() external;\n}\n" + }, + "contracts/interfaces/IDeviationBoundedOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IDeviationBoundedOracle {\n // --- Enums ---\n\n /// @notice Identifies whether a price bound is a minimum or maximum\n enum PriceBoundType {\n MIN,\n MAX\n }\n\n /// @notice Identifies which keeper action a single syncPriceBoundsAndProtections item performs\n enum KeeperAction {\n SetMinPrice,\n SetMaxPrice,\n ExitProtectionMode\n }\n\n // --- Structs ---\n\n /// @notice Per-asset protection state tracking the min/max price window\n struct MarketProtectionState {\n /// @notice Lowest price observed in the current window (packed with maxPrice in one slot)\n uint128 minPrice;\n /// @notice Highest price observed in the current window\n uint128 maxPrice;\n /// @notice Whether protected price is currently being used\n bool currentlyUsingProtectedPrice;\n /// @notice Whether this market is whitelisted for bounded pricing\n bool isBoundedPricingEnabled;\n /// @notice Timestamp of the last protection trigger — reset on every trigger\n uint64 lastProtectionTriggeredAt;\n /// @notice Minimum time protection stays active after last trigger\n uint64 cooldownPeriod;\n /// @notice The underlying asset address, used to verify initialization\n address asset;\n /// @notice Entry deviation threshold (mantissa, e.g. 0.1667e18 = 16.67%); packed with resetThreshold\n uint128 triggerThreshold;\n /// @notice Exit threshold (mantissa); window must converge below this for protection to be disabled\n uint128 resetThreshold;\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n bool cachingEnabled;\n }\n\n /// @notice One item in an syncPriceBoundsAndProtections payload\n /// @dev `value` is interpreted per-action: the new bound price for SetMinPrice / SetMaxPrice, ignored for ExitProtectionMode\n struct KeeperActionItem {\n address asset;\n KeeperAction action;\n uint256 value;\n }\n\n /// @notice One item in a setTokenConfigs payload\n struct TokenConfigInput {\n /// @notice The underlying asset address\n address asset;\n /// @notice Minimum time protection stays active after the last trigger (seconds)\n uint64 cooldownPeriod;\n /// @notice Entry deviation threshold (mantissa). Must be between 5% and 50%.\n uint256 triggerThreshold;\n /// @notice Exit deviation threshold (mantissa). Must be non-zero and below triggerThreshold.\n uint256 resetThreshold;\n /// @notice Whether to enable bounded pricing immediately upon initialization\n bool enableBoundedPricing;\n /// @notice Whether transient caching of the bounded (collateral, debt) pair is enabled for this asset\n bool enableCaching;\n }\n\n // --- Events ---\n\n /// @notice Emitted when protection is initialized for an asset\n event ProtectionInitialized(\n address indexed asset,\n uint128 minPrice,\n uint128 maxPrice,\n uint64 cooldownPeriod,\n uint256 triggerThreshold\n );\n\n /// @notice Emitted when protection mode is triggered for an asset\n event ProtectionTriggered(address indexed asset, uint256 spotPrice, uint128 minPrice, uint128 maxPrice);\n\n /// @notice Emitted when protection mode is disabled for an asset\n event ProtectionModeExited(address indexed asset);\n\n /// @notice Emitted when the keeper updates the minimum price for an asset\n event MinPriceUpdated(address indexed asset, uint128 oldMin, uint128 newMin);\n\n /// @notice Emitted when the keeper updates the maximum price for an asset\n event MaxPriceUpdated(address indexed asset, uint128 oldMax, uint128 newMax);\n\n /// @notice Emitted when the entry threshold is updated for an asset\n event TriggerThresholdSet(address indexed asset, uint256 oldThreshold, uint256 newThreshold);\n\n /// @notice Emitted when the exit threshold is updated for an asset\n event ResetThresholdSet(address indexed asset, uint256 oldExitThreshold, uint256 newExitThreshold);\n\n /// @notice Emitted when the cooldown period is updated for an asset\n event CooldownPeriodSet(address indexed asset, uint64 oldCooldown, uint64 newCooldown);\n\n /// @notice Emitted when an asset's whitelist status changes\n event BoundedPricingWhitelistUpdated(address indexed asset, bool whitelisted);\n\n /// @notice Emitted when the per-asset transient caching flag is toggled\n event CachingEnabledUpdated(address indexed asset, bool oldEnabled, bool newEnabled);\n\n // --- Errors ---\n\n /// @notice Thrown when trying to use or update protection for an asset that has not been initialized\n error MarketNotInitialized(address asset);\n\n /// @notice Thrown when trying to initialize an already initialized market\n error MarketAlreadyInitialized(address asset);\n\n /// @notice Thrown when trying to disable protection that is not active\n error ProtectedPriceInactive(address asset);\n\n /// @notice Thrown when trying to disable protection before cooldown has elapsed\n error CooldownNotElapsed(address asset, uint64 lastProtectionTriggeredAt, uint64 cooldownPeriod);\n\n /// @notice Thrown when trying to disable protection before price range has converged\n error PriceRangeNotConverged(address asset, uint256 currentRangeRatio, uint256 resetThreshold);\n\n /// @notice Thrown when keeper tries to set minPrice above current spot\n error InvalidMinPrice(address asset, uint128 newMin, uint256 currentSpot);\n\n /// @notice Thrown when keeper tries to set maxPrice below current spot\n error InvalidMaxPrice(address asset, uint128 newMax, uint256 currentSpot);\n\n /// @notice Thrown when threshold is set below the minimum allowed value\n error ThresholdBelowMinimum(uint256 threshold, uint256 minimum);\n\n /// @notice Thrown when threshold is set above the maximum allowed value\n error ThresholdAboveMaximum(uint256 threshold, uint256 maximum);\n\n /// @notice Thrown when a price exceeds uint128 max\n error PriceExceedsUint128(uint256 price);\n\n /// @notice Thrown when a zero price is provided where a non-zero price is required\n error ZeroPriceNotAllowed();\n\n /// @notice Thrown when trying to initialize protection for VAI\n error VAINotAllowed();\n\n /// @notice Thrown when trying to disable bounded pricing for an asset while protection is active\n error ProtectedPriceActive(address asset);\n\n /// @notice Thrown when the lengths of the arrays are not equal\n error InvalidArrayLength();\n\n /// @notice Thrown when the exit threshold is set at or above the trigger threshold\n error InvalidResetThreshold(uint256 resetThreshold);\n\n /// @notice Thrown when an syncPriceBoundsAndProtections item carries an unsupported action enum value\n error InvalidKeeperAction(uint8 action);\n\n // --- Non-view price functions (update window + trigger protection) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedCollateralPrice(address vToken) external returns (uint256 collateralPrice);\n\n /**\n * @notice Gets the bounded debt price for a given vToken, updating protection state\n * @param vToken vToken address\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedDebtPrice(address vToken) external returns (uint256 debtPrice);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken, updating protection state\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function getBoundedPrices(address vToken) external returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- State update (call before view price reads to populate transient cache) ---\n\n /**\n * @notice Updates the protection state for a given vToken, caching the resolved collateral and debt prices\n * @dev Called by PolicyFacet before liquidity calculations so subsequent view price\n * reads in the same transaction are served from transient storage. The transient\n * cache is only populated when the asset's `cachingEnabled` flag is `true`.\n * @param vToken vToken address\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event MinPriceUpdated if a new window minimum is recorded\n * @custom:event MaxPriceUpdated if a new window maximum is recorded\n * @custom:event ProtectionTriggered if the spot price deviates beyond the threshold\n */\n function updateProtectionState(address vToken) external;\n\n // --- View price functions (read stored/cached state only) ---\n\n /**\n * @notice Gets the bounded collateral price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return price The bounded collateral price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedCollateralPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets the bounded debt price for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return price The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedDebtPriceView(address vToken) external view returns (uint256 price);\n\n /**\n * @notice Gets both the bounded collateral and debt prices for a given vToken (view variant)\n * @dev Reads from transient cache first when the asset's `cachingEnabled` flag is `true`;\n * falls back to ResilientOracle on cache miss or when caching is disabled.\n * @param vToken vToken address\n * @return collateralPrice The bounded collateral price\n * @return debtPrice The bounded debt price\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128 (cache miss path only)\n */\n function getBoundedPricesView(address vToken) external view returns (uint256 collateralPrice, uint256 debtPrice);\n\n // --- Keeper functions ---\n\n /**\n * @notice Updates the minimum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMin The new minimum price; must be at or below the current spot and below maxPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMin is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMinPrice if newMin exceeds the current spot or is at or above maxPrice\n * @custom:event MinPriceUpdated\n */\n function updateMinPrice(address asset, uint128 newMin) external;\n\n /**\n * @notice Updates the maximum price in the rolling window for a given asset\n * @param asset The underlying asset address\n * @param newMax The new maximum price; must be at or above the current spot and above minPrice\n * @custom:access Only authorized keeper addresses\n * @custom:error ZeroPriceNotAllowed if newMax is zero\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error InvalidMaxPrice if newMax is below the current spot or is at or below minPrice\n * @custom:event MaxPriceUpdated\n */\n function updateMaxPrice(address asset, uint128 newMax) external;\n\n /**\n * @notice Exits protection mode for a given asset once conditions are met\n * @param asset The underlying asset address\n * @custom:access Only authorized monitor/keeper addresses\n * @custom:error ProtectedPriceInactive if protection is not currently active\n * @custom:error CooldownNotElapsed if the cooldown period has not elapsed since the last trigger\n * @custom:error PriceRangeNotConverged if the window range is still above the exit threshold\n * @custom:event ProtectionModeExited\n */\n function exitProtectionMode(address asset) external;\n\n /**\n * @notice Dispatches a batch of keeper-only actions (set min, set max, or exit protection) under a single ACM check\n * @dev Each item is processed in array order; any item revert rolls back the whole batch.\n * `value` is interpreted as the new bound price for SetMinPrice / SetMaxPrice and ignored for ExitProtectionMode.\n * Empty `actions` is a no-op success.\n * @param actions The list of keeper actions to apply\n * @custom:access Only authorized keeper addresses\n * @custom:error InvalidKeeperAction if an item carries an unsupported action enum value\n * @custom:error PriceExceedsUint128 if a SetMin/SetMax item value overflows uint128\n * @custom:error ZeroPriceNotAllowed if a SetMin/SetMax item value is zero\n * @custom:error MarketNotInitialized if any referenced asset has not been initialized\n * @custom:error InvalidMinPrice if a SetMinPrice item violates the spot/maxPrice constraints\n * @custom:error InvalidMaxPrice if a SetMaxPrice item violates the spot/minPrice constraints\n * @custom:error ProtectedPriceInactive if an ExitProtectionMode item targets an asset whose protection is not active\n * @custom:error CooldownNotElapsed if an ExitProtectionMode item is submitted before cooldown elapsed\n * @custom:error PriceRangeNotConverged if an ExitProtectionMode item is submitted before window convergence\n * @custom:event MinPriceUpdated, MaxPriceUpdated, ProtectionModeExited\n */\n function syncPriceBoundsAndProtections(KeeperActionItem[] calldata actions) external;\n\n // --- Admin functions (governance-gated) ---\n\n /**\n * @notice Initializes protection parameters for a new asset\n * @dev Seeds the initial min/max window from the current ResilientOracle spot price,\n * confirming the oracle is live for this asset before it is listed.\n * @param tokenConfig_ Token config input for the asset\n * @custom:access Only Governance\n * @custom:error ZeroAddressNotAllowed if asset is the zero address\n * @custom:error ZeroValueNotAllowed if cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if the asset has already been initialized\n * @custom:error ThresholdBelowMinimum if triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if resetThreshold is at or above triggerThreshold\n * @custom:error VAINotAllowed if asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price overflows uint128\n * @custom:event ProtectionInitialized\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setTokenConfig(TokenConfigInput calldata tokenConfig_) external;\n\n /**\n * @notice Batch-initializes protection parameters for multiple assets in a single transaction\n * @param tokenConfigs_ Array of token config inputs, one per asset\n * @custom:access Only Governance\n * @custom:error InvalidArrayLength if the input array is empty\n * @custom:error ZeroAddressNotAllowed if any asset is the zero address\n * @custom:error ZeroValueNotAllowed if any cooldownPeriod, triggerThreshold, or resetThreshold is zero\n * @custom:error MarketAlreadyInitialized if any asset has already been initialized\n * @custom:error ThresholdBelowMinimum if any triggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if any triggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if any resetThreshold is at or above its triggerThreshold\n * @custom:error VAINotAllowed if any asset is the VAI token\n * @custom:error PriceExceedsUint128 if the spot price for any asset overflows uint128\n * @custom:event ProtectionInitialized for each asset\n * @custom:event BoundedPricingWhitelistUpdated for each asset\n */\n function setTokenConfigs(TokenConfigInput[] calldata tokenConfigs_) external;\n\n /**\n * @notice Sets the cooldown period for an asset\n * @param asset The underlying asset address\n * @param newCooldown The new cooldown period in seconds; must be non-zero\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CooldownPeriodSet\n */\n function setCooldownPeriod(address asset, uint64 newCooldown) external;\n\n /**\n * @notice Sets the trigger and reset thresholds for an asset\n * @param asset The underlying asset address\n * @param newTriggerThreshold The new trigger threshold (mantissa). Must be between 5% and 50% and above the reset threshold.\n * @param newResetThreshold The new reset threshold (mantissa). Must be non-zero and below the trigger threshold.\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ThresholdBelowMinimum if newTriggerThreshold is below 5%\n * @custom:error ThresholdAboveMaximum if newTriggerThreshold is above 50%\n * @custom:error InvalidResetThreshold if newResetThreshold is at or above newTriggerThreshold\n * @custom:event TriggerThresholdSet if the trigger threshold changed\n * @custom:event ResetThresholdSet if the reset threshold changed\n */\n function setThresholds(address asset, uint256 newTriggerThreshold, uint256 newResetThreshold) external;\n\n /**\n * @notice Sets whether bounded pricing is enabled for an asset\n * @param asset The underlying asset address\n * @param enabled Whether bounded pricing should be enabled for the asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:error ProtectedPriceActive if trying to disable an asset while protection is active\n * @custom:event BoundedPricingWhitelistUpdated\n */\n function setAssetBoundedPricingEnabled(address asset, bool enabled) external;\n\n /**\n * @notice Toggles transient caching of the bounded (collateral, debt) pair for an asset\n * @dev When disabled, each view/non-view price call recomputes bounded prices from the\n * live spot instead of reading or writing the transient slots. The initial value is\n * set via the `enableCaching` argument of `setTokenConfig`.\n * @param asset The underlying asset address\n * @param enabled Whether transient caching is enabled for this asset\n * @custom:access Only Governance\n * @custom:error MarketNotInitialized if the asset has not been initialized\n * @custom:event CachingEnabledUpdated\n */\n function setCachingEnabled(address asset, bool enabled) external;\n\n // --- View helpers ---\n\n /**\n * @notice Returns the full protection state for an asset\n * @param asset The underlying asset address\n * @return minPrice Lowest price observed in the current window\n * @return maxPrice Highest price observed in the current window\n * @return currentlyUsingProtectedPrice Whether protected price is currently active\n * @return isBoundedPricingEnabled Whether the asset is whitelisted for bounded pricing\n * @return lastProtectionTriggeredAt Timestamp of the last protection trigger\n * @return cooldownPeriod Minimum time protection stays active after last trigger\n * @return assetAddr The underlying asset address stored in the struct\n * @return triggerThreshold Entry deviation threshold (mantissa) that activates protection\n * @return resetThreshold Exit deviation threshold (mantissa) below which protection can be disabled\n * @return cachingEnabled Whether transient caching of the bounded pair is enabled for the asset\n */\n function assetProtectionConfig(\n address asset\n )\n external\n view\n returns (\n uint128 minPrice,\n uint128 maxPrice,\n bool currentlyUsingProtectedPrice,\n bool isBoundedPricingEnabled,\n uint64 lastProtectionTriggeredAt,\n uint64 cooldownPeriod,\n address assetAddr,\n uint128 triggerThreshold,\n uint128 resetThreshold,\n bool cachingEnabled\n );\n\n /**\n * @notice Checks if an asset is whitelisted for bounded pricing\n * @param asset The underlying asset address\n * @return True if the asset is whitelisted\n */\n function isBoundedPricingEnabled(address asset) external view returns (bool);\n\n /**\n * @notice Checks if the asset is currently using the protected (bounded) price\n * @param asset The underlying asset address\n * @return True if the asset is currently using the protected price instead of spot\n */\n function currentlyUsingProtectedPrice(address asset) external view returns (bool);\n\n /**\n * @notice Checks if protection can be exited for a given asset\n * @param asset The underlying asset address\n * @return True if both the cooldown has elapsed and the price range has converged below the exit threshold\n */\n function canExitProtection(address asset) external view returns (bool);\n\n /**\n * @notice Returns the initialized asset at the given index (auto-generated array getter)\n * @param index Array index\n * @return The asset address at the given index\n */\n function allAssets(uint256 index) external view returns (address);\n\n /**\n * @notice Returns all currently whitelisted asset addresses\n * @return result Array of whitelisted asset addresses\n */\n function getAllBoundedPricingEnabledAssets() external view returns (address[] memory result);\n\n /**\n * @notice Returns all asset addresses that have ever been initialized\n * @return Array of all initialized asset addresses\n */\n function getInitializedAssets() external view returns (address[] memory);\n\n /**\n * @notice Batch-checks which assets' on-chain min/max have drifted beyond the keeper deadband\n * @param assets Array of asset addresses to check\n * @param proposedMins Keeper's proposed window minimum prices\n * @param proposedMaxs Keeper's proposed window maximum prices\n * @return needsMinUpdate Whether minPrice drift exceeds the deadband for each asset\n * @return needsMaxUpdate Whether maxPrice drift exceeds the deadband for each asset\n * @custom:error InvalidArrayLength if the input array lengths do not match\n */\n function checkAndGetWindowDrift(\n address[] calldata assets,\n uint128[] calldata proposedMins,\n uint128[] calldata proposedMaxs\n ) external view returns (bool[] memory needsMinUpdate, bool[] memory needsMaxUpdate);\n}\n" + }, + "contracts/interfaces/IERC4626.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface IERC4626 {\n function convertToAssets(uint256 shares) 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\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256);\n\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/ISfrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\ninterface ISfrxEthFraxOracle {\n function getPrices() external view returns (bool _isbadData, uint256 _priceLow, uint256 _priceHigh);\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/IZkETH.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\ninterface IZkETH {\n function LSTPerToken() 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 BoundValidatorInterface {\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool);\n}\n" + }, + "contracts/interfaces/PublicResolverInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface PublicResolverInterface {\n function addr(bytes32 node) external view returns (address payable);\n}\n" + }, + "contracts/interfaces/SIDRegistryInterface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity ^0.8.25;\n\ninterface SIDRegistryInterface {\n function resolver(bytes32 node) external view returns (address);\n}\n" + }, + "contracts/interfaces/VBep20Interface.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\ninterface VBep20Interface is IERC20Metadata {\n /**\n * @notice Underlying asset for this VToken\n */\n function underlying() external view returns (address);\n}\n" + }, + "contracts/lib/Transient.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity ^0.8.25;\n\nlibrary Transient {\n /**\n * @notice Cache the asset price into transient storage\n * @param key address of the asset\n * @param value asset price\n */\n function cachePrice(bytes32 cacheSlot, address key, uint256 value) internal {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n tstore(slot, value)\n }\n }\n\n /**\n * @notice Read cached price from transient storage\n * @param key address of the asset\n * @return value cached asset price\n */\n function readCachedPrice(bytes32 cacheSlot, address key) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(cacheSlot, key));\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/oracles/AnkrBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title AnkrBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of ankrBNB asset\n */\ncontract AnkrBNBOracle 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 Constructor for the implementation contract.\n constructor(\n address ankrBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n ankrBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of BNB for 1 ankrBNB\n * @return amount The amount of BNB for ankrBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IAnkrBNB(CORRELATED_TOKEN).sharesToBonds(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/AsBNBOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title asBNBOracle\n * @author Venus\n * @notice This oracle fetches the price of asBNB asset\n */\ncontract AsBNBOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address asBNB,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n asBNB,\n slisBNB,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Fetches the amount of slisBNB for 1 asBNB\n * @return price The amount of slisBNB for asBNB\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n IAsBNBMinter minter = IAsBNBMinter(IAsBNB(CORRELATED_TOKEN).minter());\n return minter.convertToTokens(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/SIDRegistryInterface.sol\";\nimport \"../interfaces/FeedRegistryInterface.sol\";\nimport \"../interfaces/PublicResolverInterface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title BinanceOracle\n * @author Venus\n * @notice This oracle fetches price of assets from Binance.\n */\ncontract BinanceOracle is AccessControlledV8, OracleInterface {\n /// @notice Used to fetch feed registry address.\n address public sidRegistryAddress;\n\n /// @notice Set this as asset address for BNB. This is the underlying address for vBNB\n address public constant BNB_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Max stale period configuration for assets\n mapping(string => uint256) public maxStalePeriod;\n\n /// @notice Override symbols to be compatible with Binance feed registry\n mapping(string => string) public symbols;\n\n /// @notice Used to fetch price of assets used directly when space ID is not supported by current chain.\n address public feedRegistryAddress;\n\n /// @notice Emits when asset stale period is updated.\n event MaxStalePeriodAdded(string indexed asset, uint256 maxStalePeriod);\n\n /// @notice Emits when symbol of the asset is updated.\n event SymbolOverridden(string indexed symbol, string overriddenSymbol);\n\n /// @notice Emits when address of feed registry is updated.\n event FeedRegistryUpdated(address indexed oldFeedRegistry, address indexed newFeedRegistry);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _sidRegistryAddress Address of SID registry\n * @param _acm Address of the access control manager contract\n */\n function initialize(address _sidRegistryAddress, address _acm) external initializer {\n sidRegistryAddress = _sidRegistryAddress;\n __AccessControlled_init(_acm);\n }\n\n /**\n * @notice Used to set the max stale period of an asset\n * @param symbol The symbol of the asset\n * @param _maxStalePeriod The max stake period\n */\n function setMaxStalePeriod(string memory symbol, uint256 _maxStalePeriod) external {\n _checkAccessAllowed(\"setMaxStalePeriod(string,uint256)\");\n if (_maxStalePeriod == 0) revert(\"stale period can't be zero\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n maxStalePeriod[symbol] = _maxStalePeriod;\n emit MaxStalePeriodAdded(symbol, _maxStalePeriod);\n }\n\n /**\n * @notice Used to override a symbol when fetching price\n * @param symbol The symbol to override\n * @param overrideSymbol The symbol after override\n */\n function setSymbolOverride(string calldata symbol, string calldata overrideSymbol) external {\n _checkAccessAllowed(\"setSymbolOverride(string,string)\");\n if (bytes(symbol).length == 0) revert(\"symbol cannot be empty\");\n\n symbols[symbol] = overrideSymbol;\n emit SymbolOverridden(symbol, overrideSymbol);\n }\n\n /**\n * @notice Used to set feed registry address when current chain does not support space ID.\n * @param newfeedRegistryAddress Address of new feed registry.\n */\n function setFeedRegistryAddress(\n address newfeedRegistryAddress\n ) external notNullAddress(newfeedRegistryAddress) onlyOwner {\n if (sidRegistryAddress != address(0)) revert(\"sidRegistryAddress must be zero\");\n emit FeedRegistryUpdated(feedRegistryAddress, newfeedRegistryAddress);\n feedRegistryAddress = newfeedRegistryAddress;\n }\n\n /**\n * @notice Uses Space ID to fetch the feed registry address\n * @return feedRegistryAddress Address of binance oracle feed registry.\n */\n function getFeedRegistryAddress() public view returns (address) {\n bytes32 nodeHash = 0x94fe3821e0768eb35012484db4df61890f9a6ca5bfa984ef8ff717e73139faff;\n\n SIDRegistryInterface sidRegistry = SIDRegistryInterface(sidRegistryAddress);\n address publicResolverAddress = sidRegistry.resolver(nodeHash);\n PublicResolverInterface publicResolver = PublicResolverInterface(publicResolverAddress);\n\n return publicResolver.addr(nodeHash);\n }\n\n /**\n * @notice Gets the price of a asset from the binance oracle\n * @param asset Address of the asset\n * @return Price in USD\n */\n function getPrice(address asset) public view returns (uint256) {\n string memory symbol;\n uint256 decimals;\n\n if (asset == BNB_ADDR) {\n symbol = \"BNB\";\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n symbol = token.symbol();\n decimals = token.decimals();\n }\n\n string memory overrideSymbol = symbols[symbol];\n\n if (bytes(overrideSymbol).length != 0) {\n symbol = overrideSymbol;\n }\n\n return _getPrice(symbol, decimals);\n }\n\n function _getPrice(string memory symbol, uint256 decimals) internal view returns (uint256) {\n FeedRegistryInterface feedRegistry;\n\n if (sidRegistryAddress != address(0)) {\n // If sidRegistryAddress is available, fetch feedRegistryAddress from sidRegistry\n feedRegistry = FeedRegistryInterface(getFeedRegistryAddress());\n } else {\n // Use feedRegistry directly if sidRegistryAddress is not available\n feedRegistry = FeedRegistryInterface(feedRegistryAddress);\n }\n\n (, int256 answer, , uint256 updatedAt, ) = feedRegistry.latestRoundDataByName(symbol, \"USD\");\n if (answer <= 0) revert(\"invalid binance oracle price\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n if (deltaTime > maxStalePeriod[symbol]) revert(\"binance oracle price expired\");\n\n uint256 decimalDelta = feedRegistry.decimalsByName(symbol, \"USD\");\n return (uint256(answer) * (10 ** (18 - decimalDelta))) * (10 ** (18 - decimals));\n }\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 IStaderStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address bnbx,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n bnbx,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertBnbXToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/BoundValidator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title BoundValidator\n * @author Venus\n * @notice The BoundValidator contract is used to validate prices fetched from two different sources.\n * Each asset has an upper and lower bound ratio set in the config. In order for a price to be valid\n * it must fall within this range of the validator price.\n */\ncontract BoundValidator is AccessControlledV8, BoundValidatorInterface {\n struct ValidateConfig {\n /// @notice asset address\n address asset;\n /// @notice Upper bound of deviation between reported price and anchor price,\n /// beyond which the reported price will be invalidated\n uint256 upperBoundRatio;\n /// @notice Lower bound of deviation between reported price and anchor price,\n /// below which the reported price will be invalidated\n uint256 lowerBoundRatio;\n }\n\n /// @notice validation configs by asset\n mapping(address => ValidateConfig) public validateConfigs;\n\n /// @notice Emit this event when new validation configs are added\n event ValidateConfigAdded(address indexed asset, uint256 indexed upperBound, uint256 indexed lowerBound);\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Add multiple validation configs at the same time\n * @param configs Array of validation configs\n * @custom:access Only Governance\n * @custom:error Zero length error is thrown if length of the config array is 0\n * @custom:event Emits ValidateConfigAdded for each validation config that is successfully set\n */\n function setValidateConfigs(ValidateConfig[] memory configs) external {\n uint256 length = configs.length;\n if (length == 0) revert(\"invalid validate config length\");\n for (uint256 i; i < length; ++i) {\n setValidateConfig(configs[i]);\n }\n }\n\n /**\n * @notice Add a single validation config\n * @param config Validation config struct\n * @custom:access Only Governance\n * @custom:error Null address error is thrown if asset address is null\n * @custom:error Range error thrown if bound ratio is not positive\n * @custom:error Range error thrown if lower bound is greater than or equal to upper bound\n * @custom:event Emits ValidateConfigAdded when a validation config is successfully set\n */\n function setValidateConfig(ValidateConfig memory config) public {\n _checkAccessAllowed(\"setValidateConfig(ValidateConfig)\");\n\n if (config.asset == address(0)) revert(\"asset can't be zero address\");\n if (config.upperBoundRatio == 0 || config.lowerBoundRatio == 0) revert(\"bound must be positive\");\n if (config.upperBoundRatio <= config.lowerBoundRatio) revert(\"upper bound must be higher than lowner bound\");\n validateConfigs[config.asset] = config;\n emit ValidateConfigAdded(config.asset, config.upperBoundRatio, config.lowerBoundRatio);\n }\n\n /**\n * @notice Test reported asset price against anchor price\n * @param asset asset address\n * @param reportedPrice The price to be tested\n * @custom:error Missing error thrown if asset config is not set\n * @custom:error Price error thrown if anchor price is not valid\n */\n function validatePriceWithAnchorPrice(\n address asset,\n uint256 reportedPrice,\n uint256 anchorPrice\n ) public view virtual override returns (bool) {\n if (validateConfigs[asset].upperBoundRatio == 0) revert(\"validation config not exist\");\n if (anchorPrice == 0) revert(\"anchor price is not valid\");\n return _isWithinAnchor(asset, reportedPrice, anchorPrice);\n }\n\n /**\n * @notice Test whether the reported price is within the valid bounds\n * @param asset Asset address\n * @param reportedPrice The price to be tested\n * @param anchorPrice The reported price must be within the the valid bounds of this price\n */\n function _isWithinAnchor(address asset, uint256 reportedPrice, uint256 anchorPrice) private view returns (bool) {\n if (reportedPrice != 0) {\n // we need to multiply anchorPrice by 1e18 to make the ratio 18 decimals\n uint256 anchorRatio = (anchorPrice * 1e18) / reportedPrice;\n uint256 upperBoundAnchorRatio = validateConfigs[asset].upperBoundRatio;\n uint256 lowerBoundAnchorRatio = validateConfigs[asset].lowerBoundRatio;\n return anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio;\n }\n return false;\n }\n\n // BoundValidator is to get inherited, so it's a good practice to add some storage gaps like\n // OpenZepplin proposed in their contracts: https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\n // solhint-disable-next-line\n uint256[49] private __gap;\n}\n" + }, + "contracts/oracles/ChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/VBep20Interface.sol\";\nimport \"../interfaces/OracleInterface.sol\";\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\nimport \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\n\n/**\n * @title ChainlinkOracle\n * @author Venus\n * @notice This oracle fetches prices of assets from the Chainlink oracle.\n */\ncontract ChainlinkOracle is AccessControlledV8, OracleInterface {\n struct TokenConfig {\n /// @notice Underlying token address, which can't be a null address\n /// @notice Used to check if a token is supported\n /// @notice 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB address for native tokens\n /// (e.g BNB for BNB chain, ETH for Ethereum network)\n address asset;\n /// @notice Chainlink feed address\n address feed;\n /// @notice Price expiration period of this asset\n uint256 maxStalePeriod;\n }\n\n /// @notice Set this as asset address for native token on each chain.\n /// This is the underlying address for vBNB on BNB chain or an underlying asset for a native market on any chain.\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Manually set an override price, useful under extenuating conditions such as price feed failure\n mapping(address => uint256) public prices;\n\n /// @notice Token config by assets\n mapping(address => TokenConfig) public tokenConfigs;\n\n /// @notice Emit when a price is manually set\n event PricePosted(address indexed asset, uint256 previousPriceMantissa, uint256 newPriceMantissa);\n\n /// @notice Emit when a token config is added\n event TokenConfigAdded(address indexed asset, address feed, uint256 maxStalePeriod);\n\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /// @notice Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor() {\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the owner of the contract\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n }\n\n /**\n * @notice Manually set the price of a given asset\n * @param asset Asset address\n * @param price Asset price in 18 decimals\n * @custom:access Only Governance\n * @custom:event Emits PricePosted event on successfully setup of asset price\n */\n function setDirectPrice(address asset, uint256 price) external notNullAddress(asset) {\n _checkAccessAllowed(\"setDirectPrice(address,uint256)\");\n\n uint256 previousPriceMantissa = prices[asset];\n prices[asset] = price;\n emit PricePosted(asset, previousPriceMantissa, price);\n }\n\n /**\n * @notice Add multiple token configs at the same time\n * @param tokenConfigs_ config array\n * @custom:access Only Governance\n * @custom:error Zero length error thrown, if length of the array in parameter is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Add single token config. asset & feed cannot be null addresses and maxStalePeriod must be positive\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error NotNullAddress error is thrown if token feed address is null\n * @custom:error Range error is thrown if maxStale period of token is not greater than zero\n * @custom:event Emits TokenConfigAdded event on successfully setting of the token config\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.feed) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n if (tokenConfig.maxStalePeriod == 0) revert(\"stale period can't be zero\");\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(tokenConfig.asset, tokenConfig.feed, tokenConfig.maxStalePeriod);\n }\n\n /**\n * @notice Gets the price of a asset from the chainlink oracle\n * @param asset Address of the asset\n * @return Price in USD from Chainlink or a manually set price for the asset\n */\n function getPrice(address asset) public view virtual returns (uint256) {\n uint256 decimals;\n\n if (asset == NATIVE_TOKEN_ADDR) {\n decimals = 18;\n } else {\n IERC20Metadata token = IERC20Metadata(asset);\n decimals = token.decimals();\n }\n\n return _getPriceInternal(asset, decimals);\n }\n\n /**\n * @notice Gets the Chainlink price for a given asset\n * @param asset address of the asset\n * @param decimals decimals of the asset\n * @return price Asset price in USD or a manually set price of the asset\n */\n function _getPriceInternal(address asset, uint256 decimals) internal view returns (uint256 price) {\n uint256 tokenPrice = prices[asset];\n if (tokenPrice != 0) {\n price = tokenPrice;\n } else {\n price = _getChainlinkPrice(asset);\n }\n\n uint256 decimalDelta = 18 - decimals;\n return price * (10 ** decimalDelta);\n }\n\n /**\n * @notice Get the Chainlink price for an asset, revert if token config doesn't exist\n * @dev The precision of the price feed is used to ensure the returned price has 18 decimals of precision\n * @param asset Address of the asset\n * @return price Price in USD, with 18 decimals of precision\n * @custom:error NotNullAddress error is thrown if the asset address is null\n * @custom:error Price error is thrown if the Chainlink price of asset is not greater than zero\n * @custom:error Timing error is thrown if current timestamp is less than the last updatedAt timestamp\n * @custom:error Timing error is thrown if time difference between current time and last updated time\n * is greater than maxStalePeriod\n */\n function _getChainlinkPrice(\n address asset\n ) private view notNullAddress(tokenConfigs[asset].asset) returns (uint256) {\n TokenConfig memory tokenConfig = tokenConfigs[asset];\n AggregatorV3Interface feed = AggregatorV3Interface(tokenConfig.feed);\n\n // note: maxStalePeriod cannot be 0\n uint256 maxStalePeriod = tokenConfig.maxStalePeriod;\n\n // Chainlink USD-denominated feeds store answers at 8 decimals, mostly\n uint256 decimalDelta = 18 - feed.decimals();\n\n (, int256 answer, , uint256 updatedAt, ) = feed.latestRoundData();\n if (answer <= 0) revert(\"chainlink price must be positive\");\n if (block.timestamp < updatedAt) revert(\"updatedAt exceeds block time\");\n\n uint256 deltaTime;\n unchecked {\n deltaTime = block.timestamp - updatedAt;\n }\n\n if (deltaTime > maxStalePeriod) revert(\"chainlink price expired\");\n\n return uint256(answer) * (10 ** decimalDelta);\n }\n}\n" + }, + "contracts/oracles/common/CorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../../interfaces/OracleInterface.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { SECONDS_PER_YEAR } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\nimport { ICappedOracle } from \"../../interfaces/ICappedOracle.sol\";\nimport { IAccessControlManagerV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/IAccessControlManagerV8.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, ICappedOracle {\n /// @notice Address of the correlated token\n address public immutable CORRELATED_TOKEN;\n\n /// @notice Address of the underlying token\n address public immutable UNDERLYING_TOKEN;\n\n /// @notice Address of Resilient Oracle\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Address of the AccessControlManager contract\n IAccessControlManagerV8 public immutable ACCESS_CONTROL_MANAGER;\n\n //// @notice Growth rate percentage in seconds. Ex: 1e18 is 100%\n uint256 public growthRatePerSecond;\n\n /// @notice Snapshot update interval\n uint256 public snapshotInterval;\n\n /// @notice Last stored snapshot maximum exchange rate\n uint256 public snapshotMaxExchangeRate;\n\n /// @notice Last stored snapshot timestamp\n uint256 public snapshotTimestamp;\n\n /// @notice Gap to add when updating the snapshot\n uint256 public snapshotGap;\n\n /// @notice Emitted when the snapshot is updated\n event SnapshotUpdated(uint256 indexed maxExchangeRate, uint256 indexed timestamp);\n\n /// @notice Emitted when the growth rate is updated\n event GrowthRateUpdated(\n uint256 indexed oldGrowthRatePerSecond,\n uint256 indexed newGrowthRatePerSecond,\n uint256 indexed oldSnapshotInterval,\n uint256 newSnapshotInterval\n );\n\n /// @notice Emitted when the snapshot gap is updated\n event SnapshotGapUpdated(uint256 indexed oldSnapshotGap, uint256 indexed newSnapshotGap);\n\n /// @notice Thrown if the token address is invalid\n error InvalidTokenAddress();\n\n /// @notice Thrown if the growth rate is invalid\n error InvalidGrowthRate();\n\n /// @notice Thrown if the initial snapshot is invalid\n error InvalidInitialSnapshot();\n\n /// @notice Thrown if the max snapshot exchange rate is invalid\n error InvalidSnapshotMaxExchangeRate();\n\n /// @notice @notice Thrown when the action is prohibited by AccessControlManager\n error Unauthorized(address sender, address calledContract, string methodSignature);\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:error InvalidInitialSnapshot error is thrown if the initial snapshot values are invalid\n */\n constructor(\n address _correlatedToken,\n address _underlyingToken,\n address _resilientOracle,\n uint256 _annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 _initialSnapshotMaxExchangeRate,\n uint256 _initialSnapshotTimestamp,\n address _accessControlManager,\n uint256 _snapshotGap\n ) {\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n if ((_initialSnapshotMaxExchangeRate == 0 || _initialSnapshotTimestamp == 0) && _snapshotInterval > 0) {\n revert InvalidInitialSnapshot();\n }\n\n ensureNonzeroAddress(_correlatedToken);\n ensureNonzeroAddress(_underlyingToken);\n ensureNonzeroAddress(_resilientOracle);\n ensureNonzeroAddress(_accessControlManager);\n\n CORRELATED_TOKEN = _correlatedToken;\n UNDERLYING_TOKEN = _underlyingToken;\n RESILIENT_ORACLE = ResilientOracleInterface(_resilientOracle);\n snapshotInterval = _snapshotInterval;\n\n snapshotMaxExchangeRate = _initialSnapshotMaxExchangeRate;\n snapshotTimestamp = _initialSnapshotTimestamp;\n snapshotGap = _snapshotGap;\n\n ACCESS_CONTROL_MANAGER = IAccessControlManagerV8(_accessControlManager);\n }\n\n /**\n * @notice Directly sets the snapshot exchange rate and timestamp\n * @param _snapshotMaxExchangeRate The exchange rate to set\n * @param _snapshotTimestamp The timestamp to set\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n */\n function setSnapshot(uint256 _snapshotMaxExchangeRate, uint256 _snapshotTimestamp) external {\n _checkAccessAllowed(\"setSnapshot(uint256,uint256)\");\n\n snapshotMaxExchangeRate = _snapshotMaxExchangeRate;\n snapshotTimestamp = _snapshotTimestamp;\n\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Sets the growth rate and snapshot interval\n * @param _annualGrowthRate The annual growth rate to set\n * @param _snapshotInterval The snapshot interval to set\n * @custom:error InvalidGrowthRate error is thrown if the growth rate is invalid\n * @custom:event Emits GrowthRateUpdated event on successful update of the growth rate\n */\n function setGrowthRate(uint256 _annualGrowthRate, uint256 _snapshotInterval) external {\n _checkAccessAllowed(\"setGrowthRate(uint256,uint256)\");\n uint256 oldGrowthRatePerSecond = growthRatePerSecond;\n\n growthRatePerSecond = _annualGrowthRate / SECONDS_PER_YEAR;\n\n if ((growthRatePerSecond == 0 && _snapshotInterval > 0) || (growthRatePerSecond > 0 && _snapshotInterval == 0))\n revert InvalidGrowthRate();\n\n emit GrowthRateUpdated(oldGrowthRatePerSecond, growthRatePerSecond, snapshotInterval, _snapshotInterval);\n\n snapshotInterval = _snapshotInterval;\n }\n\n /**\n * @notice Sets the snapshot gap\n * @param _snapshotGap The snapshot gap to set\n * @custom:event Emits SnapshotGapUpdated event on successful update of the snapshot gap\n */\n function setSnapshotGap(uint256 _snapshotGap) external {\n _checkAccessAllowed(\"setSnapshotGap(uint256)\");\n\n emit SnapshotGapUpdated(snapshotGap, _snapshotGap);\n\n snapshotGap = _snapshotGap;\n }\n\n /**\n * @notice Returns if the price is capped\n * @return isCapped Boolean indicating if the price is capped\n */\n function isCapped() external view virtual returns (bool) {\n if (snapshotInterval == 0) {\n return false;\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n if (maxAllowedExchangeRate == 0) {\n return false;\n }\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n return exchangeRate > maxAllowedExchangeRate;\n }\n\n /**\n * @notice Updates the snapshot price and timestamp\n * @custom:event Emits SnapshotUpdated event on successful update of the snapshot\n * @custom:error InvalidSnapshotMaxExchangeRate error is thrown if the max snapshot exchange rate is zero\n */\n function updateSnapshot() public override {\n if (block.timestamp - snapshotTimestamp < snapshotInterval || snapshotInterval == 0) return;\n\n uint256 exchangeRate = getUnderlyingAmount();\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n snapshotMaxExchangeRate =\n (exchangeRate > maxAllowedExchangeRate ? maxAllowedExchangeRate : exchangeRate) +\n snapshotGap;\n snapshotTimestamp = block.timestamp;\n\n if (snapshotMaxExchangeRate == 0) revert InvalidSnapshotMaxExchangeRate();\n\n RESILIENT_ORACLE.updateAssetPrice(UNDERLYING_TOKEN);\n emit SnapshotUpdated(snapshotMaxExchangeRate, snapshotTimestamp);\n }\n\n /**\n * @notice Fetches the price of the token\n * @param asset Address of the token\n * @return price The price of the token in scaled decimal places. It can be capped\n * to a maximum value taking into account the growth rate\n * @custom:error InvalidTokenAddress error is thrown if the token address is invalid\n */\n function getPrice(address asset) public view override returns (uint256) {\n if (asset != CORRELATED_TOKEN) revert InvalidTokenAddress();\n\n uint256 exchangeRate = getUnderlyingAmount();\n\n if (snapshotInterval == 0) {\n return _calculatePrice(exchangeRate);\n }\n\n uint256 maxAllowedExchangeRate = getMaxAllowedExchangeRate();\n\n uint256 finalExchangeRate = (exchangeRate > maxAllowedExchangeRate && maxAllowedExchangeRate != 0)\n ? maxAllowedExchangeRate\n : exchangeRate;\n\n return _calculatePrice(finalExchangeRate);\n }\n\n /**\n * @notice Gets the maximum allowed exchange rate for token\n * @return maxExchangeRate Maximum allowed exchange rate\n */\n function getMaxAllowedExchangeRate() public view returns (uint256) {\n uint256 timeElapsed = block.timestamp - snapshotTimestamp;\n uint256 maxExchangeRate = snapshotMaxExchangeRate +\n (snapshotMaxExchangeRate * growthRatePerSecond * timeElapsed) /\n 1e18;\n return maxExchangeRate;\n }\n\n /**\n * @notice Gets the underlying amount for correlated token\n * @return underlyingAmount Amount of underlying token\n */\n function getUnderlyingAmount() public view virtual returns (uint256);\n\n /**\n * @notice Fetches price of the token based on an underlying exchange rate\n * @param exchangeRate The underlying exchange rate to use\n * @return price The price of the token in scaled decimal places\n */\n function _calculatePrice(uint256 exchangeRate) internal view returns (uint256) {\n uint256 underlyingUSDPrice = RESILIENT_ORACLE.getPrice(UNDERLYING_TOKEN);\n\n IERC20Metadata token = IERC20Metadata(CORRELATED_TOKEN);\n uint256 decimals = token.decimals();\n\n return (exchangeRate * underlyingUSDPrice) / (10 ** decimals);\n }\n\n /**\n * @notice Reverts if the call is not allowed by AccessControlManager\n * @param signature Method signature\n * @custom:error Unauthorized error is thrown if the call is not allowed\n */\n function _checkAccessAllowed(string memory signature) internal view {\n bool isAllowedToCall = ACCESS_CONTROL_MANAGER.isAllowedToCall(msg.sender, signature);\n\n if (!isAllowedToCall) {\n revert Unauthorized(msg.sender, address(this), signature);\n }\n }\n}\n" + }, + "contracts/oracles/ERC4626Oracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IERC4626 } from \"../interfaces/IERC4626.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ERC4626Oracle\n * @author Venus\n * @notice This oracle fetches the price of ERC4626 tokens\n */\ncontract ERC4626Oracle is CorrelatedTokenOracle {\n uint256 public immutable ONE_CORRELATED_TOKEN;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ONE_CORRELATED_TOKEN = 10 ** IERC4626(correlatedToken).decimals();\n }\n\n /**\n * @notice Fetches the amount of underlying token for 1 correlated token\n * @return amount The amount of underlying token for correlated token\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IERC4626(CORRELATED_TOKEN).convertToAssets(ONE_CORRELATED_TOKEN);\n }\n}\n" + }, + "contracts/oracles/EtherfiAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title EtherfiAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of any Ether.fi asset that uses\n * Accountant contracts to derive the underlying price\n */\ncontract EtherfiAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Fetches the conversion rate from the ACCOUNTANT contract\n * @return amount Amount of WBTC\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\n }\n}\n" + }, + "contracts/oracles/mocks/MockAccountant.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IAccountant.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAccountant is IAccountant, Ownable {\n uint256 public rate;\n\n constructor() Ownable() {}\n\n function setRate(uint256 _rate) external onlyOwner {\n rate = _rate;\n }\n\n function getRateSafe() external view override returns (uint256) {\n return rate;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceFeedRegistry.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/FeedRegistryInterface.sol\";\n\ncontract MockBinanceFeedRegistry is FeedRegistryInterface {\n mapping(string => uint256) public assetPrices;\n\n function setAssetPrice(string memory base, uint256 price) external {\n assetPrices[base] = price;\n }\n\n function latestRoundDataByName(\n string memory base,\n string memory quote\n )\n external\n view\n override\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n quote;\n return (0, int256(assetPrices[base]), 0, block.timestamp - 10, 0);\n }\n\n function decimalsByName(string memory base, string memory quote) external view override returns (uint8) {\n return 8;\n }\n}\n" + }, + "contracts/oracles/mocks/MockBinanceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockBinanceOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n constructor() {}\n\n function initialize() public initializer {}\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OwnableUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol\";\nimport { OracleInterface } from \"../../interfaces/OracleInterface.sol\";\n\ncontract MockChainlinkOracle is OwnableUpgradeable, OracleInterface {\n mapping(address => uint256) public assetPrices;\n\n //set price in 6 decimal precision\n constructor() {}\n\n function initialize() public initializer {\n __Ownable_init();\n }\n\n function setPrice(address asset, uint256 price) external {\n assetPrices[asset] = price;\n }\n\n //https://compound.finance/docs/prices\n function getPrice(address token) public view returns (uint256) {\n return assetPrices[token];\n }\n}\n" + }, + "contracts/oracles/mocks/MockPendlePtOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/IPendlePtOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockPendlePtOracle is IPendlePtOracle, Ownable {\n mapping(address => mapping(uint32 => uint256)) public ptToAssetRate;\n mapping(address => mapping(uint32 => uint256)) public ptToSyRate;\n\n constructor() Ownable() {}\n\n function setPtToAssetRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToAssetRate[market][duration] = rate;\n }\n\n function setPtToSyRate(address market, uint32 duration, uint256 rate) external onlyOwner {\n ptToSyRate[market][duration] = rate;\n }\n\n function getPtToAssetRate(address market, uint32 duration) external view returns (uint256) {\n return ptToAssetRate[market][duration];\n }\n\n function getPtToSyRate(address market, uint32 duration) external view returns (uint256) {\n return ptToSyRate[market][duration];\n }\n\n function getOracleState(\n address /* market */,\n uint32 /* duration */\n )\n external\n pure\n returns (bool increaseCardinalityRequired, uint16 cardinalityRequired, bool oldestObservationSatisfied)\n {\n return (false, 0, true);\n }\n}\n" + }, + "contracts/oracles/mocks/MockSFrxEthFraxOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/ISfrxEthFraxOracle.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSfrxEthFraxOracle is ISfrxEthFraxOracle, Ownable {\n bool public isBadData;\n uint256 public priceLow;\n uint256 public priceHigh;\n\n constructor() Ownable() {}\n\n function setPrices(bool _isBadData, uint256 _priceLow, uint256 _priceHigh) external onlyOwner {\n isBadData = _isBadData;\n priceLow = _priceLow;\n priceHigh = _priceHigh;\n }\n\n function getPrices() external view override returns (bool, uint256, uint256) {\n return (isBadData, priceLow, priceHigh);\n }\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 OracleInterface public immutable INTERMEDIATE_ORACLE;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n address intermediateOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 scaled by the underlying token decimals\n */\n function getUnderlyingAmount() public 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 (underlyingAmount * (10 ** correlatedDecimals)) / (10 ** (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\";\nimport { IERC20Metadata } from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\n/**\n * @title PendleOracle\n * @author Venus\n * @notice This oracle fetches the price of a pendle token\n * @dev As a base price the oracle uses either the price of the Pendle\n * market's asset (in this case PT_TO_ASSET rate should be used) or\n * the price of the Pendle market's interest bearing token (e.g. wstETH\n * for stETH; in this case PT_TO_SY rate should be used). Technically,\n * interest bearing token is different from standardized yield (SY) token,\n * but since SY is a wrapper around an interest bearing token, we can safely\n * assume the prices of the two are equal. This is not always true for asset\n * price though: using PT_TO_ASSET rate assumes that the yield token can\n * be seamlessly redeemed for the underlying asset. In reality, this might\n * not always be the case. For more details, see\n * https://docs.pendle.finance/Developers/Contracts/StandardizedYield\n */\ncontract PendleOracle is CorrelatedTokenOracle {\n struct ConstructorParams {\n /// @notice Pendle market\n address market;\n /// @notice Pendle oracle\n address ptOracle;\n /// @notice Either PT_TO_ASSET or PT_TO_SY\n RateKind rateKind;\n /// @notice Pendle PT token\n address ptToken;\n /// @notice Underlying token, can be either the market's asset or the interest bearing token\n address underlyingToken;\n /// @notice Resilient oracle to get the underlying token price from\n address resilientOracle;\n /// @notice TWAP duration to call Pendle oracle with\n uint32 twapDuration;\n /// @notice Annual growth rate of the underlying token\n uint256 annualGrowthRate;\n /// @notice Snapshot interval for the oracle\n uint256 snapshotInterval;\n /// @notice Initial exchange rate of the underlying token\n uint256 initialSnapshotMaxExchangeRate;\n /// @notice Initial timestamp of the underlying token\n uint256 initialSnapshotTimestamp;\n /// @notice Access control manager\n address accessControlManager;\n /// @notice Gap to add when updating the snapshot\n uint256 snapshotGap;\n }\n\n /// @notice Which asset to use as a base for the returned PT\n /// price. Can be either a standardized yield token (SY), in\n /// this case PT/SY price is returned, or the Pendle\n /// market's asset directly.\n enum RateKind {\n PT_TO_ASSET,\n PT_TO_SY\n }\n\n /// @notice Address of the PT oracle\n IPendlePtOracle public immutable PT_ORACLE;\n\n /// @notice Whether to use PT/SY (standardized yield token) rate\n /// or PT/market asset rate\n RateKind public immutable RATE_KIND;\n\n /// @notice Address of the market\n address public immutable MARKET;\n\n /// @notice Twap duration for the oracle\n uint32 public immutable TWAP_DURATION;\n\n /// @notice Decimals of the underlying token\n /// @dev We make an assumption that the underlying decimals will\n /// not change throughout the lifetime of the Pendle market\n uint8 public immutable UNDERLYING_DECIMALS;\n\n /// @notice Thrown if the duration is invalid\n error InvalidDuration();\n\n /**\n * @notice Constructor for the implementation contract.\n * @custom:error InvalidDuration Thrown if the duration is invalid\n */\n constructor(\n ConstructorParams memory params\n )\n CorrelatedTokenOracle(\n params.ptToken,\n params.underlyingToken,\n params.resilientOracle,\n params.annualGrowthRate,\n params.snapshotInterval,\n params.initialSnapshotMaxExchangeRate,\n params.initialSnapshotTimestamp,\n params.accessControlManager,\n params.snapshotGap\n )\n {\n ensureNonzeroAddress(params.market);\n ensureNonzeroAddress(params.ptOracle);\n ensureNonzeroValue(params.twapDuration);\n\n MARKET = params.market;\n PT_ORACLE = IPendlePtOracle(params.ptOracle);\n RATE_KIND = params.rateKind;\n TWAP_DURATION = params.twapDuration;\n UNDERLYING_DECIMALS = IERC20Metadata(UNDERLYING_TOKEN).decimals();\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 /// @notice Fetches the amount of underlying token for 1 PT\n /// @return amount The amount of underlying token (either the market's asset\n /// or the yield token) for 1 PT, adjusted for decimals such that the result\n /// has the same precision as the underlying token\n function getUnderlyingAmount() public view override returns (uint256) {\n uint256 rate;\n if (RATE_KIND == RateKind.PT_TO_SY) {\n rate = PT_ORACLE.getPtToSyRate(MARKET, TWAP_DURATION);\n } else {\n rate = PT_ORACLE.getPtToAssetRate(MARKET, TWAP_DURATION);\n }\n return ((10 ** UNDERLYING_DECIMALS) * rate) / 1e18;\n }\n}\n" + }, + "contracts/oracles/SequencerChainlinkOracle.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity 0.8.25;\n\nimport { ChainlinkOracle } from \"./ChainlinkOracle.sol\";\nimport { AggregatorV3Interface } from \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol\";\n\n/**\n @title Sequencer Chain Link Oracle\n @notice Oracle to fetch price using chainlink oracles on L2s with sequencer\n*/\ncontract SequencerChainlinkOracle is ChainlinkOracle {\n /// @notice L2 Sequencer feed\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n AggregatorV3Interface public immutable sequencer;\n\n /// @notice L2 Sequencer grace period\n uint256 public constant GRACE_PERIOD_TIME = 3600;\n\n /**\n @notice Contract constructor\n @param _sequencer L2 sequencer\n @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(AggregatorV3Interface _sequencer) ChainlinkOracle() {\n require(address(_sequencer) != address(0), \"zero address\");\n\n sequencer = _sequencer;\n }\n\n /// @inheritdoc ChainlinkOracle\n function getPrice(address asset) public view override returns (uint) {\n if (!isSequencerActive()) revert(\"L2 sequencer unavailable\");\n return super.getPrice(asset);\n }\n\n function isSequencerActive() internal view returns (bool) {\n // answer from oracle is a variable with a value of either 1 or 0\n // 0: The sequencer is up\n // 1: The sequencer is down\n // startedAt: This timestamp indicates when the sequencer changed status\n (, int256 answer, uint256 startedAt, , ) = sequencer.latestRoundData();\n if (block.timestamp - startedAt <= GRACE_PERIOD_TIME || answer == 1) return false;\n return true;\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 constructor(\n address sFrax,\n address frax,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n sFrax,\n frax,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public 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 { ISfrxEthFraxOracle } from \"../interfaces/ISfrxEthFraxOracle.sol\";\nimport { ensureNonzeroAddress, ensureNonzeroValue } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title SFrxETHOracle\n * @author Venus\n * @notice This oracle fetches the price of sfrxETH\n */\ncontract SFrxETHOracle is AccessControlledV8, OracleInterface {\n /// @notice Address of SfrxEthFraxOracle\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ISfrxEthFraxOracle public immutable SFRXETH_FRAX_ORACLE;\n\n /// @notice Address of sfrxETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable SFRXETH;\n\n /// @notice Maximum allowed price difference\n uint256 public maxAllowedPriceDifference;\n\n /// @notice Emits when the maximum allowed price difference is updated\n event MaxAllowedPriceDifferenceUpdated(uint256 oldMaxAllowedPriceDifference, uint256 newMaxAllowedPriceDifference);\n\n /// @notice Thrown if the price data is invalid\n error BadPriceData();\n\n /// @notice Thrown if the price difference exceeds the allowed limit\n error PriceDifferenceExceeded();\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 /// @custom:error ZeroAddressNotAllowed is thrown when `_sfrxEthFraxOracle` or `_sfrxETH` are the zero address\n constructor(address _sfrxEthFraxOracle, address _sfrxETH) {\n ensureNonzeroAddress(_sfrxEthFraxOracle);\n ensureNonzeroAddress(_sfrxETH);\n\n SFRXETH_FRAX_ORACLE = ISfrxEthFraxOracle(_sfrxEthFraxOracle);\n SFRXETH = _sfrxETH;\n\n _disableInitializers();\n }\n\n /**\n * @notice Sets the contracts required to fetch prices\n * @param _acm Address of the access control manager contract\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function initialize(address _acm, uint256 _maxAllowedPriceDifference) external initializer {\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n __AccessControlled_init(_acm);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Sets the maximum allowed price difference\n * @param _maxAllowedPriceDifference Maximum allowed price difference\n * @custom:error ZeroValueNotAllowed is thrown if `_maxAllowedPriceDifference` is zero\n */\n function setMaxAllowedPriceDifference(uint256 _maxAllowedPriceDifference) external {\n _checkAccessAllowed(\"setMaxAllowedPriceDifference(uint256)\");\n ensureNonzeroValue(_maxAllowedPriceDifference);\n\n emit MaxAllowedPriceDifferenceUpdated(maxAllowedPriceDifference, _maxAllowedPriceDifference);\n maxAllowedPriceDifference = _maxAllowedPriceDifference;\n }\n\n /**\n * @notice Fetches the USD price of sfrxETH\n * @param asset Address of the sfrxETH token\n * @return price The price scaled by 1e18\n * @custom:error InvalidTokenAddress is thrown when the `asset` is not the sfrxETH token (`SFRXETH`)\n * @custom:error BadPriceData is thrown if the `SFRXETH_FRAX_ORACLE` oracle informs it has bad data\n * @custom:error ZeroValueNotAllowed is thrown if the prices (low or high, in USD) are zero\n * @custom:error PriceDifferenceExceeded is thrown if priceHigh/priceLow is greater than `maxAllowedPriceDifference`\n */\n function getPrice(address asset) external view returns (uint256) {\n if (asset != SFRXETH) revert InvalidTokenAddress();\n\n (bool isBadData, uint256 priceLow, uint256 priceHigh) = SFRXETH_FRAX_ORACLE.getPrices();\n\n if (isBadData) revert BadPriceData();\n\n // calculate price in USD\n uint256 priceHighInUSD = (EXP_SCALE ** 2) / priceLow;\n uint256 priceLowInUSD = (EXP_SCALE ** 2) / priceHigh;\n\n ensureNonzeroValue(priceHighInUSD);\n ensureNonzeroValue(priceLowInUSD);\n\n // validate price difference\n uint256 difference = (priceHighInUSD * EXP_SCALE) / priceLowInUSD;\n if (difference > maxAllowedPriceDifference) revert PriceDifferenceExceeded();\n\n // calculate and return average price\n return (priceHighInUSD + priceLowInUSD) / 2;\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 ISynclubStakeManager public immutable STAKE_MANAGER;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address stakeManager,\n address slisBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n slisBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return STAKE_MANAGER.convertSnBnbToBnb(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/StableUsdtPriceFeed.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\n/**\n * @title StableUsdtPriceFeed\n * @dev This contract is used to get the price of USDT from a Resilient Oracle\n * and bounds the price to a certain range.\n */\ncontract StableUsdtPriceFeed {\n ResilientOracleInterface public resilientOracle;\n\n address public constant USDT_TOKEN_ADDR = 0x55d398326f99059fF775485246999027B3197955;\n uint256 public constant UPPER_BOUND = 1020000000000000000; // 1.02 USD\n uint256 public constant LOWER_BOUND = 980000000000000000; // 0.98 USD\n\n constructor(address _resilientOracle) {\n require(_resilientOracle != address(0), \"Zero address provided\");\n resilientOracle = ResilientOracleInterface(_resilientOracle);\n }\n\n function latestAnswer() external view returns (int256 answer) {\n // get price\n uint256 price = getPrice();\n // cast price to int256\n answer = int256(price);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n // get price\n uint256 _answer = getPrice();\n // mock timestamp to latest block timestamp\n uint256 timestamp = block.timestamp;\n // mock roundId to timestamp\n roundId = uint80(timestamp);\n return (roundId, int256(_answer), timestamp, timestamp, roundId);\n }\n\n function decimals() external pure returns (uint8) {\n return 18;\n }\n\n function description() external pure returns (string memory) {\n return \"Stabilized USDT Price Feed\";\n }\n\n function version() external pure returns (uint256) {\n return 1;\n }\n\n /**\n * @dev Get the price from the Resilient Oracle, and bound it to the range\n * @return price The price of USDT in 18 decimals\n */\n function getPrice() private view returns (uint256 price) {\n // get USDT price (18 decimals)\n price = resilientOracle.getPrice(USDT_TOKEN_ADDR);\n price = price < LOWER_BOUND ? LOWER_BOUND : (price > UPPER_BOUND ? UPPER_BOUND : price);\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 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 constructor(\n address stakePool,\n address stkBNB,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n stkBNB,\n NATIVE_TOKEN_ADDR,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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 * @custom:error PoolTokenSupplyIsZero error is thrown if the pool token supply is zero\n */\n function getUnderlyingAmount() public 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 constructor(\n address wbeth,\n address eth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wbeth,\n eth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\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() public view override returns (uint256) {\n return IWBETH(CORRELATED_TOKEN).exchangeRate();\n }\n}\n" + }, + "contracts/oracles/WeETHAccountantOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\nimport { IAccountant } from \"../interfaces/IAccountant.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\n\n/**\n * @title WeETHAccountantOracle\n * @author Venus\n * @notice This oracle fetches the price of Ether.fi tokens based on an `Accountant` contract (i.e. weETHs and weETHk)\n */\ncontract WeETHAccountantOracle is CorrelatedTokenOracle {\n /// @notice Address of Accountant\n IAccountant public immutable ACCOUNTANT;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address accountant,\n address weethLRT,\n address weth,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weethLRT,\n weth,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(accountant);\n ACCOUNTANT = IAccountant(accountant);\n }\n\n /**\n * @notice Gets the WETH for 1 weETH LRT\n * @return amount Amount of WETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return ACCOUNTANT.getRateSafe();\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 IEtherFiLiquidityPool public immutable LIQUIDITY_POOL;\n\n /// @notice Constructor for the implementation contract.\n constructor(\n address liquidityPool,\n address weETH,\n address eETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n weETH,\n eETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\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() public view override returns (uint256) {\n return LIQUIDITY_POOL.amountForShare(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/WstETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { OracleInterface } from \"../interfaces/OracleInterface.sol\";\nimport { IStETH } from \"../interfaces/IStETH.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { EXP_SCALE } from \"@venusprotocol/solidity-utilities/contracts/constants.sol\";\n\n/**\n * @title WstETHOracle\n * @author Venus\n * @notice Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle.\n */\ncontract WstETHOracle is OracleInterface {\n /// @notice A flag assuming 1:1 price equivalence between stETH/ETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n bool public immutable ASSUME_STETH_ETH_EQUIVALENCE;\n\n /// @notice Address of stETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n IStETH public immutable STETH;\n\n /// @notice Address of wstETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WSTETH_ADDRESS;\n\n /// @notice Address of WETH\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable WETH_ADDRESS;\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 Constructor for the implementation contract.\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address wstETHAddress,\n address wETHAddress,\n address stETHAddress,\n address resilientOracleAddress,\n bool assumeEquivalence\n ) {\n ensureNonzeroAddress(wstETHAddress);\n ensureNonzeroAddress(wETHAddress);\n ensureNonzeroAddress(stETHAddress);\n ensureNonzeroAddress(resilientOracleAddress);\n WSTETH_ADDRESS = wstETHAddress;\n WETH_ADDRESS = wETHAddress;\n STETH = IStETH(stETHAddress);\n RESILIENT_ORACLE = OracleInterface(resilientOracleAddress);\n ASSUME_STETH_ETH_EQUIVALENCE = assumeEquivalence;\n }\n\n /**\n * @notice Gets the USD price of wstETH asset\n * @dev Depending on the equivalence flag price is either based on assumption that 1 stETH = 1 ETH\n * or the price of stETH/USD (secondary market price) is obtained from the oracle\n * @param asset Address of wstETH\n * @return wstETH Price in USD scaled by 1e18\n */\n function getPrice(address asset) public view returns (uint256) {\n if (asset != WSTETH_ADDRESS) revert(\"wrong wstETH address\");\n\n // get stETH amount for 1 wstETH scaled by 1e18\n uint256 stETHAmount = STETH.getPooledEthByShares(1 ether);\n\n // price is scaled 1e18 (oracle returns 36 - asset decimal scale)\n uint256 stETHUSDPrice = RESILIENT_ORACLE.getPrice(ASSUME_STETH_ETH_EQUIVALENCE ? WETH_ADDRESS : address(STETH));\n\n // stETHAmount (for 1 wstETH) * stETHUSDPrice / 1e18\n return (stETHAmount * stETHUSDPrice) / 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\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.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 Address of stETH\n IStETH public immutable STETH;\n\n /// @notice Constructor for the implementation contract.\n /// @dev The underlyingToken must be correlated so that 1 underlyingToken is equal to 1 stETH, because\n /// getUnderlyingAmount() implicitly assumes that\n constructor(\n address stETH,\n address wstETH,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n wstETH,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {\n ensureNonzeroAddress(stETH);\n STETH = IStETH(stETH);\n }\n\n /**\n * @notice Gets the amount of underlyingToken for 1 wstETH, assuming that 1 underlyingToken is equivalent to 1 stETH\n * @return amount Amount of underlyingToken\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return STETH.getPooledEthByShares(EXP_SCALE);\n }\n}\n" + }, + "contracts/oracles/ZkETHOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IZkETH } from \"../interfaces/IZkETH.sol\";\nimport { CorrelatedTokenOracle } from \"./common/CorrelatedTokenOracle.sol\";\n\n/**\n * @title ZkETHOracle\n * @author Venus\n * @notice This oracle fetches the price of zkETH\n */\ncontract ZkETHOracle is CorrelatedTokenOracle {\n /// @notice Constructor for the implementation contract.\n constructor(\n address zkETH,\n address rzkETH,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 _snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 _snapshotGap\n )\n CorrelatedTokenOracle(\n zkETH,\n rzkETH,\n resilientOracle,\n annualGrowthRate,\n _snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n _snapshotGap\n )\n {}\n\n /**\n * @notice Gets the amount of rzkETH for 1 zkETH\n * @return amount Amount of rzkETH\n */\n function getUnderlyingAmount() public view override returns (uint256) {\n return IZkETH(CORRELATED_TOKEN).LSTPerToken();\n }\n}\n" + }, + "contracts/ReferenceOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2025 Venus\npragma solidity 0.8.25;\n\nimport { Ownable2StepUpgradeable } from \"@openzeppelin/contracts-upgradeable/access/Ownable2StepUpgradeable.sol\";\nimport { ensureNonzeroAddress } from \"@venusprotocol/solidity-utilities/contracts/validators.sol\";\nimport { ResilientOracleInterface, OracleInterface } from \"./interfaces/OracleInterface.sol\";\n\n/**\n * @title ReferenceOracle\n * @author Venus\n * @notice Reference oracle is the oracle that is not used for production but required for\n * price monitoring. This oracle contains some extra configurations for assets required to\n * compute reference prices of their derivative assets (OneJump, ERC4626, Pendle, etc.)\n */\ncontract ReferenceOracle is Ownable2StepUpgradeable, OracleInterface {\n struct ExternalPrice {\n /// @notice asset address\n address asset;\n /// @notice price of the asset from an external source\n uint256 price;\n }\n\n /// @notice Slot to temporarily store price information from external sources\n /// like CMC/Coingecko, useful to compute prices of derivative assets based on\n /// prices of the base assets with no on chain price information\n bytes32 public constant PRICES_SLOT = keccak256(abi.encode(\"venus-protocol/oracle/ReferenceOracle/prices\"));\n\n /// @notice Resilient oracle address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n ResilientOracleInterface public immutable RESILIENT_ORACLE;\n\n /// @notice Oracle configuration for assets\n mapping(address => OracleInterface) public oracles;\n\n /// @notice Event emitted when an oracle is set\n event OracleConfigured(address indexed asset, address indexed oracle);\n\n /**\n * @notice Constructor for the implementation contract. Sets immutable variables.\n * @param resilientOracle Resilient oracle address\n * @custom:error ZeroAddressNotAllowed is thrown if resilient oracle address is null\n * @custom:oz-upgrades-unsafe-allow constructor\n */\n constructor(ResilientOracleInterface resilientOracle) {\n ensureNonzeroAddress(address(resilientOracle));\n RESILIENT_ORACLE = resilientOracle;\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin\n */\n function initialize() external initializer {\n __Ownable2Step_init();\n }\n\n /**\n * @notice Sets an oracle to use for a specific asset\n * @dev The production resilientOracle will be used if zero address is passed\n * @param asset Asset address\n * @param oracle Oracle address\n * @custom:access Only owner\n * @custom:error ZeroAddressNotAllowed is thrown if asset address is null\n * @custom:event Emits OracleConfigured event\n */\n function setOracle(address asset, OracleInterface oracle) external onlyOwner {\n ensureNonzeroAddress(asset);\n oracles[asset] = OracleInterface(oracle);\n emit OracleConfigured(asset, address(oracle));\n }\n\n /**\n * @notice Gets price of the asset assuming other assets have the defined price\n * @param asset asset address\n * @param externalPrices an array of prices for other assets\n * @return USD price in scaled decimal places\n */\n function getPriceAssuming(address asset, ExternalPrice[] memory externalPrices) external returns (uint256) {\n uint256 externalPricesCount = externalPrices.length;\n for (uint256 i = 0; i < externalPricesCount; ++i) {\n _storeExternalPrice(externalPrices[i].asset, externalPrices[i].price);\n }\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return USD price in scaled decimal places\n */\n function getPrice(address asset) external view override returns (uint256) {\n return _getPrice(asset);\n }\n\n function _storeExternalPrice(address asset, uint256 price) internal {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n tstore(slot, price)\n }\n }\n\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 externalPrice = _loadExternalPrice(asset);\n if (externalPrice != 0) {\n return externalPrice;\n }\n OracleInterface oracle = oracles[asset];\n if (oracle != OracleInterface(address(0))) {\n return oracle.getPrice(asset);\n }\n return RESILIENT_ORACLE.getPrice(asset);\n }\n\n function _loadExternalPrice(address asset) internal view returns (uint256 value) {\n bytes32 slot = keccak256(abi.encode(PRICES_SLOT, asset));\n // solhint-disable-next-line no-inline-assembly\n assembly (\"memory-safe\") {\n value := tload(slot)\n }\n }\n}\n" + }, + "contracts/ResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\n// SPDX-FileCopyrightText: 2022 Venus\npragma solidity 0.8.25;\n\nimport { PausableUpgradeable } from \"@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol\";\nimport { VBep20Interface } from \"./interfaces/VBep20Interface.sol\";\nimport { OracleInterface, ResilientOracleInterface, BoundValidatorInterface } from \"./interfaces/OracleInterface.sol\";\nimport { AccessControlledV8 } from \"@venusprotocol/governance-contracts/contracts/Governance/AccessControlledV8.sol\";\nimport { ICappedOracle } from \"./interfaces/ICappedOracle.sol\";\nimport { Transient } from \"./lib/Transient.sol\";\n\n/**\n * @title ResilientOracle\n * @author Venus\n * @notice The Resilient Oracle is the main contract that the protocol uses to fetch prices of assets.\n *\n * DeFi protocols are vulnerable to price oracle failures including oracle manipulation and incorrectly\n * reported prices. If only one oracle is used, this creates a single point of failure and opens a vector\n * for attacking the protocol.\n *\n * The Resilient Oracle uses multiple sources and fallback mechanisms to provide accurate prices and protect\n * the protocol from oracle attacks.\n *\n * For every market (vToken) we configure the main, pivot and fallback oracles. The oracles are configured per\n * vToken's underlying asset address. The main oracle oracle is the most trustworthy price source, the pivot\n * oracle is used as a loose sanity checker and the fallback oracle is used as a backup price source.\n *\n * To validate prices returned from two oracles, we use an upper and lower bound ratio that is set for every\n * market. The upper bound ratio represents the deviation between reported price (the price that’s being\n * validated) and the anchor price (the price we are validating against) above which the reported price will\n * be invalidated. The lower bound ratio presents the deviation between reported price and anchor price below\n * which the reported price will be invalidated. So for oracle price to be considered valid the below statement\n * should be true:\n\n```\nanchorRatio = anchorPrice/reporterPrice\nisValid = anchorRatio <= upperBoundAnchorRatio && anchorRatio >= lowerBoundAnchorRatio\n```\n\n * In most cases, Chainlink is used as the main oracle, other oracles are used as the pivot oracle depending\n * on which supports the given market and Binance oracle is used as the fallback oracle.\n *\n * For a fetched price to be valid it must be positive and not stagnant. If the price is invalid then we consider the\n * oracle to be stagnant and treat it like it's disabled.\n */\ncontract ResilientOracle is PausableUpgradeable, AccessControlledV8, ResilientOracleInterface {\n /**\n * @dev Oracle roles:\n * **main**: The most trustworthy price source\n * **pivot**: Price oracle used as a loose sanity checker\n * **fallback**: The backup source when main oracle price is invalidated\n */\n enum OracleRole {\n MAIN,\n PIVOT,\n FALLBACK\n }\n\n struct TokenConfig {\n /// @notice asset address\n address asset;\n /// @notice `oracles` stores the oracles based on their role in the following order:\n /// [main, pivot, fallback],\n /// It can be indexed with the corresponding enum OracleRole value\n address[3] oracles;\n /// @notice `enableFlagsForOracles` stores the enabled state\n /// for each oracle in the same order as `oracles`\n bool[3] enableFlagsForOracles;\n /// @notice `cachingEnabled` is a flag that indicates whether the asset price should be cached\n bool cachingEnabled;\n }\n\n uint256 public constant INVALID_PRICE = 0;\n\n /// @notice Native market address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable nativeMarket;\n\n /// @notice VAI address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n address public immutable vai;\n\n /// @notice Set this as asset address for Native token on each chain.This is the underlying for vBNB (on bsc)\n /// and can serve as any underlying asset of a market that supports native tokens\n address public constant NATIVE_TOKEN_ADDR = 0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB;\n\n /// @notice Slot to cache the asset's price, used for transient storage\n /// custom:storage-location erc7201:venus-protocol/oracle/ResilientOracle/cache\n /// keccak256(abi.encode(uint256(keccak256(\"venus-protocol/oracle/ResilientOracle/cache\")) - 1))\n /// & ~bytes32(uint256(0xff))\n bytes32 public constant CACHE_SLOT = 0x4e99ec55972332f5e0ef9c6623192c0401b609161bffae64d9ccdd7ad6cc7800;\n\n /// @notice Bound validator contract address\n /// @custom:oz-upgrades-unsafe-allow state-variable-immutable\n BoundValidatorInterface public immutable boundValidator;\n\n mapping(address => TokenConfig) private tokenConfigs;\n\n event TokenConfigAdded(\n address indexed asset,\n address indexed mainOracle,\n address indexed pivotOracle,\n address fallbackOracle\n );\n\n /// Event emitted when an oracle is set\n event OracleSet(address indexed asset, address indexed oracle, uint256 indexed role);\n\n /// Event emitted when an oracle is enabled or disabled\n event OracleEnabled(address indexed asset, uint256 indexed role, bool indexed enable);\n\n /// Event emitted when an asset cachingEnabled flag is set\n event CachedEnabled(address indexed asset, bool indexed enabled);\n\n /**\n * @notice Checks whether an address is null or not\n */\n modifier notNullAddress(address someone) {\n if (someone == address(0)) revert(\"can't be zero address\");\n _;\n }\n\n /**\n * @notice Checks whether token config exists by checking whether asset is null address\n * @dev address can't be null, so it's suitable to be used to check the validity of the config\n * @param asset asset address\n */\n modifier checkTokenConfigExistence(address asset) {\n if (tokenConfigs[asset].asset == address(0)) revert(\"token config must exist\");\n _;\n }\n\n /// @notice Constructor for the implementation contract. Sets immutable variables.\n /// @dev nativeMarketAddress can be address(0) if on the chain we do not support native market\n /// (e.g vETH on ethereum would not be supported, only vWETH)\n /// @param nativeMarketAddress The address of a native market (for bsc it would be vBNB address)\n /// @param vaiAddress The address of the VAI token (if there is VAI on the deployed chain).\n /// Set to address(0) of VAI is not existent.\n /// @param _boundValidator Address of the bound validator contract\n /// @custom:oz-upgrades-unsafe-allow constructor\n constructor(\n address nativeMarketAddress,\n address vaiAddress,\n BoundValidatorInterface _boundValidator\n ) notNullAddress(address(_boundValidator)) {\n nativeMarket = nativeMarketAddress;\n vai = vaiAddress;\n boundValidator = _boundValidator;\n\n _disableInitializers();\n }\n\n /**\n * @notice Initializes the contract admin and sets the BoundValidator contract address\n * @param accessControlManager_ Address of the access control manager contract\n */\n function initialize(address accessControlManager_) external initializer {\n __AccessControlled_init(accessControlManager_);\n __Pausable_init();\n }\n\n /**\n * @notice Pauses oracle\n * @custom:access Only Governance\n */\n function pause() external {\n _checkAccessAllowed(\"pause()\");\n _pause();\n }\n\n /**\n * @notice Unpauses oracle\n * @custom:access Only Governance\n */\n function unpause() external {\n _checkAccessAllowed(\"unpause()\");\n _unpause();\n }\n\n /**\n * @notice Batch sets token configs\n * @param tokenConfigs_ Token config array\n * @custom:access Only Governance\n * @custom:error Throws a length error if the length of the token configs array is 0\n */\n function setTokenConfigs(TokenConfig[] memory tokenConfigs_) external {\n if (tokenConfigs_.length == 0) revert(\"length can't be 0\");\n uint256 numTokenConfigs = tokenConfigs_.length;\n for (uint256 i; i < numTokenConfigs; ++i) {\n setTokenConfig(tokenConfigs_[i]);\n }\n }\n\n /**\n * @notice Sets oracle for a given asset and role.\n * @dev Supplied asset **must** exist and main oracle may not be null\n * @param asset Asset address\n * @param oracle Oracle address\n * @param role Oracle role\n * @custom:access Only Governance\n * @custom:error Null address error if main-role oracle address is null\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleSet event with asset address, oracle address and role of the oracle for the asset\n */\n function setOracle(\n address asset,\n address oracle,\n OracleRole role\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"setOracle(address,address,uint8)\");\n if (oracle == address(0) && role == OracleRole.MAIN) revert(\"can't set zero address to main oracle\");\n tokenConfigs[asset].oracles[uint256(role)] = oracle;\n emit OracleSet(asset, oracle, uint256(role));\n }\n\n /**\n * @notice Enables/ disables oracle for the input asset. Token config for the input asset **must** exist\n * @dev Configuration for the asset **must** already exist and the asset cannot be 0 address\n * @param asset Asset address\n * @param role Oracle role\n * @param enable Enabled boolean of the oracle\n * @custom:access Only Governance\n * @custom:error NotNullAddress error is thrown if asset address is null\n * @custom:error TokenConfigExistance error is thrown if token config is not set\n * @custom:event Emits OracleEnabled event with asset address, role of the oracle and enabled flag\n */\n function enableOracle(\n address asset,\n OracleRole role,\n bool enable\n ) external notNullAddress(asset) checkTokenConfigExistence(asset) {\n _checkAccessAllowed(\"enableOracle(address,uint8,bool)\");\n tokenConfigs[asset].enableFlagsForOracles[uint256(role)] = enable;\n emit OracleEnabled(asset, uint256(role), enable);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getUnderlyingPrice\n * @param vToken vToken address\n */\n function updatePrice(address vToken) external override {\n address asset = _getUnderlyingAsset(vToken);\n _updateAssetPrice(asset);\n }\n\n /**\n * @notice Updates the capped main oracle snapshot.\n * @dev This function should always be called before calling getPrice\n * @param asset asset address\n */\n function updateAssetPrice(address asset) external {\n _updateAssetPrice(asset);\n }\n\n /**\n * @dev Gets token config by asset address\n * @param asset asset address\n * @return tokenConfig Config for the asset\n */\n function getTokenConfig(address asset) external view returns (TokenConfig memory) {\n return tokenConfigs[asset];\n }\n\n /**\n * @notice Gets price of the underlying asset for a given vToken. Validation flow:\n * - Check if the oracle is paused globally\n * - Validate price from main oracle against pivot oracle\n * - Validate price from fallback oracle against pivot oracle if the first validation failed\n * - Validate price from main oracle against fallback oracle if the second validation failed\n * In the case that the pivot oracle is not available but main price is available and validation is successful,\n * main oracle price is returned.\n * @param vToken vToken address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getUnderlyingPrice(address vToken) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n\n address asset = _getUnderlyingAsset(vToken);\n return _getPrice(asset);\n }\n\n /**\n * @notice Gets price of the asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Paused error is thrown when resilent oracle is paused\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function getPrice(address asset) external view override returns (uint256) {\n if (paused()) revert(\"resilient oracle is paused\");\n return _getPrice(asset);\n }\n\n /**\n * @notice Sets/resets single token configs.\n * @dev main oracle **must not** be a null address\n * @param tokenConfig Token config struct\n * @custom:access Only Governance\n * @custom:error NotNullAddress is thrown if asset address is null\n * @custom:error NotNullAddress is thrown if main-role oracle address for asset is null\n * @custom:event Emits TokenConfigAdded event when the asset config is set successfully by the authorized account\n * @custom:event Emits CachedEnabled event when the asset cachingEnabled flag is set successfully\n */\n function setTokenConfig(\n TokenConfig memory tokenConfig\n ) public notNullAddress(tokenConfig.asset) notNullAddress(tokenConfig.oracles[uint256(OracleRole.MAIN)]) {\n _checkAccessAllowed(\"setTokenConfig(TokenConfig)\");\n\n tokenConfigs[tokenConfig.asset] = tokenConfig;\n emit TokenConfigAdded(\n tokenConfig.asset,\n tokenConfig.oracles[uint256(OracleRole.MAIN)],\n tokenConfig.oracles[uint256(OracleRole.PIVOT)],\n tokenConfig.oracles[uint256(OracleRole.FALLBACK)]\n );\n emit CachedEnabled(tokenConfig.asset, tokenConfig.cachingEnabled);\n }\n\n /**\n * @notice Gets oracle and enabled status by asset address\n * @param asset asset address\n * @param role Oracle role\n * @return oracle Oracle address based on role\n * @return enabled Enabled flag of the oracle based on token config\n */\n function getOracle(address asset, OracleRole role) public view returns (address oracle, bool enabled) {\n oracle = tokenConfigs[asset].oracles[uint256(role)];\n enabled = tokenConfigs[asset].enableFlagsForOracles[uint256(role)];\n }\n\n /**\n * @notice Updates the capped oracle snapshot.\n * @dev Cache the asset price and return if already cached\n * @param asset asset address\n */\n function _updateAssetPrice(address asset) internal {\n if (Transient.readCachedPrice(CACHE_SLOT, asset) != 0) {\n return;\n }\n\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracle != address(0) && mainOracleEnabled) {\n // if main oracle is not CorrelatedTokenOracle it will revert so we need to catch the revert\n try ICappedOracle(mainOracle).updateSnapshot() {} catch {}\n }\n\n if (_isCacheEnabled(asset)) {\n uint256 price = _getPrice(asset);\n Transient.cachePrice(CACHE_SLOT, asset, price);\n }\n }\n\n /**\n * @notice Gets price for the provided asset\n * @param asset asset address\n * @return price USD price in scaled decimal places.\n * @custom:error Invalid resilient oracle price error is thrown if fetched prices from oracle is invalid\n */\n function _getPrice(address asset) internal view returns (uint256) {\n uint256 pivotPrice = INVALID_PRICE;\n uint256 price;\n\n price = Transient.readCachedPrice(CACHE_SLOT, asset);\n if (price != 0) {\n return price;\n }\n\n // Get pivot oracle price, Invalid price if not available or error\n (address pivotOracle, bool pivotOracleEnabled) = getOracle(asset, OracleRole.PIVOT);\n if (pivotOracleEnabled && pivotOracle != address(0)) {\n try OracleInterface(pivotOracle).getPrice(asset) returns (uint256 pricePivot) {\n pivotPrice = pricePivot;\n } catch {}\n }\n\n // Compare main price and pivot price, return main price and if validation was successful\n // note: In case pivot oracle is not available but main price is available and\n // validation is successful, the main oracle price is returned.\n (uint256 mainPrice, bool validatedPivotMain) = _getMainOraclePrice(\n asset,\n pivotPrice,\n pivotOracleEnabled && pivotOracle != address(0)\n );\n if (mainPrice != INVALID_PRICE && validatedPivotMain) return mainPrice;\n\n // Compare fallback and pivot if main oracle comparision fails with pivot\n // Return fallback price when fallback price is validated successfully with pivot oracle\n (uint256 fallbackPrice, bool validatedPivotFallback) = _getFallbackOraclePrice(asset, pivotPrice);\n if (fallbackPrice != INVALID_PRICE && validatedPivotFallback) return fallbackPrice;\n\n // Lastly compare main price and fallback price\n if (\n mainPrice != INVALID_PRICE &&\n fallbackPrice != INVALID_PRICE &&\n boundValidator.validatePriceWithAnchorPrice(asset, mainPrice, fallbackPrice)\n ) {\n return mainPrice;\n }\n\n revert(\"invalid resilient oracle price\");\n }\n\n /**\n * @notice Gets a price for the provided asset\n * @dev This function won't revert when price is 0, because the fallback oracle may still be\n * able to fetch a correct price\n * @param asset asset address\n * @param pivotPrice Pivot oracle price\n * @param pivotEnabled If pivot oracle is not empty and enabled\n * @return price USD price in scaled decimals\n * e.g. asset decimals is 8 then price is returned as 10**18 * 10**(18-8) = 10**28 decimals\n * @return pivotValidated Boolean representing if the validation of main oracle price\n * and pivot oracle price were successful\n * @custom:error Invalid price error is thrown if main oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if main oracle is not enabled or main oracle\n * address is null\n */\n function _getMainOraclePrice(\n address asset,\n uint256 pivotPrice,\n bool pivotEnabled\n ) internal view returns (uint256, bool) {\n (address mainOracle, bool mainOracleEnabled) = getOracle(asset, OracleRole.MAIN);\n if (mainOracleEnabled && mainOracle != address(0)) {\n try OracleInterface(mainOracle).getPrice(asset) returns (uint256 mainOraclePrice) {\n if (!pivotEnabled) {\n return (mainOraclePrice, true);\n }\n if (pivotPrice == INVALID_PRICE) {\n return (mainOraclePrice, false);\n }\n return (\n mainOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, mainOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function won't revert when the price is 0 because getPrice checks if price is > 0\n * @param asset asset address\n * @return price USD price in 18 decimals\n * @return pivotValidated Boolean representing if the validation of fallback oracle price\n * and pivot oracle price were successfully\n * @custom:error Invalid price error is thrown if fallback oracle fails to fetch price of the asset\n * @custom:error Invalid price error is thrown if fallback oracle is not enabled or fallback oracle\n * address is null\n */\n function _getFallbackOraclePrice(address asset, uint256 pivotPrice) private view returns (uint256, bool) {\n (address fallbackOracle, bool fallbackEnabled) = getOracle(asset, OracleRole.FALLBACK);\n if (fallbackEnabled && fallbackOracle != address(0)) {\n try OracleInterface(fallbackOracle).getPrice(asset) returns (uint256 fallbackOraclePrice) {\n if (pivotPrice == INVALID_PRICE) {\n return (fallbackOraclePrice, false);\n }\n return (\n fallbackOraclePrice,\n boundValidator.validatePriceWithAnchorPrice(asset, fallbackOraclePrice, pivotPrice)\n );\n } catch {\n return (INVALID_PRICE, false);\n }\n }\n\n return (INVALID_PRICE, false);\n }\n\n /**\n * @dev This function returns the underlying asset of a vToken\n * @param vToken vToken address\n * @return asset underlying asset address\n */\n function _getUnderlyingAsset(address vToken) private view notNullAddress(vToken) returns (address asset) {\n if (vToken == nativeMarket) {\n asset = NATIVE_TOKEN_ADDR;\n } else if (vToken == vai) {\n asset = vai;\n } else {\n asset = VBep20Interface(vToken).underlying();\n }\n }\n\n /**\n * @dev This function checks if the asset price should be cached\n * @param asset asset address\n * @return bool true if caching is enabled, false otherwise\n */\n function _isCacheEnabled(address asset) private view returns (bool) {\n return tokenConfigs[asset].cachingEnabled;\n }\n}\n" + }, + "contracts/test/BEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract BEP20Harness is ERC20 {\n uint8 public decimalsInternal = 18;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) {\n decimalsInternal = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function decimals() public view virtual override returns (uint8) {\n return decimalsInternal;\n }\n}\n" + }, + "contracts/test/DeviationBoundedOracleCaller.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { IDeviationBoundedOracle } from \"../interfaces/IDeviationBoundedOracle.sol\";\n\n/// @notice Test helper that batches DeviationBoundedOracle calls in a single transaction\n/// so transient storage (tstore/tload) cache can be tested.\ncontract DeviationBoundedOracleCaller {\n IDeviationBoundedOracle public immutable oracle;\n\n constructor(address _oracle) {\n oracle = IDeviationBoundedOracle(_oracle);\n }\n\n function updateAndGetCollateralPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPriceView(vToken);\n }\n\n function updateAndGetDebtPrice(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateAndGetBothPrices(address vToken) external returns (uint256 collateral, uint256 debt) {\n oracle.updateProtectionState(vToken);\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n function updateThenNonViewCollateral(address vToken) external returns (uint256) {\n oracle.updateProtectionState(vToken);\n return oracle.getBoundedCollateralPrice(vToken);\n }\n\n function twoConsecutiveNonViewCollateral(address vToken) external returns (uint256 first, uint256 second) {\n first = oracle.getBoundedCollateralPrice(vToken);\n second = oracle.getBoundedCollateralPrice(vToken);\n }\n\n /// @notice Non-view wrapper so smock records oracle calls made by the view functions.\n function getViewPricesWithoutUpdateNonView(address vToken) external returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n\n /// @notice Calls updateProtectionState on vTokenA, then getBoundedCollateralPriceView on vTokenB.\n function updateAViewB(address vTokenA, address vTokenB) external returns (uint256) {\n oracle.updateProtectionState(vTokenA);\n return oracle.getBoundedCollateralPriceView(vTokenB);\n }\n\n function getViewPricesWithoutUpdate(address vToken) external view returns (uint256 collateral, uint256 debt) {\n collateral = oracle.getBoundedCollateralPriceView(vToken);\n debt = oracle.getBoundedDebtPriceView(vToken);\n }\n}\n" + }, + "contracts/test/MockAnkrBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAnkrBNB } from \"../interfaces/IAnkrBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAnkrBNB is ERC20, Ownable, IAnkrBNB {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setSharesToBonds(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function sharesToBonds(uint256 amount) external view override returns (uint256) {\n return (amount * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, IAnkrBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNB.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IAsBNB } from \"../interfaces/IAsBNB.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockAsBNB is ERC20, Ownable, IAsBNB {\n uint8 private immutable _decimals;\n address public minter;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals_,\n address minter_\n ) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n minter = minter_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setMinter(address minter_) external onlyOwner {\n minter = minter_;\n }\n\n function decimals() public view virtual override(ERC20, IAsBNB) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockAsBNBMinter.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { IAsBNBMinter } from \"../interfaces/IAsBNBMinter.sol\";\n\ncontract MockAsBNBMinter is IAsBNBMinter {\n function convertToTokens(uint256 _amount) external pure override returns (uint256) {\n return _amount;\n }\n}\n" + }, + "contracts/test/MockCallPrice.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { OracleInterface, ResilientOracleInterface } from \"../interfaces/OracleInterface.sol\";\n\ninterface CorrelatedTokenOracleInterface {\n function updateSnapshot() external;\n function getPrice(address asset) external view returns (uint256);\n}\n\ncontract MockCallPrice {\n function getMultiPrice(CorrelatedTokenOracleInterface oracle, address asset) public returns (uint256, uint256) {\n oracle.updateSnapshot();\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n\n function getUnderlyingPriceResilientOracle(\n ResilientOracleInterface oracle,\n address vToken\n ) public returns (uint256, uint256) {\n oracle.updatePrice(vToken);\n oracle.updatePrice(vToken);\n return (oracle.getUnderlyingPrice(vToken), oracle.getUnderlyingPrice(vToken));\n }\n\n function getAssetPriceResilientOracle(\n ResilientOracleInterface oracle,\n address asset\n ) public returns (uint256, uint256) {\n oracle.updateAssetPrice(asset);\n oracle.updateAssetPrice(asset);\n return (oracle.getPrice(asset), oracle.getPrice(asset));\n }\n}\n" + }, + "contracts/test/MockEtherFiLiquidityPool.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/IEtherFiLiquidityPool.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockEtherFiLiquidityPool is IEtherFiLiquidityPool, Ownable {\n /// @notice The amount of eETH per weETH scaled by 1e18\n uint256 public amountPerShare;\n\n constructor() Ownable() {}\n\n function setAmountPerShare(uint256 _amountPerShare) external onlyOwner {\n amountPerShare = _amountPerShare;\n }\n\n function amountForShare(uint256 _share) external view override returns (uint256) {\n return (_share * amountPerShare) / 1e18;\n }\n}\n" + }, + "contracts/test/MockSFrax.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { ISFrax } from \"../interfaces/ISFrax.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockSFrax is ERC20, Ownable, ISFrax {\n uint8 private immutable _decimals;\n uint256 public exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function convertToAssets(uint256 shares) external view override returns (uint256) {\n return (shares * exchangeRate) / (10 ** uint256(_decimals));\n }\n\n function decimals() public view virtual override(ERC20, ISFrax) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/MockSimpleOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../interfaces/OracleInterface.sol\";\n\ncontract MockSimpleOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n constructor() {\n //\n }\n\n function getUnderlyingPrice(address vToken) external view returns (uint256) {\n return prices[vToken];\n }\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n\ncontract MockBoundValidator is BoundValidatorInterface {\n mapping(address => bool) public validateResults;\n bool public twapUpdated;\n\n constructor() {\n //\n }\n\n function validatePriceWithAnchorPrice(\n address vToken,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[vToken];\n }\n\n function validateAssetPriceWithAnchorPrice(\n address asset,\n uint256 reporterPrice,\n uint256 anchorPrice\n ) external view returns (bool) {\n return validateResults[asset];\n }\n\n function setValidateResult(address token, bool pass) public {\n validateResults[token] = pass;\n }\n}\n" + }, + "contracts/test/MockV3Aggregator.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@chainlink/contracts/src/v0.8/interfaces/AggregatorV2V3Interface.sol\";\n\n/**\n * @title MockV3Aggregator\n * @notice Based on the FluxAggregator contract\n * @notice Use this contract when you need to test\n * other contract's ability to read data from an\n * aggregator contract, but how the aggregator got\n * its answer is unimportant\n */\ncontract MockV3Aggregator is AggregatorV2V3Interface {\n uint256 public constant version = 0;\n\n uint8 public decimals;\n int256 public latestAnswer;\n uint256 public latestTimestamp;\n uint256 public latestRound;\n\n mapping(uint256 => int256) public getAnswer;\n mapping(uint256 => uint256) public getTimestamp;\n mapping(uint256 => uint256) private getStartedAt;\n\n constructor(uint8 _decimals, int256 _initialAnswer) {\n decimals = _decimals;\n updateAnswer(_initialAnswer);\n }\n\n function getRoundData(\n uint80 _roundId\n )\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (_roundId, getAnswer[_roundId], getStartedAt[_roundId], getTimestamp[_roundId], _roundId);\n }\n\n function latestRoundData()\n external\n view\n returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)\n {\n return (\n uint80(latestRound),\n getAnswer[latestRound],\n getStartedAt[latestRound],\n getTimestamp[latestRound],\n uint80(latestRound)\n );\n }\n\n function description() external pure returns (string memory) {\n return \"v0.6/tests/MockV3Aggregator.sol\";\n }\n\n function updateAnswer(int256 _answer) public {\n latestAnswer = _answer;\n latestTimestamp = block.timestamp;\n latestRound++;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = block.timestamp;\n getStartedAt[latestRound] = block.timestamp;\n }\n\n function updateRoundData(uint80 _roundId, int256 _answer, uint256 _timestamp, uint256 _startedAt) public {\n latestRound = _roundId;\n latestAnswer = _answer;\n latestTimestamp = _timestamp;\n getAnswer[latestRound] = _answer;\n getTimestamp[latestRound] = _timestamp;\n getStartedAt[latestRound] = _startedAt;\n }\n}\n" + }, + "contracts/test/MockWBETH.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport { ERC20 } from \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\nimport { IWBETH } from \"../interfaces/IWBETH.sol\";\nimport \"@openzeppelin/contracts/access/Ownable.sol\";\n\ncontract MockWBETH is ERC20, Ownable, IWBETH {\n uint8 private immutable _decimals;\n uint256 public override exchangeRate;\n\n constructor(string memory name_, string memory symbol_, uint8 decimals_) ERC20(name_, symbol_) Ownable() {\n _decimals = decimals_;\n }\n\n function faucet(uint256 amount) external {\n _mint(msg.sender, amount);\n }\n\n function setExchangeRate(uint256 rate) external onlyOwner {\n exchangeRate = rate;\n }\n\n function decimals() public view virtual override(ERC20, IWBETH) returns (uint8) {\n return _decimals;\n }\n}\n" + }, + "contracts/test/oracles/MockCorrelatedTokenOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport { CorrelatedTokenOracle } from \"../../oracles/common/CorrelatedTokenOracle.sol\";\n\ncontract MockCorrelatedTokenOracle is CorrelatedTokenOracle {\n uint256 public mockUnderlyingAmount;\n\n constructor(\n address correlatedToken,\n address underlyingToken,\n address resilientOracle,\n uint256 annualGrowthRate,\n uint256 snapshotInterval,\n uint256 initialSnapshotMaxExchangeRate,\n uint256 initialSnapshotTimestamp,\n address accessControlManager,\n uint256 snapshotGap\n )\n CorrelatedTokenOracle(\n correlatedToken,\n underlyingToken,\n resilientOracle,\n annualGrowthRate,\n snapshotInterval,\n initialSnapshotMaxExchangeRate,\n initialSnapshotTimestamp,\n accessControlManager,\n snapshotGap\n )\n {}\n\n function setMockUnderlyingAmount(uint256 amount) external {\n mockUnderlyingAmount = amount;\n }\n\n function getUnderlyingAmount() public view override returns (uint256) {\n return mockUnderlyingAmount;\n }\n}\n" + }, + "contracts/test/oracles/MockERC20.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"@openzeppelin/contracts/token/ERC20/ERC20.sol\";\n\ncontract MockERC20 is ERC20 {\n constructor(string memory name, string memory symbol, uint8 decimals) ERC20(name, symbol) {\n _mint(msg.sender, 100000 * 10 ** uint256(decimals));\n }\n}\n" + }, + "contracts/test/oracles/MockResilientOracle.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"../../interfaces/OracleInterface.sol\";\n\ncontract MockOracle is OracleInterface {\n mapping(address => uint256) public prices;\n\n function getPrice(address asset) external view returns (uint256) {\n return prices[asset];\n }\n\n function setPrice(address vToken, uint256 price) public {\n prices[vToken] = price;\n }\n}\n" + }, + "contracts/test/PancakePairHarness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\n// a library for performing various math operations\n\nlibrary Math {\n function min(uint256 x, uint256 y) internal pure returns (uint256 z) {\n z = x < y ? x : y;\n }\n\n // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)\n function sqrt(uint256 y) internal pure returns (uint256 z) {\n if (y > 3) {\n z = y;\n uint256 x = y / 2 + 1;\n while (x < z) {\n z = x;\n x = (y / x + x) / 2;\n }\n } else if (y != 0) {\n z = 1;\n }\n }\n}\n\n// range: [0, 2**112 - 1]\n// resolution: 1 / 2**112\n\nlibrary UQ112x112 {\n //solhint-disable-next-line state-visibility\n uint224 constant Q112 = 2 ** 112;\n\n // encode a uint112 as a UQ112x112\n function encode(uint112 y) internal pure returns (uint224 z) {\n z = uint224(y) * Q112; // never overflows\n }\n\n // divide a UQ112x112 by a uint112, returning a UQ112x112\n function uqdiv(uint224 x, uint112 y) internal pure returns (uint224 z) {\n z = x / uint224(y);\n }\n}\n\ncontract PancakePairHarness {\n using UQ112x112 for uint224;\n\n address public token0;\n address public token1;\n\n uint112 private reserve0; // uses single storage slot, accessible via getReserves\n uint112 private reserve1; // uses single storage slot, accessible via getReserves\n uint32 private blockTimestampLast; // uses single storage slot, accessible via getReserves\n\n uint256 public price0CumulativeLast;\n uint256 public price1CumulativeLast;\n uint256 public kLast; // reserve0 * reserve1, as of immediately after the most recent liquidity event\n\n // called once by the factory at time of deployment\n function initialize(address _token0, address _token1) external {\n token0 = _token0;\n token1 = _token1;\n }\n\n // update reserves and, on the first call per block, price accumulators\n function update(uint256 balance0, uint256 balance1, uint112 _reserve0, uint112 _reserve1) external {\n require(balance0 <= type(uint112).max && balance1 <= type(uint112).max, \"PancakeV2: OVERFLOW\");\n uint32 blockTimestamp = uint32(block.timestamp % 2 ** 32);\n unchecked {\n uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired\n if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) {\n // * never overflows, and + overflow is desired\n price0CumulativeLast += uint256(UQ112x112.encode(_reserve1).uqdiv(_reserve0)) * timeElapsed;\n price1CumulativeLast += uint256(UQ112x112.encode(_reserve0).uqdiv(_reserve1)) * timeElapsed;\n }\n }\n reserve0 = uint112(balance0);\n reserve1 = uint112(balance1);\n blockTimestampLast = blockTimestamp;\n }\n\n function currentBlockTimestamp() external view returns (uint32) {\n return uint32(block.timestamp % 2 ** 32);\n }\n\n function getReserves() public view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast) {\n _reserve0 = reserve0;\n _reserve1 = reserve1;\n _blockTimestampLast = blockTimestampLast;\n }\n}\n" + }, + "contracts/test/VBEP20Harness.sol": { + "content": "// SPDX-License-Identifier: BSD-3-Clause\npragma solidity 0.8.25;\n\nimport \"./BEP20Harness.sol\";\n\ncontract VBEP20Harness is BEP20Harness {\n /**\n * @notice Underlying asset for this VToken\n */\n address public underlying;\n\n constructor(\n string memory name_,\n string memory symbol_,\n uint8 decimals,\n address underlying_\n ) BEP20Harness(name_, symbol_, decimals) {\n underlying = underlying_;\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../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 * By default, the owner account will be the one that deploys the contract. This\n * can 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 event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor (address initialOwner) {\n _transferOwnership(initialOwner);\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 called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing 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 require(newOwner != address(0), \"Ownable: new owner is the zero address\");\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/interfaces/draft-IERC1822.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.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 IERC1822Proxiable {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/beacon/IBeacon.sol": { + "content": "// 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 IBeacon {\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/ERC1967/ERC1967Proxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../Proxy.sol\";\nimport \"./ERC1967Upgrade.sol\";\n\n/**\n * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an\n * implementation address that can be changed. This address is stored in storage in the location specified by\n * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the\n * implementation behind the proxy.\n */\ncontract ERC1967Proxy is Proxy, ERC1967Upgrade {\n /**\n * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.\n *\n * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded\n * function call, and allows initializating the storage of the proxy like a Solidity constructor.\n */\n constructor(address _logic, bytes memory _data) payable {\n assert(_IMPLEMENTATION_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.implementation\")) - 1));\n _upgradeToAndCall(_logic, _data, false);\n }\n\n /**\n * @dev Returns the current implementation address.\n */\n function _implementation() internal view virtual override returns (address impl) {\n return ERC1967Upgrade._getImplementation();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/ERC1967/ERC1967Upgrade.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/ERC1967/ERC1967Upgrade.sol)\n\npragma solidity ^0.8.2;\n\nimport \"../beacon/IBeacon.sol\";\nimport \"../../interfaces/draft-IERC1822.sol\";\nimport \"../../utils/Address.sol\";\nimport \"../../utils/StorageSlot.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 *\n * @custom:oz-upgrades-unsafe-allow delegatecall\n */\nabstract contract ERC1967Upgrade {\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 /**\n * @dev Emitted when the implementation is upgraded.\n */\n event Upgraded(address indexed implementation);\n\n /**\n * @dev Returns the current implementation address.\n */\n function _getImplementation() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newImplementation), \"ERC1967: new implementation is not a contract\");\n StorageSlot.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) internal {\n _upgradeTo(newImplementation);\n if (data.length > 0 || forceCall) {\n Address.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(\n address newImplementation,\n bytes memory data,\n bool forceCall\n ) 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 (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {\n _setImplementation(newImplementation);\n } else {\n try IERC1822Proxiable(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 Emitted when the admin account has changed.\n */\n event AdminChanged(address previousAdmin, address newAdmin);\n\n /**\n * @dev Returns the current admin.\n */\n function _getAdmin() internal view virtual returns (address) {\n return StorageSlot.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 StorageSlot.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 Emitted when the beacon is upgraded.\n */\n event BeaconUpgraded(address indexed beacon);\n\n /**\n * @dev Returns the current beacon.\n */\n function _getBeacon() internal view returns (address) {\n return StorageSlot.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(Address.isContract(newBeacon), \"ERC1967: new beacon is not a contract\");\n require(Address.isContract(IBeacon(newBeacon).implementation()), \"ERC1967: beacon implementation is not a contract\");\n StorageSlot.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(\n address newBeacon,\n bytes memory data,\n bool forceCall\n ) internal {\n _setBeacon(newBeacon);\n emit BeaconUpgraded(newBeacon);\n if (data.length > 0 || forceCall) {\n Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/Proxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (proxy/Proxy.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM\n * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to\n * be specified by overriding the virtual {_implementation} function.\n *\n * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a\n * different contract through the {_delegate} function.\n *\n * The success and return data of the delegated call will be returned back to the caller of the proxy.\n */\nabstract contract Proxy {\n /**\n * @dev Delegates the current call to `implementation`.\n *\n * This function does not return to its internal call site, it will return directly to the external caller.\n */\n function _delegate(address implementation) internal virtual {\n assembly {\n // Copy msg.data. We take full control of memory in this inline assembly\n // block because it will not return to Solidity code. We overwrite the\n // Solidity scratch pad at memory position 0.\n calldatacopy(0, 0, calldatasize())\n\n // Call the implementation.\n // out and outsize are 0 because we don't know the size yet.\n let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)\n\n // Copy the returned data.\n returndatacopy(0, 0, returndatasize())\n\n switch result\n // delegatecall returns 0 on error.\n case 0 {\n revert(0, returndatasize())\n }\n default {\n return(0, returndatasize())\n }\n }\n }\n\n /**\n * @dev This is a virtual function that should be overriden so it returns the address to which the fallback function\n * and {_fallback} should delegate.\n */\n function _implementation() internal view virtual returns (address);\n\n /**\n * @dev Delegates the current call to the address returned by `_implementation()`.\n *\n * This function does not return to its internall call site, it will return directly to the external caller.\n */\n function _fallback() internal virtual {\n _beforeFallback();\n _delegate(_implementation());\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other\n * function in the contract matches the call data.\n */\n fallback() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data\n * is empty.\n */\n receive() external payable virtual {\n _fallback();\n }\n\n /**\n * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`\n * call, or as part of the Solidity `fallback` or `receive` functions.\n *\n * If overriden should call `super._beforeFallback()`.\n */\n function _beforeFallback() internal virtual {}\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/ProxyAdmin.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/ProxyAdmin.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./TransparentUpgradeableProxy.sol\";\nimport \"../../access/Ownable.sol\";\n\n/**\n * @dev This is an auxiliary contract meant to be assigned as the admin of a {TransparentUpgradeableProxy}. For an\n * explanation of why you would want to use this see the documentation for {TransparentUpgradeableProxy}.\n */\ncontract ProxyAdmin is Ownable {\n\n constructor (address initialOwner) Ownable(initialOwner) {}\n\n /**\n * @dev Returns the current implementation of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyImplementation(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"implementation()\")) == 0x5c60da1b\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"5c60da1b\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Returns the current admin of `proxy`.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function getProxyAdmin(TransparentUpgradeableProxy proxy) public view virtual returns (address) {\n // We need to manually run the static call since the getter cannot be flagged as view\n // bytes4(keccak256(\"admin()\")) == 0xf851a440\n (bool success, bytes memory returndata) = address(proxy).staticcall(hex\"f851a440\");\n require(success);\n return abi.decode(returndata, (address));\n }\n\n /**\n * @dev Changes the admin of `proxy` to `newAdmin`.\n *\n * Requirements:\n *\n * - This contract must be the current admin of `proxy`.\n */\n function changeProxyAdmin(TransparentUpgradeableProxy proxy, address newAdmin) public virtual onlyOwner {\n proxy.changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation`. See {TransparentUpgradeableProxy-upgradeTo}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgrade(TransparentUpgradeableProxy proxy, address implementation) public virtual onlyOwner {\n proxy.upgradeTo(implementation);\n }\n\n /**\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation. See\n * {TransparentUpgradeableProxy-upgradeToAndCall}.\n *\n * Requirements:\n *\n * - This contract must be the admin of `proxy`.\n */\n function upgradeAndCall(\n TransparentUpgradeableProxy proxy,\n address implementation,\n bytes memory data\n ) public payable virtual onlyOwner {\n proxy.upgradeToAndCall{value: msg.value}(implementation, data);\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/proxy/transparent/TransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract TransparentUpgradeableProxy is ERC1967Proxy {\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _changeAdmin(admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Changes the admin of the proxy.\n *\n * Emits an {AdminChanged} event.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-changeProxyAdmin}.\n */\n function changeAdmin(address newAdmin) external virtual ifAdmin {\n _changeAdmin(newAdmin);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0-rc.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\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 *\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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, \"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(\n address target,\n bytes memory data,\n uint256 value\n ) 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 require(isContract(target), \"Address: call to non-contract\");\n\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResult(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 require(isContract(target), \"Address: static call to non-contract\");\n\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResult(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 require(isContract(target), \"Address: delegate call to non-contract\");\n\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResult(success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason 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 // 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\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}\n" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\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" + }, + "hardhat-deploy/solc_0.8/openzeppelin/utils/StorageSlot.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/StorageSlot.sol)\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 * ```\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`, and `uint256`._\n */\nlibrary StorageSlot {\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 /**\n * @dev Returns an `AddressSlot` with member `value` located at `slot`.\n */\n function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {\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 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 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 assembly {\n r.slot := slot\n }\n }\n}\n" + }, + "hardhat-deploy/solc_0.8/proxy/OptimizedTransparentUpgradeableProxy.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (proxy/transparent/TransparentUpgradeableProxy.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../openzeppelin/proxy/ERC1967/ERC1967Proxy.sol\";\n\n/**\n * @dev This contract implements a proxy that is upgradeable by an admin.\n *\n * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector\n * clashing], which can potentially be used in an attack, this contract uses the\n * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two\n * things that go hand in hand:\n *\n * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if\n * that call matches one of the admin functions exposed by the proxy itself.\n * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the\n * implementation. If the admin tries to call a function on the implementation it will fail with an error that says\n * \"admin cannot fallback to proxy target\".\n *\n * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing\n * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due\n * to sudden errors when trying to call a function from the proxy implementation.\n *\n * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,\n * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.\n */\ncontract OptimizedTransparentUpgradeableProxy is ERC1967Proxy {\n address internal immutable _ADMIN;\n\n /**\n * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and\n * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.\n */\n constructor(\n address _logic,\n address admin_,\n bytes memory _data\n ) payable ERC1967Proxy(_logic, _data) {\n assert(_ADMIN_SLOT == bytes32(uint256(keccak256(\"eip1967.proxy.admin\")) - 1));\n _ADMIN = admin_;\n\n // still store it to work with EIP-1967\n bytes32 slot = _ADMIN_SLOT;\n // solhint-disable-next-line no-inline-assembly\n assembly {\n sstore(slot, admin_)\n }\n emit AdminChanged(address(0), admin_);\n }\n\n /**\n * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.\n */\n modifier ifAdmin() {\n if (msg.sender == _getAdmin()) {\n _;\n } else {\n _fallback();\n }\n }\n\n /**\n * @dev Returns the current admin.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyAdmin}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103`\n */\n function admin() external ifAdmin returns (address admin_) {\n admin_ = _getAdmin();\n }\n\n /**\n * @dev Returns the current implementation.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-getProxyImplementation}.\n *\n * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using the\n * https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call.\n * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`\n */\n function implementation() external ifAdmin returns (address implementation_) {\n implementation_ = _implementation();\n }\n\n /**\n * @dev Upgrade the implementation of the proxy.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgrade}.\n */\n function upgradeTo(address newImplementation) external ifAdmin {\n _upgradeToAndCall(newImplementation, bytes(\"\"), false);\n }\n\n /**\n * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified\n * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the\n * proxied contract.\n *\n * NOTE: Only the admin can call this function. See {ProxyAdmin-upgradeAndCall}.\n */\n function upgradeToAndCall(address newImplementation, bytes calldata data) external payable ifAdmin {\n _upgradeToAndCall(newImplementation, data, true);\n }\n\n /**\n * @dev Returns the current admin.\n */\n function _admin() internal view virtual returns (address) {\n return _getAdmin();\n }\n\n /**\n * @dev Makes sure the admin cannot access the fallback function. See {Proxy-_beforeFallback}.\n */\n function _beforeFallback() internal virtual override {\n require(msg.sender != _getAdmin(), \"TransparentUpgradeableProxy: admin cannot fallback to proxy target\");\n super._beforeFallback();\n }\n\n function _getAdmin() internal view virtual override returns (address) {\n return _ADMIN;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 200, + "details": { + "yul": true + } + }, + "evmVersion": "cancun", + "outputSelection": { + "*": { + "*": [ + "storageLayout", + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "evm.gasEstimates" + ], + "": ["ast"] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} From 12e375f1eaf6f00d15fd2815a1c2ce39401abdca Mon Sep 17 00:00:00 2001 From: GitGuru7 <128375421+GitGuru7@users.noreply.github.com> Date: Fri, 1 May 2026 10:55:54 +0000 Subject: [PATCH 28/30] feat: updating deployment files --- deployments/bsctestnet.json | 2887 +++++++++++++++++++++++++ deployments/bsctestnet_addresses.json | 3 + 2 files changed, 2890 insertions(+) diff --git a/deployments/bsctestnet.json b/deployments/bsctestnet.json index 18c1e5bb..e519494e 100644 --- a/deployments/bsctestnet.json +++ b/deployments/bsctestnet.json @@ -4488,6 +4488,2893 @@ } ] }, + "DeviationBoundedOracle": { + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "abi": [ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint64[]", + "name": "cooldownPeriods", + "type": "uint64[]" + }, + { + "internalType": "uint256[]", + "name": "triggerThresholds", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "resetThresholds", + "type": "uint256[]" + }, + { + "internalType": "bool[]", + "name": "enableBoundedPricings", + "type": "bool[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + } + ] + }, + "DeviationBoundedOracle_Implementation": { + "address": "0x90c9756446ebA9E1762811c239Fe10029019e35e", + "abi": [ + { + "inputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "_resilientOracle", + "type": "address" + }, + { + "internalType": "address", + "name": "nativeMarketAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "vaiAddress", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + } + ], + "name": "CooldownNotElapsed", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidArrayLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint8", + "name": "action", + "type": "uint8" + } + ], + "name": "InvalidKeeperAction", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMaxPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + }, + { + "internalType": "uint256", + "name": "currentSpot", + "type": "uint256" + } + ], + "name": "InvalidMinPrice", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "InvalidResetThreshold", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketAlreadyInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "MarketNotInitialized", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "PriceExceedsUint128", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "currentRangeRatio", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + } + ], + "name": "PriceRangeNotConverged", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceActive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectedPriceInactive", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maximum", + "type": "uint256" + } + ], + "name": "ThresholdAboveMaximum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "threshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "minimum", + "type": "uint256" + } + ], + "name": "ThresholdBelowMinimum", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "sender", + "type": "address" + }, + { + "internalType": "address", + "name": "calledContract", + "type": "address" + }, + { + "internalType": "string", + "name": "methodSignature", + "type": "string" + } + ], + "name": "Unauthorized", + "type": "error" + }, + { + "inputs": [], + "name": "VAINotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddressNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPriceNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroValueNotAllowed", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "whitelisted", + "type": "bool" + } + ], + "name": "BoundedPricingWhitelistUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "oldEnabled", + "type": "bool" + }, + { + "indexed": false, + "internalType": "bool", + "name": "newEnabled", + "type": "bool" + } + ], + "name": "CachingEnabledUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "oldCooldown", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "CooldownPeriodSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMax", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "MaxPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "oldMin", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "MinPriceUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "oldAccessControlManager", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAccessControlManager", + "type": "address" + } + ], + "name": "NewAccessControlManager", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferStarted", + "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": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + } + ], + "name": "ProtectionInitialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "ProtectionModeExited", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "spotPrice", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "indexed": false, + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + } + ], + "name": "ProtectionTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldExitThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newExitThreshold", + "type": "uint256" + } + ], + "name": "ResetThresholdSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "oldThreshold", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "newThreshold", + "type": "uint256" + } + ], + "name": "TriggerThresholdSet", + "type": "event" + }, + { + "inputs": [], + "name": "COLLATERAL_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEBT_PRICE_CACHE_SLOT", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "KEEPER_DEADBAND", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MAX_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MIN_THRESHOLD", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NATIVE_TOKEN_ADDR", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESILIENT_ORACLE", + "outputs": [ + { + "internalType": "contract ResilientOracleInterface", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "acceptOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "accessControlManager", + "outputs": [ + { + "internalType": "contract IAccessControlManagerV8", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allAssets", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "name": "assetProtectionConfig", + "outputs": [ + { + "internalType": "uint128", + "name": "minPrice", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "maxPrice", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "currentlyUsingProtectedPrice", + "type": "bool" + }, + { + "internalType": "bool", + "name": "isBoundedPricingEnabled", + "type": "bool" + }, + { + "internalType": "uint64", + "name": "lastProtectionTriggeredAt", + "type": "uint64" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "triggerThreshold", + "type": "uint128" + }, + { + "internalType": "uint128", + "name": "resetThreshold", + "type": "uint128" + }, + { + "internalType": "bool", + "name": "cachingEnabled", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "canExitProtection", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "assets", + "type": "address[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMins", + "type": "uint128[]" + }, + { + "internalType": "uint128[]", + "name": "proposedMaxs", + "type": "uint128[]" + } + ], + "name": "checkAndGetWindowDrift", + "outputs": [ + { + "internalType": "bool[]", + "name": "needsMinUpdate", + "type": "bool[]" + }, + { + "internalType": "bool[]", + "name": "needsMaxUpdate", + "type": "bool[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "currentlyUsingProtectedPrice", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "exitProtectionMode", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getAllBoundedPricingEnabledAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedCollateralPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPrice", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedDebtPriceView", + "outputs": [ + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPrices", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "getBoundedPricesView", + "outputs": [ + { + "internalType": "uint256", + "name": "collateralPrice", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "debtPrice", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getInitializedAssets", + "outputs": [ + { + "internalType": "address[]", + "name": "", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + } + ], + "name": "isBoundedPricingEnabled", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "nativeMarket", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "pendingOwner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "accessControlManager_", + "type": "address" + } + ], + "name": "setAccessControlManager", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setAssetBoundedPricingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "bool", + "name": "enabled", + "type": "bool" + } + ], + "name": "setCachingEnabled", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "newCooldown", + "type": "uint64" + } + ], + "name": "setCooldownPeriod", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint256", + "name": "newTriggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newResetThreshold", + "type": "uint256" + } + ], + "name": "setThresholds", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput", + "name": "tokenConfig_", + "type": "tuple" + } + ], + "name": "setTokenConfig", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint64", + "name": "cooldownPeriod", + "type": "uint64" + }, + { + "internalType": "uint256", + "name": "triggerThreshold", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "resetThreshold", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "enableBoundedPricing", + "type": "bool" + }, + { + "internalType": "bool", + "name": "enableCaching", + "type": "bool" + } + ], + "internalType": "struct IDeviationBoundedOracle.TokenConfigInput[]", + "name": "tokenConfigs_", + "type": "tuple[]" + } + ], + "name": "setTokenConfigs", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "enum IDeviationBoundedOracle.KeeperAction", + "name": "action", + "type": "uint8" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "internalType": "struct IDeviationBoundedOracle.KeeperActionItem[]", + "name": "actions", + "type": "tuple[]" + } + ], + "name": "syncPriceBoundsAndProtections", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMax", + "type": "uint128" + } + ], + "name": "updateMaxPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "asset", + "type": "address" + }, + { + "internalType": "uint128", + "name": "newMin", + "type": "uint128" + } + ], + "name": "updateMinPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "vToken", + "type": "address" + } + ], + "name": "updateProtectionState", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "vai", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + } + ] + }, + "DeviationBoundedOracle_Proxy": { + "address": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_logic", + "type": "address" + }, + { + "internalType": "address", + "name": "admin_", + "type": "address" + }, + { + "internalType": "bytes", + "name": "_data", + "type": "bytes" + } + ], + "stateMutability": "payable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "beacon", + "type": "address" + } + ], + "name": "BeaconUpgraded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { + "stateMutability": "payable", + "type": "fallback" + }, + { + "inputs": [], + "name": "admin", + "outputs": [ + { + "internalType": "address", + "name": "admin_", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "implementation", + "outputs": [ + { + "internalType": "address", + "name": "implementation_", + "type": "address" + } + ], + "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" + }, + { + "stateMutability": "payable", + "type": "receive" + } + ] + }, "MockAnkrBNB": { "address": "0x5269b7558D3d5E113010Ef1cFF0901c367849CC9", "abi": [ diff --git a/deployments/bsctestnet_addresses.json b/deployments/bsctestnet_addresses.json index d6de5c58..61e14359 100644 --- a/deployments/bsctestnet_addresses.json +++ b/deployments/bsctestnet_addresses.json @@ -15,6 +15,9 @@ "ChainlinkOracle_Implementation": "0xBea89b7560Ec88f75f31A8E62da7F2d52c807416", "ChainlinkOracle_Proxy": "0xCeA29f1266e880A1482c06eD656cD08C148BaA32", "DefaultProxyAdmin": "0xef480a5654b231ff7d80A0681F938f3Db71a6Ca6", + "DeviationBoundedOracle": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", + "DeviationBoundedOracle_Implementation": "0x90c9756446ebA9E1762811c239Fe10029019e35e", + "DeviationBoundedOracle_Proxy": "0xE0dafC97895B3c98d3B96D3f8739AaC73166beB8", "MockAnkrBNB": "0x5269b7558D3d5E113010Ef1cFF0901c367849CC9", "MockAsBNB": "0xc625f060ad25f4A6c2d9eBF30C133dB61B7AF072", "MockAsBNBMinter": "0x0E35fe8594551Eba23f7BC191De20612a0f152F4", From 495c2cca6ecb1b5a8d5a23601516ef34ee642a91 Mon Sep 17 00:00:00 2001 From: GitGuru7 Date: Tue, 5 May 2026 13:23:14 +0530 Subject: [PATCH 29/30] add certik and hashdit audit report --- ...eviationBoundedOracle_hashdit_20260417.pdf | Bin 0 -> 336393 bytes ...deviationBoundedOracle_certik_20260423.pdf | Bin 0 -> 2341713 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/183_deviationBoundedOracle_hashdit_20260417.pdf create mode 100644 audits/184_deviationBoundedOracle_certik_20260423.pdf diff --git a/audits/183_deviationBoundedOracle_hashdit_20260417.pdf b/audits/183_deviationBoundedOracle_hashdit_20260417.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a74cd4d4903739fac99996679758ef2c1f4afaba GIT binary patch literal 336393 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
    5GY4Rrw}5U(#RKg+n=z7A>;q&`M=B5^8WE8mIo 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

    lw2wHpmm|kCroI;8e zsly6ob5AW^c+#+p2Y#(%nfQFJ{hl?geQ=aLIRW0InOt60fk2C}0 zM}DZ^S`uJWZ>`Yo*Q|=@%{$8z5?5@hLcCSaGfE=jnRP3MUO=IJ#=N9MF{0i(84ZVN z-Dx|hfl5giZM%x9LmNpg*mu%S%Fq%R$eZE*VL@x_F~QV~%QXPnFMm*BPGjD+vCtM4 zFKeiVGRaw;5#VJ+S0_2;WSp<56lURTajCfOg7C<5! zEI8FfMy3bz+yXnuPkW)<1OmgQ&WDi#LE@H+xSAeLyr%w@_M8%?&5Wal5PZnxzk*+K z-=<26cr^2>q2UU`ivL7MFCIi^pHvgMT zSPS=FY!>ndM@B3$0#E00np)NOLY-i*7;`0+pz848>8cz{B(4N2+s98g`o(pcq~@3A zLbkPM3QsVD=4bY-xosr%aKprzme&@xaRo!4-ETSo;bj6?bdbZim00HFgga#gdY=2v zov-A|BSaceS8L}?sAA*|Q)T_{haPk#51sMF8a*=eG-}|wMc8dThQd-iYB-OCi7+^I z=_JO3j2CvH=_39y*%^4G{Cgc(Q=JZO3P4f%i)BrRg1?ufkjX2?XFQy=|3M3tFHeaW zOlFI%O+*_Uqlr_U`&XP+)_ayFW7sn3*>5KZ)bgoIk8YR$Wdxg3&IvnZ8xKf7lo2&4 zgOHbP%}{6z!2E@aH&bI9uRQHpDhBz_5E$O%QuhoHIWc6HiG#G=4lfq+SIv+4+ z@c1NbI*S`+f(uDFJH8!*gweID={uJt|0W20^lWXlSXH2P02>Nr&r*P(i61|h8C3lI zF*Hc|>;?eR?lH)7Y%S!-#mk%kjHvNktI3TUs}ksAVkaVSoPaHK5ZYD ziC~GKDkT5zZF6|FzgTv_($Sd^trCf8(pzjIf=v$*vE{Pa-aWUgkF7pT<(V8n?J9A zb1&o=OL4-*JNtYs_w(X;yT2TR!U({ni93sd7uJYu+K=>)r;EXX0{X!EP5ujmUuX4qxAAJ=6^?Q8o>X-g@(SIHesJZC7dWJ*}L`!nRa3*R) zC5VbQT>Zuv+N?%=kCF7NNPOy^(T0I035<6M*(Mtpu3ix3{T{Av>_7f~``o?xI7TGQ z{NP^{iocU5+nxEYM$C&odk(SVS~&i0w*82B9Qf2btN4E3#s9toqSkWmp*TfQ18hZH zEr$4fJ>A@U1iP0M-ZvOpleYb?Vm4u@9 zS^vD_Mf{&@W2elR$~*mSqTDz|@{f%k6cBT$3PLd$Ki&`m9RGt)#IBFKoB46(VqgPm zt-VATfMeB&>9hUoED}t?4~1qZnCQ2}B?k)ji+avApL;!KsSpo?=cl;5 z{rc_o7W4=pxx_}xW|;+GB=cPs6;v|`?qdc{- zkjAM-aZ(tKDSeRSL4kw*8_(BdFGnFXNj_jLkM|{kmYobQX`Tz|!kJLC1aQPbG0?w5 zlgA4{hiPg`6eEUiU~F8hD1e9;gZA=8qa+VKF_D(ru_;vAh=kI(~J_K7(zCn99Z&CXFcvKV-)sl z9Vm`#1nd%s4U|^Gj&SL(E~6#AJVEi55V})LfCVKR zD%Ml|y}|?!@YFEfB+`?jf1v@808?W+I3#84M1_Hdm3sw-@e$iUW!Ngr5J^XjXIHr? zN&iiHHJn?MI8T-n3Jztj&%q49G=Oe(YF&jCQeRX?6HATQ-!b%45(vvC4_kJQ$>$5o z-?oW?_DlGY#aSOL6@$3c(?nsOIH>84KuR+|n%t?Cke>&lRfZ}Q6gsu(jYP|T|56CM z++U-6v?lK1=(_mXePk;ZwAD9(%P887Qeuo|grdwbfJatwbBRRwFpZKIpjcQn*ZJB^0);q%5Q;!$3rf?V!nMGS z<+UoPv7mG${R;_)B_VjYbo!SlZGm9wg@=I^vm$pqbOA85bc~*cRc(2&h4?YI$t%%y z3_~Zr@?hYcjd%nO_;!$AQj-aKhrs1MVG3sc4@>+U*M3acN4S%28Vf4;RF|7zp;#H~ z-bJgZAbPY;gdTd_9Tsq@c|tbZ4OAt+h!f)rPm^k&SX`8**?*4=UEsOdB%KFj=VhHKCbTQ@+qpg==hX zNXy1Cmnh5F5T4os z41v|g7C86S-u0w+DbM4xTbpOZ4wYr~#S=i7bW2ZB@GUI-v06PD8}2%G34)HGFwsSA zB6^WD*+C+xnfnZ{#T$XWT5csPb|)w~3e&3COg5cHFW1M-q{iVl3R~eYLm(y+%SD+} zzuYBFHx~TWaD^aRV3Us9g3u)fSGdArqvGzvNSDBb>55Bbn1RPpJXfXANC$;x1PH98 zLnCJ&Eap8o7+B?|=cuV;WaI!O*cx%vgx~-hCfC8ARt)%>fXAYS#&f*IOZpDv1JX8` zto6xe%#wD~Q58*J>67Tdtk^F_|3jM zHL^Ao9vNt#>ni8|81YNp+IEm2y#iy|@`2zUJED8U@?%SxiU1YH%G{DfND9%zd6A@` zWyzV&^dJVkd2Ed0v9X0i^Yns!Sbvw5C%S%q)AkjZc*E(p?p{$wcx6(O@?uGun71cE z+`#Q%esWZ14I2iw_Dt?>!E(CH)EsC!G;gw!E_>w^*;U-xzWoWw;N=e`4kB|^nm)4> zOS8fI(l*N+Cv5z3)@Pwq_H{rb!sGdA9a&0a{~$QQL>2xi;bcjmGKa=ACkcot@4Df= zGd^OaiQVdL7}OvizvffOsk0&amj5OO0#T1N7JEAHTAJtxM^JQR9L=^m%T~` zqR<(O7HOfN6)nJ(YwW(%A93Q}bT9-e5d3i(z^p|hpp-tIgyA{o5?<*DllHkxO>hEx zc|NZ0^j7*=r(}?0D!zX+rv)b999qz#On?I=mBqJz+?LBPW^@8~TF_L5 z2gx&YVdFZ%E_^riRx&3S314cQON+P`nft&HR>nb8hOyoT4sH zeFZqG2{X~hCAJ9r4yx55Je)8Qal`a%YG5f8~#|KLuJzoHf%M|``jBP&ysY-!yLH2N&_tu%`y?2KT<^x9=y zRM~BYWJoLvE7`@FOd3QOF+MvDRbwEnvLNC7nQ5w$yQO_}`po}q9k-}>`99m9ofd3N z)73huhE=&TYbf3(v{DeJaVD+YO2Yd-crE-sYzjDO6R9st(WicL?V+da+Ox8*c>lV7VVE_h}@XRxD7bjF(wp z3L9T3$R&adGqWA&kE3MgJLG$P%V@N^8;-|XA@Nr( z1kCCEWpXko>(`7T`Qf0vdtb^p_=Okb^MB#(nGxXLktDUEBgZuZJel z6;@hZuNTYO2g8G3FOmDP?|h?;7`VXNk%&XvmpB`+8?{^`AY+7Cyy}XWs3OE)&vmW- zIryl>=o!SP8BFUjnV$UU6wK3GUnmb;Vz{Q78BTuO?~a=%z!{)-pybm%!ZK z!c^ACvLh`F3gLt8VFH1=sS{M%6OCJG0d@}1^FVH9)n>{1T?D)A-zkz4(&^pC^!Um6 zG1?V@(IuX}(tV;(upgL$Y!1njtcwN-jCB2(}fVDa`*YcPTLZ2u!Do(c7Q+XkVgS4}puuLbo z1eGN@GY4!{}_IiqSqK$uSS^SZ%ZHf49boHGonM3LI zSXYL@OVRY5|JfHC9*tnZl@>xN=r#7{OKckj9(4!6Cq-P6JpKW)c-2>Nb5vYh*%6`g z-Yl7vD`2yB#um>;m}c&-#42CG+KHoIAGWOAZc`^$(Adc|RGrWhcD;oo+*%gVt5i;8 zd%5S73*mB_UQ}>8J`mi5z8-V)cvM$~W6jV^&HY})nJ$s573hP2kL_L*l%mlwoA?O3 zWhmDw+G!$ZJ^SlW;CGY{!6qxg7rs!7C&OAYF-%)^#GC|LCu#>dX(+0%?@D8M6-zj) zO26GNzdrKbu$9+UQNub!^at6SToS6PlqYDsd=I?YMbK5J^r{7!Le5(GWoa53wiMyG z9OVjx_%`llY!84rs+Ori95!k64e@HIx*%Zs{FKO}UVyFq_n69fSG6JVb8d<&^dp}% zHI>Fc8%9`N3iWwQmT=D$lwRAKKgJiNUWh1|zJ{B6LM6yx~ z2pRF1x^VU|e{g=GvvI6cO_Rp`w*Rz31i$hpPB}xOy#D0AUlYL;;M;)vUBqVa))cT4 zm|tUH*>Cg@;7*Z_o=3Rl6NSgE7@l>}*eRW-yw{hf{dmT8iW_o=?Y*j%U!~*@U`4$C zL00zh>ie*N_ZbVpRCvPDB}n6Si$WgM$ttYSsq{17*E8r6OQ}EN#;ACsI0ko1z2d5} zsk!{Ucb_5o&G_#wBp3dv5${Wwa+dXYkftA@n?na-5-;IPvAO7hHaS~$1P)0$fQ(_G zK_k4XP9>MV3Cw&%!tCrgA|@JojTBMa1{P^n080jq_o2G>(rI3GV_rnT%TtCL*5XlYp{v6=maFJ`UZR)Bl#m+a_WlWu#3v1SNd#M~as%|0)rM z44NEfg6lVTQmyzIk7|H^8Nw;V$JjZ(X%ft?%3GotM z{ofq%S96V2wb!OkR0vcon ze(`Sp(qKkS@WW#ZAI8SG%Fpowk8Fq$Sr$zJM=;#r4~!!y*C9qxHR=!mg+4S z34ZBEn3kYxHoi)rWqx%CZh0o$K0Pw+FC+Hn;08Ir%Xd< z72TgubDBU-@qkLl@KozxFQfYJJqu%~tA}mXgu2A!wpBV*pLQlFNHB*ZTuAA0eo_kNC#&P>sb%z1 zQ~JzNSe&)i{18KW(l!L8AHKP1D-l|7WW&IO3sEk7)F?X|zr3`Y`?m(X6A%oW4u#G7 zjRsG4*GH2%Uc42^t^^J0#;X|5dW4X3zP|7i@oP)7ONNNcd!y~Qj;V|2wUr#oXmIIP z<6k065zDafuyi!N%>)dYo9Fvb)C{{tEs`5L&;4LVd%w_A3fD;&$*6r`Ek+iq&S|R#8bi!dK@|*omeq2ZS~Um75}#8nUa@pD1M$*>H7d1S%Zez? zLTJj;RdIYr24f^SCZT6hV7?&?rOfu?aNeX{pZ{`HP3)`z@1*iYV$FV*-(Odvv^<}C zYXe?u733KXiu&s7Z7#b*(#|PsvcR)YI?7<=CQPgk=-bzYUrY=XFG!?5 zPl{~Q562j#J9vH~Vfyxm5W@J|47AwK<=U#B;YBzf3G`12qPKG*e ze*)tZ?I@K^!-nbjMWa(DkDd}AvRhh_wxgAFe6p%-BS>lyP_%h1yPI*F*>|Qf;tPth zT%YCpPBKo`5O!bC5f>Uc>_!QbaqZYm0^<8X!F`I17oFjDw7P(l<>RPXOc(0Wao5(Gm4HER+-#DNv|Q1R zVk?+KL)~EwZ_r|}c8w_vtS%0nj zPT{p33KnxEq;tvC0z+DUqn>uH&FRj^2TCFlM(aPg!`~}}m?Lk@As!YljWVnOXk68U z$CyAk(JEfUgqS~&KjC_f;-;Pq$K5U5v_#ywwg36Fo0Ojy+%6@G$raRa$2x4E$DvWa z=kA^%qPb#S@gc1u!GiYCj!4cO?)9uBZTH zjrut6w713Ge18O?)mrdRp{9r)xBsnVvbEt|yiMc-I~(9|aT#-VR+%05B{O?ekA(YW z(&xkcvGf3I!ykieOKUX^+;Iz(>0VC;j zbGQRKL%o>L=KKk=MlzqaZ2 z%ho3#*_YRKE{g*tpN{txo%{BL>hF2qGR?}uEH*>UQRWo*5I!`jGWH9h;Zh~4-NLajb)e$Y;e3zqX-)}ip0yGnrS=IU=rb++9O zc=a9))sWfUC*~q9Z()M0!z|;?%n+&5&Xy&){5Pg4v4-f8vvc1%IJU*^av8&ECesst zP|-0Ig8qZNOwAD*$dc!GFeYSoXGK`h1)t5DP3r=M%aeF60|GPtEb}UwpdGh)av=WV z$$5Aqgg2jZ8o+;TvZqeE^hoJOaG|cB|Knxv(;yrLV9kGu%oHkSFC41Jn@tr$s+dW` zaV$eT0RaTTEJ@gV$0*FE7V^i3azYDd((ry?kkq$Fy=K0nr@$B^da$vrbzC9~k5W3A z98z!(PGT=QYYMqU@+Wz4Xtp09Ecx1&mi{*pjQn)~_;G+mu3bsm7$%+Yu2z9x{+pfs zdA5Q;$XCIgaQlnea}iHp;itnbmI$O=me0llJKt9#iQ6c^Yv$)lJkhsQt_Jk_ut`lZ6+8loq_KnX&m7%t9~eVKUv@lPULqT8 z!O6E0ca6u?VOcP|RHBk73ChV{zo9;}QJ-fyW&UmE$BYE0xf@F4(UF)!T`z7}U-S77 z@+VO*$z;qW+P*#Zq~;Aj$Gu0JdP-EbzMJ)l-Ae8#X#uPmOMt)gaBN);*oCIa>iaDgt`IhCIF6NK0>1g5xwKseYbuevFLGU|>Hy{We#BcG} z`OQ`H6)PDysToZ%E1n^(f9kO4ZjbGItc?eyO&cYK*Tc0oD{&bIez!r?_|AyHo8K@H8{VS;zYqH45}znq3|8Gu4IXtN zBGfT(5O+IS&J>sDU>^Sz)HlU4R$k4aAM9eM4$9`&^OHIWIQih~erN?)RHy9o{FxUw zyQkIH{PKJ91tyEp8duO@-<2n(lr_D#y$~1vr~+4&IGrtUB&Eg2n@`Q==IyEXeeo@_ zahziW@^<#3$<{F~i$PE^9O6npywFJwp{jUi08MD3^d35*9ik0^c7q0;7y(-^^$Kn+ z**BkePwtr3C%)PSd9Al_Tg*8dvD|9c4ig!DBR;ewGO-7?eE~r|%}?ay@NJ%nr@5;p zoC_heC&qK=rsn2fxP~LzHr{TxWF4!@F<*P>(AzUV-pQ4#F*J#pyAlYaLAM9OOVO0( zj0#9%g0+Ie*z z^uJQjb1FFHIsFLFjIx2`01VmbZ=zhcKs^5p3<;&__Q&VnTL3mGF-vKRL;9(LLVs>@ zp!4rnail$dU+-7D-@Qg?fD!^px*h}Mdj5A{`^TBHUbhnz#TYVL*+&Q(lT~4{!evN8 zpFX;=^zgr<%LoMnU%v7m$&w2F{?9G`ALS8WP(rVSR{y8`{r}5n_W#RVm4lOu?SEH% z>m-=AJNf4uEX;wZ8taXdf(ZTAH_zq8j=YArv!!ke7Gyyk0l5Q)aPP4C$#YaAO`J@} zAMJ#(@tnE>wdqzLe)5KjaQcQsIL-@45c&H*-$E(MMzNJ1@4RrBN@Bx}_(DHQ@viR) zeA>SRMHu+|K0kW+KK~0Kyt2Vr0uhmoF!;RtyA~m^ZOM)Xje6qxyCPA`MaYJbDb@GK zVj?1PWu%+i$KUO1jzRV~MMT+CduCF_@xgzBvVrJ{h^Q=)RVN{mp@O8Ad(Z6w-0#<` zpu^D2rcH#xLFk$36d|N2NQ$HwZvnJZlJ$gn649>E5&1+#!y=sT_sC?zq!?VGBC+0) zzonT~wERW5-~TqehhQXfS?Kl^L!m>;jSC^2QYua^mDhZ%)C*|#SMLRQb9%IR!y5si z)X>IK*LuSqH2poH*+=sU2fhEyeQE3a9|F2!CszM_i}POM5x2qxW60$G0nhLG zNaM)Lk;%3>W9|QT?kIzkOB9b@!iJGGMUW9l%8-vtpp}FpydR$~?tj^`p^8;nZ)M!OpZd_8v`OK2*sw10U&e>?64eC-?X z6Atdb-R=dvJMtQfqa|J?*duCl23k&3=;p=afK@g*^5#Q09Xtbu;DvT&vgK`~sTi-u}u6 z0{j~Hdy?L==llE|@*Z>SHF5GClguGVIkcwDc|HRI$6kSvyW+`D2jgzc*xAH-_ID~o z`Dq;R=xEYfz2ovaMY}N`-z64h$Q<`89cQJ1;IJfnCG~lj%uJEa6Usb67dePt0X`(& zP(nDV&XhSEjFjUfmJ8A;pO8Lp*fAo%Z$^DoPgR(F7zdMDCf38OEph66{9R3%VbG|Z zmaVo#&;?~;8y62)n-QbMirMMfw)MMq2gD#(@lTb=#2}&y*|%oaqn@`rpen6m4p%m#Etyx?CdQPBiJpWMOjO7-01y&!g_;RB z)F?t4U(J7n`ZUBBO2JD(GTHgzWqBCRf4n@futIB;WY&ziW6*fSQkhyHgK<=2#b&g@ zNrGcb0J}YXkZpMKh+?$~YOu-%t>l&dOEpqQJM*TfLDJhv`ES~?hW+z|XdBayetTZn z-D;)8ipDfNlfo(6`4|~iN>L8uA5XB)_IIKb zbx{tgc>rUoV6zM-&9vUSMp>QBp-m24ODxB)X-6fyo{FYV7O|7;9V`$P&`K?aMk73l(nOK_rcx*L{U0-AX(KEbCYLA)^xURd(wPRwkFSFAY< z4gg>ykCKpA40Tss5|`>hNB&Oz$4DRa(JdMhS$F3^y*P$WLpT*pln4sJcUn(8m|sT2 zh@|@%M+OT6mmf<`3{n&U;H^2~lqh2wfbb6a*#aDy9FHjUVEj&1tW_*QJ>bXuxrFMU z0=9+Sn9$$ak=~Z8D?E?xjdw)`(l={%+t)Zn^wR@1y8LV8A2tu~eYTwHCUZLOyo; zl$~4AN8f#nwnyS1hnb%_L_#w=!kn97aNY*n0d?&e*6l;CY-mD~No>Zgc9Y^wv%J$T zk{(Td>q`kKL((#rd9_EmeZucFSglDHz%vt@`Ju{nepH#rVl{(CWCaAzVbso+&{Xj%VIM!;Fu zWZ&wMUAG%KbFh}&C50;<(*+12&~nKtN<#xquI8-I%t@FdfU+_8QNqchYEji&LFd-2 zb=pUjTzRp4E1 zg;H94cDVP}ErW`jG1haIFJj_vIY<%ABC*NN{KExl-qf5K$Pp(9swKMil+294Hw*8) zf@$d(A6HF)pQEYDeJX~lTe97*=%FRo59b;lU4{+~n;1~^WlAlrh?KUu0wGR4oY@RJ8-|QqBYs;g z76fSpF6>xKHI!Vij4m13u1kv#ms_3h)h1Y-&Yk-GAoMb~975W@y4n&Hmi!3Ic2#9= zi;dcG14yvd9IePa*0Y z?&=5J(E&X?vn34-YAd!a9$u_@53O796k)h%r(JF5%mjOAMc$g*8DwPgH*2o9rlHn7 z1!dY~BHfY*C*_`oW5f0}ZFIh{dqk=VfkMG~BV~-1QFlDy!KvM|SsiJ{p55%h%d6Wr;2k`Ff57KXx@ck77Ah*R$)0mbYA>v1ZR}IZpJB zU4>A=oI|7TCO(hA2~>QCx&O;(Dx98ErMPjyXM>6Uj!x==tMGO4w~P-|i@v9>Db1FsCc6f`zVX;y}KKJT%|Zn8eIcQp)+$TSR4|7w{6{eZP{&kxVek^sDz zkQhgnsKE%p0PUZSw8NTc5k>kTK76oH{Z9dt^TzGn@C5D-WrLp-Fqi)0nxY=O2cWEX@VJ1B;zfmz)0nE z>d0ndf;s)RX<6~5S|{ITXGSitV{{MQbH7BX-^^pGarYPU`PcHP&VURry{}0&#mDe1 zBG|nc_7*G^Eu~w%l%lQWI++^2=#GWj%~%=Bjm>T2YJ2-eL70ccKR3k9aXNQ(1wk2(a6x!UnD_&jc4V;P87M!m@$ADp3 zk*Z`5mDp9pX?sZCIx7GXF3Dwg~ZVU`oKt$yiCUwIva*zVU^#CCq@R(@{v)JaP=e~Ck7(& zJA~$QY&}@&l4;y*%xLn+%gz!0aOhW$pMCrZYh-^enGptkA_w57L~EQ;LvZBPTE|xI z8j-2rxQG6Pu@^$BbxcW{@Cr@OvrrS~m^pblBPOb2VjUrjeEzP{uLtW827aEczc z3HmFux+@di^HF9+R2&UOhSvqWho=py+88V5<}@{h)w8++bN^#y81|8*zROG~DhUm% zWE{n6w19$Yy`QwcjDwsfB3-xQ43AShJykn09++f8&_284nI68|KU>)%IDs7_yNoU! zI7~fMu*=7vVJ{d-5z!nC!mE8k6J%Oxt<7)oOUN19(H|UM&B}TE1*IvBsfY6fL~B=^ z0j>HRJFs^G#Q+)jTM!j)tvWbvkO33AFy3m}c{?kI5Dj?dVZUTgXAX|O993}33`(LA z#N6-5MW9|?p-Txm?rg3&8ta0LpB;OMr%?=7eB*D@1Po+#l>D}Z-Zf^-xwGIuvkB=e zvMSYUi1!$J$TqH`y(zByWeN2a_hLV0Nd+51oW_-xj4#9@?W@(gP-}1qYxvS;zG%0{ z;_FuFO(^lwx?e5R8ZO)KdVPtr<0QtcZm zUx|5%C*8n`T#nwD6Obg%*J8IZf!WIHY2$CjJuIw(`;ZI>Mg@!9Q7#_zZg+#3z zgn#Yk`C~{B8wi)y!h#0Ausr$O4SBfxLWW}nn5Dg(PUl8CrK%~|lv_>N?@by{#H*e& z!EQ9aGj8hOzSFRwY4IA2?i~N1GxjS1DsZdcF?Wr^KS8CH^Nrx2Pocj;FA=P3BU@tf z!SE(Q6S*tR1^V&EPNk6A9B8&F>2oukTXxm_Uh^0s*f26>+Gh$ia;tvypI`VhMWABJ zzY3tJN+Cc`yi?U2b|mY$_YF1mA~69BDy}0%$SKbLT6zn;69iB89+ojbQTxL!?50E7 zmN!QUz6NIOWEWs-2{I<^JDp`=$|&B_*`{bIo-YdX;aWikr@aN?IvNDhU0|m2QMoFa z`0PHEP5DQN6;!zD(5T5^ zeE7%N3DU#+UrTX_UfpgNoQnk(dLUeSNh@IyD-Y}}+#~yCYM$E%sDS6*^YRvYFHqmJ z+m)M=KrWY5k^5E9gRt-kuN*vAT7}3*1BoKa-H0!G!fQrLAv zB+G@id8J&pr3EWX80PmN9QBGB(vf|R3_c+j#9iP1BXc9rCtknJu=#a?)phkkNV}i7 zzH)_wLBC*aS>iU#Q;yFYh+I$O5G*RMLgH4x0(CngQBU)rAG-DCbb9`$hIqq}TmRxc z(_JPLOD1GbB*l~hl!A$I9sJrjnoR58rHne|MG!VRw<%sx-1FTA+_>5&K|(#XMr+Jq zJJb+7MLOvsx1U@29;1H;>hCcjm;w>Q1v~8Zbx@pn6@AhTafP?*6Aby{x+{^q`5;*A zo(aTSfKy6^U?`2k!qSmj=Y&nq`cB1#Egd$ejZxk7WcpL-6M0wBe5Jd_vDl+N?=JIB zPS7u)@dF{B(n`1tn}NE1F#XoZ>eJ5VHdO*bX?x>u%y~SM<(Hqa%pel05O^Pxm`)l~ z6Qtov)e(RCnD^$NliN)gI-gHKulibz8IL=`A2BlqTJigmNLQVo%{Mq+!Ea*ju^4$V zY)lN-?+5bqk7#7^FdMBda-WKX;=0d@h2mVO);rX1{5!g^I{nyOZx|*XN2J87;n#eU z&hnyhIc+#v*!uqFvHT&<$|!@qGbH7?RGpVTb;^wgju+}f2^Ntv=&Y(C@MiQ{Qe znEZEz*Pg>C=fJUhV~9Q=`<6D@zU@f5mxu1XZ)3-yx^w3pL1zX=GXV1Pra${2c4R0~ zD8;;MjLW?ns^#}}M*1eZ#{1%m+V0HRX2BDxwcG89Y`lYR92nuHy~<@O+VUUbk0Q#p zy~P-~{LIq>8?SwKKxG1%QmeH%4v9|ZBaMFfefDy!`HTDP=%M=BYQ0Q^GmijBMUNf9 z#mUWflScclBnQv$Kt<&VH9hWcm(k#H$L@%1(jkG2Xg8lydvHQOwbs5WZ3DI1`l?k8 zwac|q>sHupu^#~IJW|KY%Lp$y)bOxsGv&njC^PG76I(1Y`Nl796b*G zB)^Kn2OJ>bZ`Xr3r*o&LD3A zv{3Wp7&psQ_K1a!^AXcxkDI3R(Yoi#){un=e1VvBP6THNb)pLG3dZ{Zv>kOgrnD#; z%J@ipydpuoAyiK<-aV6udQKE!26VJ0<*2M?vb`Z3q<9ExHq@`e--x4-1 zrAd4wVMWIv$r@l}jwuSx<5K!oh3RR_6C#5dbg&ueLAbV-LfuL3r^ufcW(r9zplFF3 zVgZfnK1G0=pdB0w@hNT7F~N8sc9rcqJFyyy$D;SF_dww zmD5R@PD)9lDAn$G(YHp}5>ilitRyPFUX*TfS& zw_!%WgA;x(vIp{ow%Lqi0hjT`zbM6LW5OJAa|nb|n~vwMA-+zz+BUmciV++fUDq(4 zHn-;uq%kxv4eg;eEC|@h=#g9cbnB+U8FxiNPOWQ|}$q)|s>fqEgLk%gn($OJPJ9%46lL<~Voe=BJ8@l>ZH?cWt zL;2^5NeNzwyfh$Ghz9RJZHr4e-=XDsTN|MOiEU^BkzKHh6=xF&k1NOG@;U@;)CJ(?*(U zVN==R*?O#C65!DnANe}wLuAlpJ9R3faL8A011P_8e@l|rB0?L@0u9Z;!do@dnOdzxY=_J5zK z?0dSnt~|Q0Z;e##Qk$1X(Ky?zZ3FuEymTNM2IghA^Fujt#N zp^O{}oxnlQraW)+Np&77(~ydHO#2&7U(caMQnharTBi%K$Y^#RKhohMy$INrvku!% zs`)z*0r!8=|=1GfYdZOgEkqnkyp=cW>9s^NrfIZhd~s&NC4UE1om1@$H@k@cG{COrx02G% zTAUVzNvUnw*_XVOZ!va-(V9eQ$CVJo%|MVyl}an+sh^gYbuSTgsmNkj z3_w_0FM>!5lB}eZzqPWR>xYxHWn$3LdXN&)V3MX7-=vg2xjtToaR!~L6)<$QrsPVu z?{MMaNQS0Gc4~3qfyYKwIddXnz)1{!%;H#>r;*2qGu6B8t;$#!9dL95MZ=|(F&zfT zF{M#ZSBDyQrrNXJY@J!Qrg24{Sm^&O;ZoHlyd;#Ws$}*+duzCEp-A!(^ypBD8p@%e z7;=gtPpE+%TVZ(X=pyG#PQSYVmuOc3b(nIVy?^oW?kM?6g>LSzpmb(tWTN(RNRWt) zSk>{>6jivpb}cG%k7d0EC3F)u4|jo7|KT<4JJ?xLuCG8as}2G;RZ~*{ADeCYDr#qgT_rMB=cjmA=G7tMHt$#tSfRo;Mp6bO;^P8W|sQV z6oc{H)fNgHCOB+J7X1SiJZ=TyFZ|KY%b1U{pU0g;Aa=`*1)(ezW~BB-9dUvuKF!q7 zXQ9k=KPCf5gg=4t&t>pHEyyy#BoLzqeE)V*- zOo-~bb)ilkGi1}6&Cj0g=g;O(dv*JsIombA2)7@bs>{KW5TujzI==xDmsqb{A>i8} zihWxl3kf6#yGS% z>q>9(&hzVMMR45vzhm5de#DIkxkfU8KJ|9%tbJiE(;DuZp=53S*dHkKQ=b$lmGra?*2)A-)2 zD5cuOjCZbLpzzHpzx2;XOP|2a+Xa*`Yn1e_YV%GMHVhjW6@hPES$3N%yinITu@~610MO+l3d4nNa z)XnM2626cy`D8>s;iu_H3>d=;|D{5HzP&)MGWf5+u9y3l^T(w?xF2{{l2DPVrcwp{ z|D`9V&YIM&iosH4gHX##_f5wEVHygx`zvG3fsk=6FZV!^H^(hd6V>q=$O7ZauOK%5 zJp#KD%)!P&^f){N27 z&DNHYm5Gzl#L~##!pwz{3BYN}4q)bFF*XJmF&mqhurZmjahP$La+z{+aFVre;;LxmY-aCD%=wLZ|L?Up7+b?KGynfI*W_SjWBuQ21^#b3d>#@L zeRPQ=NCcR>g+(qe`1lUJ<6Mx-DRBc*6z~fy$lANTx@&~CQk#{>=85jlKgpff647WP zfdlk1Ccg-k47RcJF$2QSr~j$-*Y)^>gF%&!H&&s}AFh0Vn?eFI=Ju3W@abXY`FzAzPLm!* z0XsF&L$PC}C=rlNPVlJ^A#1AG3u!f>t&i~n-iGeyYF}ak!DC1ixWJ0d(!5GCA*jYt zU0xg}fs*yGb7Ui&Vdv>kMwx^6zz}HR=tw(f9&{VdT!Vlq4#Ix$#s8!=qZqZm;TN> zp85$dUbCC8hrbB|yg%ShVK^yr14nH2e^(D01bBOXeLs0Zn)Fuw=fA-GC@il*=rnXW zv)B765gIYU=y0Vng)goT=Fn$!(5d|I^N&Dq5{P}((HGsHw#j2LtziQ&I- zgG-Q~MW6>sB4-RdU+@2($_Se%6SFKq6pFD#hSK?kQhtZvk9i7rV6H_iQG*ic7;c(v z1FJR`(aDI-O>K$)6Pyk&mVi=KeKqFf-rX_^O!p5SY`%W(l?#0SdkgS+Uqe#K_`ENF zA|lM6BU2bpoJ^>bH_HeF;L#q>StJuzp{C>_V&%@7{9umf-uqK-^5okCuZTSL@m@;G zg@LMop=BIReH#7ucpj}vQ6_Gyw_pjbT4O+8Wp2-q2`ih1iq-W^b3IIUH(cz~tdpS4un3`rC>2qwpspwt zWKt@&LHIU0&{xFav7_7MeX53E^z#Tjih0xsE&^3BiK%>ZvKJU%(vQk8<5hi~f8%N? zY@R6RiEn2_30*{|_tVvoWS0m>Zx|k1#O*77hC>{5npwrJk0*pk>?{d}+{&vpHVfk? z`6S@vLgmlf$jrdNhAy{&LRMW??Ax_(nvEjU5e1L8hviKtZ;)}CQMD9E5ZGF}ixh0* z?C4s`>sbxxHAf4bfSz=(%Ko?f8j1mtD$;Vibz}lgTGEJF%R%{!P8hC|o=0;*`#{yq zquS4@a-PiP-O;o&dOeF`{W0$2lpST&TpB5qkJJ{Qe2_h!{o5Zv72H2rG0#`b0Yj;U zdMTEwph)wlb$Ye12VzT3$ayF<+n28Vf!0e(STf5p~l2og-#o56ks~xm5R@qzms9H9|t3#Cy;24SW5C zUSdwz%TOaBPq~Vy#7yiyOWXIb2(-71-xK2s@NhH}(p%O8GkV5`q5P!H=Z!(sQ?^_U z{T;hJJSSE${HeWB3tS_AQcSAvTffXIjqKVUs%LzfR#!kwrD|XqWcf4Igq7&+ix^u^ z{m?R1xfMbZY|F*kE^n}N{safb5b)`kDBux^*5zMHs8bLc82$pO-?7s(Xtn&yuK|RB zT7+5Eb|K3L{1)Sh!i#6vkp#pOR7NIjYnfvWsxjW`Lf^?CIb`_nbb+>+vV0=FQVU8K zr%!$xOXZKEmgi>#0-bM6KtEme3)i4ks~Ls!NEWnmq?XaUr8y z745bg;7;U#eONOq?;10^Y{daaxm?9$&Cx0g%5mv+N$&!Vu~OyFQF`sM4b7KOZ+VX{ zI9@zau^7QKfV2a9WuKezcsZ!|YhkG`{IY0p$uUlYw7D7a*p z4BO;Yjzt{12$>r=xwZ&p_xL<{Q7{J^m;Fnqehz^n+5rG4PFzytJ(ai$Jxyk`4O`o?hcf2(NuT)OsJ zwwfVr?R0eQOwQ1h;=ZfE z;jxK}HuXezu$101&p_%g%Z+kw?Xu?ITVFXDevIJ#+BR(^M8-k!1|!v`i)R#%<)GIP z{oW6@W3yc#NHFBf-G>_p*z7hXQ>Q8= zY#BnpiJTP>F|XZ5R`gPIAFD}WKgCo6oyWDWmxO>kk2uJrV<|8VA!N6pom~fEN%evS z#2~8V-&YH52xyxt#^JG=P=-{(WQdMcM|*t;Ml+Uc$xxLt#$-GEYYs9fyQyX!eAlc|Mo zArM{^0dKbD2?A>tdKS9mIt%I-5oES|JH8PLjXfxde&KsQk)$NlK!ouT|0&RLDI2PO zqQqzL$(4TyL@Fr+p<+&x1Ray&B`O|%u;I*5Tjp^QSqzrB;ffLm+$ep{>KTovcVTmHxk;ieN6q1x01~nfN zW#>&cDb;>GUm|~QEJ0+41Z}O^!lxU%aIWM%*3nMTkpmkmVpT(S9PbP+{7~-HoP&3} z8OYNTU}l1vTfV8ZQGps&&kPoC-Y`9$(*@c7kg)~tDUu;FFwQrjmmpK*VU)- z{eRsz4xJmkI23o0!?V21+@O0dRG*>rS7tAt*wTO-50=(PD`$kVs;~#!wyCOxV%z z6O7nwl6iLV6xw;r6#OSDnop9e(orGPSRDx*+F5-6wtvd5n*~6Q!*R&R#tc&Q3h@m` z4m&wkKlo=E4%Q~Cpu)25;x6)sll%d#5V5%4;9#B;7GgyDBg}0i50{RH1Zmv6 zG{5T(O~Vn9l(Br0=Ch2P6YTIhPWcBmp;l72>S|qTbRm((d~v2-7O;i1mg?=*IT9A0 zR7ko$!7U4EssI`7^b{_WG9U@jmPK9e23gia$)Y`z1Hk%~p&F;HR8_zDdW-Kur-5b_ z_?BaWLOnM93x-L^e;O=zFx$acPul;xEdmSSH;>t0xbo_OeqWki*zzX=4nEC`6weIX zvcfxxIH2Vl zzZ1&bWJ&`zJPM{fOwbAPMcB5hTrSIO$CR7RRt+T1v7TZR^qq<~(@E8oEuZFRf+?gIOWM2okl^Sx>VQ4XKFpE;4?%DNVA!h3o!i z4~MDW^62{TP(p6b6OJ*r$crbUZf>!q_5ONPVdVEk?y6Mkm6%@pB`j>PbA zT=DRBE}+|1+I$qzDMquwr30g^&0fl3v#_bPj!y-s+PZNRg>=loK2o=VSbAs7$I1u@ zfD}3=R?}aVdpNuKwncay?aoH?Q#(`ZlEg+_LZYQiR1&uia+J4dLr)3I1Z79FXZ8H4TXmva za3{{AnYfmGopiGRD&_9R?EruX_r+UL2c)G&8F4Mz1;kS;AgH08sYj?j>v>oyzvmSE z8H=-ey%p+RY5P@5SeeW*QNtz!OHOuV9k-KebtXGrX|Hy2pFt2H3`ws2LlEifY_`Lg zqN@zZQINFO?;kI2?S)+pS6WVdTX;FalXL^j<_`&1gjKp9mBzFmuAs6m8zF4mYzuQV zfCh^wKT`9uyFwklNR`}SI3P^8lJ?vm(E~hq7INGsXu;4r2I*%v3`3I(&s_F(|LG~C zA4Z{_3tVGDFSQD~z`SofTJ8xsU4N-3Ki9z3Lkr=~Kl%W&YL{1XhD zSScQds@6kNEq%GQzH&T~t=iL!cGYp~WtS_@`VQdE<(C6id2jtaUJ~Bj-h;I@CT+{?QNgw7E6{d4w+l> zs8ye7F*}=rbtO`r-4?(=+3B#bDnOe%_}kaH=rQAUHgYAZzd$yAz#7=dP345(7d}}` zi}T4SZsv2JYIOnXvdFGf<_8)byw{iVCqS$dZVZVQIs{yu@|&9+j2OpXZ5TH|ys0S#1r&Q$yDRJR!dDUXn+IktRNpr?-PG z@HBxSCTfW3vg94xXQfr2!BH3C};JIU?`AyHo z*Lm?DyhuQz0Y1ink|P2!xO8Ju>+#L@rGrid=mf9*ON0Q7b^>1bGarx)a$+MUCU*`X zUigu3Ukd*^3{0y9qLl#XCLW$pF;E?K9)u}P2;ihgBy*|O*I3FJw)JU^$m=ESx2 zWPj=UN&n?

    HiPAqr5cxbdn5ra3R-Shume(~a8;*Jru{t$l2y)c;#PtHML*zA3wp z#8}LUm=KIIU|bvNcp!%6xi)~V9vM2b6f_Hj)k_O+>Gg}7LcNm>|SfS*ZBDaALD57yw+*cdnbD-Rj+52;=ubAJPErG0}AMFHNk+5T@V_Er*IUEGT5Ky##g393tc*q$F(I6)qll zg$M&oHZ3ZKU$xYBn^Aq27t}<-(jGfINkHVIDrx^Z)sBD}WygtNl}8Efp!;rvT~8OOUI1hOGvyc$eqyl)UAJJcW6{+0`_#KBZC@p@ET6G%g`}?HEql4 zCdcrzMzFA%>JVE;WE5zHvLTa9pwg%{19VkglRu9qAF(PiOht;FR!X9ZB{wAX6_$%q zt&FK2-qMp_!WVVGpf2EUj>$bb@&k{+@0_Vj>+yncVUFGJxXsuM}YJflH#-` zx!sR4veLhh2f@!6X@gL`KdVVS@ZGyQc+&GYDH0hOm%+&(NwueCcJQLNQ$;o}@sv?b zJ@my2R)YXAkgg^OYr*gM`YE>CxU>q_Du^@rL?ViW4duHKRk1rcPU_I{)&(*QFEiRfJxW^res^4Dxm}oO5e6uWM=lTv?P)JY;JSm+{~?;03<%h)6@(n?5GJX-<}+rD z5!744T(Db%%04-G=ed@++oVqw)w2{%G7Ge@-#}|mIDgyh)Gkk>Nr`iLng*pZsSK4O z(3-8tiC!$Igy@0qG&zxd;ZzU*=RhaK@e^>f0HXuVA_l346w{b_^CRU7Nx;s7O$Fd(aLs44p*cobp=PrE3k==Vbv{cjJM(5B&F|JCjhz^)jWR%T$WaZPsMzlVi`wc znSOEUUL27|+4U!Nj*8Y1-#*UR7d$Gy+P%4!{!W)l=afr|J8AS*w$dW6EwSt#uee@D7U9# zkjP?)pNqQG&J|I3v`*fSw_R>mY3md}QgZYBY&K^s+yVxDx){rG*JMcrmU6BFu5*ud zi)H74WBVTVCS4QJ@tkF6_FNdE0^(uUp+mOd2so&_YLg zKFBILZOV=y)SA-5Zd>PGX*+nA0Rx$KDR1fK;t@tfE6=DCqy6`v8C)6N_I!<7-t_HT z$|?832%7Z6CCT#-iq&h7v9?wPa{4J#_ov^QwW}-LIbOC(PoYehHSV}|Q|{oCyG1W} zn-~VuoV`=6Ba5tcQSu*F-fVQEUq&7+kth(v-w;vA+F{&qk7l>x*hd#TroU^~?fzUxgp0?!SJuXep_ck{Z|Gi=8V zm?Pi!wg*~v7ANoJFp2gHPN#i^KvKT~N)iQdeIl1ZaG`)NKm6j=Z7&kehPfDl2?du{ zlh!0D{r=YsUdvO}`-m4lVd?t$@b-}Jbe`?DiQb3B*PI;?>kY zU7=))gNM(p@hGoKww@ZnWCy%l2JUC=Ema|HEk@IgYWqI}mmhglZb+StnjU}Jfd387 zw=N(1-uLbJBf^@|Hes|Ta8kN=8N6}k1qGVsO1ig8kAgEX;?Lp0A>&=UJxFcMLUf$E zYVT0{cwe}VT)EM@y$UqT7V;xbX6=m8wJJKy(0Pzxo)ygmhXXepytEK;4qB)SO3c}c zd}y)aZ|7gF|2gPV{dZ;c=*7~527m^GF(*xuCS&89F6H9FyoqMk>!W2e$vs`}=Kr`v znCD-wnapFX0m}|xCPMYDd!5SK(RkDRGm-a4LniBw>=`eWg=Pb3>u};EAZ51bZX!;A z36*n6^mQ7+k8g4crz~Y4xppU>0%USjc}&8A`uppy{{x0$_z@3<5DWD z3IqKX zn3+Y^#2(A5HafklWvx^|P{9OMbyF!&l%{@mm~-cT3PM#Eo%T*?psw}ZUVl{IV%U%2 zN)T?GD>KUNNd9%_Y`xq-M;L*=>5)eQ47e-${Lf$)eI&z)Kio{-5Zh{|6hcz9Lu;n; zGN>zkCnkg;_#UxM)$eY~F5DJI5i0kI@&G?7AM%}V2&|I=>;Fy!=J?+z0<&^((sQzN zak2l1z%2Ak?3}EGtXz!rTx{%&Z2y01z^07GCLAorMl6O#jO@%tT#QDBY{qQHMr<5x zrtGXNrauMk98AXS9RH05%=KS2;QyC|aLyl{`~RW=`>e;3awHyl`G)Xw5Taa)kpK${ z=y*Nn23+C;-}BD6S~10A*RN^l^ZOZOE1+FrH8@iQX_O@}!<3Xc$K~7`%B~%*Flo;v zrrOy9qEs|}KMr^O`27v0jJc|xtGbDV#VQL-0AB#@kLm5Nj<2BcYJNWNcQakzH-3b# z#z2qW0*}|nYlLt2mvfd$^dC1wA_hI|-}=f=An8V0fz-QSk}4m7W{hgNPq7v8gtI

    2pox>wpETcZ#fSfE%<( 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

    ;zWx816m`t#S2O|2_0KV94L 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 literal 0 HcmV?d00001 diff --git a/audits/184_deviationBoundedOracle_certik_20260423.pdf b/audits/184_deviationBoundedOracle_certik_20260423.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f6e0394f6a173d08980e88a2c4407d5be0e559e5 GIT binary patch literal 2341713 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 z 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�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�Dxp4Nfg?-&9rDj&lD#bL?VqJ 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�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≈#S0AFpyC(G9S>}N$N7p{tHVkbT2azXgFfyMUV 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%0DID7V{f6z&<6I1X+D2CI#9qbawhN8ame1N`! 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 e9b->Tbxg2hEg<-#D$l?8===vHm|7wM1 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

      v>u35GcM{(ejzf?wSc6>Iv({9)O`OxTJP` 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�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ⅅF50MIILv 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͎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 z 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

      Oya3=Z8*Sl7! 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

      U$M|J>lt9W#9WIquUm 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

      D5{j>_h%v(&}L4#*;1j(P@ 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

      gu2Y-28E&0}Ip7``nfsE+hM!8wylhHIfJlr?!c= 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%0ASRQFi6P=i+r_grOr~cr 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%0Dyy@-%FpkU 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

      i|zt_|rBd-5*kzihy7Y*+K`3*$6Jy z(Y!E00Z*}YnvPVK=}1#jG#$)mK;Va8LAR@ny`(V70hKB0Tt6_+0Yw}pS_7s!xH?Z~ zt*nVK6y{2}UzjzfG%rk~KtL;Nf{?=G3e+JFX>gcdfg+9|{XwQ$AVS9RqQzkLg{z0O z7)0LTDYiw0&m0Z+Q(5YZE2T2l<)<*&1Hd!!T$t_wN*2dRVG0Q9aFnU=nFZqNA)VQ> z{*b~{5xghsEAms)2_<|X!i}o)_@P7;KQcO>rr?K~u=t@mj~{Bn;)h~5ekc*e57jaJ zNPC)Wg0`Tn8$v2?Nw~opgvmi~u4>F1-!1W&XSzLQmChNo~AO=kDSTtLjf*SP|W0DV+ zmM9dFV`2h8Ve4W7K*{2mP*6mU$)W)>2PJDZ2?a&$ zhA4bcC?sk3Kh0jDpbpt0CIA$&Mf5z<0>~DnsNHU|U6RL5#&aAoS=EC=e#nk4C|M&W z6cn**vVH)CU87zvV_segk{Q^2>VDT#?4ei#RAvulZ2(GE4~2pv_E7XXDC{A%cv)LQ zK~4qxBU&634jr|)>nZj}^g1e2g2ZhHg@Pk)JF+!0=XZVzDocNu2L+1shj~z-h$yA= zpwc}g1$BfQ%!~p>xWUXQWRI{d@zz0MTUq*86AJ3Eb?Rg0N}));ow-uTOOZ)K*gYtj zlZF%&v31e4ps=kh&59ffNV|>Ire6(N06*m{;`MR1;V*dJ9W@RcE za)h#47Yd5V4bh{Z@Z0Gxmq{JL$&Ub1nNv?wxJHcofP#lR;m8BFP7R6mtn`N( z600+Z;%YrF1uvxh(9bPvom!O1bEr)Dp%#U!sal6?#~+!a1LulGBE9e{NRifIQXNWJ zpGiT2oQw`E2cMGBf%eRNie4?Wo>Zn5WfC5aiOA#+DJWups72FY+G2m`)uxmA z(mW&uXHu{~S(=vTRk*%g>Y#)i%kp!XCWt!hGj%W11W}aLXZpEJ97GEoLF(Rg;$YcV zP#ZIq5KnOg>DBTS4A)ms8>bJ(V3r{s=LlwQh2yi>A39>`yu-5oP#ZJv5Km=|X@i-+sbB6;(Y@HgL zIgUsQr9@HpGV2jVS=^xRWgaBzi2h+7Bq&+ZLWh@`k&rBo4jtZfie%ZBQX4aA5>I9I zhx(aml&Hi0P#dSyC|z&P>LE2YQ!OF#>>+(xrdpzivnfkIGYb=SC>zwz>0?cpg^4

      scNw6HlQaW!#x~3JUu} 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�RPaEBM)hB&+ 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⪼l|Fq-( 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�?#wqsN2B(f`m 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 literal 0 HcmV?d00001

      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 Date: Wed, 6 May 2026 08:50:23 +0530 Subject: [PATCH 30/30] add quantstampm audit report --- ...ationBoundedOracle_quantstamp_20260505.pdf | Bin 0 -> 1386186 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/187_deviationBoundedOracle_quantstamp_20260505.pdf diff --git a/audits/187_deviationBoundedOracle_quantstamp_20260505.pdf b/audits/187_deviationBoundedOracle_quantstamp_20260505.pdf new file mode 100644 index 0000000000000000000000000000000000000000..82a172ec11cb623509d715b9e5782b9205d2a5f3 GIT binary patch literal 1386186 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%0D;qRy#)aWyaZC<7)iMJUvz^^f;% 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 u)k|JR>o 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 z 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¬Bn+%+##=%rOcYH$F~uqA^8!b$GB?$z@OK?)Pa@( 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