A TypeScript SDK for interacting with the Voltr protocol on Solana.
npm install @voltr/vault-sdk
import { Connection } from "@solana/web3.js";
import { VoltrClient } from "@voltr/vault-sdk";
// Initialize client
const connection = new Connection("https://api.mainnet-beta.solana.com");
const client = new VoltrClient(connection);
import { BN } from "@coral-xyz/anchor";
import { Keypair, PublicKey } from "@solana/web3.js";
// Create vault initialization parameters
const vaultParams = {
config: {
maxCap: new BN("1000000000"),
startAtTs: new BN(Math.floor(Date.now() / 1000)),
lockedProfitDegradationDuration: new BN(3600), // 1 hour
managerManagementFee: 50, // 0.5%
managerPerformanceFee: 1000, // 10%
adminManagementFee: 50, // 0.5%
adminPerformanceFee: 1000, // 10%
redemptionFee: 10, // 0.1%
issuanceFee: 10, // 0.1%
withdrawalWaitingPeriod: new BN(3600), // 1 hour
},
name: "My Vault",
description: "Example vault",
};
// Create initialization instruction
const ix = await client.createInitializeVaultIx(vaultParams, {
vault: vaultKeypair,
vaultAssetMint: new PublicKey("..."),
admin: adminPubkey,
manager: managerPubkey,
payer: payerPubkey,
});
import { VaultConfigField } from "@voltr/vault-sdk";
// Update max cap
const maxCapData = client.serializeU64(new BN(20_000_000_000_000));
const maxCapIx = await client.createUpdateVaultConfigIx(
VaultConfigField.MaxCap,
maxCapData,
{
vault: vaultPubkey,
admin: adminPubkey,
}
);
// Update withdrawal waiting period
const waitingPeriodData = client.serializeU64(new BN(5_000));
const waitingPeriodIx = await client.createUpdateVaultConfigIx(
VaultConfigField.WithdrawalWaitingPeriod,
waitingPeriodData,
{
vault: vaultPubkey,
admin: adminPubkey,
}
);
// Update manager management fee (requires LP mint)
const vaultLpMint = client.findVaultLpMint(vaultPubkey);
const feeData = client.serializeU16(1000); // 10%
const feeIx = await client.createUpdateVaultConfigIx(
VaultConfigField.ManagerManagementFee,
feeData,
{
vault: vaultPubkey,
admin: adminPubkey,
vaultLpMint: vaultLpMint,
}
);
// Update issuance fee
const issuanceFeeData = client.serializeU16(75); // 0.75%
const issuanceFeeIx = await client.createUpdateVaultConfigIx(
VaultConfigField.IssuanceFee,
issuanceFeeData,
{
vault: vaultPubkey,
admin: adminPubkey,
}
);
// Update vault manager
const newManager = new PublicKey("...");
const managerData = client.serializePubkey(newManager);
const managerIx = await client.createUpdateVaultConfigIx(
VaultConfigField.Manager,
managerData,
{
vault: vaultPubkey,
admin: adminPubkey,
}
);
VaultConfigField.MaxCap - Maximum vault capacity (u64)VaultConfigField.StartAtTs - Vault start timestamp (u64)VaultConfigField.LockedProfitDegradationDuration - Locked profit degradation duration (u64)VaultConfigField.WithdrawalWaitingPeriod - Withdrawal waiting period (u64)VaultConfigField.ManagerPerformanceFee - Manager performance fee in BPS (u16)VaultConfigField.AdminPerformanceFee - Admin performance fee in BPS (u16)VaultConfigField.ManagerManagementFee - Manager management fee in BPS (u16, requires LP mint)VaultConfigField.AdminManagementFee - Admin management fee in BPS (u16, requires LP mint)VaultConfigField.RedemptionFee - Redemption fee in BPS (u16)VaultConfigField.IssuanceFee - Issuance fee in BPS (u16)VaultConfigField.Manager - Vault manager (PublicKey)Note: When updating
ManagerManagementFeeorAdminManagementFee, you must provide thevaultLpMintparameter as these operations charge management fees and require reading the LP mint supply.
// Add an adaptor to a vault
const addAdaptorIx = await client.createAddAdaptorIx({
vault: vaultPubkey,
payer: payerPubkey,
admin: adminPubkey,
adaptorProgram: adaptorProgramPubkey,
});
// Initialize a strategy
const initStrategyIx = await client.createInitializeStrategyIx(
{
instructionDiscriminator: null,
additionalArgs: null,
},
{
payer: payerPubkey,
vault: vaultPubkey,
manager: managerPubkey,
strategy: strategyPubkey,
adaptorProgram: adaptorProgramPubkey,
remainingAccounts: [],
}
);
// Initialize direct withdraw strategy
const initDirectWithdrawIx =
await client.createInitializeDirectWithdrawStrategyIx(
{
instructionDiscriminator: null,
additionalArgs: null,
allowUserArgs: true,
},
{
payer: payerPubkey,
admin: adminPubkey,
vault: vaultPubkey,
strategy: strategyPubkey,
adaptorProgram: adaptorProgramPubkey,
}
);
// Deposit assets
const depositIx = await client.createDepositVaultIx(new BN("1000000000"), {
userTransferAuthority: userPubkey,
vault: vaultPubkey,
vaultAssetMint: mintPubkey,
assetTokenProgram: tokenProgramPubkey,
});
// Request withdraw assets
const requestWithdrawIx = await client.createRequestWithdrawVaultIx(
{
amount: new BN("1000000000"),
isAmountInLp: false,
isWithdrawAll: false,
},
{
payer: payerPubkey,
userTransferAuthority: userPubkey,
vault: vaultPubkey,
}
);
// Cancel withdraw request
const cancelRequestWithdrawIx = await client.createCancelRequestWithdrawVaultIx(
{
userTransferAuthority: userPubkey,
vault: vaultPubkey,
}
);
// Withdraw from vault
const withdrawIx = await client.createWithdrawVaultIx({
userTransferAuthority: userPubkey,
vault: vaultPubkey,
vaultAssetMint: mintPubkey,
assetTokenProgram: tokenProgramPubkey,
});
// Direct withdraw from strategy
const directWithdrawIx = await client.createDirectWithdrawStrategyIx(
{
userArgs: null,
},
{
user: userPubkey,
vault: vaultPubkey,
strategy: strategyPubkey,
vaultAssetMint: mintPubkey,
assetTokenProgram: tokenProgramPubkey,
adaptorProgram: adaptorProgramPubkey,
remainingAccounts: [],
}
);
// Get position and total values for a vault
const values = await client.getPositionAndTotalValuesForVault(vaultPubkey);
console.log(`Total Value: ${values.totalValue}`);
console.log("Strategy Positions:", values.strategies);
// Calculate the amount of assets that would be received for a given LP token amount
const assetsToReceive = await client.calculateAssetsForWithdraw(
vaultPubkey,
new BN("1000000000")
);
console.log(`Assets to receive: ${assetsToReceive.toString()}`);
// Calculate the amount of LP tokens needed to withdraw a specific asset amount
const lpTokensRequired = await client.calculateLpForWithdraw(
vaultPubkey,
new BN("1000000000")
);
console.log(`LP tokens required: ${lpTokensRequired.toString()}`);
// Calculate the amount of LP tokens that would be received for a deposit
const lpTokensToReceive = await client.calculateLpForDeposit(
vaultPubkey,
new BN("1000000000")
);
console.log(`LP tokens to receive: ${lpTokensToReceive.toString()}`);
// Get all pending withdrawals for a vault
const pendingWithdrawals = await client.getAllPendingWithdrawalsForVault(
vaultPubkey
);
// Process the pending withdrawals
pendingWithdrawals.forEach((withdrawal, index) => {
console.log(`Withdrawal ${index + 1}:`);
console.log(` Asset amount: ${withdrawal.amountAssetToWithdraw}`);
// Check if withdrawal is available yet
const withdrawableTimestamp = withdrawal.withdrawableFromTs.toNumber();
const currentTime = Math.floor(Date.now() / 1000);
const isWithdrawable = currentTime >= withdrawableTimestamp;
console.log(
` Withdrawable from: ${new Date(
withdrawableTimestamp * 1000
).toLocaleString()}`
);
console.log(` Status: ${isWithdrawable ? "Available now" : "Pending"}`);
if (!isWithdrawable) {
const timeRemaining = Math.max(0, withdrawableTimestamp - currentTime);
console.log(
` Time remaining: ${Math.floor(timeRemaining / 3600)}h ${Math.floor(
(timeRemaining % 3600) / 60
)}m`
);
}
});
// Get pending withdrawal for a specific user
const userWithdrawal = await client.getPendingWithdrawalForUser(
vaultPubkey,
userPubkey
);
console.log(`User withdrawal amount: ${userWithdrawal.amountAssetToWithdrawEffective}`);
// Calibrate high water mark (admin only)
const calibrateIx = await client.createCalibrateHighWaterMarkIx({
vault: vaultPubkey,
admin: adminPubkey,
});
// Get current high water mark
const highWaterMark = await client.getHighWaterMarkForVault(vaultPubkey);
console.log(`Highest asset per LP: ${highWaterMark.highestAssetPerLp}`);
console.log(
`Last updated: ${new Date(highWaterMark.lastUpdatedTs * 1000).toLocaleString()}`
);
// Get current asset per LP
const currentAssetPerLp =
await client.getCurrentAssetPerLpForVault(vaultPubkey);
console.log(`Current asset per LP: ${currentAssetPerLp}`);
// Harvest accumulated fees
const harvestIx = await client.createHarvestFeeIx({
harvester: harvesterPubkey,
vaultManager: managerPubkey,
vaultAdmin: adminPubkey,
protocolAdmin: protocolAdminPubkey,
vault: vaultPubkey,
});
// Get accumulated fees
const adminFees = await client.getAccumulatedAdminFeesForVault(vaultPubkey);
const managerFees = await client.getAccumulatedManagerFeesForVault(vaultPubkey);
console.log(`Admin fees: ${adminFees.toString()}`);
console.log(`Manager fees: ${managerFees.toString()}`);
The SDK provides helper methods to serialize values for vault configuration updates:
// Serialize u64 values (for amounts, timestamps, etc.)
const u64Data = client.serializeU64(new BN(20_000_000_000_000));
// Serialize u16 values (for fee percentages in basis points)
const u16Data = client.serializeU16(1000); // 10%
// Serialize PublicKey values (for manager updates)
const pubkeyData = client.serializePubkey(new PublicKey("..."));
createInitializeVaultIx(vaultParams, params) - Initialize a new vaultcreateUpdateVaultIx(vaultConfig, params) - Deprecated: Update vault (use createUpdateVaultConfigIx instead)createUpdateVaultConfigIx(field, data, params) - Update a specific vault configuration fieldcreateDepositVaultIx(amount, params) - Deposit assets into vaultcreateRequestWithdrawVaultIx(requestWithdrawArgs, params) - Request withdrawal from vaultcreateCancelRequestWithdrawVaultIx(params) - Cancel a pending withdrawal requestcreateWithdrawVaultIx(params) - Execute a withdrawal from vaultcreateHarvestFeeIx(params) - Harvest accumulated feescreateCalibrateHighWaterMarkIx(params) - Calibrate the high water markcreateCreateLpMetadataIx(createLpMetadataArgs, params) - Create LP token metadatacreateAddAdaptorIx(params) - Add an adaptor to a vaultcreateInitializeStrategyIx(initArgs, params) - Initialize a new strategycreateDepositStrategyIx(depositArgs, params) - Deposit assets into a strategycreateWithdrawStrategyIx(withdrawArgs, params) - Withdraw assets from a strategycreateInitializeDirectWithdrawStrategyIx(initArgs, params) - Initialize direct withdraw for a strategycreateDirectWithdrawStrategyIx(withdrawArgs, params) - Execute direct withdrawal from a strategycreateCloseStrategyIx(params) - Close a strategycreateRemoveAdaptorIx(params) - Remove an adaptor from a vaultfetchVaultAccount(vault) - Fetch vault account datafetchStrategyInitReceiptAccount(strategyInitReceipt) - Fetch strategy initialization receiptfetchAdaptorAddReceiptAccount(adaptorAddReceipt) - Fetch adaptor add receiptfetchRequestWithdrawVaultReceiptAccount(requestWithdrawVaultReceipt) - Fetch withdrawal request receiptfetchAllStrategyInitReceiptAccounts() - Fetch all strategy receiptsfetchAllStrategyInitReceiptAccountsOfVault(vault) - Fetch all strategy receipts for a vaultfetchAllAdaptorAddReceiptAccountsOfVault(vault) - Fetch all adaptor receipts for a vaultfetchAllRequestWithdrawVaultReceiptsOfVault(vault) - Fetch all withdrawal requests for a vaultgetPositionAndTotalValuesForVault(vault) - Get position values and total vault valuegetAccumulatedAdminFeesForVault(vault) - Get accumulated admin feesgetAccumulatedManagerFeesForVault(vault) - Get accumulated manager feesgetPendingWithdrawalForUser(vault, user) - Get pending withdrawal for a specific usergetAllPendingWithdrawalsForVault(vault) - Get all pending withdrawals for a vaultgetCurrentAssetPerLpForVault(vault) - Get current asset per LP ratiogetHighWaterMarkForVault(vault) - Get high water mark informationfindVaultLpMint(vault) - Find vault LP mint addressfindVaultAssetIdleAuth(vault) - Find vault asset idle authorityfindVaultAddresses(vault) - Find all vault-related addressesfindVaultStrategyAuth(vault, strategy) - Find vault strategy authorityfindStrategyInitReceipt(vault, strategy) - Find strategy initialization receiptfindDirectWithdrawInitReceipt(vault, strategy) - Find direct withdraw receiptfindVaultStrategyAddresses(vault, strategy) - Find all strategy-related addressesfindRequestWithdrawVaultReceipt(vault, user) - Find withdrawal request receiptfindLpMetadataAccount(vault) - Find LP metadata accountcalculateAssetsForWithdraw(vaultPk, lpAmount) - Calculate asset amount for LP tokenscalculateLpForWithdraw(vaultPk, assetAmount) - Calculate LP tokens needed for asset amountcalculateLpForDeposit(vaultPk, assetAmount) - Calculate LP tokens received for depositserializeU64(value) - Serialize a u64 value to BufferserializeU16(value) - Serialize a u16 value to BufferserializePubkey(pubkey) - Serialize a PublicKey to BuffergetBalance(publicKey) - Get account balance in lamports