Source Code
Overview
MON Balance
MON Value
$0.00Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | ||||
|---|---|---|---|---|---|---|---|
| 51300634 | 2 hrs ago | 0 MON | |||||
| 51300634 | 2 hrs ago | 0 MON | |||||
| 51300634 | 2 hrs ago | 0 MON | |||||
| 51279985 | 4 hrs ago | 0 MON | |||||
| 51279985 | 4 hrs ago | 0 MON | |||||
| 51279985 | 4 hrs ago | 0 MON | |||||
| 51279786 | 4 hrs ago | 0 MON | |||||
| 51279786 | 4 hrs ago | 0 MON | |||||
| 51279786 | 4 hrs ago | 0 MON | |||||
| 51279707 | 4 hrs ago | 0 MON | |||||
| 51279707 | 4 hrs ago | 0 MON | |||||
| 51279707 | 4 hrs ago | 0 MON | |||||
| 51279578 | 4 hrs ago | 0 MON | |||||
| 51279578 | 4 hrs ago | 0 MON | |||||
| 51279578 | 4 hrs ago | 0 MON | |||||
| 51279048 | 4 hrs ago | 0 MON | |||||
| 51279048 | 4 hrs ago | 0 MON | |||||
| 51279048 | 4 hrs ago | 0 MON | |||||
| 51278887 | 4 hrs ago | 0 MON | |||||
| 51278887 | 4 hrs ago | 0 MON | |||||
| 51278887 | 4 hrs ago | 0 MON | |||||
| 51278749 | 4 hrs ago | 0 MON | |||||
| 51278749 | 4 hrs ago | 0 MON | |||||
| 51278749 | 4 hrs ago | 0 MON | |||||
| 51278673 | 4 hrs ago | 0 MON |
Loading...
Loading
Contract Name:
SharesOracleAggregator
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 100000 runs
Other Settings:
berlin EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
import {AggregatorInterface} from "@aave/core-v3/contracts/dependencies/chainlink/AggregatorInterface.sol";
import {IERC4626} from "./interfaces/IERC4626.sol";
import {ISharesOracleAggregator} from "./interfaces/ISharesOracleAggregator.sol";
import {IERC20Metadata} from "./interfaces/IERC20Metadata.sol";
/**
* @title IAggregatorWithDecimals
* @author Neverland
* @notice Extended Chainlink aggregator interface with decimals and round data functions
*/
interface IAggregatorWithDecimals is AggregatorInterface {
/**
* @notice Returns the number of decimals used by the aggregator
* @return The number of decimals
*/
function decimals() external view returns (uint8);
/**
* @notice Returns data for the latest round
* @return roundId The round ID
* @return answer The price answer
* @return startedAt Timestamp of when the round started
* @return updatedAt Timestamp of when the round was updated
* @return answeredInRound The round ID in which the answer was computed
*/
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
/**
* @notice Returns data for a specific round
* @param requestedRoundId The round ID to retrieve
* @return roundId The round ID
* @return answer The price answer
* @return startedAt Timestamp of when the round started
* @return updatedAt Timestamp of when the round was updated
* @return answeredInRound The round ID in which the answer was computed
*/
function getRoundData(uint80 requestedRoundId)
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
}
/**
* @title SharesOracleAggregator
* @author Neverland
* @notice Oracle aggregator that converts base asset price to shares price using ERC4626's convertToAssets
* @dev Implements ISharesOracleAggregator and provides Chainlink-compatible oracle interface for ERC4626 vault shares
*/
contract SharesOracleAggregator is ISharesOracleAggregator {
/*//////////////////////////////////////////////////////////////
CONSTANTS
//////////////////////////////////////////////////////////////*/
/// @dev Target decimals for price output (Chainlink standard)
uint256 private constant TARGET_DECIMALS = 8;
/// @dev Maximum allowed decimals to prevent overflow (10^77 < 2^256)
uint8 private constant MAX_DECIMALS = 77;
/*//////////////////////////////////////////////////////////////
IMMUTABLE STATE
//////////////////////////////////////////////////////////////*/
/// @notice The base asset price oracle (e.g., MON/USD)
IAggregatorWithDecimals public immutable baseAggregator;
/// @notice The ERC4626 shares contract (e.g., shMON)
IERC4626 public immutable sharesContract;
/// @notice Maximum staleness allowed for price data in seconds
uint256 public immutable maxDelay;
/// @notice Minimum time between validated price updates
uint256 public immutable minValidationInterval;
/// @notice Number of decimals used by the base aggregator
uint8 public immutable baseDecimals;
/// @notice Number of decimals used by the shares contract
uint8 public immutable sharesDecimals;
/// @notice Number of decimals used by the underlying asset
uint8 public immutable assetDecimals;
/// @dev Precision units for one full share (10 ** sharesDecimals)
uint256 private immutable SHARE_UNIT;
/// @dev Precision units for one underlying asset (10 ** assetDecimals)
uint256 private immutable ASSET_UNIT;
/*//////////////////////////////////////////////////////////////
MUTABLE STATE
//////////////////////////////////////////////////////////////*/
/// @notice Maximum allowed price deviation in basis points (e.g., 500 = 5%)
uint256 public maxDeviationBps;
/// @notice Contract owner for admin functions
address public owner;
/// @notice Pending owner for two-step transfer
address public pendingOwner;
/// @notice Human-readable description for the aggregator
string public description;
/// @dev Last validated price for deviation check
int256 private _lastValidatedPrice;
/// @dev Last validation timestamp
uint256 private _lastValidationTime;
/*//////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
/**
* @notice Constructor
* @param _baseAggregator Address of the base asset price oracle
* @param _sharesContract Address of the ERC4626 shares contract
* @param _maxDelay Maximum allowed staleness in seconds (0 = no staleness check)
* @param _maxDeviationBps Maximum allowed price deviation in basis points
* @param _minValidationInterval Minimum time between validation updates (seconds)
* @param _description Human-readable description for the aggregator
*/
constructor(
address _baseAggregator,
address _sharesContract,
uint256 _maxDelay,
uint256 _maxDeviationBps,
uint256 _minValidationInterval,
string memory _description
) {
if (_baseAggregator == address(0)) {
revert ISharesOracleAggregator.BaseAggregatorZeroAddress();
}
if (_sharesContract == address(0)) revert ISharesOracleAggregator.SharesContractZeroAddress();
baseAggregator = IAggregatorWithDecimals(_baseAggregator);
sharesContract = IERC4626(_sharesContract);
maxDelay = _maxDelay;
maxDeviationBps = _maxDeviationBps;
minValidationInterval = _minValidationInterval;
owner = msg.sender;
baseDecimals = baseAggregator.decimals();
if (baseDecimals > MAX_DECIMALS) revert ISharesOracleAggregator.InvalidDecimals();
sharesDecimals = sharesContract.decimals();
if (sharesDecimals > MAX_DECIMALS) revert ISharesOracleAggregator.InvalidDecimals();
SHARE_UNIT = 10 ** sharesDecimals;
address asset = sharesContract.asset();
if (asset == address(0)) revert ISharesOracleAggregator.AssetZeroAddress();
assetDecimals = IERC20Metadata(asset).decimals();
if (assetDecimals > MAX_DECIMALS) revert ISharesOracleAggregator.InvalidDecimals();
ASSET_UNIT = 10 ** assetDecimals;
description = _description;
}
/*//////////////////////////////////////////////////////////////
CHAINLINK INTERFACE
//////////////////////////////////////////////////////////////*/
/// @inheritdoc ISharesOracleAggregator
function latestAnswer() external view returns (int256) {
(uint80 roundId, int256 basePrice,, uint256 baseTimestamp, uint80 answeredInRound) =
baseAggregator.latestRoundData();
_validateRound(basePrice, baseTimestamp, roundId, answeredInRound);
return _computeSharesPrice(basePrice);
}
/// @inheritdoc ISharesOracleAggregator
function latestTimestamp() external view returns (uint256) {
(uint80 roundId, int256 answer,, uint256 baseTimestamp, uint80 answeredInRound) =
baseAggregator.latestRoundData();
_validateRound(answer, baseTimestamp, roundId, answeredInRound);
return baseTimestamp;
}
/// @inheritdoc ISharesOracleAggregator
function latestRound() external view returns (uint256) {
return baseAggregator.latestRound();
}
/// @inheritdoc ISharesOracleAggregator
/// @dev Returns 0 for invalid/stale rounds. Downstream consumers must treat 0 as "price unavailable"
function getAnswer(uint256 roundId) external view returns (int256) {
try baseAggregator.getRoundData(uint80(roundId)) returns (
uint80 rId, int256 basePrice, uint256, /* startedAt */ uint256 timestamp, uint80 answeredInRound
) {
if (basePrice <= 0) return 0;
if (timestamp == 0) return 0;
if (answeredInRound < rId) return 0; // Round incomplete
if (!_isFresh(timestamp)) return 0;
return _computeSharesPrice(basePrice);
} catch {
return 0;
}
}
/// @inheritdoc ISharesOracleAggregator
/// @dev Returns 0 for invalid/stale rounds. Downstream consumers must treat 0 as "timestamp unavailable"
function getTimestamp(uint256 roundId) external view returns (uint256) {
try baseAggregator.getTimestamp(roundId) returns (uint256 timestamp) {
if (timestamp == 0) return 0; // Explicitly check for invalid timestamp
if (!_isFresh(timestamp)) return 0;
return timestamp;
} catch {
return 0;
}
}
/// @inheritdoc ISharesOracleAggregator
function decimals() external pure returns (uint8) {
return uint8(TARGET_DECIMALS);
}
/// @inheritdoc ISharesOracleAggregator
function version() external pure returns (uint256) {
return 1;
}
/// @inheritdoc ISharesOracleAggregator
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
(roundId, answer, startedAt, updatedAt, answeredInRound) = baseAggregator.latestRoundData();
_validateRound(answer, updatedAt, roundId, answeredInRound);
answer = _computeSharesPrice(answer);
}
/// @inheritdoc ISharesOracleAggregator
/// @dev WARNING: Historical rounds return price using CURRENT convertToAssets ratio,
/// not the historical ratio. This is inherent to the design - ERC4626 vaults
/// don't store historical conversion rates. Use latestRoundData() for accurate pricing.
function getRoundData(uint80 requestedRoundId)
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound)
{
(roundId, answer, startedAt, updatedAt, answeredInRound) = baseAggregator.getRoundData(requestedRoundId);
_validateRound(answer, updatedAt, roundId, answeredInRound);
answer = _computeSharesPrice(answer);
}
/*//////////////////////////////////////////////////////////////
INTERNAL FUNCTIONS
//////////////////////////////////////////////////////////////*/
/**
* @notice Validates round data according to Chainlink best practices
* @param answer The price answer from the oracle
* @param updatedAt Timestamp when the price was last updated
* @param roundId The round ID
* @param answeredInRound The round in which the answer was computed
* @dev Reverts if: price <= 0, round incomplete (answeredInRound < roundId),
* updatedAt == 0, or data is stale per maxDelay
*/
function _validateRound(int256 answer, uint256 updatedAt, uint80 roundId, uint80 answeredInRound) internal view {
if (answer <= 0) revert ISharesOracleAggregator.InvalidBasePrice();
if (answeredInRound < roundId) revert ISharesOracleAggregator.StaleRound();
if (updatedAt == 0) revert ISharesOracleAggregator.StaleRound();
if (!_isFresh(updatedAt)) {
revert ISharesOracleAggregator.PriceTooOld(block.timestamp, updatedAt, updatedAt + maxDelay);
}
}
/**
* @notice Checks if price data is fresh without reverting
* @param updatedAt Timestamp when the price was last updated
* @return True if fresh or maxDelay is 0, false otherwise
*/
function _isFresh(uint256 updatedAt) internal view returns (bool) {
if (updatedAt == 0) return false;
if (maxDelay == 0) return true;
return updatedAt + maxDelay >= block.timestamp;
}
/**
* @notice Computes the raw shares price without clamping
* @param basePrice The base asset price from the oracle
* @return The computed shares price in TARGET_DECIMALS precision (before clamping)
* @dev Formula: shares_price = base_price * convertToAssets(1 share) / 10^assetDecimals
*/
function _computeSharesPriceRaw(int256 basePrice) internal view returns (int256) {
// Get conversion rate: how many assets for 1 full share
uint256 assets = sharesContract.convertToAssets(SHARE_UNIT);
if (assets == 0) revert ISharesOracleAggregator.InvalidSharesConversion();
// shares_price = asset_price * assets / ASSET_UNIT
int256 sharesPrice = (basePrice * int256(assets)) / int256(ASSET_UNIT);
// Scale to target decimals (8)
if (baseDecimals > TARGET_DECIMALS) {
uint256 diff = baseDecimals - TARGET_DECIMALS;
sharesPrice /= int256(10 ** diff);
} else if (baseDecimals < TARGET_DECIMALS) {
uint256 diff = TARGET_DECIMALS - baseDecimals;
sharesPrice *= int256(10 ** diff);
}
return sharesPrice;
}
/**
* @notice Computes the shares price from the base asset price with clamping
* @param basePrice The base asset price from the oracle
* @return The computed shares price in TARGET_DECIMALS precision (after clamping if needed)
*/
function _computeSharesPrice(int256 basePrice) internal view returns (int256) {
int256 sharesPrice = _computeSharesPriceRaw(basePrice);
// Check deviation from last validated price and clamp if needed
if (_lastValidatedPrice > 0 && maxDeviationBps > 0) {
uint256 deviation = _calculateDeviation(_lastValidatedPrice, sharesPrice);
if (deviation > maxDeviationBps) {
// Instead of reverting, clamp to max allowed deviation
// This prevents DoS while still limiting price manipulation
int256 maxAllowedChange = (_lastValidatedPrice * int256(maxDeviationBps)) / 10000;
if (sharesPrice > _lastValidatedPrice) {
// Price increased - clamp to upper bound
sharesPrice = _lastValidatedPrice + maxAllowedChange;
} else {
// Price decreased - clamp to lower bound
sharesPrice = _lastValidatedPrice - maxAllowedChange;
}
}
}
return sharesPrice;
}
/**
* @notice Calculates price deviation in basis points
* @param oldPrice Previous price
* @param newPrice New price
* @return Deviation in basis points (10000 = 100%)
*/
function _calculateDeviation(int256 oldPrice, int256 newPrice) internal pure returns (uint256) {
if (oldPrice == 0) return 0;
int256 diff = newPrice > oldPrice ? newPrice - oldPrice : oldPrice - newPrice;
return uint256((diff * 10000) / oldPrice);
}
/*//////////////////////////////////////////////////////////////
ADMIN FUNCTIONS
//////////////////////////////////////////////////////////////*/
/// @inheritdoc ISharesOracleAggregator
function updateValidatedPrice() external {
if (msg.sender != owner) revert ISharesOracleAggregator.Unauthorized();
if (block.timestamp < _lastValidationTime + minValidationInterval) {
revert ISharesOracleAggregator.ValidationUpdateTooSoon();
}
// Get current price (this will revert if deviation is too high from old validated price)
// So we temporarily disable the check by setting maxDeviationBps to max
uint256 tempMaxDev = maxDeviationBps;
maxDeviationBps = type(uint256).max;
(, int256 answer,,,) = this.latestRoundData();
// Restore max deviation
maxDeviationBps = tempMaxDev;
_lastValidatedPrice = answer;
_lastValidationTime = block.timestamp;
emit ISharesOracleAggregator.ValidatedPriceUpdated(answer, block.timestamp);
}
/// @inheritdoc ISharesOracleAggregator
function updateMaxDeviation(uint256 newMaxDeviationBps) external {
if (msg.sender != owner) revert ISharesOracleAggregator.Unauthorized();
uint256 oldDeviation = maxDeviationBps;
maxDeviationBps = newMaxDeviationBps;
emit ISharesOracleAggregator.MaxDeviationUpdated(oldDeviation, newMaxDeviationBps);
}
/*//////////////////////////////////////////////////////////////
VIEW FUNCTIONS
//////////////////////////////////////////////////////////////*/
/// @inheritdoc ISharesOracleAggregator
function lastValidatedPrice() external view returns (int256) {
return _lastValidatedPrice;
}
/// @inheritdoc ISharesOracleAggregator
function isCurrentlyClamping() external view returns (bool isClamped, int256 actualPrice, int256 clampedPrice) {
// Get base price
(uint80 roundId, int256 basePrice,, uint256 baseTimestamp, uint80 answeredInRound) =
baseAggregator.latestRoundData();
_validateRound(basePrice, baseTimestamp, roundId, answeredInRound);
// Compute actual shares price (before clamping logic)
actualPrice = _computeSharesPriceRaw(basePrice);
// Check if clamping would occur
if (_lastValidatedPrice > 0 && maxDeviationBps > 0) {
uint256 deviation = _calculateDeviation(_lastValidatedPrice, actualPrice);
if (deviation > maxDeviationBps) {
isClamped = true;
// Compute clamped price
int256 maxAllowedChange = (_lastValidatedPrice * int256(maxDeviationBps)) / 10000;
if (actualPrice > _lastValidatedPrice) {
clampedPrice = _lastValidatedPrice + maxAllowedChange;
} else {
clampedPrice = _lastValidatedPrice - maxAllowedChange;
}
} else {
isClamped = false;
clampedPrice = actualPrice;
}
} else {
isClamped = false;
clampedPrice = actualPrice;
}
}
/*//////////////////////////////////////////////////////////////
OWNERSHIP
//////////////////////////////////////////////////////////////*/
/// @inheritdoc ISharesOracleAggregator
function transferOwnership(address newOwner) external {
if (msg.sender != owner) revert ISharesOracleAggregator.Unauthorized();
if (newOwner == address(0)) revert ISharesOracleAggregator.BaseAggregatorZeroAddress();
pendingOwner = newOwner;
emit ISharesOracleAggregator.OwnershipTransferStarted(owner, newOwner);
}
/// @inheritdoc ISharesOracleAggregator
function acceptOwnership() external {
if (msg.sender != pendingOwner) revert ISharesOracleAggregator.Unauthorized();
address previousOwner = owner;
owner = pendingOwner;
pendingOwner = address(0);
emit ISharesOracleAggregator.OwnershipTransferred(previousOwner, owner);
}
}// SPDX-License-Identifier: MIT
// Chainlink Contracts v0.8
pragma solidity ^0.8.0;
interface AggregatorInterface {
function latestAnswer() external view returns (int256);
function latestTimestamp() external view returns (uint256);
function latestRound() external view returns (uint256);
function getAnswer(uint256 roundId) external view returns (int256);
function getTimestamp(uint256 roundId) external view returns (uint256);
event AnswerUpdated(int256 indexed current, uint256 indexed roundId, uint256 updatedAt);
event NewRound(uint256 indexed roundId, address indexed startedBy, uint256 startedAt);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
interface IERC20Metadata {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
/**
* @title IERC4626
* @author Aave
* @notice Minimal ERC4626 Tokenized Vault Standard interface
* @dev Subset of EIP-4626 focusing on share-to-asset conversion
*/
interface IERC4626 {
/**
* @notice Returns the amount of assets that would be exchanged for the amount of shares provided
* @param shares The amount of shares to convert
* @return The amount of underlying assets equivalent to the shares
*/
function convertToAssets(uint256 shares) external view returns (uint256);
/**
* @notice Returns the number of decimals used by the vault shares
* @return The number of decimals for the share token
*/
function decimals() external view returns (uint8);
/**
* @notice Returns the address of the underlying asset token
* @return The address of the asset
*/
function asset() external view returns (address);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
/**
* @title ISharesOracleAggregator
* @author Neverland
* @notice Interface for SharesOracleAggregator that provides Chainlink-compatible oracle for ERC4626 vault shares
* @dev Converts base asset prices to vault share prices using ERC4626's convertToAssets function
* @dev Formula: shares_price = base_price * convertToAssets(1 share) / 10^assetDecimals
*/
interface ISharesOracleAggregator {
/*//////////////////////////////////////////////////////////////
ERRORS
//////////////////////////////////////////////////////////////*/
/// @notice Thrown when base aggregator address is zero
error BaseAggregatorZeroAddress();
/// @notice Thrown when shares contract address is zero
error SharesContractZeroAddress();
/// @notice Thrown when base price is invalid (zero or negative)
error InvalidBasePrice();
/// @notice Thrown when convertToAssets returns zero
error InvalidSharesConversion();
/// @notice Thrown when the ERC4626 asset address is zero
error AssetZeroAddress();
/// @notice Thrown when decimals exceed maximum allowed value (77)
error InvalidDecimals();
/**
* @notice Thrown when price data is too old
* @param currentTime Current block timestamp
* @param updatedAt Timestamp when price was last updated
* @param expiresAt Timestamp when price expires
*/
error PriceTooOld(uint256 currentTime, uint256 updatedAt, uint256 expiresAt);
/// @notice Thrown when oracle round is incomplete (answeredInRound < roundId or updatedAt == 0)
error StaleRound();
/**
* @notice Thrown when price deviation exceeds maximum allowed
* @param oldPrice Previous validated price
* @param newPrice New computed price
* @param deviation Actual deviation in basis points
* @param maxDeviation Maximum allowed deviation in basis points
*/
error PriceDeviationExceeded(int256 oldPrice, int256 newPrice, uint256 deviation, uint256 maxDeviation);
/// @notice Thrown when trying to update validated price too soon
error ValidationUpdateTooSoon();
/// @notice Thrown when caller is not authorized
error Unauthorized();
/*//////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
/**
* @notice Emitted when validated price is updated
* @param price New validated price
* @param timestamp Update timestamp
*/
event ValidatedPriceUpdated(int256 price, uint256 timestamp);
/**
* @notice Emitted when max deviation is updated
* @param oldDeviation Previous max deviation in bps
* @param newDeviation New max deviation in bps
*/
event MaxDeviationUpdated(uint256 oldDeviation, uint256 newDeviation);
/**
* @notice Emitted when ownership transfer is initiated
* @param previousOwner Current owner
* @param newOwner Pending new owner
*/
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @notice Emitted when ownership transfer is completed
* @param previousOwner Previous owner
* @param newOwner New owner
*/
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/*//////////////////////////////////////////////////////////////
CHAINLINK INTERFACE
//////////////////////////////////////////////////////////////*/
/**
* @notice Returns the latest shares price
* @return The latest price in 8 decimal precision (Chainlink standard)
*/
function latestAnswer() external view returns (int256);
/**
* @notice Returns the timestamp of the latest price update
* @return The timestamp of the latest update
*/
function latestTimestamp() external view returns (uint256);
/**
* @notice Returns the latest round ID from the base aggregator
* @return The latest round ID
*/
function latestRound() external view returns (uint256);
/**
* @notice Returns the shares price for a specific round
* @param roundId The round ID to query
* @return The price for the specified round, or 0 if unavailable/stale
* @dev IMPORTANT: A return value of 0 means "price unavailable/invalid"
* Downstream consumers MUST NOT treat 0 as a valid price
* This function performs round completeness checks (answeredInRound, timestamp)
*/
function getAnswer(uint256 roundId) external view returns (int256);
/**
* @notice Returns the timestamp for a specific round
* @param roundId The round ID to query
* @return The timestamp for the specified round, or 0 if unavailable/stale
* @dev IMPORTANT: A return value of 0 means "timestamp unavailable/invalid"
* Downstream consumers MUST NOT treat 0 as a valid timestamp
*/
function getTimestamp(uint256 roundId) external view returns (uint256);
/**
* @notice Returns the number of decimals used by this aggregator
* @return The number of decimals (always 8 for Chainlink compatibility)
*/
function decimals() external pure returns (uint8);
/**
* @notice Returns a description of this aggregator
* @return A string describing the aggregator
*/
function description() external view returns (string memory);
/**
* @notice Returns the version of this aggregator
* @return The version number
*/
function version() external pure returns (uint256);
/**
* @notice Returns the latest round data with shares price
* @return roundId The round ID from base aggregator
* @return answer The computed shares price
* @return startedAt Timestamp when the round started
* @return updatedAt Timestamp when the round was updated
* @return answeredInRound The round ID in which the answer was computed
*/
function latestRoundData()
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
/**
* @notice Returns round data for a specific round with shares price
* @param requestedRoundId The round ID to retrieve
* @return roundId The round ID from base aggregator
* @return answer The computed shares price for this round
* @return startedAt Timestamp when the round started
* @return updatedAt Timestamp when the round was updated
* @return answeredInRound The round ID in which the answer was computed
* @dev WARNING: Historical rounds use CURRENT convertToAssets ratio, not historical
* ERC4626 vaults do not store historical conversion rates
* For accurate pricing, use latestRoundData() only
* This is a known limitation, not a bug
*/
function getRoundData(uint80 requestedRoundId)
external
view
returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound);
/*//////////////////////////////////////////////////////////////
ADMIN FUNCTIONS
//////////////////////////////////////////////////////////////*/
/**
* @notice Updates the validated price reference (admin only)
* @dev Can only be called after minValidationInterval has passed
*/
function updateValidatedPrice() external;
/**
* @notice Updates the maximum allowed deviation (admin only)
* @param newMaxDeviationBps New maximum deviation in basis points
*/
function updateMaxDeviation(uint256 newMaxDeviationBps) external;
/*//////////////////////////////////////////////////////////////
VIEW FUNCTIONS
//////////////////////////////////////////////////////////////*/
/**
* @notice Returns the current validated price reference
* @return The last validated price
*/
function lastValidatedPrice() external view returns (int256);
/**
* @notice Returns the maximum allowed deviation
* @return The max deviation in basis points
*/
function maxDeviationBps() external view returns (uint256);
/**
* @notice Returns the current owner address
* @return The owner address
*/
function owner() external view returns (address);
/**
* @notice Returns the pending owner address (during two-step transfer)
* @return The pending owner address
*/
function pendingOwner() external view returns (address);
/**
* @notice Checks if current price is being clamped due to deviation
* @return isClamped True if current price would be clamped
* @return actualPrice The actual computed price (before clamping)
* @return clampedPrice The price that would be returned (after clamping)
*/
function isCurrentlyClamping() external view returns (bool isClamped, int256 actualPrice, int256 clampedPrice);
/*//////////////////////////////////////////////////////////////
OWNERSHIP
//////////////////////////////////////////////////////////////*/
/**
* @notice Initiates ownership transfer (two-step process)
* @param newOwner Address of the new owner
*/
function transferOwnership(address newOwner) external;
/**
* @notice Accepts ownership transfer (called by pending owner)
*/
function acceptOwnership() external;
}{
"optimizer": {
"enabled": true,
"runs": 100000
},
"evmVersion": "berlin",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_baseAggregator","type":"address"},{"internalType":"address","name":"_sharesContract","type":"address"},{"internalType":"uint256","name":"_maxDelay","type":"uint256"},{"internalType":"uint256","name":"_maxDeviationBps","type":"uint256"},{"internalType":"uint256","name":"_minValidationInterval","type":"uint256"},{"internalType":"string","name":"_description","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AssetZeroAddress","type":"error"},{"inputs":[],"name":"BaseAggregatorZeroAddress","type":"error"},{"inputs":[],"name":"InvalidBasePrice","type":"error"},{"inputs":[],"name":"InvalidDecimals","type":"error"},{"inputs":[],"name":"InvalidSharesConversion","type":"error"},{"inputs":[{"internalType":"int256","name":"oldPrice","type":"int256"},{"internalType":"int256","name":"newPrice","type":"int256"},{"internalType":"uint256","name":"deviation","type":"uint256"},{"internalType":"uint256","name":"maxDeviation","type":"uint256"}],"name":"PriceDeviationExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"currentTime","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"PriceTooOld","type":"error"},{"inputs":[],"name":"SharesContractZeroAddress","type":"error"},{"inputs":[],"name":"StaleRound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ValidationUpdateTooSoon","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldDeviation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newDeviation","type":"uint256"}],"name":"MaxDeviationUpdated","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":false,"internalType":"int256","name":"price","type":"int256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ValidatedPriceUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"assetDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseAggregator","outputs":[{"internalType":"contract IAggregatorWithDecimals","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint80","name":"requestedRoundId","type":"uint80"}],"name":"getRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roundId","type":"uint256"}],"name":"getTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isCurrentlyClamping","outputs":[{"internalType":"bool","name":"isClamped","type":"bool"},{"internalType":"int256","name":"actualPrice","type":"int256"},{"internalType":"int256","name":"clampedPrice","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastValidatedPrice","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestAnswer","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestRoundData","outputs":[{"internalType":"uint80","name":"roundId","type":"uint80"},{"internalType":"int256","name":"answer","type":"int256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"},{"internalType":"uint80","name":"answeredInRound","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDeviationBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minValidationInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sharesContract","outputs":[{"internalType":"contract IERC4626","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sharesDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxDeviationBps","type":"uint256"}],"name":"updateMaxDeviation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateValidatedPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
6101a06040523480156200001257600080fd5b506040516200230d3803806200230d833981016040819052620000359162000428565b6001600160a01b0386166200005d5760405163bf1c16e960e01b815260040160405180910390fd5b6001600160a01b03851662000085576040516319ece6e360e21b815260040160405180910390fd5b6001600160a01b03808716608081905290861660a05260c0859052600084905560e0839052600180546001600160a01b031916331790556040805163313ce56760e01b8152905163313ce567916004808201926020929091908290030181865afa158015620000f8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011e919062000549565b60ff16610100819052604d10156200014957604051630692acc560e51b815260040160405180910390fd5b60a0516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200018a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b0919062000549565b60ff16610120819052604d1015620001db57604051630692acc560e51b815260040160405180910390fd5b61012051620001ec90600a6200068a565b6101608181525050600060a0516001600160a01b03166338d52e0f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000237573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200025d91906200069b565b90506001600160a01b03811662000287576040516302a7314f60e41b815260040160405180910390fd5b806001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000549565b60ff16610140819052604d10156200031757604051630692acc560e51b815260040160405180910390fd5b610140516200032890600a6200068a565b610180528151620003419060039060208501906200034f565b5050505050505050620006f6565b8280546200035d90620006b9565b90600052602060002090601f016020900481019282620003815760008555620003cc565b82601f106200039c57805160ff1916838001178555620003cc565b82800160010185558215620003cc579182015b82811115620003cc578251825591602001919060010190620003af565b50620003da929150620003de565b5090565b5b80821115620003da5760008155600101620003df565b80516001600160a01b03811681146200040d57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60008060008060008060c087890312156200044257600080fd5b6200044d87620003f5565b955060206200045e818901620003f5565b604089015160608a015160808b015160a08c0151939950919750955093506001600160401b03808211156200049257600080fd5b818a0191508a601f830112620004a757600080fd5b815181811115620004bc57620004bc62000412565b604051601f8201601f19908116603f01168101908382118183101715620004e757620004e762000412565b816040528281528d868487010111156200050057600080fd5b600093505b8284101562000524578484018601518185018701529285019262000505565b82841115620005365760008684830101525b8096505050505050509295509295509295565b6000602082840312156200055c57600080fd5b815160ff811681146200056e57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620005cc578160001904821115620005b057620005b062000575565b80851615620005be57918102915b93841c939080029062000590565b509250929050565b600082620005e55750600162000684565b81620005f45750600062000684565b81600181146200060d5760028114620006185762000638565b600191505062000684565b60ff8411156200062c576200062c62000575565b50506001821b62000684565b5060208310610133831016604e8410600b84101617156200065d575081810a62000684565b6200066983836200058b565b806000190482111562000680576200068062000575565b0290505b92915050565b60006200056e60ff841683620005d4565b600060208284031215620006ae57600080fd5b6200056e82620003f5565b600181811c90821680620006ce57607f821691505b60208210811415620006f057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516101605161018051611b2f620007de60003960006113fd01526000611315015260006103c2015260006101cd01526000818161022c0152818161143601528181611469015281816114b101526114e2015260008181610304015261055501526000818161042e015281816111720152818161128f01526112c0015260008181610290015261135501526000818161039b015281816106b0015281816107680152818161096501528181610a6901528181610b3d01528181610c9301528181610d6c0152610fe40152611b2f6000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638205bf6a116100ee578063b9692bd211610097578063e30c397811610071578063e30c397814610409578063ed49d2f814610429578063f2fde38b14610450578063feaf968c1461046357600080fd5b8063b9692bd214610396578063c2d41601146103bd578063d5c84a38146103e457600080fd5b80639a6fc8f5116100c85780639a6fc8f514610326578063b5ab58dc14610370578063b633620c1461038357600080fd5b80638205bf6a146102d75780638da5cb5b146102df578063952684ae146102ff57600080fd5b80633ee7a7011161015b578063668a0f0211610135578063668a0f02146102665780637284e4161461026e57806379ba5097146102835780637bc1ed631461028b57600080fd5b80633ee7a7011461024e57806350d25bcd1461025757806354fd4d501461025f57600080fd5b80632dd67a421161018c5780632dd67a421461020e578063313ce5671461022057806333f761781461022757600080fd5b806302651a29146101b3578063149aa916146101c85780632a9477d614610206575b600080fd5b6101c66101c136600461157d565b61046b565b005b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020015b60405180910390f35b6101c6610502565b6004545b6040519081526020016101fd565b60086101ef565b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b61021260005481565b6102126106a6565b6001610212565b610212610764565b6102766107fa565b6040516101fd9190611596565b6101c6610888565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fd565b61021261095b565b6001546102b29073ffffffffffffffffffffffffffffffffffffffff1681565b6102127f000000000000000000000000000000000000000000000000000000000000000081565b610339610334366004611624565b610a0f565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016101fd565b61021261037e36600461157d565b610b00565b61021261039136600461157d565b610c61565b6102b27f000000000000000000000000000000000000000000000000000000000000000081565b6101ef7f000000000000000000000000000000000000000000000000000000000000000081565b6103ec610d5f565b6040805193151584526020840192909252908201526060016101fd565b6002546102b29073ffffffffffffffffffffffffffffffffffffffff1681565b6102127f000000000000000000000000000000000000000000000000000000000000000081565b6101c661045e366004611641565b610ec5565b610339610fda565b60015473ffffffffffffffffffffffffffffffffffffffff1633146104bc576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549082905560408051828152602081018490527fea7b0359048504e79474eaaa05294b49265fc4e7b0a0c3737aaa22412e90f16e91015b60405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610553576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060055461058191906116a6565b4210156105ba576040517f3370678500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008190555060003073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906116be565b505050600084905560048190554260058190556040805183815260208101929092529193507f74cce8dc025f18877bd0df5b69d8d22c4cfb4d2c93c991288734263b6410af369250016104f6565b60008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073d91906116be565b9450945050935093506107528383868461109b565b61075b836111e4565b94505050505090565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663668a0f026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f59190611716565b905090565b600380546108079061172f565b80601f01602080910402602001604051908101604052809291908181526020018280546108339061172f565b80156108805780601f1061085557610100808354040283529160200191610880565b820191906000526020600020905b81548152906001019060200180831161086357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108d9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018054600280547fffffffffffffffffffffffff000000000000000000000000000000000000000080841673ffffffffffffffffffffffffffffffffffffffff8381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b60008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906116be565b945094505093509350610a078383868461109b565b509392505050565b6040517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff82166004820152600090819081908190819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639a6fc8f59060240160a060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906116be565b939850919650945092509050610aec8483878461109b565b610af5846111e4565b935091939590929450565b6040517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff821660048201526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690639a6fc8f59060240160a060405180830381865afa925050508015610bd3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bd0918101906116be565b60015b610bdf57506000919050565b60008413610bf4575060009695505050505050565b81610c06575060009695505050505050565b8469ffffffffffffffffffff168169ffffffffffffffffffff161015610c33575060009695505050505050565b610c3c8261127e565b610c4d575060009695505050505050565b610c56846111e4565b979650505050505050565b6040517fb633620c000000000000000000000000000000000000000000000000000000008152600481018290526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063b633620c90602401602060405180830381865afa925050508015610d29575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610d2691810190611716565b60015b610d3557506000919050565b80610d435750600092915050565b610d4c8161127e565b610d595750600092915050565b92915050565b60008060008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df991906116be565b945094505093509350610e0e8383868461109b565b610e17836112ed565b95506000600454138015610e2c575060008054115b15610eb4576000610e3f6004548861152b565b9050600054811115610ea657600197506000612710600054600454610e649190611783565b610e6e919061183f565b9050600454881315610e8f5780600454610e8891906118ce565b9650610ea0565b80600454610e9d9190611942565b96505b50610eae565b600097508695505b50610ebc565b600096508594505b50505050909192565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f16576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610f63576040517fbf1c16e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b60008060008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107191906116be565b9398509196509450925090506110898483878461109b565b611092846111e4565b93509091929394565b600084136110d5576040517fb2c4287100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8169ffffffffffffffffffff168169ffffffffffffffffffff161015611127576040517f04d2887100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261115e576040517f04d2887100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111678361127e565b6111de5742836111977f0000000000000000000000000000000000000000000000000000000000000000826116a6565b6040517f4253334a00000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152604482015260640160405180910390fd5b50505050565b6000806111f0836112ed565b90506000600454138015611205575060008054115b15610d595760006112186004548361152b565b90506000548111156112775760006127106000546004546112399190611783565b611243919061183f565b9050600454831315611264578060045461125d91906118ce565b9250611275565b806004546112729190611942565b92505b505b5092915050565b60008161128d57506000919050565b7f00000000000000000000000000000000000000000000000000000000000000006112ba57506001919050565b426112e57f0000000000000000000000000000000000000000000000000000000000000000846116a6565b101592915050565b6040517f07a2d13a0000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906307a2d13a90602401602060405180830381865afa15801561139c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c09190611716565b9050806113f9576040517f22d125db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006114268386611783565b611430919061183f565b905060087f000000000000000000000000000000000000000000000000000000000000000060ff1611156114ad57600061148e600860ff7f0000000000000000000000000000000000000000000000000000000000000000166119b6565b905061149b81600a611aed565b6114a5908361183f565b915050611524565b60087f000000000000000000000000000000000000000000000000000000000000000060ff16101561152457600061150960ff7f00000000000000000000000000000000000000000000000000000000000000001660086119b6565b905061151681600a611aed565b6115209083611783565b9150505b9392505050565b60008261153a57506000610d59565b60008383136115525761154d8385611942565b61155c565b61155c8484611942565b90508361156b82612710611783565b611575919061183f565b949350505050565b60006020828403121561158f57600080fd5b5035919050565b600060208083528351808285015260005b818110156115c3578581018301518582016040015282016115a7565b818111156115d5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b69ffffffffffffffffffff8116811461162157600080fd5b50565b60006020828403121561163657600080fd5b813561152481611609565b60006020828403121561165357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461152457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156116b9576116b9611677565b500190565b600080600080600060a086880312156116d657600080fd5b85516116e181611609565b80955050602086015193506040860151925060608601519150608086015161170881611609565b809150509295509295909350565b60006020828403121561172857600080fd5b5051919050565b600181811c9082168061174357607f821691505b6020821081141561177d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156117c4576117c4611677565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156117ff576117ff611677565b6000871292508782058712848416161561181b5761181b611677565b8785058712818416161561183157611831611677565b505050929093029392505050565b600082611875577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156118c9576118c9611677565b500590565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561190857611908611677565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561193c5761193c611677565b50500190565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561197c5761197c611677565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156119b0576119b0611677565b50500390565b6000828210156119c8576119c8611677565b500390565b600181815b80851115611a2657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611a0c57611a0c611677565b80851615611a1957918102915b93841c93908002906119d2565b509250929050565b600082611a3d57506001610d59565b81611a4a57506000610d59565b8160018114611a605760028114611a6a57611a86565b6001915050610d59565b60ff841115611a7b57611a7b611677565b50506001821b610d59565b5060208310610133831016604e8410600b8410161715611aa9575081810a610d59565b611ab383836119cd565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ae557611ae5611677565b029392505050565b60006115248383611a2e56fea2646970667358221220fe21e34613d81358bcc6b485cd61b5f2390e9f56e780a39c53960e916b482a9164736f6c634300080a003300000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d250000000000000000000000009c82eb49b51f7dc61e22ff347931ca32adc6cd9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000c6c6f415a4e44202f205553440000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638205bf6a116100ee578063b9692bd211610097578063e30c397811610071578063e30c397814610409578063ed49d2f814610429578063f2fde38b14610450578063feaf968c1461046357600080fd5b8063b9692bd214610396578063c2d41601146103bd578063d5c84a38146103e457600080fd5b80639a6fc8f5116100c85780639a6fc8f514610326578063b5ab58dc14610370578063b633620c1461038357600080fd5b80638205bf6a146102d75780638da5cb5b146102df578063952684ae146102ff57600080fd5b80633ee7a7011161015b578063668a0f0211610135578063668a0f02146102665780637284e4161461026e57806379ba5097146102835780637bc1ed631461028b57600080fd5b80633ee7a7011461024e57806350d25bcd1461025757806354fd4d501461025f57600080fd5b80632dd67a421161018c5780632dd67a421461020e578063313ce5671461022057806333f761781461022757600080fd5b806302651a29146101b3578063149aa916146101c85780632a9477d614610206575b600080fd5b6101c66101c136600461157d565b61046b565b005b6101ef7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020015b60405180910390f35b6101c6610502565b6004545b6040519081526020016101fd565b60086101ef565b6101ef7f000000000000000000000000000000000000000000000000000000000000000881565b61021260005481565b6102126106a6565b6001610212565b610212610764565b6102766107fa565b6040516101fd9190611596565b6101c6610888565b6102b27f0000000000000000000000009c82eb49b51f7dc61e22ff347931ca32adc6cd9081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101fd565b61021261095b565b6001546102b29073ffffffffffffffffffffffffffffffffffffffff1681565b6102127f000000000000000000000000000000000000000000000000000000000000000081565b610339610334366004611624565b610a0f565b6040805169ffffffffffffffffffff968716815260208101959095528401929092526060830152909116608082015260a0016101fd565b61021261037e36600461157d565b610b00565b61021261039136600461157d565b610c61565b6102b27f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2581565b6101ef7f000000000000000000000000000000000000000000000000000000000000001281565b6103ec610d5f565b6040805193151584526020840192909252908201526060016101fd565b6002546102b29073ffffffffffffffffffffffffffffffffffffffff1681565b6102127f000000000000000000000000000000000000000000000000000000000000000081565b6101c661045e366004611641565b610ec5565b610339610fda565b60015473ffffffffffffffffffffffffffffffffffffffff1633146104bc576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549082905560408051828152602081018490527fea7b0359048504e79474eaaa05294b49265fc4e7b0a0c3737aaa22412e90f16e91015b60405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610553576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060055461058191906116a6565b4210156105ba576040517f3370678500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60008190555060003073ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610634573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065891906116be565b505050600084905560048190554260058190556040805183815260208101929092529193507f74cce8dc025f18877bd0df5b69d8d22c4cfb4d2c93c991288734263b6410af369250016104f6565b60008060008060007f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610719573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061073d91906116be565b9450945050935093506107528383868461109b565b61075b836111e4565b94505050505090565b60007f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1663668a0f026040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f59190611716565b905090565b600380546108079061172f565b80601f01602080910402602001604051908101604052809291908181526020018280546108339061172f565b80156108805780601f1061085557610100808354040283529160200191610880565b820191906000526020600020905b81548152906001019060200180831161086357829003601f168201915b505050505081565b60025473ffffffffffffffffffffffffffffffffffffffff1633146108d9576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018054600280547fffffffffffffffffffffffff000000000000000000000000000000000000000080841673ffffffffffffffffffffffffffffffffffffffff8381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b60008060008060007f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906116be565b945094505093509350610a078383868461109b565b509392505050565b6040517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff82166004820152600090819081908190819073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d251690639a6fc8f59060240160a060405180830381865afa158015610ab0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad491906116be565b939850919650945092509050610aec8483878461109b565b610af5846111e4565b935091939590929450565b6040517f9a6fc8f500000000000000000000000000000000000000000000000000000000815269ffffffffffffffffffff821660048201526000907f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1690639a6fc8f59060240160a060405180830381865afa925050508015610bd3575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610bd0918101906116be565b60015b610bdf57506000919050565b60008413610bf4575060009695505050505050565b81610c06575060009695505050505050565b8469ffffffffffffffffffff168169ffffffffffffffffffff161015610c33575060009695505050505050565b610c3c8261127e565b610c4d575060009695505050505050565b610c56846111e4565b979650505050505050565b6040517fb633620c000000000000000000000000000000000000000000000000000000008152600481018290526000907f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff169063b633620c90602401602060405180830381865afa925050508015610d29575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610d2691810190611716565b60015b610d3557506000919050565b80610d435750600092915050565b610d4c8161127e565b610d595750600092915050565b92915050565b60008060008060008060007f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015610dd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610df991906116be565b945094505093509350610e0e8383868461109b565b610e17836112ed565b95506000600454138015610e2c575060008054115b15610eb4576000610e3f6004548861152b565b9050600054811115610ea657600197506000612710600054600454610e649190611783565b610e6e919061183f565b9050600454881315610e8f5780600454610e8891906118ce565b9650610ea0565b80600454610e9d9190611942565b96505b50610eae565b600097508695505b50610ebc565b600096508594505b50505050909192565b60015473ffffffffffffffffffffffffffffffffffffffff163314610f16576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8116610f63576040517fbf1c16e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff838116918217909255600154604051919216907f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270090600090a350565b60008060008060007f00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d2573ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561104d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107191906116be565b9398509196509450925090506110898483878461109b565b611092846111e4565b93509091929394565b600084136110d5576040517fb2c4287100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8169ffffffffffffffffffff168169ffffffffffffffffffff161015611127576040517f04d2887100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8261115e576040517f04d2887100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111678361127e565b6111de5742836111977f0000000000000000000000000000000000000000000000000000000000000000826116a6565b6040517f4253334a00000000000000000000000000000000000000000000000000000000815260048101939093526024830191909152604482015260640160405180910390fd5b50505050565b6000806111f0836112ed565b90506000600454138015611205575060008054115b15610d595760006112186004548361152b565b90506000548111156112775760006127106000546004546112399190611783565b611243919061183f565b9050600454831315611264578060045461125d91906118ce565b9250611275565b806004546112729190611942565b92505b505b5092915050565b60008161128d57506000919050565b7f00000000000000000000000000000000000000000000000000000000000000006112ba57506001919050565b426112e57f0000000000000000000000000000000000000000000000000000000000000000846116a6565b101592915050565b6040517f07a2d13a0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000de0b6b3a76400006004820152600090819073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000009c82eb49b51f7dc61e22ff347931ca32adc6cd9016906307a2d13a90602401602060405180830381865afa15801561139c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c09190611716565b9050806113f9576040517f22d125db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60007f0000000000000000000000000000000000000000000000000de0b6b3a76400006114268386611783565b611430919061183f565b905060087f000000000000000000000000000000000000000000000000000000000000000860ff1611156114ad57600061148e600860ff7f0000000000000000000000000000000000000000000000000000000000000008166119b6565b905061149b81600a611aed565b6114a5908361183f565b915050611524565b60087f000000000000000000000000000000000000000000000000000000000000000860ff16101561152457600061150960ff7f00000000000000000000000000000000000000000000000000000000000000081660086119b6565b905061151681600a611aed565b6115209083611783565b9150505b9392505050565b60008261153a57506000610d59565b60008383136115525761154d8385611942565b61155c565b61155c8484611942565b90508361156b82612710611783565b611575919061183f565b949350505050565b60006020828403121561158f57600080fd5b5035919050565b600060208083528351808285015260005b818110156115c3578581018301518582016040015282016115a7565b818111156115d5576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b69ffffffffffffffffffff8116811461162157600080fd5b50565b60006020828403121561163657600080fd5b813561152481611609565b60006020828403121561165357600080fd5b813573ffffffffffffffffffffffffffffffffffffffff8116811461152457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600082198211156116b9576116b9611677565b500190565b600080600080600060a086880312156116d657600080fd5b85516116e181611609565b80955050602086015193506040860151925060608601519150608086015161170881611609565b809150509295509295909350565b60006020828403121561172857600080fd5b5051919050565b600181811c9082168061174357607f821691505b6020821081141561177d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6000841360008413858304851182821616156117c4576117c4611677565b7f800000000000000000000000000000000000000000000000000000000000000060008712868205881281841616156117ff576117ff611677565b6000871292508782058712848416161561181b5761181b611677565b8785058712818416161561183157611831611677565b505050929093029392505050565b600082611875577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83147f8000000000000000000000000000000000000000000000000000000000000000831416156118c9576118c9611677565b500590565b6000808212827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0384138115161561190857611908611677565b827f800000000000000000000000000000000000000000000000000000000000000003841281161561193c5761193c611677565b50500190565b6000808312837f80000000000000000000000000000000000000000000000000000000000000000183128115161561197c5761197c611677565b837f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0183138116156119b0576119b0611677565b50500390565b6000828210156119c8576119c8611677565b500390565b600181815b80851115611a2657817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611a0c57611a0c611677565b80851615611a1957918102915b93841c93908002906119d2565b509250929050565b600082611a3d57506001610d59565b81611a4a57506000610d59565b8160018114611a605760028114611a6a57611a86565b6001915050610d59565b60ff841115611a7b57611a7b611677565b50506001821b610d59565b5060208310610133831016604e8410600b8410161715611aa9575081810a610d59565b611ab383836119cd565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04821115611ae557611ae5611677565b029392505050565b60006115248383611a2e56fea2646970667358221220fe21e34613d81358bcc6b485cd61b5f2390e9f56e780a39c53960e916b482a9164736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d250000000000000000000000009c82eb49b51f7dc61e22ff347931ca32adc6cd9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000c6c6f415a4e44202f205553440000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _baseAggregator (address): 0x63Bb491346fCC8695244D811F0c3501E6C2e8d25
Arg [1] : _sharesContract (address): 0x9c82eB49B51F7Dc61e22Ff347931CA32aDc6cd90
Arg [2] : _maxDelay (uint256): 0
Arg [3] : _maxDeviationBps (uint256): 0
Arg [4] : _minValidationInterval (uint256): 0
Arg [5] : _description (string): loAZND / USD
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000063bb491346fcc8695244d811f0c3501e6c2e8d25
Arg [1] : 0000000000000000000000009c82eb49b51f7dc61e22ff347931ca32adc6cd90
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 6c6f415a4e44202f205553440000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MON
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.