Skip to main content

ERC7726OracleFactory

Git Source

Inherits: Policy, PolicyEnabler, IERC7726OracleFactory, IVersioned, ReentrancyGuard

Title: ERC7726OracleFactory

Author: OlympusDAO

forge-lint: disable-start(mixed-case-function,mixed-case-variable)

Factory for deploying generic ERC7726 clone oracles keyed by maxAge

State Variables​

_ROLES_KEYCODE​

bytes5 internal constant _ROLES_KEYCODE = "ROLES"

priceCache​

The pair cache policy

IPriceCache public priceCache

ORACLE_IMPLEMENTATION​

Reference implementation for cloning

ERC7726OracleCloneable public immutable ORACLE_IMPLEMENTATION

isCreationEnabled​

Whether new oracle creation is enabled

bool public isCreationEnabled

_oracles​

Internal array of all deployed oracles

address[] internal _oracles

_enabledOracleCount​

Number of deployed oracles that are currently enabled

Updated when oracles are created, enabled, or disabled. Factory-level re-enable recaching skips all requested pairs when this count is zero.

uint256 internal _enabledOracleCount

_maxAgeToOracle​

Mapping from maxAge to oracle

mapping(uint48 maxAge => address oracle) internal _maxAgeToOracle

_oracleToMaxAge​

Mapping from oracle to maxAge

mapping(address oracle => uint48 maxAge) internal _oracleToMaxAge

isOracle​

Mapping to validate deployed oracles

mapping(address oracle => bool) public isOracle

_isOracleEnabled​

Mapping to track if an oracle is enabled

mapping(address oracle => bool) internal _isOracleEnabled

_DEFAULT_ORACLE_NAME​

bytes32 internal constant _DEFAULT_ORACLE_NAME = "ERC7726 Oracle"

Functions​

constructor​

Constructs a new ERC7726OracleFactory

Reverts if priceCache_ is not a valid IPriceCache policy for this Kernel.

constructor(Kernel kernel_, address priceCache_) Policy(kernel_);

Parameters

NameTypeDescription
kernel_KernelThe Kernel address
priceCache_addressThe price cache policy address

configureDependencies​

Define module dependencies for this policy.

Reverts if the configured ROLES module major version is unsupported.

function configureDependencies() external override returns (Keycode[] memory dependencies);

Returns

NameTypeDescription
dependenciesKeycode[]- Keycode array of module dependencies.

requestPermissions​

Function called by kernel to set module function permissions.

Does not revert.

function requestPermissions() external pure override returns (Permissions[] memory requests);

Returns

NameTypeDescription
requestsPermissions[]- Array of keycodes and function selectors for requested permissions.

VERSION​

Returns the version of the contract

Does not revert.

function VERSION() external pure override returns (uint8 major, uint8 minor);

Returns

NameTypeDescription
majoruint8- Major version upgrade indicates breaking change to the interface.
minoruint8- Minor version change retains backward-compatible interface.

onlyPolicyActive​

Reverts if this policy is not active in the Kernel.

modifier onlyPolicyActive() ;

_onlyPolicyActive​

function _onlyPolicyActive() internal view;

_onlyOracleManagerOrAdminRole​

function _onlyOracleManagerOrAdminRole() internal view;

_onlyOracleManagerOrAdminOrEmergencyRole​

function _onlyOracleManagerOrAdminOrEmergencyRole() internal view;

onlyOracleManagerOrAdminRole​

modifier onlyOracleManagerOrAdminRole() ;

onlyOracleManagerOrAdminOrEmergencyRole​

modifier onlyOracleManagerOrAdminOrEmergencyRole() ;

createOracle​

Creates a new oracle for a specific maxAge

Creates an enabled oracle and adds it to the factory-level re-enable recache count.

Reverts if:

  • The factory is disabled
  • The caller is not admin or oracle manager
  • Oracle creation is disabled
  • An oracle for maxAge_ already exists
  • customParams_ is non-empty and not exactly 32 bytes
function createOracle(uint48 maxAge_, bytes calldata customParams_)
external
override
onlyEnabled
onlyOracleManagerOrAdminRole
nonReentrant
returns (address oracle);

Parameters

NameTypeDescription
maxAge_uint48The maximum age (in seconds) of cached prices used by the oracle
customParams_bytesOptional params for factory-specific customization

Returns

NameTypeDescription
oracleaddressThe address of the created oracle

getOracle​

Gets the oracle address for a maxAge

Does not revert.

function getOracle(uint48 maxAge_) external view override returns (address oracle);

Parameters

NameTypeDescription
maxAge_uint48The maximum age used by the oracle

Returns

NameTypeDescription
oracleaddressThe oracle address, or address(0) if not found

getOracles​

Gets all deployed oracle addresses

Does not revert.

function getOracles() external view override returns (address[] memory oracles);

Returns

NameTypeDescription
oraclesaddress[]Array of all oracle addresses

getPriceCache​

Gets the configured price cache policy

Does not revert.

function getPriceCache() external view override returns (address policy);

Returns

NameTypeDescription
policyaddressThe price cache policy address

enableCreation​

Enables oracle creation

enableCreation() sets isCreationEnabled to true. It does not update the enabled-oracle counter or perform recaching logic.

Reverts if:

  • The factory is disabled
  • The caller is not admin or oracle manager
  • Creation is already enabled
