Skip to main content
This guide covers Cross-Program Invocation (CPI) integration with the Voltr Vault program. If your protocol needs to deposit into or withdraw from Voltr vaults on-chain, use these CPI instructions.
When to use CPI vs. the TypeScript SDK: CPI is for on-chain programs that need to interact with Voltr vaults programmatically (e.g., a router or aggregator). If you are building off-chain automation or a frontend, use the TypeScript SDK instead.

How It Works

Users deposit assets into a vault and receive LP tokens representing their share. Withdrawals follow a two-step process to ensure vault stability and manage liquidity:
  1. Request withdrawal — locks LP tokens into an escrow receipt
  2. Claim withdrawal — after the vault’s waiting period, burns the locked LP tokens and returns the underlying assets
Alternatively, vaults with a zero waiting period support instant withdrawal, which combines both steps into a single transaction. Users can also cancel a pending withdrawal request to reclaim their LP tokens.
Deposit:          User Assets ──► Vault ──► LP Tokens to User

Withdraw:         LP Tokens ──► Escrow Receipt ──(waiting period)──► Assets to User

Cancel Withdraw:  Escrow Receipt ──► LP Tokens back to User

Instant Withdraw: LP Tokens ──► Assets to User (single transaction)

Deployed Address

NetworkProgram Address
MainnetvVoLTRjQmtFpiYoegx285Ze4gsLJ8ZxgFKVcuvmG1a8

CPI Instructions

InstructionPurposeReference
deposit_vaultDeposit assets and receive LP tokensDeposit
request_withdraw_vaultLock LP tokens into an escrow receiptRequest Withdraw
withdraw_vaultClaim assets after the waiting periodWithdraw
cancel_request_withdraw_vaultCancel a pending withdrawal requestCancel Withdraw
instant_withdraw_vaultWithdraw assets instantly (zero waiting period vaults)Instant Withdraw

PDA Derivation

All PDAs are derived from the Voltr Vault program (vVoLTRjQmtFpiYoegx285Ze4gsLJ8ZxgFKVcuvmG1a8):
AccountSeeds
protocol["protocol"]
vault_asset_idle_auth["vault_asset_idle_auth", vault_key]
vault_lp_mint_auth["vault_lp_mint_auth", vault_key]
request_withdraw_vault_receipt["request_withdraw_vault_receipt", vault_key, user_key]
Your program does not need to provide PDA signer seeds for the vault’s internal PDAs. The Voltr Vault program handles its own invoke_signed calls internally. You only need to pass the correct PDA addresses in the account list.

Error Handling

Your program should handle the following errors from the Voltr Vault program:
ErrorCause
InvalidAmountInput amount is zero or invalid
MaxCapExceededDeposit would exceed the vault’s maximum capacity
WithdrawalNotYetAvailablewithdraw_vault called before the waiting period has passed
InstantWithdrawNotAllowedinstant_withdraw_vault called on a vault with a non-zero waiting period
OperationNotAllowedThe protocol has globally disabled the attempted operation

Reference Repository

Full reference implementations are available at github.com/voltrxyz/vault-cpi.