Л
Логово ДАО
@Logovo_DAO808 подп.
1.5Kпросмотров
18 июля 2025 г.
📷 ФотоScore: 1.6K
Как собирать ончейн статистику. Зафиналим эклипс говнокодом. 🌟 В сегодняшнем "уроке/гайде" расскажу как собрать статистику как у Вишни в посте. 😆 Базово ставим solana/web3.js, ведь если ты не знал, то эклипс это SVM, а значит для работы с ним нам надо ток при создании подключения поменять солановый rpc на эклипсовый: const RPC_URL = 'https://eclipse.helius-rpc.com/'; const connection = new Connection(RPC_URL); Сразу пару переменных себе создадим, что и откуда мы будем читать: const ADDRESS = "soshm2XkL4bYD7U39DKpthqnpN6kkhCG5BGQCauRb5f"; // отсюда шли клеймы OG const TOKEN_MINT = "GnBAskb2SQjrLgpTjtgatz4hEugUsYV7XrWU1idV3oqW"; // &#036;ES const MIN_AMOUNT = 20000; // от скольки токенов Теперь надо вытащить с адреса все транзакции(живут они ~5 дней, более старые не вытаскиваются) и т.к. их на адресе может быть дохуя - используем пагинацию(в школе по матеше у меня была 3, тут аишка помогла), так же учитываем ограничения вызываемых функций: // тут 1к пагинация из-за ограничений getSignaturesForAddress while (hasMore) { const signatures = await connection.getSignaturesForAddress( new PublicKey(address), { before, limit: 1000 } ); if (signatures.length === 0) break; allSignatures.push(...signatures.map(sig => sig.signature)); before = signatures[signatures.length - 1].signature; hasMore = signatures.length === 1000; } return allSignatures; } Теперь вытащим данные транзакций, так же не забывая про ограничения: //данные транзакций, запихуем чанками по 100, ограничение getParsedTransactions async function fetchTransactions(signatures: string[]) { const txs: (ParsedTransactionWithMeta | null)[] = []; for (let i = 0; i < signatures.length; i += 100) { const chunk = signatures.slice(i, i + 100); const chunkTxs = await connection.getParsedTransactions(chunk, { maxSupportedTransactionVersion: 0 }); txs.push(...chunkTxs); await new Promise(res => setTimeout(res, 50)); } return txs; } Отфильтруем нужные нам транзакции(дата = дата клейма, сумма >20k(og аллока)): const fromDate = new Date(2025, 6, 16); // 16 июля 2025 fromDate.setHours(0, 0, 0, 0); const filteredTxs: { signature: string, owner: string | undefined, amount: number, blockTime: string }[] = []; transactions.forEach((tx) => { if (!tx || !tx.meta || !tx.blockTime) return; const txDate = new Date(tx.blockTime 1000); if (txDate < fromDate) return; const signature = tx.transaction.signatures[0]; const blockTime = tx.blockTime ? new Date(tx.blockTime 1000).toLocaleString() : 'нет данных'; tx.meta.postTokenBalances?.forEach((post) => { if (post.mint !== TOKEN_MINT) return; const pre = tx.meta?.preTokenBalances?.find(preBal => preBal.accountIndex === post.accountIndex); const decimals = post.uiTokenAmount.decimals; const preAmount = pre ? BigInt(pre.uiTokenAmount.amount) : 0n; const postAmount = BigInt(post.uiTokenAmount.amount); const diff = postAmount - preAmount; const minAmountRaw = BigInt(Math.floor(MIN_AMOUNT * 10 decimals)); if (diff >= minAmountRaw) { const owner = post.owner; const amount = Number(diff) / 10 decimals; filteredTxs.push({ signature, owner, amount, blockTime }); } }); }); Вывод и запись в файл: const resultLines: string[] = []; filteredTxs.forEach((item, idx) => { resultLines.push(&#036;{item.owner ?? 'нет owner'} &#036;{item.amount} &#036;ES); console.log( #&#036;{idx + 1}:, &#092;n txid: &#036;{item.signature}, &#092;n кош: &#036;{item.owner ?? 'нет owner'}, &#092;n Токенов получено: &#036;{item.amount} &#036;ES, &#092;n Время: &#036;{item.blockTime}, ); }); await fs.writeFile('result.txt', resultLines.join('&#092;n'), 'utf-8'); Ну чуть наговнокодил. ⌨️ Кто знает как сделать лучше/есть вопросы - в комменты! Если нужен полный код кому-то - отпиш
1.5K
просмотров
4000
символов
Да
эмодзи
Да
медиа

Другие посты @Logovo_DAO

Все посты канала →
Как собирать ончейн статистику. Зафиналим эклипс говнокодом. — @Logovo_DAO | PostSniper