Skip to main content
Oracles provide external price data to Drift Protocol markets. The protocol supports multiple oracle sources including Pyth, Switchboard, and custom oracle implementations.

Get Oracle Price Data

Retrieve oracle price data for a market:
import { OracleSource } from '@drift-labs/sdk';

const perpMarket = driftClient.getPerpMarketAccount(0);

const oraclePriceData = driftClient.getOraclePriceDataAndSlot(
  perpMarket.amm.oracle,
  perpMarket.amm.oracleSource
);

console.log('Price:', oraclePriceData.data.price.toString());
console.log('Slot:', oraclePriceData.slot.toString());

OraclePriceData Structure

The OraclePriceData type contains price and confidence information from an oracle.
price
BN
required
Current oracle price in PRICE_PRECISION (1e6)
slot
BN
required
Solana slot when the price was updated
confidence
BN
required
Price confidence interval in PRICE_PRECISION (1e6)
hasSufficientNumberOfDataPoints
boolean
required
Whether the oracle has sufficient data points for reliability
twap
BN
Time-weighted average price (if available)
twapConfidence
BN
Confidence interval for TWAP (if available)
maxPrice
BN
Maximum price for pre-launch markets only
sequenceId
BN
Sequence identifier for the price update

Oracle Sources

Drift Protocol supports multiple oracle sources:
PYTH
OracleSource
Standard Pyth oracle with default price scaling
PYTH_1K
OracleSource
Pyth oracle with 1000x price scaling
PYTH_1M
OracleSource
Pyth oracle with 1,000,000x price scaling
PYTH_PULL
OracleSource
Pyth pull-based oracle
PYTH_1K_PULL
OracleSource
Pyth pull oracle with 1000x scaling
PYTH_1M_PULL
OracleSource
Pyth pull oracle with 1,000,000x scaling
SWITCHBOARD
OracleSource
Switchboard v2 oracle
SWITCHBOARD_ON_DEMAND
OracleSource
Switchboard on-demand oracle
QUOTE_ASSET
OracleSource
Fixed price oracle for quote asset (USDC = $1)
PYTH_STABLE_COIN
OracleSource
Pyth stablecoin oracle
PYTH_STABLE_COIN_PULL
OracleSource
Pyth pull stablecoin oracle
Prelaunch
OracleSource
Pre-launch market oracle
PYTH_LAZER
OracleSource
Pyth Lazer oracle (low-latency)
PYTH_LAZER_1K
OracleSource
Pyth Lazer with 1000x scaling
PYTH_LAZER_1M
OracleSource
Pyth Lazer with 1,000,000x scaling
PYTH_LAZER_STABLE_COIN
OracleSource
Pyth Lazer stablecoin oracle

Validate Oracle

Check if oracle data is valid:
import { isOracleValid, OracleValidity } from '@drift-labs/sdk';

const perpMarket = driftClient.getPerpMarketAccount(0);
const oraclePriceData = driftClient.getOraclePriceDataAndSlot(
  perpMarket.amm.oracle,
  perpMarket.amm.oracleSource
);
const state = driftClient.getStateAccount();
const currentSlot = new BN(await driftClient.connection.getSlot());

const validity = isOracleValid(
  perpMarket.amm,
  oraclePriceData.data,
  state.oracleGuardRails.validity,
  currentSlot
);

if (validity === OracleValidity.Valid) {
  console.log('Oracle is valid');
} else {
  console.log('Oracle validity issue:', OracleValidity[validity]);
}

Check Oracle Divergence

Check if oracle price diverges too much from mark price:
import { isOracleTooDivergent, calculateReservePrice } from '@drift-labs/sdk';

const perpMarket = driftClient.getPerpMarketAccount(0);
const oraclePriceData = driftClient.getOraclePriceDataAndSlot(
  perpMarket.amm.oracle,
  perpMarket.amm.oracleSource
);
const state = driftClient.getStateAccount();

const reservePrice = calculateReservePrice(perpMarket, oraclePriceData.data);

const isDivergent = isOracleTooDivergent(
  reservePrice,
  oraclePriceData.data.price,
  state.oracleGuardRails.priceDivergence.markOraclePercentDivergence
);

if (isDivergent) {
  console.log('Oracle price diverges from mark price');
}

OracleInfo Type

Oracle configuration for a market:
type OracleInfo = {
  publicKey: PublicKey;  // Oracle account address
  source: OracleSource;  // Oracle source type
};

Price Precision

All prices in Drift Protocol use PRICE_PRECISION (1e6):
import { PRICE_PRECISION } from '@drift-labs/sdk';

// Convert oracle price to UI price
const uiPrice = oraclePriceData.data.price.toNumber() / PRICE_PRECISION.toNumber();
console.log('UI Price: $', uiPrice);

// Convert UI price to oracle price
const oraclePrice = PRICE_PRECISION.muln(30); // $30

Build docs developers (and LLMs) love