Skip to main content

Library Examples

Practical examples using solana-privacy-scanner-core.

Wallet Analysis

import { 
RPCClient,
collectWalletData,
normalizeWalletData,
generateReport,
createDefaultLabelProvider
} from 'solana-privacy-scanner-core';

const rpc = new RPCClient();
const labels = createDefaultLabelProvider();

const raw = await collectWalletData(rpc, 'WALLET_ADDRESS', {
maxSignatures: 100,
includeTokenAccounts: true
});

const context = normalizeWalletData(raw, labels);
const report = generateReport(context);

console.log(`Risk: ${report.overallRisk}`);
console.log(`Signals: ${report.signals.length}`);

Transaction Analysis

const raw = await collectTransactionData(rpc, 'SIGNATURE');
const context = normalizeTransactionData(raw, labels);
const report = generateReport(context);

// Check for specific signals
const hasFeePayerReuse = report.signals.some(
s => s.id === 'fee-payer-reuse'
);

Program Analysis

const raw = await collectProgramData(rpc, 'PROGRAM_ID', {
maxTransactions: 50
});

const context = normalizeProgramData(raw, labels);
const report = generateReport(context);

Batch Processing

async function scanMultipleWallets(addresses: string[]) {
const rpc = new RPCClient();
const labels = createDefaultLabelProvider();
const results = [];

for (const address of addresses) {
const raw = await collectWalletData(rpc, address);
const context = normalizeWalletData(raw, labels);
const report = generateReport(context);

results.push({
address,
risk: report.overallRisk,
score: report.summary.privacyScore,
signals: report.signals.length
});

// Rate limiting handled by RPCClient
await new Promise(resolve => setTimeout(resolve, 200));
}

return results;
}

Risk-Based Logic

const report = await analyzeWallet(address);

switch (report.overallRisk) {
case 'HIGH':
console.warn('⚠️ High risk - manual review required');
notifyAdmin(address, report);
break;

case 'MEDIUM':
console.log('⚠️ Medium risk - proceed with caution');
break;

case 'LOW':
console.log('✓ Low risk - proceed');
break;
}

Filtering Signals

// Get only HIGH severity signals
const highRiskSignals = report.signals.filter(
s => s.severity === 'HIGH'
);

// Check for CEX interactions
const hasCEXInteraction = report.knownEntities.some(
e => e.type === 'exchange'
);

// Get all fee payer reuse signals
const feePayerIssues = report.signals.filter(
s => s.id === 'fee-payer-reuse'
);

Custom RPC Config

const rpc = new RPCClient({
rpcUrl: process.env.QUICKNODE_RPC_URL,
maxRetries: 5,
requestsPerSecond: 10
});

Export Reports

import { writeFileSync } from 'fs';

const report = await analyzeWallet(address);

// Save as JSON
writeFileSync(
`reports/${address}.json`,
JSON.stringify(report, null, 2)
);

// Save as CSV
const csv = report.signals.map(s =>
`${s.name},${s.severity},${s.confidence}`
).join('\n');

writeFileSync(`reports/${address}.csv`, csv);

Next Steps