Skip to main content

AdminClient

The AdminClient class extends DriftClient to provide administrative functions for managing Drift Protocol. It includes methods for initializing markets, updating protocol parameters, and managing market configurations.
The AdminClient requires the connected wallet to be the protocol admin. Most users should use DriftClient instead.

Extends

AdminClient extends DriftClient, inheriting all methods and properties.

Protocol Initialization

initialize

Initializes the Drift Protocol state account.
await adminClient.initialize(
  usdcMint: PublicKey,
  adminControlsPrices: boolean
): Promise<[TransactionSignature]>
usdcMint
PublicKey
required
USDC mint public key
adminControlsPrices
boolean
required
Whether admin controls oracle prices
return
Promise<[TransactionSignature]>
Transaction signature in array format

Perpetual Market Management

initializePerpMarket

Initializes a new perpetual market.
await adminClient.initializePerpMarket(
  marketIndex: number,
  priceOracle: PublicKey,
  baseAssetReserve: BN,
  quoteAssetReserve: BN,
  periodicity: BN,
  pegMultiplier?: BN,
  oracleSource?: OracleSource,
  contractTier?: ContractTier,
  marginRatioInitial?: number,
  marginRatioMaintenance?: number,
  liquidatorFee?: number,
  ifLiquidatorFee?: number,
  imfFactor?: number,
  activeStatus?: boolean,
  baseSpread?: number,
  maxSpread?: number,
  maxOpenInterest?: BN,
  maxRevenueWithdrawPerPeriod?: BN,
  quoteMaxInsurance?: BN,
  orderStepSize?: BN,
  orderTickSize?: BN,
  minOrderSize?: BN,
  concentrationCoefScale?: BN,
  curveUpdateIntensity?: number,
  ammJitIntensity?: number,
  name?: string,
  lpPoolId?: number
): Promise<TransactionSignature>
marketIndex
number
required
Market index for the new perpetual market
priceOracle
PublicKey
required
Oracle account public key
baseAssetReserve
BN
required
Initial base asset reserve for the AMM
quoteAssetReserve
BN
required
Initial quote asset reserve for the AMM
periodicity
BN
required
Funding rate update periodicity
pegMultiplier
BN
default:"PEG_PRECISION"
Peg multiplier for the market
oracleSource
OracleSource
default:"OracleSource.PYTH"
Oracle source type
contractTier
ContractTier
default:"ContractTier.SPECULATIVE"
Contract tier classification
marginRatioInitial
number
default:2000
Initial margin ratio (in basis points)
marginRatioMaintenance
number
default:500
Maintenance margin ratio (in basis points)
name
string
default:"DEFAULT_MARKET_NAME"
Market name
return
Promise<TransactionSignature>
Transaction signature

deletePerpMarket

Deletes an initialized but unused perpetual market.
await adminClient.deleteInitializedPerpMarket(
  marketIndex: number
): Promise<TransactionSignature>
marketIndex
number
required
Market index to delete
return
Promise<TransactionSignature>
Transaction signature

updatePerpMarketMarginRatio

Updates margin ratios for a perpetual market.
await adminClient.updatePerpMarketMarginRatio(
  perpMarketIndex: number,
  marginRatioInitial: number,
  marginRatioMaintenance: number
): Promise<TransactionSignature>
perpMarketIndex
number
required
Perpetual market index
marginRatioInitial
number
required
New initial margin ratio
marginRatioMaintenance
number
required
New maintenance margin ratio
return
Promise<TransactionSignature>
Transaction signature

updatePerpMarketBaseSpread

Updates the base spread for a perpetual market.
await adminClient.updatePerpMarketBaseSpread(
  perpMarketIndex: number,
  baseSpread: number
): Promise<TransactionSignature>
perpMarketIndex
number
required
Perpetual market index
baseSpread
number
required
New base spread value
return
Promise<TransactionSignature>
Transaction signature

updatePerpMarketOracle

Updates the oracle for a perpetual market.
await adminClient.updatePerpMarketOracle(
  perpMarketIndex: number,
  oracle: PublicKey,
  oracleSource: OracleSource,
  skipInvaraintCheck?: boolean
): Promise<TransactionSignature>
perpMarketIndex
number
required
Perpetual market index
oracle
PublicKey
required
New oracle account public key
oracleSource
OracleSource
required
Oracle source type
skipInvaraintCheck
boolean
default:false
Skip invariant validation checks
return
Promise<TransactionSignature>
Transaction signature

Spot Market Management

initializeSpotMarket

Initializes a new spot market.
await adminClient.initializeSpotMarket(
  mint: PublicKey,
  optimalUtilization: number,
  optimalRate: number,
  maxRate: number,
  oracle: PublicKey,
  oracleSource: OracleSource,
  initialAssetWeight: number,
  maintenanceAssetWeight: number,
  initialLiabilityWeight: number,
  maintenanceLiabilityWeight: number,
  imfFactor?: number,
  liquidatorFee?: number,
  ifLiquidationFee?: number,
  activeStatus?: boolean,
  assetTier?: AssetTier,
  scaleInitialAssetWeightStart?: BN,
  withdrawGuardThreshold?: BN,
  orderTickSize?: BN,
  orderStepSize?: BN,
  ifTotalFactor?: number,
  name?: string,
  marketIndex?: number
): Promise<TransactionSignature>
mint
PublicKey
required
Token mint public key
optimalUtilization
number
required
Optimal utilization rate for interest
optimalRate
number
required
Interest rate at optimal utilization
maxRate
number
required
Maximum interest rate
oracle
PublicKey
required
Oracle account public key
oracleSource
OracleSource
required
Oracle source type
initialAssetWeight
number
required
Initial asset weight for collateral
maintenanceAssetWeight
number
required
Maintenance asset weight for collateral
initialLiabilityWeight
number
required
Initial liability weight for borrows
maintenanceLiabilityWeight
number
required
Maintenance liability weight for borrows
assetTier
AssetTier
default:"AssetTier.COLLATERAL"
Asset tier classification
name
string
default:"DEFAULT_MARKET_NAME"
Market name
return
Promise<TransactionSignature>
Transaction signature

