diff --git a/src/types/transactions.ts b/src/types/transactions.ts index 7744c19..646dc01 100644 --- a/src/types/transactions.ts +++ b/src/types/transactions.ts @@ -78,4 +78,6 @@ export interface TransformedTransaction { redeemer_count: number; /** True if contract script passed validation */ valid_contract: boolean; + /** The CBOR representation of the transaction */ + cbor?: string; } diff --git a/src/utils/transaction.ts b/src/utils/transaction.ts index 80d4108..48e96b6 100644 --- a/src/utils/transaction.ts +++ b/src/utils/transaction.ts @@ -1,10 +1,13 @@ import { BlockfrostServerError, Responses } from '@blockfrost/blockfrost-js'; -import * as Types from '../types/transactions.js'; -import { TxIdsToTransactionsResponse } from '../types/transactions.js'; import { blockfrostAPI } from '../utils/blockfrost-api.js'; import { getAssetData, transformAsset } from './asset.js'; import { assetMetadataLimiter, limiter } from './limiter.js'; import { logger } from './logger.js'; +import { + TxIdsToTransactionsResponse, + TransformedTransaction, + TransformedTransactionUtxo, +} from '../types/transactions.js'; export const sortTransactionsCmp = < T extends { @@ -39,12 +42,12 @@ export const txIdsToTransactions = async ( address: string; txIds: string[]; }[], -): Promise => { +): Promise => { if (txIdsPerAddress.length === 0) { return []; } - const promises: Promise[] = []; + const promises: Promise[] = []; for (const item of txIdsPerAddress) { for (const txId of item.txIds) { @@ -55,7 +58,7 @@ export const txIdsToTransactions = async ( // eslint-disable-next-line unicorn/no-await-expression-member const result = (await Promise.all(promises)).filter( index => index !== undefined, - ) as Types.TxIdsToTransactionsResponse[]; + ) as TxIdsToTransactionsResponse[]; const sortedTxs = result.sort((a, b) => sortTransactionsCmp(a.txData, b.txData)); @@ -94,7 +97,7 @@ export const getTransactionsWithDetails = async ( export const transformTransactionData = async ( tx: Responses['tx_content'], -): Promise => { +): Promise => { const assetsMetadata = await Promise.all( tx.output_amount.map(asset => assetMetadataLimiter.add(() => getAssetData(asset.unit), { throwOnTimeout: true }), @@ -107,12 +110,21 @@ export const transformTransactionData = async ( }; }; -export const fetchTransactionData = (txId: string) => - limiter(() => blockfrostAPI.txs(txId)).then(data => transformTransactionData(data)); +export const fetchTransactionData = async ( + txId: string, + cbor?: boolean, +): Promise => { + const [txData, txCbor] = await Promise.all([ + limiter(() => blockfrostAPI.txs(txId)).then(data => transformTransactionData(data)), + cbor ? limiter(() => blockfrostAPI.txsCbor(txId)) : undefined, + ]); + + return { ...txData, ...txCbor }; +}; export const transformTransactionUtxo = async ( utxo: Responses['tx_content_utxo'], -): Promise => { +): Promise => { const assets = new Set(); for (const input of utxo.inputs) {