Vault: to store native token. Vault always has a buffer, that user can withdraw at anytime
Strategy Handler: submit liquidity in various lending protocols.
Treasury: hold rewards and operation (performance) fee
How vault sync balances from various strategies:
Vault state:
pubstructVault {/// The flag, if admin set enable = false, then the user can only withdraw and cannot deposit in the vault.pub enabled:u8,/// Vault nonce, to create vault seedspub bumps:VaultBumps, /// The total liquidity of the vault, including remaining tokens in token_vault and the liquidity in all strategies.
pub total_amount:u64,/// Token account, hold liquidity in vault reservepub token_vault:Pubkey, /// Hold lp token of vault, each time rebalance crank is called, vault calculate performance fee and mint corresponding lp token amount to fee_vault. fee_vault is owned by treasury address
pub fee_vault:Pubkey,/// Token mint that vault supportspub token_mint:Pubkey,/// Lp mint of vaultpub lp_mint:Pubkey, /// The list of strategy addresses that vault supports, vault can support up to MAX_STRATEGY strategies at the same time.
pub strategies: [Pubkey; MAX_STRATEGY],/// The base address to create vault seedspub base:Pubkey,/// Admin of vaultpub admin:Pubkey, /// Person who can send the crank. Operator can only send liquidity to strategies that admin defined, and claim reward to account of treasury address
pub operator:Pubkey,/// Stores information for locked profit.pub locked_profit_tracker:LockedProfitTracker,}
Strategy state:
pubstructStrategy {/// Lending pool address, that the strategy will deposit/withdraw balancepub reserve:Pubkey,/// The token account, that holds the collateral tokenpub collateral_vault:Pubkey,/// Specify type of strategypub strategy_type:StrategyType,/// The liquidity in strategy at the time vault deposit/withdraw from a lending protocolpub current_liquidity:u64,/// Hold some bumps, in case the strategy needs to use other seeds to sign a CPI call.pub bumps: [u8; MAX_BUMPS],/// Vault address, that the strategy belongspub vault:Pubkey,}
In which total_amount denotes to vault liquidity. Buffer liquidity is stored in token_vault account. strategies stores all strategy pubkey, that vault integrate.
At any point of time, the following assertion must be satisfied:
Which means total vault liquidity must be equal to buffer liquidity in vault and total liquidity in all strategies.
When keeper send rebalance crank in a strategy, program will update vault.total_amount and strategy.current_liquidity
// reload the new liquidity in this strategylet new_liquidity =get_new_liquidity_in_this_strategy()// sync balance in vault and this strategyvault.total_amount = vault.total_amount + new_liqudity - strategy.current_liquidity;strategy.current_liquidity = new_liquidity;