Overview
Drift Common provides a centralized configuration system through the Config object and Initialize() function. This system manages SDK configuration, market lookups, and environment-specific settings.
Config Object
The global Config object provides access to initialized SDK configuration and market data:
export const Config: {
initialized: boolean;
spotMarketsLookup: SpotMarketConfig[];
perpMarketsLookup: PerpMarketConfig[];
sdkConfig: ReturnType<typeof initialize>;
}
See Config.ts:8-18 for implementation details.
Properties
initialized
- Type:
boolean
- Indicates whether the SDK has been initialized
- Set to
true after calling Initialize()
spotMarketsLookup
- Type:
SpotMarketConfig[]
- Array indexed by market index for fast spot market config lookups
- Populated during initialization
perpMarketsLookup
- Type:
PerpMarketConfig[]
- Array indexed by market index for fast perp market config lookups
- Populated during initialization
sdkConfig
- Type:
ReturnType<typeof initialize>
- The complete SDK configuration from
@drift-labs/sdk
- Includes all market configs, program IDs, and environment settings
Initialize Function
The Initialize() function sets up the SDK configuration for a specific environment:
import { Initialize } from '@drift-labs/common';
import { DriftEnv } from '@drift-labs/sdk';
// Initialize for mainnet
const sdkConfig = Initialize('mainnet-beta');
// Initialize for devnet
const sdkConfig = Initialize('devnet');
See Config.ts:20-48 for Initialize implementation.
Parameters
env
- Type:
DriftEnv
- Values:
'mainnet-beta' | 'devnet'
- Determines which network configuration to load
Return Value
Returns the SDK configuration object from @drift-labs/sdk with:
SPOT_MARKETS: Array of all spot market configurations
PERP_MARKETS: Array of all perpetual market configurations
- Environment-specific settings
- Program IDs and addresses
What It Does
-
Initializes SDK Configuration
const SDKConfig = initialize({ env });
-
Creates Market Lookup Arrays
- Finds maximum market indexes for spot and perp markets
- Creates arrays sized to the maximum index
- Populates arrays with market configs at their respective indexes
const maxSpotMarketIndex = Math.max(
...SDKConfig.SPOT_MARKETS.map((market) => market.marketIndex)
);
const spotMarkets = new Array(maxSpotMarketIndex);
SDKConfig.SPOT_MARKETS.forEach((spotMarket) => {
spotMarkets[spotMarket.marketIndex] = spotMarket;
});
-
Updates Global Config
Config.spotMarketsLookup = spotMarkets;
Config.perpMarketsLookup = markets;
Config.initialized = true;
Usage in Applications
Client Applications
import { Initialize, Config } from '@drift-labs/common';
// Initialize once at application startup
Initialize('mainnet-beta');
// Access market configurations anywhere
const solSpotConfig = Config.spotMarketsLookup[1]; // SOL spot market
const solPerpConfig = Config.perpMarketsLookup[0]; // SOL-PERP market
// Check if initialized
if (Config.initialized) {
console.log('SDK is ready');
}
Server Applications
import { Initialize } from '@drift-labs/common';
import { CentralServerDrift } from '@drift-labs/common';
// Initialize before creating clients
Initialize('mainnet-beta');
const serverDrift = new CentralServerDrift({
solanaRpcEndpoint: process.env.RPC_URL,
driftEnv: 'mainnet-beta',
supportedPerpMarkets: [0, 1, 2],
supportedSpotMarkets: [0, 1],
});
The Initialize() function is automatically called by AuthorityDrift during construction. You only need to call it manually if you’re using Config directly or need to initialize before creating clients.
DriftClient Configuration
When creating Drift clients, you can provide additional configuration options:
AuthorityDrift Configuration
import { AuthorityDrift } from '@drift-labs/common';
const config: AuthorityDriftConfig = {
// Required
solanaRpcEndpoint: 'https://api.mainnet-beta.solana.com',
driftEnv: 'mainnet-beta',
// Optional
wallet: myWallet, // IWalletV2 instance
driftDlobServerHttpUrl: 'https://dlob.drift.trade',
tradableMarkets: [], // Filter markets to subscribe to
selectedTradeMarket: marketId, // Primary trading market
// Additional DriftClient config
additionalDriftClientConfig: {
txVersion: 0,
enableMetricsEvents: false,
accountSubscription: {
type: 'polling',
accountLoader: customAccountLoader,
},
},
// Priority fee subscriber config
priorityFeeSubscriberConfig: {
priorityFeeMethod: PriorityFeeMethod.SOLANA,
frequencyMs: 10_000,
sampleSize: 100,
},
// Orderbook configuration
orderbookConfig: {
dlobWebSocketUrl: 'wss://dlob.drift.trade/ws',
orderbookGrouping: 0.01, // Price grouping for orderbook
},
};
const authorityDrift = new AuthorityDrift(config);
See AuthorityDrift/index.ts:106-119 for AuthorityDriftConfig interface.
CentralServerDrift Configuration
import { CentralServerDrift } from '@drift-labs/common';
const config = {
// Required
solanaRpcEndpoint: 'https://api.mainnet-beta.solana.com',
driftEnv: 'mainnet-beta',
supportedPerpMarkets: [0, 1, 2], // Market indexes to support
supportedSpotMarkets: [0, 1],
// Optional
additionalDriftClientConfig: {
txVersion: 0,
txParams: {
computeUnits: 200000,
computeUnitsPrice: 1000,
},
enableMetricsEvents: false,
},
// Priority fee configuration
priorityFeeSubscriberConfig: {
priorityFeeMethod: PriorityFeeMethod.SOLANA,
addresses: customHighActivityAccounts,
frequencyMs: 10_000,
},
};
const serverDrift = new CentralServerDrift(config);
See CentralServerDrift/index.ts:96-193 for constructor implementation.
Market Configurations
Market configurations contain essential information about each market:
Spot Market Config
interface SpotMarketConfig {
marketIndex: number;
symbol: string;
mint: PublicKey;
precision: number;
precisionExp: BN;
oracle: PublicKey;
oracleSource: OracleSource;
// ... additional properties
}
Example: Access SOL Spot Market
Initialize('mainnet-beta');
const solSpot = Config.spotMarketsLookup[1];
console.log(solSpot.symbol); // 'SOL'
console.log(solSpot.marketIndex); // 1
console.log(solSpot.precision); // 1e9 (9 decimals)
Perp Market Config
interface PerpMarketConfig {
marketIndex: number;
symbol: string;
baseAssetSymbol: string;
oracle: PublicKey;
oracleSource: OracleSource;
// ... additional properties
}
Example: Access SOL-PERP Market
Initialize('mainnet-beta');
const solPerp = Config.perpMarketsLookup[0];
console.log(solPerp.symbol); // 'SOL-PERP'
console.log(solPerp.marketIndex); // 0
console.log(solPerp.baseAssetSymbol); // 'SOL'
Transaction Parameters
Configure transaction parameters for optimal execution:
import { TxParams } from '@drift-labs/sdk';
const txParams: TxParams = {
// Compute units for the transaction
computeUnits: 200000,
// Priority fee in micro-lamports
computeUnitsPrice: 1000,
// Use simulated compute units (recommended)
useSimulatedComputeUnits: true,
// Buffer multiplier for compute units
computeUnitsBufferMultiplier: 1.2,
};
// Use with client operations
const depositTxn = await serverDrift.getDepositTxn(
userAccountPubkey,
amount,
spotMarketIndex,
{ txParams }
);
Dynamic Priority Fees
Both clients automatically calculate priority fees based on network conditions:
// Get current recommended tx params
const txParams = authorityDrift.getTxParams();
// Override specific parameters
const customTxParams = authorityDrift.getTxParams({
computeUnits: 300000,
});
The priority fee is calculated from:
PriorityFeeSubscriber monitoring network conditions
- High-activity market accounts
- Configurable priority fee methods (SOLANA, HELIUS, etc.)
See CentralServerDrift/index.ts:330-346 for getTxParams implementation.
Account Loader Configuration
The account loader fetches account data from the RPC:
import { CustomizedCadenceBulkAccountLoader } from '@drift-labs/sdk';
import { Connection } from '@solana/web3.js';
const connection = new Connection(rpcEndpoint);
const accountLoader = new CustomizedCadenceBulkAccountLoader(
connection,
'confirmed', // commitment level
1000 // polling frequency in ms
);
Default configuration:
- Commitment:
'confirmed'
- Polling Frequency: 1000ms (1 second)
See blockchain.ts:4-5 for default configuration.
Transaction Sender Configuration
The transaction sender handles transaction submission and confirmation:
import { WhileValidTxSender, ConfirmationStrategy } from '@drift-labs/sdk';
const txSender = new WhileValidTxSender({
connection,
wallet,
additionalConnections: [], // Extra RPC connections for redundancy
additionalTxSenderCallbacks: [],
txHandler: driftClient.txHandler,
confirmationStrategy: ConfirmationStrategy.Combo,
retrySleep: 4000, // Retry interval in ms
});
Default configuration:
- Confirmation Strategy:
ConfirmationStrategy.Combo
- Retry Interval: 4000ms (4 seconds)
See blockchain.ts:6-8 for default configuration.
Subscription Configuration
Configure how frequently different market categories are polled:
// Polling cadences (in milliseconds)
const SELECTED_MARKET_ACCOUNT_POLLING_CADENCE = 1_000; // 1 second
const USER_INVOLVED_MARKET_ACCOUNT_POLLING_CADENCE = 1_000; // 1 second
const USER_NOT_INVOLVED_MARKET_ACCOUNT_POLLING_CADENCE = 60_000; // 1 minute
These determine how often market accounts are polled based on:
- Selected Market: The market actively being traded
- User Involved: Markets where the user has positions/orders
- User Not Involved: Other markets for background updates
See blockchain.ts:10-12 for polling cadences.
Priority Fee Subscriber
Configure priority fee tracking:
import { PriorityFeeSubscriber, PriorityFeeMethod } from '@drift-labs/sdk';
const priorityFeeConfig: PriorityFeeSubscriberConfig = {
connection,
// Method for calculating priority fees
priorityFeeMethod: PriorityFeeMethod.SOLANA,
// Specific market accounts to monitor
driftMarkets: [
{ marketType: 'perp', marketIndex: 0 }, // SOL-PERP
{ marketType: 'spot', marketIndex: 1 }, // SOL spot
],
// Additional high-traffic accounts
addresses: [
new PublicKey('8UJgxaiQx5nTrdDgph5FiahMmzduuLTLf5WmsPegYA6W'),
],
// Polling frequency
frequencyMs: 10_000,
// Sample size for calculation
sampleSize: 100,
};
const priorityFeeSubscriber = new PriorityFeeSubscriber(priorityFeeConfig);
await priorityFeeSubscriber.subscribe();
// Get current priority fee
const priorityFee = priorityFeeSubscriber.getCustomStrategyResult();
Best Practices
Initialization
- Initialize Once: Call
Initialize() once at application startup
- Environment Variables: Store RPC endpoints and environment in config files
- Error Handling: Wrap initialization in try-catch blocks
try {
const sdkConfig = Initialize(process.env.DRIFT_ENV as DriftEnv);
console.log('SDK initialized successfully');
} catch (error) {
console.error('Failed to initialize SDK:', error);
process.exit(1);
}
Market Lookups
- Use Config Arrays: Access markets via
Config.spotMarketsLookup and Config.perpMarketsLookup
- Check Bounds: Verify market index is valid before accessing
- Cache Configs: Store frequently used configs in local variables
// Efficient market config access
const getMarketConfig = (marketIndex: number, isPerp: boolean) => {
const lookup = isPerp ? Config.perpMarketsLookup : Config.spotMarketsLookup;
if (marketIndex >= lookup.length || !lookup[marketIndex]) {
throw new Error(`Invalid market index: ${marketIndex}`);
}
return lookup[marketIndex];
};
Client Configuration
- Minimize Subscriptions: Only subscribe to markets you need
- Use Environment Variables: Don’t hardcode endpoints or environments
- Configure Priority Fees: Set up priority fee tracking for optimal execution
- Handle Cleanup: Always unsubscribe when done
const authorityDrift = new AuthorityDrift({
solanaRpcEndpoint: process.env.SOLANA_RPC_URL,
driftEnv: process.env.DRIFT_ENV as DriftEnv,
tradableMarkets: getRequiredMarkets(), // Only subscribe to needed markets
priorityFeeSubscriberConfig: {
priorityFeeMethod: PriorityFeeMethod.SOLANA,
},
});
try {
await authorityDrift.subscribe();
// ... use client
} finally {
await authorityDrift.unsubscribe();
}
Next Steps