PHP WebShell
Текущая директория: /opt/BitGoJS/modules/blockapis/src
Просмотр файла: UtxoApi.ts
import * as utxolib from '@bitgo/utxo-lib';
import { mapSeries } from './BaseHttpClient';
import { TransactionApi } from './TransactionApi';
export type OutputSpend =
| {
txid: string;
vin: number;
}
| { txid: undefined; vin: undefined };
export type TransactionIO = {
inputs: { address: string }[];
outputs: { address: string }[];
};
/**
* Methods specific to UTXO-based blockchains
*/
export interface UtxoApi extends TransactionApi {
/**
* @param txid
* @return transaction inputs
*/
getTransactionInputs(txid: string): Promise<utxolib.bitgo.Unspent[]>;
/**
* @param txid
* @return transaction input and output addresses
*/
getTransactionIO(txid: string): Promise<TransactionIO>;
/**
* @param txid
*/
getTransactionSpends(txid: string): Promise<OutputSpend[]>;
/**
* @param address
* @return unspent outputs for addresses
*/
getUnspentsForAddresses(address: string[]): Promise<utxolib.bitgo.Unspent[]>;
}
/**
* Helper to efficiently fetch output data.
* Typical we can query output data for all outputs of a transaction, so we first fetch all
* the output list via `f` and then pick the output data from the result.
* @param outpoints
* @param f - maps txid to a list of outputs with type TOut
* @return list of TOut corresponding to outputs
*/
async function mapInputs<TOut>(
outpoints: utxolib.bitgo.TxOutPoint[],
f: (txid: string) => Promise<TOut[]>
): Promise<TOut[]> {
const txids = [...new Set(outpoints.map((i) => i.txid))];
const txMap = new Map(await mapSeries(txids, async (txid) => [txid, await f(txid)]));
return outpoints.map((i) => {
const arr = txMap.get(i.txid);
if (arr) {
if (i.vout in arr) {
return arr[i.vout];
}
throw new Error(`could not find output ${i.vout}`);
}
throw new Error(`could not find tx ${i.txid}`);
});
}
/**
* Fetch transaction inputs from transaction input list
* @param ins
* @param api
* @param network
*/
export async function fetchInputs(
ins: utxolib.TxInput[] | utxolib.bitgo.TxOutPoint[],
api: UtxoApi,
network: utxolib.Network
): Promise<utxolib.TxOutput[]> {
return mapInputs(
ins.map((i: utxolib.TxInput | utxolib.bitgo.TxOutPoint) => {
if ('txid' in i) {
return i;
}
return utxolib.bitgo.getOutputIdForInput(i);
}),
async (txid) => utxolib.bitgo.createTransactionFromHex(await api.getTransactionHex(txid), network).outs
);
}
/**
* Fetch transaction spend status outpoints.
*/
export async function fetchTransactionSpends(
outpoints: utxolib.bitgo.TxOutPoint[],
api: UtxoApi
): Promise<OutputSpend[]> {
return mapInputs(outpoints, async (txid) => await api.getTransactionSpends(txid));
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!