PHP WebShell
Текущая директория: /opt/BitGoJS/modules/abstract-utxo/src/transaction
Просмотр файла: fetchInputs.ts
import * as utxolib from '@bitgo/utxo-lib';
import { BitGoBase, IRequestTracer } from '@bitgo/sdk-core';
import { AbstractUtxoCoin, TransactionPrebuild } from '../abstractUtxoCoin';
/**
* Get the inputs for a psbt from a prebuild.
*/
export function getPsbtTxInputs(
psbtArg: string | utxolib.bitgo.UtxoPsbt,
network: utxolib.Network
): { address: string; value: bigint; valueString: string }[] {
const psbt = psbtArg instanceof utxolib.bitgo.UtxoPsbt ? psbtArg : utxolib.bitgo.createPsbtFromHex(psbtArg, network);
const txInputs = psbt.txInputs;
return psbt.data.inputs.map((input, index) => {
let address: string;
let value: bigint;
if (input.witnessUtxo) {
address = utxolib.address.fromOutputScript(input.witnessUtxo.script, network);
value = input.witnessUtxo.value;
} else if (input.nonWitnessUtxo) {
const tx = utxolib.bitgo.createTransactionFromBuffer<bigint>(input.nonWitnessUtxo, network, {
amountType: 'bigint',
});
const txId = (Buffer.from(txInputs[index].hash).reverse() as Buffer).toString('hex');
if (tx.getId() !== txId) {
throw new Error('input transaction hex does not match id');
}
const prevTxOutputIndex = txInputs[index].index;
address = utxolib.address.fromOutputScript(tx.outs[prevTxOutputIndex].script, network);
value = tx.outs[prevTxOutputIndex].value;
} else {
throw new Error('psbt input is missing both witnessUtxo and nonWitnessUtxo');
}
return { address, value, valueString: value.toString() };
});
}
/**
* Get the inputs for a transaction from a prebuild.
*/
export async function getTxInputs<TNumber extends number | bigint>(params: {
txPrebuild: TransactionPrebuild<TNumber>;
bitgo: BitGoBase;
coin: AbstractUtxoCoin;
disableNetworking: boolean;
reqId?: IRequestTracer;
}): Promise<{ address: string; value: TNumber; valueString: string }[]> {
const { txPrebuild, bitgo, coin, disableNetworking, reqId } = params;
if (!txPrebuild.txHex) {
throw new Error(`txPrebuild.txHex not set`);
}
const transaction = coin.createTransactionFromHex<TNumber>(txPrebuild.txHex);
const transactionCache = {};
return await Promise.all(
transaction.ins.map(async (currentInput): Promise<{ address: string; value: TNumber; valueString: string }> => {
const transactionId = (Buffer.from(currentInput.hash).reverse() as Buffer).toString('hex');
const txHex = txPrebuild.txInfo?.txHexes?.[transactionId];
if (txHex) {
const localTx = coin.createTransactionFromHex<TNumber>(txHex);
if (localTx.getId() !== transactionId) {
throw new Error('input transaction hex does not match id');
}
const currentOutput = localTx.outs[currentInput.index];
const address = utxolib.address.fromOutputScript(currentOutput.script, coin.network);
return {
address,
value: currentOutput.value,
valueString: currentOutput.value.toString(),
};
} else if (!transactionCache[transactionId]) {
if (disableNetworking) {
throw new Error('attempting to retrieve transaction details externally with networking disabled');
}
if (reqId) {
bitgo.setRequestTracer(reqId);
}
transactionCache[transactionId] = await bitgo.get(coin.url(`/public/tx/${transactionId}`)).result();
}
const transactionDetails = transactionCache[transactionId];
return transactionDetails.outputs[currentInput.index];
})
);
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!