PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-core/src/descriptor/psbt
Просмотр файла: createPsbt.ts
import * as utxolib from '@bitgo/utxo-lib';
import { Descriptor } from '@bitgo/wasm-miniscript';
import { DerivedDescriptorWalletOutput, WithOptDescriptor } from '../Output';
import { Output } from '../../Output';
import { toUtxoPsbt, toWrappedPsbt } from './wrap';
import { assertSatisfiable } from './assertSatisfiable';
/**
* Non-Final (Replaceable)
* Reference: https://github.com/bitcoin/bitcoin/blob/v25.1/src/rpc/rawtransaction_util.cpp#L49
* */
export const MAX_BIP125_RBF_SEQUENCE = 0xffffffff - 2;
function updateInputsWithDescriptors(psbt: utxolib.bitgo.UtxoPsbt, descriptors: Descriptor[]) {
if (psbt.txInputs.length !== descriptors.length) {
throw new Error(`Input count mismatch (psbt=${psbt.txInputs.length}, descriptors=${descriptors.length})`);
}
const wrappedPsbt = toWrappedPsbt(psbt);
for (const [inputIndex, descriptor] of descriptors.entries()) {
assertSatisfiable(psbt, inputIndex, descriptor);
wrappedPsbt.updateInputWithDescriptor(inputIndex, descriptor);
}
const unwrappedPsbt = toUtxoPsbt(wrappedPsbt, psbt.network);
for (const inputIndex in psbt.txInputs) {
psbt.data.inputs[inputIndex] = unwrappedPsbt.data.inputs[inputIndex];
}
}
function updateOutputsWithDescriptors(psbt: utxolib.bitgo.UtxoPsbt, descriptors: WithOptDescriptor<Output>[]) {
const wrappedPsbt = toWrappedPsbt(psbt);
for (const [outputIndex, { descriptor }] of descriptors.entries()) {
if (descriptor) {
wrappedPsbt.updateOutputWithDescriptor(outputIndex, descriptor);
}
}
const unwrappedPsbt = toUtxoPsbt(wrappedPsbt, psbt.network);
for (const outputIndex in psbt.txOutputs) {
psbt.data.outputs[outputIndex] = unwrappedPsbt.data.outputs[outputIndex];
}
}
export type PsbtParams = {
network: utxolib.Network;
version?: number;
locktime?: number;
sequence?: number;
};
export type DerivedDescriptorTransactionInput = DerivedDescriptorWalletOutput & {
sequence?: number;
};
export function createPsbt(
params: PsbtParams,
inputs: DerivedDescriptorTransactionInput[],
outputs: WithOptDescriptor<Output>[]
): utxolib.bitgo.UtxoPsbt {
const psbt = utxolib.bitgo.UtxoPsbt.createPsbt({ network: params.network });
psbt.setVersion(params.version ?? 2);
psbt.setLocktime(params.locktime ?? 0);
psbt.addInputs(inputs.map((i) => ({ ...i, sequence: i.sequence ?? params.sequence ?? MAX_BIP125_RBF_SEQUENCE })));
psbt.addOutputs(outputs);
updateInputsWithDescriptors(
psbt,
inputs.map((i) => i.descriptor)
);
updateOutputsWithDescriptors(psbt, outputs);
return psbt;
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!