This guide walks you through deploying and configuring a Flux vault as a curator. Learn how to choose parameters, select strategies, and launch a vault that provides verifiable safety for LPs.
Overview
As a vault curator, you:
Choose a strategy that defines economic parameters and risk management
Select an access policy (permissionless or whitelist)
Deploy the vault via FluxVaultFactory
Manage the vault to optimize for LP returns
Earn curator fees from manager interest (if strategy allows)
Your Responsibility: Curate a vault that provides verifiable safety and competitive yields for LPs.
Pre-Deployment Checklist
Before deploying, decide:
1. Base Asset
What asset will LPs deposit and managers borrow?
Options:
USDC (most common - stable, liquid)
USDT (alternative stablecoin)
DAI (decentralized stablecoin)
WETH (ETH exposure)
WBTC (BTC exposure)
Considerations:
Liquidity (can it be easily swapped?)
Oracle support (reliable price feeds?)
LP demand (do LPs want to deposit this?)
Manager demand (do managers want to borrow this?)
2. Strategy Type
Immutable (parameters locked) or Mutable (parameters can change)?
Immutable Strategy:
No governance risk for LPs
Predictable long-term
Cannot adapt to market changes
Best for: Conservative vaults, maximize LP trust
Mutable Strategy:
Flexible - adapt to markets
Can update rates/assets
7-day timelock on changes
LPs may exit if they disagree
Best for: Active management, competitive rates
3. Risk Parameters
Choose strategy parameters based on target risk profile:
Conservative Vault:
Moderate Vault:
Aggressive Vault:
4. Allowed Assets
Which asset wrappers can managers use?
Conservative: Only well-established assets
WETH, WBTC, USDC, USDT
Major blue-chip tokens
Moderate: Mix of established and newer
Above + DAI, stETH, cbETH
Vetted DeFi tokens
Aggressive: Broader range
Above + newer yield-bearing tokens
Emerging protocols (with research)
Critical: Only include assets with:
Reliable oracles
Sufficient liquidity
Audited wrappers
Strong security track record
5. Access Policy
Who can deposit/borrow?
Permissionless:
Anyone can deposit
Anyone can borrow (if they meet requirements)
Maximum composability
Best for: Public vaults, maximum TVL
Whitelist:
Only approved addresses can deposit
Only approved managers can borrow
More control, less risk
Best for: Private vaults, known participants
Deployment Steps
Step 1: Deploy or Choose a Strategy
Option A: Deploy New Strategy (Recommended for Control)
// Use a pre-deployed strategy if it matches your needs
address strategy = 0x...; // Existing strategy address
// Verify it has the parameters you want
IStrategy s = IStrategy(strategy);
require(s.minBondRatio() == 0.2e18, "Wrong bond ratio");
require(s.annualRate() == 0.1e18, "Wrong rate");
import {IAssetWrapperFactory} from "flux-v1-contracts/interfaces/IAssetWrapperFactory.sol";
function deployBaseAssetWrapper(
IAssetWrapperFactory wrapperFactory,
address baseAsset
) public returns (address wrapper) {
// Check if wrapper already exists
wrapper = wrapperFactory.getWrapper(baseAsset);
if (wrapper == address(0)) {
// Deploy new wrapper
wrapper = wrapperFactory.deployERC20Wrapper(baseAsset);
}
// Ensure it's whitelisted
require(
fluxVaultFactory.whitelistedAssets(wrapper),
"Wrapper not whitelisted"
);
}
import {WhitelistAccessPolicy} from "flux-v1-contracts/access/WhitelistAccessPolicy.sol";
function deployAccessPolicy() public returns (address policy) {
// For permissionless vault, use address(0)
// For whitelist vault, deploy policy
WhitelistAccessPolicy wp = new WhitelistAccessPolicy(msg.sender);
// Add initial whitelisted LPs
wp.setWhitelistedLP(lpAddress1, true);
wp.setWhitelistedLP(lpAddress2, true);
// Add initial whitelisted managers
wp.setWhitelistedManager(managerAddress1, true);
return address(wp);
}
import {IFluxVaultFactory} from "flux-v1-contracts/interfaces/IFluxVaultFactory.sol";
function deployVault(
IFluxVaultFactory factory,
address baseAsset,
address baseAssetWrapper,
address strategy,
address accessPolicy
) public returns (address vault) {
// Deploy vault
vault = factory.createVault(
IERC20(baseAsset),
IAsset(baseAssetWrapper),
IStrategy(strategy),
IAccessPolicy(accessPolicy),
"My Flux Vault", // Vault name
"MFV" // Share symbol
);
// Vault deployed! Address logged in event
}
function verifyVault(IFluxVault vault) public view returns (bool valid) {
// Check immutables are correct
require(vault.STRATEGY() == expectedStrategy, "Wrong strategy");
require(vault.FACTORY() == expectedFactory, "Wrong factory");
require(vault.VAULT_CREATOR() == msg.sender, "Wrong creator");
// Check vault is operational
require(vault.totalAssets() >= 0, "Vault not initialized");
return true;
}
function seedVault(IFluxVault vault, uint256 amount) external {
IERC20 baseAsset = IERC20(vault.asset());
// Approve and deposit
baseAsset.approve(address(vault), amount);
vault.deposit(amount, msg.sender);
// Recommended: Seed with at least 10K-100K to demonstrate commitment
}
function collectFees(IFluxVault vault) external {
// Collect accumulated creator fees
uint256 collected = vault.transferCreatorFees();
// Fees sent to vault creator (you)
console.log("Collected fees:", collected);
}
// Off-chain monitoring
async function monitorManagers(vaultAddress: string) {
const vault = await getVaultContract(vaultAddress);
// Track all managers via events
const borrowEvents = await vault.queryFilter(vault.filters.Borrowed());
for (const event of borrowEvents) {
const manager = event.args.manager;
// Check health
const healthRatio = await getHealthRatio(vault, manager);
if (healthRatio < 1.15e18) {
alert(`Manager ${manager} health low: ${healthRatio}`);
}
}
}
function queueRateChange(
IMutableStrategy strategy,
uint256 newRate
) external {
// Queue new annual rate
strategy.queueAnnualRateChange(newRate);
// Must wait 7 days before executing
}
function executeRateChange(IMutableStrategy strategy) external {
// After 7 days, execute the change
strategy.executeAnnualRateChange();
// New rate now active
}