VaultOracleFactory
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
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.
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.
function registerVault(
uint256 vaultId_,
uint256 supplyEMode_,
uint256 borrowEMode_,
uint256 pegBufferPpmOperate_,
uint256 pegBufferPpmLiquidate_
) external returns (address vaultOracle_);Parameters
| Name | Type | Description |
|---|---|---|
vaultId_ | uint256 | |
supplyEMode_ | uint256 | |
borrowEMode_ | uint256 | |
pegBufferPpmOperate_ | uint256 | Operate-path reserve adjustment for T2-T4 DEX share legs; ignored for T1. |
pegBufferPpmLiquidate_ | uint256 | Liquidate-path equivalent; must not exceed pegBufferPpmOperate_. |
registerVaultForce
Same as registerVault but governance-only; may replace an existing oracle nonce for vaultId_.
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.
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).
function _getGovernanceAddr() internal view returns (address governance_);_authorizeUpgrade
function _authorizeUpgrade(address) internal override;_registerVaultCore
function _registerVaultCore(
uint256 vaultId_,
uint256 supplyEMode_,
uint256 borrowEMode_,
uint256 pegBufferPpmOperate_,
uint256 pegBufferPpmLiquidate_
) internal returns (address vaultOracle_);_deployT1
function _deployT1(address vault_, uint256 supplyEMode_, uint256 borrowEMode_) internal returns (address);_deployT2
function _deployT2(
IFluidVault.ConstantViews memory c_,
uint256 supplyEMode_,
uint256 borrowEMode_,
uint256 pegBufferPpmOperate_,
uint256 pegBufferPpmLiquidate_
) internal returns (address);_deployT3
function _deployT3(
IFluidVault.ConstantViews memory c_,
uint256 supplyEMode_,
uint256 borrowEMode_,
uint256 pegBufferPpmOperate_,
uint256 pegBufferPpmLiquidate_
) internal returns (address);_deployT4
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.
function _isValidEmodeForVault(address vault_, uint256 vaultType_, uint256 supplyEMode_, uint256 borrowEMode_)
internal
view
returns (bool);_isEmodeValidForTokenPair
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.
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.
function _isVaultT1(address vault_) internal view returns (bool);_verifyDeployerMatchesVault
T2–T4 only: deployer_ must be DEPLOYER_FACTORY so the oracle address matches AddressCalcs.addressCalc.
function _verifyDeployerMatchesVault(address deployer_) internal view;_readDexData
Reads DEX pool constants into a DexParams struct.
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.
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_).
function _getDexPrices(address dexPool_) internal returns (IFluidDexT1.PricesAndExchangePrice memory pex_);