#!/usr/bin/env node /** * Diagnostic script to test Drift SDK initialization with Alchemy RPC * * This script attempts to initialize the Drift SDK with Alchemy and logs * detailed information about WebSocket subscription attempts, rate limits, * and initialization state. * * Usage: node scripts/test-alchemy-drift-init.mjs */ import { Connection, Keypair } from '@solana/web3.js' import { DriftClient, initialize } from '@drift-labs/sdk' import bs58 from 'bs58' import dotenv from 'dotenv' dotenv.config() const ALCHEMY_RPC = 'https://solana-mainnet.g.alchemy.com/v2/5A0iA5UYpsmP9gkuezYeg' const HELIUS_RPC = 'https://mainnet.helius-rpc.com/?api-key=5e236449-f936-4af7-ae38-f15e2f1a3757' // Test with both RPCs for comparison const TEST_RPC = process.env.TEST_RPC || ALCHEMY_RPC console.log('šŸ”¬ Drift SDK Initialization Diagnostics') console.log('=' .repeat(60)) console.log(`Testing RPC: ${TEST_RPC.includes('alchemy') ? 'ALCHEMY' : 'HELIUS'}`) console.log('=' .repeat(60)) // Parse wallet private key let secretKey if (process.env.DRIFT_WALLET_PRIVATE_KEY.startsWith('[')) { const keyArray = JSON.parse(process.env.DRIFT_WALLET_PRIVATE_KEY) secretKey = new Uint8Array(keyArray) } else { secretKey = bs58.decode(process.env.DRIFT_WALLET_PRIVATE_KEY) } const keypair = Keypair.fromSecretKey(secretKey) console.log(`\nšŸ“ Wallet: ${keypair.publicKey.toString()}`) // Create connection with detailed logging console.log('\nšŸ”Œ Creating Solana connection...') const connection = new Connection(TEST_RPC, { commitment: 'confirmed', wsEndpoint: undefined, // Let SDK handle WebSocket }) console.log('āœ… Connection created') // Track subscription events let subscriptionAttempts = 0 let subscriptionErrors = 0 let subscriptionSuccesses = 0 // Monkey-patch console.error to intercept accountSubscribe errors const originalError = console.error console.error = function(...args) { const message = args.join(' ') if (message.includes('accountSubscribe')) { subscriptionAttempts++ if (message.includes('error')) { subscriptionErrors++ // Parse error details if (message.includes('-32601')) { console.log(`āŒ Subscription error ${subscriptionErrors}: Method not found`) } else if (message.includes('429')) { console.log(`āš ļø Subscription error ${subscriptionErrors}: Rate limit (429)`) } else { console.log(`āŒ Subscription error ${subscriptionErrors}: ${message.substring(0, 100)}`) } } } // Still call original for full logging originalError.apply(console, args) } // Initialize Drift client console.log('\nšŸš€ Initializing Drift SDK...') console.log(' (Watch for accountSubscribe attempts and errors)') console.log('') const startTime = Date.now() try { const driftClient = new DriftClient({ connection, wallet: { publicKey: keypair.publicKey, signTransaction: async (tx) => { tx.partialSign(keypair) return tx }, signAllTransactions: async (txs) => { txs.forEach(tx => tx.partialSign(keypair)) return txs } }, programID: process.env.DRIFT_PROGRAM_ID || 'dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH', env: 'mainnet-beta', }) console.log('ā³ Subscribing to Drift account updates...') await driftClient.subscribe() const initTime = Date.now() - startTime console.log(`\nāœ… Drift SDK initialized successfully (${initTime}ms)`) console.log('\nšŸ“Š Subscription Statistics:') console.log(` Total attempts: ${subscriptionAttempts}`) console.log(` Errors: ${subscriptionErrors}`) console.log(` Success rate: ${((1 - subscriptionErrors/subscriptionAttempts) * 100).toFixed(1)}%`) // Test account health console.log('\nšŸ„ Testing account health...') const user = driftClient.getUser() const equity = user.getTotalCollateral() console.log(` Total collateral: $${(equity.toNumber() / 1e6).toFixed(2)}`) // Try a simple operation console.log('\nšŸ” Testing position query...') const positions = user.getActivePerpPositions() console.log(` Active positions: ${positions.length}`) // Wait a bit to see if SDK stays stable console.log('\nā³ Waiting 10 seconds to test stability...') await new Promise(resolve => setTimeout(resolve, 10000)) // Test another operation console.log('šŸ” Testing second position query...') const positions2 = user.getActivePerpPositions() console.log(` Active positions: ${positions2.length}`) console.log('\nāœ… SDK appears stable after initialization') // Cleanup await driftClient.unsubscribe() console.log('āœ… Unsubscribed successfully') process.exit(0) } catch (error) { const initTime = Date.now() - startTime console.error(`\nāŒ Drift SDK initialization failed (${initTime}ms)`) console.error(` Error: ${error.message}`) console.log('\nšŸ“Š Subscription Statistics:') console.log(` Total attempts: ${subscriptionAttempts}`) console.log(` Errors: ${subscriptionErrors}`) if (subscriptionAttempts > 0) { console.log(` Error rate: ${(subscriptionErrors/subscriptionAttempts * 100).toFixed(1)}%`) } process.exit(1) }