UNPKG

blockchain-api

Version:

API utilities for interacting with the Exatechl2 blockchain

129 lines (118 loc) 3.8 kB
import { FormattedBlock } from './utils'; import { EnhancedBlock } from '../../types'; import { parseBlockchainTimestamp } from '../../utils/formatters'; export interface ExportResult { content: string; filename: string; dataType: string; } /** * * @param {FormattedBlock} block * @returns {Object} */ export function formatBlockForJsonExport(block: FormattedBlock | EnhancedBlock): Record<string, any> { return { blockNumber: block.number, blockHash: block.hash || '', timestamp: parseBlockchainTimestamp(block.timestamp).toISOString(), status: block.status, transactions: block.txCount, size: block.size, gasUsed: block.gasUsed, gasLimit: block.gasLimit, validator: block.validator || '', parentHash: block.parentHash || '', rootHash: block.rootHash || '', extraData: block.extraData || '', baseFeePerGas: block.baseFee || '', l1BlockNumber: block.l1BlockNumber || null, logsBloom: block.logsBloom || '', difficulty: block.difficulty || '', mixHash: block.mixHash || '', nonce: block.nonce || '', sha3Uncles: block.sha3Uncles || '', totalDifficulty: block.totalDifficulty || '', sendCount: block.sendCount || '', sendRoot: block.sendRoot || '', stateRoot: block.stateRoot || '', receiptsRoot: block.receiptsRoot || '' }; } /** * * @returns {string} */ export function getBlockCsvHeaders(): string { return 'Block Number,Timestamp,Status,Transactions,Size,Gas Used,Gas Limit,Validator,Parent Hash,Root Hash,L1 Block Number,Logs Bloom,Difficulty,Mix Hash,Nonce,Sha3 Uncles,Total Difficulty,Send Count,Send Root,State Root,Receipts Root'; } /** * * @param {FormattedBlock} block * @returns {string} */ export function formatBlockForCsvExport(block: FormattedBlock | EnhancedBlock): string { const row = [ block.numberDecimal, parseBlockchainTimestamp(block.timestamp).toISOString(), block.status, block.txCount, block.size, block.gasUsed, block.gasLimit, block.validator || '', block.parentHash || '', block.rootHash || '', block.l1BlockNumber || '', block.logsBloom || '', block.difficulty || '', block.mixHash || '', block.nonce || '', block.sha3Uncles || '', block.totalDifficulty || '', block.sendCount || '', block.sendRoot || '', block.stateRoot || '', block.receiptsRoot || '' ]; return row.map(field => { if (field === null || field === undefined) return ''; const str = String(field); return str.includes(',') ? `"${str}"` : str; }).join(','); } /** * * @param {FormattedBlock} block * @param {string} format * @returns {ExportResult} */ export function formatBlockDataForExport(block: FormattedBlock | EnhancedBlock, format: 'json' | 'csv'): ExportResult { if (format === 'json') { const jsonData = formatBlockForJsonExport(block); if (block.transactions && Array.isArray(block.transactions)) { jsonData.transactionsPreview = block.transactions.slice(0, 5).map(tx => ({ hash: tx.hash, from: tx.from, to: tx.to, value: tx.value, status: tx.status })); } return { content: JSON.stringify(jsonData, null, 2), filename: `block-${block.numberDecimal}.json`, dataType: 'application/json' }; } else if (format === 'csv') { const headers = getBlockCsvHeaders(); const row = formatBlockForCsvExport(block); return { content: `${headers}\n${row}`, filename: `block-${block.numberDecimal}.csv`, dataType: 'text/csv' }; } else { throw new Error('Unsupported export format'); } }