Core Functions
createPermissionlessVaultInstruction
Creates an instruction to initialize a new permissionless vault.
Function
static async createPermissionlessVaultInstruction(
connection: Connection,
payer: PublicKey,
tokenMint: PublicKey,
opt?: {
cluster?: Cluster;
programId?: string;
}
): Promise<TransactionInstruction>
Parameters
interface CreatePermissionlessVaultParams {
connection: Connection; // Solana connection instance
payer: PublicKey; // The wallet paying for the transaction
tokenMint: PublicKey; // The mint address of the token for the vault
opt?: {
cluster?: Cluster; // Network cluster (mainnet-beta, devnet, testnet)
programId?: string; // Custom program ID (optional)
};
}
Returns
A transaction instruction that can be used to initialize the vault.
Example
const instruction = await VaultImpl.createPermissionlessVaultInstruction(
connection,
wallet.publicKey,
usdcMint,
{
cluster: 'mainnet-beta',
programId: CUSTOM_PROGRAM_ID // optional
}
);
const transaction = new Transaction().add(instruction);
const signature = await wallet.sendTransaction(transaction, connection);
Notes
- Creates all necessary PDAs for the vault including vault account, token vault, and LP mint
- The vault will be permissionless, allowing anyone to deposit and withdraw
- Payer will cover the rent costs for the new accounts
fetchMultipleUserBalance
Fetches LP token balances for multiple vaults for a specific user.
Function
static async fetchMultipleUserBalance(
connection: Connection,
lpMintList: Array<PublicKey>,
owner: PublicKey
): Promise<Array<BN>>
Parameters
interface FetchMultipleUserBalanceParams {
connection: Connection; // Solana connection instance
lpMintList: Array<PublicKey>; // Array of LP mint addresses
owner: PublicKey; // The user's wallet address
}
Returns
An array of BN values representing the user’s LP token balance for each vault.
Example
const lpMints = [vault1LpMint, vault2LpMint, vault3LpMint];
const balances = await VaultImpl.fetchMultipleUserBalance(
connection,
lpMints,
wallet.publicKey
);
balances.forEach((balance, index) => {
console.log(`Vault ${index} LP balance: ${balance.toString()}`);
});
Notes
- Returns 0 for vaults where the user has no LP tokens
- Efficiently fetches multiple balances in a single call
- Useful for portfolio overview displays
createMultiple
Creates multiple vault instances from token mint addresses.
Function
static async createMultiple(
connection: Connection,
tokenMints: Array<PublicKey>,
opt?: {
seedBaseKey?: PublicKey;
allowOwnerOffCurve?: boolean;
cluster?: Cluster;
programId?: string;
affiliateId?: PublicKey;
affiliateProgramId?: string;
}
): Promise<Array<VaultImpl>>
Parameters
interface CreateMultipleParams {
connection: Connection; // Solana connection instance
tokenMints: Array<PublicKey>; // Array of token mint addresses
opt?: {
seedBaseKey?: PublicKey; // Optional seed for deterministic PDAs
allowOwnerOffCurve?: boolean; // Allow off-curve owner accounts
cluster?: Cluster; // Network cluster
programId?: string; // Custom vault program ID
affiliateId?: PublicKey; // Affiliate partner ID
affiliateProgramId?: string; // Affiliate program ID
};
}
Returns
An array of VaultImpl
instances for the specified token mints.
Example
const tokenMints = [usdcMint, solMint, btcMint];
const vaults = await VaultImpl.createMultiple(connection, tokenMints, {
cluster: 'mainnet-beta',
affiliateId: partnerPublicKey
});
vaults.forEach((vault, index) => {
console.log(`Vault ${index}: ${vault.vaultPda.toString()}`);
});
Notes
- Efficiently creates multiple vault instances in parallel
- All vaults must already exist on-chain
- Useful for initializing a portfolio of vaults
createMultipleWithPda
Creates multiple vault instances from vault PDA addresses.
Function
static async createMultipleWithPda(
connection: Connection,
vaultsPda: Array<PublicKey>,
opt?: {
seedBaseKey?: PublicKey;
allowOwnerOffCurve?: boolean;
cluster?: Cluster;
programId?: string;
affiliateId?: PublicKey;
affiliateProgramId?: string;
}
): Promise<Array<VaultImpl>>
Parameters
interface CreateMultipleWithPdaParams {
connection: Connection; // Solana connection instance
vaultsPda: Array<PublicKey>; // Array of vault PDA addresses
opt?: {
seedBaseKey?: PublicKey; // Optional seed for deterministic PDAs
allowOwnerOffCurve?: boolean; // Allow off-curve owner accounts
cluster?: Cluster; // Network cluster
programId?: string; // Custom vault program ID
affiliateId?: PublicKey; // Affiliate partner ID
affiliateProgramId?: string; // Affiliate program ID
};
}
Returns
An array of VaultImpl
instances for the specified vault PDAs.
Example
const vaultPdas = [vault1Pda, vault2Pda, vault3Pda];
const vaults = await VaultImpl.createMultipleWithPda(connection, vaultPdas, {
affiliateId: partnerPublicKey,
affiliateProgramId: CUSTOM_AFFILIATE_PROGRAM_ID
});
console.log(`Created ${vaults.length} vault instances`);
Notes
- Use this when you already have the vault PDA addresses
- More direct than
createMultiple
when PDAs are known
- Supports affiliate integration for revenue sharing
create
Creates a single vault instance from a token mint address.
Function
static async create(
connection: Connection,
tokenAddress: PublicKey,
opt?: {
seedBaseKey?: PublicKey;
allowOwnerOffCurve?: boolean;
cluster?: Cluster;
programId?: string;
affiliateId?: PublicKey;
affiliateProgramId?: string;
}
): Promise<VaultImpl>
Parameters
interface CreateParams {
connection: Connection; // Solana connection instance
tokenAddress: PublicKey; // Token mint address
opt?: {
seedBaseKey?: PublicKey; // Optional seed for deterministic PDAs
allowOwnerOffCurve?: boolean; // Allow off-curve owner accounts
cluster?: Cluster; // Network cluster
programId?: string; // Custom vault program ID
affiliateId?: PublicKey; // Affiliate partner ID
affiliateProgramId?: string; // Affiliate program ID
};
}
Returns
A VaultImpl
instance for the specified token.
Example
const vault = await VaultImpl.create(connection, usdcMint, {
cluster: 'mainnet-beta',
affiliateId: partnerPublicKey
});
console.log(`Vault PDA: ${vault.vaultPda.toString()}`);
console.log(`Token Mint: ${vault.tokenMint.address.toString()}`);
console.log(`LP Supply: ${vault.tokenLpMint.supply.toString()}`);
Notes
- Use this for creating a single vault instance
- The vault must already exist on-chain
- Automatically fetches and caches vault state information
getUserBalance
Gets the user’s LP token balance for this vault.
Function
async getUserBalance(owner: PublicKey): Promise<BN>
Parameters
interface GetUserBalanceParams {
owner: PublicKey; // The user's wallet address
}
Returns
A BN representing the user’s LP token balance.
Example
const vault = await VaultImpl.create(connection, usdcMint);
const userBalance = await vault.getUserBalance(wallet.publicKey);
console.log(`User LP balance: ${userBalance.toString()}`);
// Convert to human readable format
const balanceInTokens = userBalance.div(new BN(10).pow(new BN(vault.tokenLpMint.decimals)));
console.log(`User balance: ${balanceInTokens.toString()} LP tokens`);
Notes
- Returns 0 if the user has no LP tokens
- Handles both direct deposits and affiliate deposits
- Balance represents share of the vault’s total assets
getVaultSupply
Gets the total LP token supply for the vault.
Function
async getVaultSupply(): Promise<BN>
Returns
A BN representing the total LP token supply.
Example
const vault = await VaultImpl.create(connection, usdcMint);
const totalSupply = await vault.getVaultSupply();
console.log(`Total LP supply: ${totalSupply.toString()}`);
// Calculate user's share percentage
const userBalance = await vault.getUserBalance(wallet.publicKey);
const userSharePercentage = userBalance.mul(new BN(100)).div(totalSupply);
console.log(`User owns ${userSharePercentage.toString()}% of the vault`);
Notes
- Refetches the latest LP mint supply from the blockchain
- Updates the cached
tokenLpMint
property
- Use the cached
vault.tokenLpMint.supply
for performance if recent data is sufficient
getWithdrawableAmount
Gets the amount of assets that can be immediately withdrawn from the vault.
Function
async getWithdrawableAmount(): Promise<BN>
Returns
A BN representing the withdrawable amount in base token units.
Example
const vault = await VaultImpl.create(connection, usdcMint);
const withdrawableAmount = await vault.getWithdrawableAmount();
console.log(`Withdrawable amount: ${withdrawableAmount.toString()}`);
// Convert to human readable format (assuming USDC with 6 decimals)
const withdrawableUsdc = withdrawableAmount.div(new BN(1_000_000));
console.log(`Withdrawable: ${withdrawableUsdc.toString()} USDC`);
Notes
- Amount may be less than total vault assets due to strategy allocations
- Uses current on-chain time for calculations
- Does not account for user’s specific LP token balance
refreshVaultState
Refreshes the cached vault state and token mint information.
Function
async refreshVaultState(): Promise<void>
Returns
Void. Updates the instance’s vaultState
and tokenMint
properties.
Example
const vault = await VaultImpl.create(connection, usdcMint);
// Check current state
console.log(`Current liquidity: ${vault.vaultState.totalLiquidity.toString()}`);
// Refresh state to get latest data
await vault.refreshVaultState();
// Check updated state
console.log(`Updated liquidity: ${vault.vaultState.totalLiquidity.toString()}`);
Notes
- Call this before deposit/withdraw operations to ensure latest state
- Updates both vault state and token mint data
- Essential for accurate calculations in dynamic environments
deposit
Deposits tokens into the vault and receives LP tokens in return.
Function
async deposit(owner: PublicKey, baseTokenAmount: BN): Promise<Transaction>
Parameters
interface DepositParams {
owner: PublicKey; // The depositor's wallet address
baseTokenAmount: BN; // Amount of base tokens to deposit
}
Returns
A Transaction
ready to be signed and sent.
Example
const vault = await VaultImpl.create(connection, usdcMint, {
affiliateId: partnerPublicKey
});
// Deposit 1,000 USDC (with 6 decimals)
const depositAmount = new BN(1_000_000_000);
const depositTx = await vault.deposit(wallet.publicKey, depositAmount);
// Sign and send transaction
const signature = await wallet.sendTransaction(depositTx, connection);
console.log(`Deposit transaction: ${signature}`);
Notes
- Automatically handles SOL wrapping for native SOL vaults
- Creates necessary token accounts if they don’t exist
- Supports affiliate revenue sharing if configured
- The transaction includes all necessary pre-instructions
- LP tokens are minted proportional to the deposit amount
withdraw
Withdraws tokens from the vault by burning LP tokens.
Function
async withdraw(owner: PublicKey, baseTokenAmount: BN): Promise<Transaction>
Parameters
interface WithdrawParams {
owner: PublicKey; // The withdrawer's wallet address
baseTokenAmount: BN; // Amount of LP tokens to burn for withdrawal
}
Returns
A Transaction
ready to be signed and sent.
Example
const vault = await VaultImpl.create(connection, usdcMint);
// Get user's LP token balance
const userBalance = await vault.getUserBalance(wallet.publicKey);
// Withdraw half of user's position
const withdrawAmount = userBalance.div(new BN(2));
const withdrawTx = await vault.withdraw(wallet.publicKey, withdrawAmount);
// Sign and send transaction
const signature = await wallet.sendTransaction(withdrawTx, connection);
console.log(`Withdraw transaction: ${signature}`);
Notes
- Automatically handles SOL unwrapping for native SOL vaults
- May withdraw from vault reserves or underlying strategies
- Supports affiliate revenue sharing if configured
- The
baseTokenAmount
parameter refers to LP tokens to burn, not underlying tokens to receive
- Automatically selects the optimal withdrawal strategy based on liquidity availability
getStrategiesState
Gets the state of all strategies associated with the vault.
Function
async getStrategiesState(): Promise<Array<StrategyState>>
Returns
An array of StrategyState
objects representing the vault’s strategies.
Example
const vault = await VaultImpl.create(connection, usdcMint);
const strategies = await vault.getStrategiesState();
strategies.forEach((strategy, index) => {
console.log(`Strategy ${index}:`);
console.log(` Current Liquidity: ${strategy.currentLiquidity.toString()}`);
console.log(` Performance Fee: ${strategy.performanceFee.toString()}`);
});
console.log(`Total strategies: ${strategies.length}`);
Notes
- Excludes the vault’s internal strategy (VAULT_STRATEGY_ADDRESS)
- Useful for understanding vault composition and performance
- Each strategy represents a different yield farming or liquidity provision approach
getAffiliateInfo
Gets affiliate partnership information for the vault.
Function
async getAffiliateInfo(): Promise<AffiliateInfo>
Returns
An AffiliateInfo
object containing partnership details.
Example
const vault = await VaultImpl.create(connection, usdcMint, {
affiliateId: partnerPublicKey
});
try {
const affiliateInfo = await vault.getAffiliateInfo();
console.log(`Partner fee rate: ${affiliateInfo.feeRate}%`);
console.log(`Total fees earned: ${affiliateInfo.totalFeesEarned.toString()}`);
} catch (error) {
console.log('No affiliate information found');
}
Notes
- Only available when vault is created with an
affiliateId
- Throws an error if no affiliate program is configured
- Contains fee rates, total fees earned, and partnership terms
State Functions
getAllVaultState
Fetches state information for multiple vaults by token mint addresses.
Function
async getAllVaultState(
tokensAddress: Array<PublicKey>,
program: VaultProgram,
seedBaseKey?: PublicKey
): Promise<Array<VaultStateAndLp>>
Parameters
tokensAddress
: Array of token mint addresses
program
: The vault program instance
seedBaseKey
: Optional seed for deterministic PDAs
Returns
Array of vault state information including PDA, state, and mint data.
Example
const provider = new AnchorProvider(connection, wallet, {});
const program = new Program(IDL, PROGRAM_ID, provider);
const tokenMints = [usdcMint, solMint];
const vaultsInfo = await getAllVaultState(tokenMints, program);
vaultsInfo.forEach((vaultInfo, index) => {
console.log(`Vault ${index}: ${vaultInfo.vaultPda.toString()}`);
console.log(`Total Liquidity: ${vaultInfo.vaultState.totalLiquidity.toString()}`);
});
getAllVaultStateByPda
Fetches state information for multiple vaults by their PDA addresses.
Function
async getAllVaultStateByPda(
vaultsPda: Array<PublicKey>,
program: VaultProgram
): Promise<Array<VaultStateAndLp>>
Parameters
vaultsPda
: Array of vault PDA addresses
program
: The vault program instance
Returns
Array of vault state information including PDA, state, and mint data.
Example
const vaultPdas = [vault1Pda, vault2Pda];
const vaultsInfo = await getAllVaultStateByPda(vaultPdas, program);
console.log(`Fetched ${vaultsInfo.length} vault states`);
getVaultState
Fetches state information for a single vault by token mint address.
Function
async getVaultState(
tokenAddress: PublicKey,
program: VaultProgram,
seedBaseKey?: PublicKey
): Promise<VaultStateAndLp>
Parameters
tokenAddress
: Token mint address
program
: The vault program instance
seedBaseKey
: Optional seed for deterministic PDAs
Returns
Vault state information including PDA, state, and mint data.
Example
const vaultInfo = await getVaultState(usdcMint, program);
console.log(`Vault PDA: ${vaultInfo.vaultPda.toString()}`);
console.log(`LP Mint: ${vaultInfo.vaultState.lpMint.toString()}`);
getVaultStateByPda
Fetches state information for a single vault by its PDA address.
Function
async getVaultStateByPda(
vaultPda: PublicKey,
program: VaultProgram
): Promise<VaultStateAndLp>
Parameters
vaultPda
: Vault PDA address
program
: The vault program instance
Returns
Vault state information including PDA, state, and mint data.
Example
const vaultInfo = await getVaultStateByPda(vaultPda, program);
console.log(`Token Mint: ${vaultInfo.vaultState.tokenMint.toString()}`);
console.log(`Total Supply: ${vaultInfo.vaultLpMint.supply.toString()}`);
getVaultLiquidity
Gets the current liquidity amount in the vault’s token account.
Function
async getVaultLiquidity(
connection: Connection,
tokenVaultPda: PublicKey
): Promise<string | null>
Parameters
connection
: Solana connection instance
tokenVaultPda
: The vault’s token account PDA
Returns
The liquidity amount as a string, or null if the account doesn’t exist.
Example
const liquidity = await getVaultLiquidity(connection, vault.tokenVaultPda);
if (liquidity) {
console.log(`Vault liquidity: ${liquidity} tokens`);
} else {
console.log('Vault account not found');
}
Helper Functions
calculateWithdrawableAmount
Calculates the amount that can be withdrawn based on current time and vault state.
Function
function calculateWithdrawableAmount(currentTime: BN, vaultState: VaultState): BN
Parameters
currentTime
: Current blockchain timestamp
vaultState
: The vault’s current state
Returns
The withdrawable amount as a BN.
Example
import { getOnchainTime } from './utils';
const currentTime = await getOnchainTime(connection);
const withdrawable = calculateWithdrawableAmount(currentTime, vault.vaultState);
console.log(`Withdrawable: ${withdrawable.toString()}`);
Notes
- Accounts for time-based withdrawal restrictions
- Used internally by the
getWithdrawableAmount
method
- Essential for implementing withdrawal limits and unlock schedules