UNPKG

chronik-cache

Version:

A cache helper for chronik-client

55 lines (45 loc) 1.92 kB
// Copyright (c) 2024 The Bitcoin developers // Distributed under the MIT software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. interface TxBlock { height: number; timestamp?: number; } interface Transaction { txid?: string; block?: TxBlock; timestamp?: number; timeFirstSeen: number; } /** * A helper function to sort transaction IDs based on corresponding transaction data */ export default function sortTxIds(txIds: string[], getTx: (txId: string) => Transaction): string[] { return txIds.sort((a, b) => { const txA = getTx(a); const txB = getTx(b); const txidA = txA?.txid || a; const txidB = txB?.txid || b; // 检查区块高度是否存在 const hasHeightA = txA.block && typeof txA.block.height !== 'undefined'; const hasHeightB = txB.block && typeof txB.block.height !== 'undefined'; // 如果两个交易都没有区块高度,按 timeFirstSeen 倒序,再按 txid 反字母序 if (!hasHeightA && !hasHeightB) { const timeFirstSeenDiff = txB.timeFirstSeen - txA.timeFirstSeen; if (timeFirstSeenDiff !== 0) { return timeFirstSeenDiff; } return txidB.localeCompare(txidA); } // 没有区块高度的排在前面 if (!hasHeightA) return -1; if (!hasHeightB) return 1; // 都有区块高度,先比较高度 const heightDiff = txB.block!.height - txA.block!.height; if (heightDiff !== 0) return heightDiff; // 同一区块内,按 timeFirstSeen 正序,再按 txid 反字母序 const timeFirstSeenDiff = txA.timeFirstSeen - txB.timeFirstSeen; if (timeFirstSeenDiff !== 0) return timeFirstSeenDiff; return txidB.localeCompare(txidA); }); }