Skip to main content

Account Model

All on-chain state lives in Anchor accounts derived via PDAs (Program Derived Addresses).

Core Accounts

Protocol

Global configuration. One per deployment.

FieldDescription
authorityAdmin who can pause, update config
protocol_fee_bpsProtocol fee in basis points
max_management_fee_bpsCap on curator fees
keeper_incentive_bpsKeeper reward on deposits
jupiter_program / titan_programAllowlisted swap router programs
points_enabledWhether loyalty points are active
pausedEmergency pause flag

PDA: ["protocol"]

Vault

A portfolio created by a curator. Holds strategy configuration and accounting state.

FieldDescription
curatorCreator and manager
allocations[]Target weights per asset (must sum to 10,000 bps)
total_sharesOutstanding vault shares (u128)
total_value_usdOracle-priced NAV
share_mintSPL token mint for vault shares
rebalance_cadenceweekly, monthly, or quarterly
management_fee_bpsAnnual fee (linked to cadence tier)
pending_allocationsQueued allocation update (timelocked)
swap_in_progressRebalance swap lock flag

PDA: ["vault", vault_id_le_bytes]

GlobalAssetReserve

Protocol-level shared reserve for a specific (mint, reserve_index) pair. Holds pooled assets across all vaults.

FieldDescription
mintToken mint (e.g., USDC, SOL)
reserve_indexNumeric class ID (allows multiple reserves per mint)
total_sharesReserve-level share supply
total_assets_nativeIdle treasury + protocol-deployed balance
protocol_balanceAmount deployed to yield adapter
protocol_adapterAllowlisted adapter program
token_treasurySPL token account for idle assets
oracle_primary / oracle_fallbackOracle accounts for pricing
pausedReserve pause flag

PDA: ["global_asset_reserve", mint, reserve_index_le_bytes]

See Yield Adapter Interface for how protocol_adapter is invoked and how protocol_balance is refreshed.

VaultReservePosition

Per-vault entitlement over a GlobalAssetReserve. Tracks how many reserve shares this vault owns.

FieldDescription
vaultParent vault
reserveParent reserve
sharesReserve shares owned by this vault

PDA: ["vault_reserve_position", vault, reserve]

DepositorPosition

Per-depositor position within a specific vault.

FieldDescription
vaultVault this position is in
ownerDepositor wallet
sharesVault shares held (u128)
loyalty_pointsAccrued loyalty points
last_points_accrual_tsLast time points were calculated

PDA: ["position", vault, owner]

Depositor

Global account per depositor wallet. Aggregates points across all vault positions.

FieldDescription
ownerWallet address
total_loyalty_pointsSum of points across all vaults

PDA: ["depositor", owner]

DcaSchedule

A recurring deposit schedule for a depositor into a vault.

FieldDescription
vaultTarget vault
ownerSchedule creator
schedule_idUnique ID per owner per vault
amount_per_periodAmount deposited each execution
intervalSeconds between executions (min 86,400 = 1 day)
next_executionTimestamp of next eligible execution
max_executionsTotal allowed executions
executions_countCompleted executions
activeWhether schedule is still running

PDA: ["dca", vault, owner, schedule_id_le_bytes]

DepositAuthority

PDA that controls the depositor's USDC escrow account for a specific vault. Used by keepers to pull funds during deposit processing and DCA execution.

PDA: ["deposit_authority", vault, owner]

Account Relationships