✅ Restore working dashboard and TradingView analysis
- Fixed layout conflicts by removing minimal layout.tsx in favor of complete layout.js - Restored original AI Analysis page with full TradingView integration - Connected enhanced screenshot API to real TradingView automation service - Fixed screenshot gallery to handle both string and object formats - Added image serving API route for screenshot display - Resolved hydration mismatch issues with suppressHydrationWarning - All navigation pages working (Analysis, Trading, Automation, Settings) - TradingView automation successfully capturing screenshots from AI and DIY layouts - Docker Compose v2 compatibility ensured Working features: - Homepage with hero section and status cards - Navigation menu with Trading Bot branding - Real TradingView screenshot capture - AI-powered chart analysis - Multi-layout support (AI + DIY module) - Screenshot gallery with image serving - API endpoints for balance, status, screenshots, trading
This commit is contained in:
161
test-drift-account-comprehensive.js
Normal file
161
test-drift-account-comprehensive.js
Normal file
@@ -0,0 +1,161 @@
|
||||
#!/usr/bin/env node
|
||||
require('dotenv').config();
|
||||
const { Connection, Keypair, PublicKey } = require('@solana/web3.js');
|
||||
|
||||
async function testDriftAccount() {
|
||||
console.log('🔍 Comprehensive Drift Account Analysis\n');
|
||||
|
||||
try {
|
||||
// Setup
|
||||
const secret = process.env.SOLANA_PRIVATE_KEY;
|
||||
const keypair = Keypair.fromSecretKey(Buffer.from(JSON.parse(secret)));
|
||||
const connection = new Connection(process.env.SOLANA_RPC_URL || 'https://api.mainnet-beta.solana.com', 'confirmed');
|
||||
|
||||
console.log('🔑 Wallet public key:', keypair.publicKey.toString());
|
||||
|
||||
// Check SOL balance
|
||||
const balance = await connection.getBalance(keypair.publicKey);
|
||||
console.log('💰 SOL balance:', (balance / 1e9).toFixed(6), 'SOL\n');
|
||||
|
||||
// Test multiple PDA calculation methods
|
||||
const DRIFT_PROGRAM_ID = 'dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH';
|
||||
|
||||
console.log('📊 Testing different PDA calculation methods:\n');
|
||||
|
||||
// Method 1: Manual calculation (what check-drift-account.js uses)
|
||||
console.log('1️⃣ Manual PDA calculation:');
|
||||
const [userAccountPDA1] = await PublicKey.findProgramAddress(
|
||||
[
|
||||
Buffer.from('user'),
|
||||
keypair.publicKey.toBuffer(),
|
||||
Buffer.from([0]) // subAccountId = 0
|
||||
],
|
||||
new PublicKey(DRIFT_PROGRAM_ID)
|
||||
);
|
||||
console.log(' PDA:', userAccountPDA1.toString());
|
||||
|
||||
const accountInfo1 = await connection.getAccountInfo(userAccountPDA1);
|
||||
console.log(' Exists:', !!accountInfo1);
|
||||
if (accountInfo1) {
|
||||
console.log(' Data length:', accountInfo1.data.length);
|
||||
console.log(' Owner:', accountInfo1.owner.toString());
|
||||
}
|
||||
|
||||
// Method 2: Try using the Drift SDK's getUserAccountPublicKey function
|
||||
console.log('\n2️⃣ SDK PDA calculation:');
|
||||
try {
|
||||
// Import the getUserAccountPublicKey function from Drift SDK
|
||||
const { getUserAccountPublicKey } = require('@drift-labs/sdk');
|
||||
|
||||
const userAccountPDA2 = await getUserAccountPublicKey(
|
||||
new PublicKey(DRIFT_PROGRAM_ID),
|
||||
keypair.publicKey,
|
||||
0
|
||||
);
|
||||
console.log(' PDA:', userAccountPDA2.toString());
|
||||
console.log(' Same as manual?', userAccountPDA1.equals(userAccountPDA2));
|
||||
|
||||
const accountInfo2 = await connection.getAccountInfo(userAccountPDA2);
|
||||
console.log(' Exists:', !!accountInfo2);
|
||||
if (accountInfo2) {
|
||||
console.log(' Data length:', accountInfo2.data.length);
|
||||
console.log(' Owner:', accountInfo2.owner.toString());
|
||||
}
|
||||
} catch (sdkError) {
|
||||
console.log(' ❌ SDK method failed:', sdkError.message);
|
||||
}
|
||||
|
||||
// Method 3: Try with different subaccount IDs
|
||||
console.log('\n3️⃣ Testing multiple subaccount IDs:');
|
||||
for (let subAccountId = 0; subAccountId < 5; subAccountId++) {
|
||||
const [userAccountPDA] = await PublicKey.findProgramAddress(
|
||||
[
|
||||
Buffer.from('user'),
|
||||
keypair.publicKey.toBuffer(),
|
||||
Buffer.from([subAccountId])
|
||||
],
|
||||
new PublicKey(DRIFT_PROGRAM_ID)
|
||||
);
|
||||
|
||||
const accountInfo = await connection.getAccountInfo(userAccountPDA);
|
||||
console.log(` SubAccount ${subAccountId}: ${userAccountPDA.toString()} - ${accountInfo ? '✅ EXISTS' : '❌ NOT FOUND'}`);
|
||||
}
|
||||
|
||||
// Method 4: Try searching for any user accounts by scanning program accounts
|
||||
console.log('\n4️⃣ Scanning for any Drift user accounts by this authority:');
|
||||
try {
|
||||
const programAccounts = await connection.getProgramAccounts(
|
||||
new PublicKey(DRIFT_PROGRAM_ID),
|
||||
{
|
||||
filters: [
|
||||
{
|
||||
memcmp: {
|
||||
offset: 8, // Skip discriminator
|
||||
bytes: keypair.publicKey.toBase58()
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
);
|
||||
|
||||
console.log(` Found ${programAccounts.length} account(s) owned by this program with this authority`);
|
||||
|
||||
programAccounts.forEach((account, index) => {
|
||||
console.log(` Account ${index + 1}: ${account.pubkey.toString()}`);
|
||||
console.log(` Data length: ${account.account.data.length}`);
|
||||
console.log(` Lamports: ${account.account.lamports}`);
|
||||
});
|
||||
|
||||
} catch (scanError) {
|
||||
console.log(' ❌ Scan failed:', scanError.message);
|
||||
}
|
||||
|
||||
// Method 5: Test API endpoints
|
||||
console.log('\n5️⃣ Testing API endpoints:');
|
||||
try {
|
||||
// Test login
|
||||
const loginResponse = await fetch('http://localhost:3000/api/drift/login', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
const loginData = await loginResponse.json();
|
||||
console.log(' Login API result:', JSON.stringify(loginData, null, 2));
|
||||
|
||||
// Test balance
|
||||
const balanceResponse = await fetch('http://localhost:3000/api/drift/balance');
|
||||
const balanceData = await balanceResponse.json();
|
||||
console.log(' Balance API result:', JSON.stringify(balanceData, null, 2));
|
||||
|
||||
// Test positions
|
||||
const positionsResponse = await fetch('http://localhost:3000/api/drift/positions');
|
||||
const positionsData = await positionsResponse.json();
|
||||
console.log(' Positions API result:', JSON.stringify(positionsData, null, 2));
|
||||
|
||||
} catch (apiError) {
|
||||
console.log(' ❌ API test failed:', apiError.message);
|
||||
}
|
||||
|
||||
// Method 6: Check actual Drift program state
|
||||
console.log('\n6️⃣ Checking Drift program state:');
|
||||
try {
|
||||
const programInfo = await connection.getAccountInfo(new PublicKey(DRIFT_PROGRAM_ID));
|
||||
console.log(' Program exists:', !!programInfo);
|
||||
console.log(' Program owner:', programInfo?.owner.toString());
|
||||
console.log(' Program executable:', programInfo?.executable);
|
||||
} catch (programError) {
|
||||
console.log(' ❌ Program check failed:', programError.message);
|
||||
}
|
||||
|
||||
console.log('\n📋 Summary:');
|
||||
console.log(' - This wallet has sufficient SOL for transactions');
|
||||
console.log(' - The Drift program is accessible');
|
||||
console.log(' - Account existence discrepancy between manual check and SDK login');
|
||||
console.log(' - Need to investigate why the SDK reports account exists but manual check fails');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Test failed:', error.message);
|
||||
console.error('Stack:', error.stack);
|
||||
}
|
||||
}
|
||||
|
||||
testDriftAccount().catch(console.error);
|
||||
Reference in New Issue
Block a user