function enableCreation() external override onlyEnabled onlyOracleManagerOrAdminRole nonReentrant;

disableCreation​

Disables oracle creation

disableCreation() sets isCreationEnabled to false. It does not update the enabled-oracle counter or perform recaching logic.

Reverts if:

  • The factory is disabled
  • The caller is not admin, oracle manager, or emergency
  • Creation is already disabled
function disableCreation() external override onlyEnabled onlyOracleManagerOrAdminOrEmergencyRole nonReentrant;

setPriceCache​

Sets the configured price cache policy

Reverts if:

  • The factory is disabled
  • The caller is not admin
  • policy_ is zero, not IPriceCache-compatible, or bound to a different Kernel
function setPriceCache(address policy_) external override onlyEnabled onlyAdminRole nonReentrant;

Parameters

NameTypeDescription
policy_addressThe price cache policy address

enableOracle​

Enables a specific oracle

Reverts if:

  • The factory is disabled
  • The caller is not admin or oracle manager
  • oracle_ is not a factory-created oracle
  • oracle_ is already enabled
function enableOracle(address oracle_) external override onlyEnabled onlyOracleManagerOrAdminRole nonReentrant;

Parameters

NameTypeDescription
oracle_addressThe oracle address to enable

disableOracle​

Disables a specific oracle

Reverts if:

  • The factory is disabled
  • The caller is not admin, oracle manager, or emergency
  • oracle_ is not a factory-created oracle
  • oracle_ is already disabled
function disableOracle(address oracle_)
external
override
onlyEnabled
onlyOracleManagerOrAdminOrEmergencyRole
nonReentrant;

Parameters

NameTypeDescription
oracle_addressThe oracle address to disable

isOracleEnabled​

Checks if a specific oracle is enabled

Reverts if the policy is deactivated in Kernel.

function isOracleEnabled(address oracle_) external view override onlyPolicyActive returns (bool enabled);

Parameters

NameTypeDescription
oracle_addressThe oracle address to check

Returns

NameTypeDescription
enabledboolTrue if the oracle is enabled, false otherwise

getOracleContext​

Checks if a factory-created oracle is enabled and returns the configured price cache

Reverts if:

  • The policy is deactivated in Kernel
  • oracle_ was not created by this factory
function getOracleContext(address oracle_)
external
view
override
onlyPolicyActive
returns (bool enabled, address policy);

Parameters

NameTypeDescription
oracle_addressThe oracle address to check

Returns

NameTypeDescription
enabledboolTrue if the oracle is enabled, false otherwise
policyaddressThe configured price cache policy address

cachePrice​

Cache the direct pair unconditionally for the calling oracle

Reverts if:

  • The policy is deactivated in Kernel
  • The factory is disabled
  • The caller is not a factory-created oracle
  • The caller oracle is disabled
  • Underlying cache write fails
function cachePrice(address base_, address quote_) external override onlyPolicyActive onlyEnabled nonReentrant;

Parameters

NameTypeDescription
base_addressThe base asset to cache
quote_addressThe quote asset to cache

cachePriceIfNecessary​

Cache the direct pair only when stale for the calling oracle's configured max age

Reverts if:

  • The policy is deactivated in Kernel
  • The factory is disabled
  • The caller is not a factory-created oracle
  • The caller oracle is disabled
  • Underlying cache evaluation/write fails
function cachePriceIfNecessary(address base_, address quote_)
external
override
onlyPolicyActive
onlyEnabled
nonReentrant;

Parameters

NameTypeDescription
base_addressThe base asset to conditionally cache
quote_addressThe quote asset to conditionally cache

_enable​

Implementation-specific enable function

_enable optionally re-caches caller-specified pairs from enableData_ before the factory-level isEnabled flag flips to true. enableData_ can be empty for a no-op. Requested pairs are only recached when at least one ERC-7726 oracle variant is enabled; otherwise all requested pairs are skipped because disabled clones cannot request fresh cache writes until they are individually re-enabled. When enableData_ is non-empty, it must encode: (address[] baseTokens, address[] quoteTokens). Reverts if enableData_ is non-empty and:

  • enableData_ cannot be decoded into (address[] baseTokens, address[] quoteTokens)
  • The decoded base and quote token arrays have different lengths
  • The price cache rejects a requested pair during recaching
function _enable(bytes calldata enableData_) internal override;

Parameters

NameTypeDescription
enableData_bytesCustom data that can be used by the implementation. The format of this data is left to the discretion of the implementation.

_decodeOracleName​

function _decodeOracleName(bytes calldata customParams_) internal pure returns (bytes32 oracleName);

_validateCachingCaller​

function _validateCachingCaller(address caller_) internal view;

_hasEnabledOracleVariant​

function _hasEnabledOracleVariant() internal view returns (bool);

_setPriceCache​

function _setPriceCache(address policy_) internal;

_implementsIPriceCache​

function _implementsIPriceCache(address policy_) internal view returns (bool);

_hasSameKernel​

function _hasSameKernel(address policy_) internal view returns (bool);

supportsInterface​

Query if a contract implements an interface

Does not revert.

function supportsInterface(bytes4 interfaceId_) public view override returns (bool);

Parameters

NameTypeDescription
interfaceId_bytes4The interface identifier, as specified in ERC-165

Returns

NameTypeDescription
<none>boolbool True if the contract implements interfaceId_