Skip to main content
Spot markets represent depositable and borrowable assets in Drift Protocol. Each spot market has its own account containing market configuration, interest rate parameters, and deposit/borrow data.

Get Spot Market Account

Retrieve a spot market account by its market index:
const marketIndex = 0; // USDC
const spotMarket = driftClient.getSpotMarketAccount(marketIndex);

Force Fetch from RPC

Force a fetch from RPC before returning the account (useful for testing):
const spotMarket = await driftClient.forceGetSpotMarketAccount(marketIndex);

Get All Spot Markets

Retrieve all spot market accounts:
const allSpotMarkets = driftClient.getSpotMarketAccounts();

Get Quote Spot Market

The quote spot market (USDC, index 0) is commonly used:
const quoteMarket = driftClient.getQuoteSpotMarketAccount();

SpotMarketAccount Structure

The SpotMarketAccount type contains all data for a spot market.
marketIndex
number
required
The unique identifier for this spot market
pubkey
PublicKey
required
The on-chain address of this market account
status
MarketStatus
required
Current status of the market (e.g., active, paused, delisted)
assetTier
AssetTier
required
Asset tier classification: collateral, protected, cross, isolated, or unlisted
name
number[]
required
Market name as byte array (use decodeName() to convert to string)
mint
PublicKey
required
SPL token mint address for this market
vault
PublicKey
required
Vault account holding the market’s token balance
oracle
PublicKey
required
Oracle account providing price data
oracleSource
OracleSource
required
Oracle source type (Pyth, Switchboard, etc.)
decimals
number
required
Token decimals for this market
initialAssetWeight
number
required
Asset weight for initial margin calculations (in margin precision 10000)
maintenanceAssetWeight
number
required
Asset weight for maintenance margin calculations (in margin precision 10000)
initialLiabilityWeight
number
required
Liability weight for initial margin calculations (in margin precision 10000)
maintenanceLiabilityWeight
number
required
Liability weight for maintenance margin calculations (in margin precision 10000)
imfFactor
number
required
Initial margin fraction factor for size-based margin increases
liquidatorFee
number
required
Fee paid to liquidators (in percentage precision)
ifLiquidationFee
number
required
Fee paid to insurance fund during liquidations
depositBalance
BN
required
Total scaled deposit balance across all users
borrowBalance
BN
required
Total scaled borrow balance across all users
cumulativeDepositInterest
BN
required
Cumulative deposit interest multiplier
cumulativeBorrowInterest
BN
required
Cumulative borrow interest multiplier
optimalUtilization
number
required
Target utilization rate for optimal interest rates
optimalBorrowRate
number
required
Interest rate at optimal utilization
maxBorrowRate
number
required
Maximum borrow interest rate
minBorrowRate
number
required
Minimum borrow interest rate
maxTokenDeposits
BN
required
Maximum token deposits allowed (0 = unlimited)
maxTokenBorrowsFraction
number
required
Maximum borrow fraction relative to deposits
scaleInitialAssetWeightStart
BN
required
Deposit size where asset weight scaling begins
insuranceFund
object
required
Insurance fund information for this market
historicalOracleData
HistoricalOracleData
required
Historical oracle price data and TWAP values
historicalIndexData
HistoricalIndexData
required
Historical index price bid/ask data
orderStepSize
BN
required
Minimum order size increment
orderTickSize
BN
required
Minimum price increment
minOrderSize
BN
required
Minimum order size
maxPositionSize
BN
required
Maximum position size allowed

Calculate Token Amount

Convert scaled balance to token amount:
import { getTokenAmount, SpotBalanceType } from '@drift-labs/sdk';

const scaledBalance = user.spotPositions[0].scaledBalance;
const spotMarket = driftClient.getSpotMarketAccount(0);

const tokenAmount = getTokenAmount(
  scaledBalance,
  spotMarket,
  SpotBalanceType.DEPOSIT
);

console.log('Token amount:', tokenAmount.toString());

Calculate Spot Market Margin

Calculate margin requirements for a spot position:
import { 
  calculateSpotMarketMarginRatio,
  castNumberToSpotPrecision,
  SpotBalanceType
} from '@drift-labs/sdk';

const size = castNumberToSpotPrecision(100, spotMarket); // 100 tokens
const oraclePrice = PRICE_PRECISION.muln(30); // $30
const marginCategory = 'Initial'; // or 'Maintenance'

const marginRatio = calculateSpotMarketMarginRatio(
  spotMarket,
  oraclePrice,
  marginCategory,
  size,
  SpotBalanceType.DEPOSIT
);

console.log('Margin ratio:', marginRatio);

Calculate Maximum Deposit

Calculate remaining deposit capacity:
import { calculateMaxRemainingDeposit } from '@drift-labs/sdk';

const maxRemaining = calculateMaxRemainingDeposit(spotMarket);

if (maxRemaining.eq(ZERO)) {
  console.log('No deposit limit set');
} else {
  console.log('Remaining capacity:', maxRemaining.toString());
}

Build docs developers (and LLMs) love