Protocol Overview
Oblivion is a permissionless portfolio protocol on Solana.
- On-chain account term:
Vault - User-facing product term:
Portfolio
Core Accounts
Protocol: global config, fee caps, keeper incentives, points configVault: strategy state, allocations, pending allocation queue, fee/rebalance/performance metadataGlobalAssetReserve: shared protocol reserve per(mint, reserve_index)— holds treasury + adapter balanceVaultReservePosition: per-vault reserve share ledger (entitlement over aGlobalAssetReserve)DepositorPosition: shares + loyalty points per depositor per vaultDepositor: global account aggregating cross-vault loyalty pointsDcaSchedule: recurring deposit schedule stateAllocation: per-vault target weights referencingmarket_reserve_id
Instruction Surface
Protocol / vault lifecycle
initialize_protocolcreate_vaultupdate_allocation(with orphan guard: removed allocations must have zero reserve shares)apply_allocation_update(validation-only; activation is on rebalance)pause_vault/set_protocol_pause
Global reserve management
init_global_asset_reserveset_allocation_market_reserveinit_vault_reserve_positionsync_global_asset_reserve_assetsrefresh_global_vault_valuations(oracle-priced NAV refresh)refresh_performance_snapshot
Deposits / withdrawals
register_deposit_addressprocess_deposit_vault(multi-mint, oracle-priced NAV)withdraw_vault(pro-rata proportional burns across all reserves)accrue_points(permissionless time-weighted point accrual)
Rebalance
rebalance(cadence-gated, applies pending allocations)move_vault_reserve_liquidity(same-mint between reserve classes)rebalance_swap_begin/rebalance_swap_end(cross-mint via router)
Reserve yield
deposit_reserve_to_yield/withdraw_reserve_from_yieldrefresh_reserve_yield_balance
DCA
create_dca/execute_dca/update_dca/cancel_dca
Fees
collect_fees(dilution/mint-shares model, valuation staleness check)
Key Invariants
- Allocation weights must sum to
10000bps. - Rebalance cadence and annual fee tier are linked and enforced on-chain.
- Value-sensitive operations require fresh oracle state (
last_oracle_updatestaleness check). - Pending allocation updates are timelocked and activate on rebalance.
sum(VaultReservePosition.shares) == GlobalAssetReserve.total_sharesper reserve.- Points accrue on oracle-priced USD deposit value after keeper incentive deduction.