PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-core/src/descriptor/psbt

Просмотр файла: parse.ts

import { Descriptor } from '@bitgo/wasm-miniscript';
import * as utxolib from '@bitgo/utxo-lib';

import { DescriptorMap } from '../DescriptorMap';
import { getVirtualSize } from '../VirtualSize';

import { findDescriptorForInput, findDescriptorForOutput } from './findDescriptors';
import { assertSatisfiable } from './assertSatisfiable';

export type ScriptId = { descriptor: Descriptor; index: number | undefined };

export type ParsedInput = {
  address: string;
  value: bigint;
  scriptId: ScriptId;
};

export type ParsedOutput = {
  address?: string;
  script: Buffer;
  value: bigint;
  scriptId?: ScriptId;
};

export type ParsedDescriptorTransaction = {
  inputs: ParsedInput[];
  outputs: ParsedOutput[];
  spendAmount: bigint;
  minerFee: bigint;
  virtualSize: number;
};

function sum(...values: bigint[]): bigint {
  return values.reduce((a, b) => a + b, BigInt(0));
}

export function parse(
  psbt: utxolib.Psbt,
  descriptorMap: DescriptorMap,
  network: utxolib.Network
): ParsedDescriptorTransaction {
  const inputs = psbt.data.inputs.map((input, inputIndex): ParsedInput => {
    if (!input.witnessUtxo) {
      throw new Error('invalid input: no witnessUtxo');
    }
    if (!input.witnessUtxo.value) {
      throw new Error('invalid input: no value');
    }
    const scriptId = findDescriptorForInput(input, descriptorMap);
    if (!scriptId) {
      throw new Error('invalid input: no descriptor found');
    }
    assertSatisfiable(psbt, inputIndex, scriptId.descriptor);
    return {
      address: utxolib.address.fromOutputScript(input.witnessUtxo.script, network),
      value: input.witnessUtxo.value,
      scriptId,
    };
  });
  const outputs = psbt.txOutputs.map((output, i): ParsedOutput => {
    if (output.value === undefined) {
      throw new Error('invalid output: no value');
    }
    const scriptId = findDescriptorForOutput(output.script, psbt.data.outputs[i], descriptorMap);
    return {
      address: output.address,
      script: output.script,
      value: output.value,
      scriptId,
    };
  });
  const inputAmount = sum(...inputs.map((input) => input.value));
  const outputSum = sum(...outputs.map((output) => output.value));
  const spendAmount = sum(...outputs.filter((output) => !output.scriptId).map((output) => output.value));
  const minerFee = inputAmount - outputSum;
  return {
    inputs,
    outputs,
    spendAmount,
    minerFee,
    virtualSize: getVirtualSize({ inputs: inputs.map((i) => i.scriptId.descriptor), outputs }),
  };
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!