Skip to main content
This guide is the operational walkthrough for managing vault allocations. For the conceptual model — Standard vs. Conditional, weights, caps, priority — read Concepts → Allocations first. This page assumes you’ve already chosen the parameters you want. For fixed-rate-specific allocation patterns and a focused step-by-step, see Configure fixed-rate allocations.

Configure via kamino.com/curators/vaults

Add a reserve

1

Open the Allocations tab

Navigate to your vault on kamino.com/curators/vaults and open the Allocations tab.
2

Click Add Reserve

Opens the allocation configuration form.
3

Select market and reserve

The reserve picker shows market name and TVL, reserve type (floating or fixed-rate), supply APY, reserve TVL, and utilization. A market may contain multiple reserves for the same token (e.g. USDC floating, USDC 5% 3M, USDC 6% 6M).
4

Set parameters

ParameterNotes
Allocation WeightRelative integer; ignored for Conditional allocations
Allocation CapHard ceiling in tokens; binding limit for Conditional
Conditional Allocation toggleOff = Standard (immediate deployment); On = Conditional (deploy on demand)
Allocation PriorityDefault 0; raise to protect this Standard allocation from being a source for Conditional fills
5

Submit

Sign with your admin wallet, or generate a Squads proposal if the vault is multisig-controlled.

Edit an existing allocation

Open the allocation entry on the Allocations tab. Adjust weight, cap, type toggle, or priority. Submit.

Batch edit weights

To change weights across multiple reserves in a single transaction, use the batch-edit view. The UI shows real-time percentage recalculation and projected vault APY impact, including unallocated funds.

Remove an allocation

Either set the weight (Standard) or cap (Conditional) to 0, or remove the entry entirely. The removed reserve’s share is redistributed to the remaining allocations per their weights.

Sync after changes

Allocations are targets. After updating an allocation, the vault doesn’t immediately rebalance — a permissionless sync brings actual allocation toward target. The sync bot runs every ~15 minutes; you can also trigger it manually via the UI’s “Sync Allocations” action or the SDK’s investAllReservesIxs / investSingleReserveIxs methods. The underlying vault operation is invest. It compares the reserve’s current allocation with its weight/cap target and then either:
  • deposits vault liquidity into the reserve if the reserve is under target, or
  • withdraws available liquidity from the reserve back into the vault if the reserve is over target.

Partial moves with invest_with_max_amount

invest_with_max_amount is a capped variant of invest: weights and allocation caps still determine whether funds move into or out of the reserve, but the caller can cap the amount of liquidity moved toward that target. Use it when the full target move is larger than the liquidity currently available, or when you want to move funds in controlled chunks. This instruction is available on-chain and in @kamino-finance/klend-sdk 9.1.0+ as investSingleReserveWithMaxAmountIxs. The SDK argument is maxAmountLamports: the maximum vault-token lamports to move in or out of the selected reserve. Example — partial rebalance when one reserve cannot fully deallocate:
  • Vault has two allocations, 50% each, with 1M total tokens: 500K in reserve 1 and 500K in reserve 2.
  • The manager changes weights to reserve 1: 90%, reserve 2: 10%.
  • The target move is to withdraw 400K from reserve 2, but reserve 2 only has 300K available.
  • Call invest_with_max_amount on reserve 2 with max_amount = 300K. This withdraws 300K from reserve 2 into the vault.
  • Call invest_with_max_amount on reserve 1 with max_amount = 300K. This deposits that 300K into reserve 1.
  • Final state: reserve 1 has 800K and reserve 2 has 200K. The vault is closer to the 900K / 100K target, and reserve 2 utilization may rise to 100%, incentivizing borrowers to repay so more liquidity becomes withdrawable.
import { createSolanaRpc, address } from '@solana/kit';
import {
  KaminoManager,
  KaminoVault,
  getMedianSlotDurationInMsFromLastEpochs,
} from '@kamino-finance/klend-sdk';
import { parseKeypairFile } from '@kamino-finance/klend-sdk/dist/utils/signer.js';

const payer = await parseKeypairFile('/path/to/payer.json');
const rpc = createSolanaRpc('https://api.mainnet-beta.solana.com');
const slotDuration = await getMedianSlotDurationInMsFromLastEpochs();
const kaminoManager = new KaminoManager(rpc, slotDuration);

const vault = new KaminoVault(rpc, address('<VAULT_ADDRESS>'));
const reserveAddress = address('<RESERVE_ADDRESS>');
const vaultState = await vault.getState();
const vaultReservesMap = await kaminoManager.loadVaultReserves(vaultState);
const reserve = vaultReservesMap.get(reserveAddress);
if (!reserve) {
  throw new Error(`Reserve ${reserveAddress} not found in vault allocations`);
}

const maxAmountLamports = '300000000000'; // 300,000 USDC with 6 decimals
const cappedInvestIxs = await kaminoManager.investSingleReserveWithMaxAmountIxs(
  payer,
  vault,
  { address: reserveAddress, state: reserve.state },
  maxAmountLamports,
  vaultReservesMap,
);
If cappedInvestIxs is empty, the computed move was below the vault’s minInvestAmount or there was no eligible liquidity to move. Sync may still not reach the exact target if the reserve has no available liquidity left after the capped move. When you need to exit capital that is not currently withdrawable, use the withdrawal queue.

What’s next

Allocations (concept)

The model behind weights, caps, types, and priority.

Configure fixed-rate allocations

The focused step-by-step for adding an FR allocation, with FR-specific parameter choices.