PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-bin/src/commands/cmdPsbt

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

import * as fs from 'fs/promises';
import * as utxolib from '@bitgo/utxo-lib';

import { argToString, getNetworkOptionsDemand, readStringOptions } from '../../args';
import { Buffer } from 'buffer';

type InputArgs = {
  /** path to psbt file */
  path?: string;
  /** when set, create a new psbt */
  create?: boolean;
  /** network */
  network: utxolib.Network;
  /** expect empty psbt */
  expectEmpty?: boolean;
};
type OutputArgs = {
  /** edit the input file */
  edit: boolean;
  /** output path */
  out?: string;
};
export type WithPsbtOptions = InputArgs & OutputArgs;

export const withPsbtOptions = {
  ...readStringOptions,
  ...getNetworkOptionsDemand('bitcoin'),
  create: { type: 'boolean', default: false },
  edit: { type: 'boolean', default: false },
  out: { type: 'string' },
} as const;

export async function getOrCreatePsbt(args: InputArgs): Promise<utxolib.Psbt> {
  let psbt: string | undefined;
  try {
    psbt = await argToString({ path: args.path, stdin: false });
  } catch (e) {
    // check for ENOENT
    if ((e as NodeJS.ErrnoException).code !== 'ENOENT') {
      throw e;
    }
  }
  if (psbt) {
    if (args.expectEmpty) {
      throw new Error(`psbt is not empty (path=${args.path})`);
    }
    const buffer = utxolib.bitgo.toPsbtBuffer(psbt);
    return utxolib.Psbt.fromBuffer(buffer, { network: args.network });
  }
  if (args.create) {
    return new utxolib.Psbt({ network: args.network });
  }
  throw new Error(`missing psbt (path=${args.path})`);
}

export async function emitOutput(value: utxolib.Psbt | Buffer | string, args: InputArgs & OutputArgs): Promise<void> {
  if (value instanceof utxolib.Psbt) {
    value = value.toBase64();
  }

  if (value instanceof Buffer) {
    value = value.toString('hex');
  }

  if (args.edit || args.out) {
    if (args.edit && args.out) {
      throw new Error('cannot specify both edit and out');
    }
    const path = args.edit ? args.path : args.out;
    if (!path) {
      throw new Error('missing out path');
    }
    await fs.writeFile(path, value);
  } else {
    console.log(value);
  }
}

export async function withPsbt(
  args: InputArgs & OutputArgs,
  fn: (psbt: utxolib.Psbt) => Promise<utxolib.Psbt | Buffer>
): Promise<void> {
  const psbt = await getOrCreatePsbt(args);
  await emitOutput(await fn(psbt), args);
}

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


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