Skip to main content
After a reserve is live, every parameter on its ReserveConfig is editable through the same fetch → mutate → apply pattern as market settings. This page covers the day-to-day workflow.

Update a reserve via SDK

The SDK exposes kaminoManager.updateReserveIxs(signer, marketWithAddress, reserveAddress, newReserveConfig) for full reserve config updates. Fetch the current config, mutate, pass the new value in.
1

Initialize KaminoManager and fetch the reserve

2

Mutate the fields you want to change

For oracle changes, see Configure oracles. For elevation groups, see Elevation groups.
3

Apply the update

updateReserveIxs returns the update split into chunks for transaction size; submit each chunk in order.

Cloning a reserve config

To duplicate an existing reserve’s config onto a new reserve, see Add reserves → Cloning an existing reserve config via SDK.

Multisig mode

Replace the admin signer with noopSigner(multisigPubkey) and submit the resulting transactions as Squads proposals.

Common edits

Adjust LTV / liquidation threshold / borrow factor

Edit loanToValuePct, liquidationThresholdPct, borrowFactorPct. Existing positions continue using the new values from the next refresh.
Lowering liquidationThresholdPct below the LTV of existing positions causes those positions to become liquidatable on the next refresh. Communicate parameter tightening publicly in advance, or set the change to take effect only after a cooldown.

Adjust deposit / borrow caps

Edit depositLimit and/or borrowLimit. The CLI’s focused update-reserve-config-debt-cap command exists for the borrow cap.

Change the IR curve

Edit borrowRateCurve.points. The change takes effect from the next interest accrual; current debts continue accruing at the new rate.

Update oracle config

Edit fields under tokenInfo. The on-chain validator confirms the new oracle accounts match what was passed in the instruction; mismatches return InvalidScopePriceAccount. For a full oracle migration, do it as a single update: clear old fields, set new fields, apply. See Configure oracles.

Pause a reserve

Set status: 1 (Obsolete) or status: 2 (Hidden). For a stronger pause that blocks operations program-side, use block_price_usage: 1 on the reserve’s tokenInfo (rejects every operation that needs the price) or emergency_mode: 1 on the reserve. See Emergency controls.

Enable / disable advanced features

Most advanced features have flags at the market level — withdrawal queue, borrow orders, obligation orders, fixed-term rollover windows. The reserve-level fixed-term parameters (debt_term_seconds, host_fixed_interest_rate_bps, early_repay_remaining_interest_pct) live on ReserveConfig and use the standard reserve update flow. See:

Multisig considerations

For multisig-owned markets, every reserve update is a Squads proposal subject to the configured timelock. Plan parameter changes accordingly — a 12-hour timelock means an LTV adjustment proposed at 9:00 AM executes at 9:00 PM. For changes that need to land faster (e.g., closing a reserve in response to an oracle incident), use Emergency controlsborrow_disabled or block_price_usage flips can be batched into a single emergency proposal that takes precedence over slower-cadence parameter tuning.

Common errors

Reference