deleteSpotMarket

Deletes an initialized but unused spot market.
await adminClient.deleteInitializedSpotMarket(
  marketIndex: number
): Promise<TransactionSignature>
marketIndex
number
required
Spot market index to delete
return
Promise<TransactionSignature>
Transaction signature

updateSpotMarketOracle

Updates the oracle for a spot market.
await adminClient.updateSpotMarketOracle(
  spotMarketIndex: number,
  oracle: PublicKey,
  oracleSource: OracleSource
): Promise<TransactionSignature>
spotMarketIndex
number
required
Spot market index
oracle
PublicKey
required
New oracle account public key
oracleSource
OracleSource
required
Oracle source type
return
Promise<TransactionSignature>
Transaction signature

AMM Management

moveAmmPrice

Moves the AMM price to new reserve values.
await adminClient.moveAmmPrice(
  perpMarketIndex: number,
  baseAssetReserve: BN,
  quoteAssetReserve: BN,
  sqrtK?: BN
): Promise<TransactionSignature>
perpMarketIndex
number
required
Perpetual market index
baseAssetReserve
BN
required
New base asset reserve
quoteAssetReserve
BN
required
New quote asset reserve
sqrtK
BN
Square root of k (auto-calculated if not provided)
return
Promise<TransactionSignature>
Transaction signature

repegAmmCurve

Repegs the AMM curve to a new peg multiplier.
await adminClient.repegAmmCurve(
  newPeg: BN,
  perpMarketIndex: number
): Promise<TransactionSignature>
newPeg
BN
required
New peg multiplier
perpMarketIndex
number
required
Perpetual market index
return
Promise<TransactionSignature>
Transaction signature

updateK

Updates the k parameter for an AMM.
await adminClient.updateK(
  perpMarketIndex: number,
  sqrtK: BN
): Promise<TransactionSignature>
perpMarketIndex
number
required
Perpetual market index
sqrtK
BN
required
New square root of k value
return
Promise<TransactionSignature>
Transaction signature

Fee Structure Management

updatePerpFeeStructure

Updates the perpetual market fee structure.
await adminClient.updatePerpFeeStructure(
  feeStructure: FeeStructure
): Promise<TransactionSignature>
feeStructure
FeeStructure
required
New fee structure configuration
return
Promise<TransactionSignature>
Transaction signature

updateSpotFeeStructure

Updates the spot market fee structure.
await adminClient.updateSpotFeeStructure(
  feeStructure: FeeStructure
): Promise<TransactionSignature>
feeStructure
FeeStructure
required
New fee structure configuration
return
Promise<TransactionSignature>
Transaction signature

State Parameter Updates

updateAdmin

Transfers admin authority to a new address.
await adminClient.updateAdmin(
  admin: PublicKey
): Promise<TransactionSignature>
admin
PublicKey
required
New admin public key
return
Promise<TransactionSignature>
Transaction signature

updateOracleGuardRails

Updates oracle guard rails for price validation.
await adminClient.updateOracleGuardRails(
  oracleGuardRails: OracleGuardRails
): Promise<TransactionSignature>
oracleGuardRails
OracleGuardRails
required
New oracle guard rail configuration
return
Promise<TransactionSignature>
Transaction signature

updateLiquidationDuration

Updates the liquidation duration parameter.
await adminClient.updateLiquidationDuration(
  liquidationDuration: number
): Promise<TransactionSignature>
liquidationDuration
number
required
New liquidation duration in seconds
return
Promise<TransactionSignature>
Transaction signature

Usage Example

import { AdminClient } from '@drift-labs/sdk';
import { Connection, PublicKey } from '@solana/web3.js';
import { BN } from '@coral-xyz/anchor';

// Initialize admin client
const connection = new Connection('https://api.mainnet-beta.solana.com');
const adminClient = new AdminClient({
  connection,
  wallet: adminWallet,
  env: 'mainnet-beta',
});

await adminClient.subscribe();

// Initialize a new perpetual market
const marketIndex = 10;
const oracle = new PublicKey('...');
const baseAssetReserve = new BN(100_000_000_000); // 100 SOL
const quoteAssetReserve = new BN(10_000_000_000); // 10,000 USDC
const periodicity = new BN(3600); // 1 hour

await adminClient.initializePerpMarket(
  marketIndex,
  oracle,
  baseAssetReserve,
  quoteAssetReserve,
  periodicity,
  undefined, // default peg
  OracleSource.PYTH,
  ContractTier.A,
  2000, // 20% initial margin
  500,  // 5% maintenance margin
  0,
  10000,
  0,
  true,
  100,
  142500,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  undefined,
  0,
  0,
  'BTC-PERP'
);

// Update market parameters
await adminClient.updatePerpMarketMarginRatio(
  marketIndex,
  1500, // 15% initial margin
  400   // 4% maintenance margin
);

// Update base spread
await adminClient.updatePerpMarketBaseSpread(
  marketIndex,
  50 // 0.5 bps
);

await adminClient.unsubscribe();

Build docs developers (and LLMs) love