Skip to content

VaultOracleFactory ​

Git Source

Inherits: VaultError, VaultOracleFactoryConstants, VaultOracleFactoryEvents, VaultOracleFactoryVariables, UUPSUpgradeable

Title: VaultOracleFactory

Deploys per-vault oracles via FluidContractFactory so the oracle lands at AddressCalcs.addressCalc(DEPLOYER_FACTORY, nonce). T2–T4 vault admin uses updateOracle(uint); T1 uses updateOracle(address) with that address. The FluidContractFactory must allow-list this contract via updateDeployer(address(this), count) (owner-only). registerVault is restricted to governance, TEAM_MULTISIG, or vaultOracleDeployer allow-list entries. Governance may registerVaultForce to redeploy and replace the recorded nonce for a vault ID.

Proxy deployment (see factory/proxy.sol, README, spec §8.0): In production this implementation is placed behind VaultOracleFactoryProxy (ERC1967 UUPS) so (1) logic can be upgraded without changing the factory address, (2) vaultIdToOracleDeployNonce stays at a stable address across upgrades, and (3) integrators and allow-lists can keep a single canonical factory address per network. Not the “infinite” meta-proxy pattern. Upgrades are allowed only by Liquidity governance (same address as resolved on LIQUIDITY via readFromStorage).

Nonce tracking: For each VAULT_ID, vaultIdToOracleDeployNonce stores the global FluidContractFactory deploy nonce for that vault's oracle. The oracle address is DEPLOYER_FACTORY.getContractAddress(nonce); off-chain handlers can verify updateOracle targets the canonical deployment via that nonce.

T2–T4 DEX share peg buffers are per-oracle immutables set at registerVault (pegBufferPpmOperate_, pegBufferPpmLiquidate_; factory max 1%). T1 uses 0, 0. T1 uses IFluidVaultT1.constantsView() only; T2–T4 use IFluidVault views and a deployer check.

Functions ​

constructor ​

solidity
constructor(
    address liquidity_,
    address usdOracle_,
    address vaultFactory_,
    address deployerFactory_,
    address t1OracleLogic_,
    address t2OracleLogic_,
    address t3OracleLogic_,
    address t4OracleLogic_
) ;

setVaultOracleDeployer ​

Allow-list or remove an address allowed to call registerVault. Callable by governance or TEAM_MULTISIG.

solidity
function setVaultOracleDeployer(address _deployer, bool allowed_) external;

registerVault ​

Deploys a vault oracle for vaultId_ with immutable supply/borrow eModes and DEX share peg buffers baked into the oracle.

solidity
function registerVault(
    uint256 vaultId_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) external returns (address vaultOracle_);

Parameters

NameTypeDescription
vaultId_uint256
supplyEMode_uint256
borrowEMode_uint256
pegBufferPpmOperate_uint256Operate-path reserve adjustment for T2-T4 DEX share legs; ignored for T1.
pegBufferPpmLiquidate_uint256Liquidate-path equivalent; must not exceed pegBufferPpmOperate_.

registerVaultForce ​

Same as registerVault but governance-only; may replace an existing oracle nonce for vaultId_.

solidity
function registerVaultForce(
    uint256 vaultId_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) external returns (address vaultOracle_);

getVaultOracleDeployment ​

Resolves vault ID to vault address, recorded FluidContractFactory oracle deploy nonce, and oracle address.

Reverts if no oracle was registered for vaultId_, or if stored data is inconsistent.

solidity
function getVaultOracleDeployment(uint256 vaultId_)
    external
    view
    returns (address vault_, uint256 oracleNonce_, address vaultOracle_);

_getGovernanceAddr ​

Current governance address on Liquidity (same read path as FluidUsdOracle._getGovernanceAddr).

solidity
function _getGovernanceAddr() internal view returns (address governance_);

_authorizeUpgrade ​

solidity
function _authorizeUpgrade(address) internal override;

_registerVaultCore ​

solidity
function _registerVaultCore(
    uint256 vaultId_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) internal returns (address vaultOracle_);

_deployT1 ​

solidity
function _deployT1(address vault_, uint256 supplyEMode_, uint256 borrowEMode_) internal returns (address);

_deployT2 ​

solidity
function _deployT2(
    IFluidVault.ConstantViews memory c_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) internal returns (address);

_deployT3 ​

solidity
function _deployT3(
    IFluidVault.ConstantViews memory c_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) internal returns (address);

_deployT4 ​

solidity
function _deployT4(
    IFluidVault.ConstantViews memory c_,
    uint256 supplyEMode_,
    uint256 borrowEMode_,
    uint256 pegBufferPpmOperate_,
    uint256 pegBufferPpmLiquidate_
) internal returns (address);

_isValidEmodeForVault ​

Returns true when supply and borrow eModes are each valid for at least one token on their respective side.

solidity
function _isValidEmodeForVault(address vault_, uint256 vaultType_, uint256 supplyEMode_, uint256 borrowEMode_)
    internal
    view
    returns (bool);

_isEmodeValidForTokenPair ​

solidity
function _isEmodeValidForTokenPair(address token0_, address token1_, uint256 emode_) internal view returns (bool);

_finalizeOracleRegistration ​

Records registry + per-vault-ID nonce. nonce_ must equal DEPLOYER_FACTORY.totalContracts() after deploy.

solidity
function _finalizeOracleRegistration(uint256 vaultId_, address vault_, address vaultOracle_, uint256 vaultType_)
    internal;

_isVaultT1 ​

T1 if TYPE() reverts (no TYPE() on legacy vaults) or returns VAULT_T1_TYPE.

solidity
function _isVaultT1(address vault_) internal view returns (bool);

_verifyDeployerMatchesVault ​

T2–T4 only: deployer_ must be DEPLOYER_FACTORY so the oracle address matches AddressCalcs.addressCalc.

solidity
function _verifyDeployerMatchesVault(address deployer_) internal view;

_readDexData ​

Reads DEX pool constants into a DexParams struct.

solidity
function _readDexData(address dexPool_) internal view returns (DexShareResolver.DexParams memory dex_);

_assertDexIsPeg ​

Filters out volatile DEX pools: a wide band lets a flash-skew inflate DEX-share value, so revert unless the band is tight enough to be a peg pool. One-time check at registration.

solidity
function _assertDexIsPeg(address dexPool_) internal;

_getDexPrices ​

Reads DEX center/range prices via the getPricesAndExchangePrices() revert-data pattern (same as FluidDexReservesResolver). The call always reverts with FluidDexPricesAndExchangeRates(pex_).

solidity
function _getDexPrices(address dexPool_) internal returns (IFluidDexT1.PricesAndExchangePrice memory pex_);