"use strict"; /** Blockscout ERC-20 transfer parsing (shared by aggregator + indexer). */ Object.defineProperty(exports, "__esModule", { value: true }); exports.pickPrimaryTokenTransfer = pickPrimaryTokenTransfer; exports.parseAllTokenTransfers = parseAllTokenTransfers; exports.fetchTokenTransferItemsForTx = fetchTokenTransferItemsForTx; exports.pickPrimaryFromSummaries = pickPrimaryFromSummaries; exports.applyPrimaryTransferToLeaf = applyPrimaryTransferToLeaf; exports.fetchAllTokenTransfersForTx = fetchAllTokenTransfersForTx; exports.fetchPrimaryTokenTransferForTx = fetchPrimaryTokenTransferForTx; function parseItem(item) { const token = item.token?.address; const raw = item.total?.value ?? (item.value != null && item.value !== '' ? item.value : undefined); if (!token || raw === undefined) return null; const value = BigInt(raw); if (value === 0n) return null; const decimals = parseInt(item.token?.decimals || item.total?.decimals || '18', 10); return { token, tokenSymbol: item.token?.symbol || '', tokenDecimals: Number.isFinite(decimals) ? decimals : 18, from: item.from?.hash || '', to: item.to?.hash || '', value, logIndex: item.log_index ?? 0, }; } /** Largest ERC-20 transfer in a tx (legacy primary payment). */ function pickPrimaryTokenTransfer(items) { let best = null; for (const item of items) { const summary = parseItem(item); if (!summary) continue; if (!best || summary.value > best.value) best = summary; } return best; } /** All non-zero ERC-20 transfers in a tx. */ function parseAllTokenTransfers(items) { const out = []; for (const item of items) { const summary = parseItem(item); if (summary) out.push(summary); } return out.sort((a, b) => (a.logIndex < b.logIndex ? -1 : a.logIndex > b.logIndex ? 1 : 0)); } async function fetchTokenTransferItemsForTx(apiBase, txHash) { const base = apiBase.replace(/\/$/, ''); const res = await fetch(`${base}/transactions/${txHash}/token-transfers`); if (!res.ok) return []; const body = (await res.json()); return body.items ?? []; } function pickPrimaryFromSummaries(items) { let best = null; for (const s of items) { if (!best || s.value > best.value) best = s; } return best; } function applyPrimaryTransferToLeaf(leaf, primary) { if (!primary) return; leaf.token = primary.token; leaf.tokenSymbol = primary.tokenSymbol; leaf.tokenDecimals = primary.tokenDecimals; leaf.tokenValue = primary.value.toString(); leaf.tokenLogIndex = primary.logIndex; if (leaf.nativeValueWei == null) leaf.nativeValueWei = String(leaf.value ?? '0'); } async function fetchAllTokenTransfersForTx(apiBase, txHash) { const items = await fetchTokenTransferItemsForTx(apiBase, txHash); return parseAllTokenTransfers(items); } async function fetchPrimaryTokenTransferForTx(apiBase, txHash) { const items = await fetchTokenTransferItemsForTx(apiBase, txHash); return pickPrimaryTokenTransfer(items); }