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:
mindesbunister
2025-07-14 14:21:19 +02:00
parent 9978760995
commit de45349baa
68 changed files with 2147 additions and 1813 deletions

View 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);