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