Add backend endpoint to fetch prevouts
This commit is contained in:
@@ -12,7 +12,7 @@ import backendInfo from '../backend-info';
|
||||
import transactionUtils from '../transaction-utils';
|
||||
import { IEsploraApi } from './esplora-api.interface';
|
||||
import loadingIndicators from '../loading-indicators';
|
||||
import { TransactionExtended } from '../../mempool.interfaces';
|
||||
import { MempoolTransactionExtended, TransactionExtended } from '../../mempool.interfaces';
|
||||
import logger from '../../logger';
|
||||
import blocks from '../blocks';
|
||||
import bitcoinClient from './bitcoin-client';
|
||||
@@ -49,6 +49,7 @@ class BitcoinRoutes {
|
||||
.post(config.MEMPOOL.API_URL_PREFIX + 'psbt/addparents', this.postPsbtCompletion)
|
||||
.get(config.MEMPOOL.API_URL_PREFIX + 'blocks-bulk/:from', this.getBlocksByBulk.bind(this))
|
||||
.get(config.MEMPOOL.API_URL_PREFIX + 'blocks-bulk/:from/:to', this.getBlocksByBulk.bind(this))
|
||||
.post(config.MEMPOOL.API_URL_PREFIX + 'prevouts', this.$getPrevouts)
|
||||
// Temporarily add txs/package endpoint for all backends until esplora supports it
|
||||
.post(config.MEMPOOL.API_URL_PREFIX + 'txs/package', this.$submitPackage)
|
||||
;
|
||||
@@ -824,6 +825,53 @@ class BitcoinRoutes {
|
||||
}
|
||||
}
|
||||
|
||||
private async $getPrevouts(req: Request, res: Response) {
|
||||
try {
|
||||
const outpoints = req.body;
|
||||
if (!Array.isArray(outpoints) || outpoints.some((item) => !/^[a-fA-F0-9]{64}$/.test(item.txid) || typeof item.vout !== 'number')) {
|
||||
return res.status(400).json({ error: 'Invalid input format' });
|
||||
}
|
||||
|
||||
if (outpoints.length > 100) {
|
||||
return res.status(400).json({ error: 'Too many prevouts requested' });
|
||||
}
|
||||
|
||||
const result = Array(outpoints.length).fill(null);
|
||||
const memPool = mempool.getMempool();
|
||||
|
||||
for (let i = 0; i < outpoints.length; i++) {
|
||||
const outpoint = outpoints[i];
|
||||
let prevout: IEsploraApi.Vout | null = null;
|
||||
let tx: MempoolTransactionExtended | null = null;
|
||||
|
||||
const mempoolTx = memPool[outpoint.txid];
|
||||
if (mempoolTx) {
|
||||
prevout = mempoolTx.vout[outpoint.vout];
|
||||
tx = mempoolTx;
|
||||
} else {
|
||||
const rawPrevout = await bitcoinClient.getTxOut(outpoint.txid, outpoint.vout, false);
|
||||
if (rawPrevout) {
|
||||
prevout = {
|
||||
value: Math.round(rawPrevout.value * 100000000),
|
||||
scriptpubkey: rawPrevout.scriptPubKey.hex,
|
||||
scriptpubkey_asm: rawPrevout.scriptPubKey.asm ? transactionUtils.convertScriptSigAsm(rawPrevout.scriptPubKey.hex) : '',
|
||||
scriptpubkey_type: transactionUtils.translateScriptPubKeyType(rawPrevout.scriptPubKey.type),
|
||||
scriptpubkey_address: rawPrevout.scriptPubKey && rawPrevout.scriptPubKey.address ? rawPrevout.scriptPubKey.address : '',
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
if (prevout) {
|
||||
result[i] = { prevout, tx };
|
||||
}
|
||||
}
|
||||
|
||||
res.json(result);
|
||||
|
||||
} catch (e) {
|
||||
handleError(req, res, 500, e instanceof Error ? e.message : e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default new BitcoinRoutes();
|
||||
|
||||
@@ -420,6 +420,29 @@ class TransactionUtils {
|
||||
|
||||
return { prioritized, deprioritized };
|
||||
}
|
||||
|
||||
// Copied from https://github.com/mempool/mempool/blob/14e49126c3ca8416a8d7ad134a95c5e090324d69/backend/src/api/bitcoin/bitcoin-api.ts#L324
|
||||
public translateScriptPubKeyType(outputType: string): string {
|
||||
const map = {
|
||||
'pubkey': 'p2pk',
|
||||
'pubkeyhash': 'p2pkh',
|
||||
'scripthash': 'p2sh',
|
||||
'witness_v0_keyhash': 'v0_p2wpkh',
|
||||
'witness_v0_scripthash': 'v0_p2wsh',
|
||||
'witness_v1_taproot': 'v1_p2tr',
|
||||
'nonstandard': 'nonstandard',
|
||||
'multisig': 'multisig',
|
||||
'anchor': 'anchor',
|
||||
'nulldata': 'op_return'
|
||||
};
|
||||
|
||||
if (map[outputType]) {
|
||||
return map[outputType];
|
||||
} else {
|
||||
return 'unknown';
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export default new TransactionUtils();
|
||||
|
||||
Reference in New Issue
Block a user