PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-lib/src/bitgo/litecoin

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

import { BufferReader, BufferWriter } from 'bitcoinjs-lib/src/bufferutils';

import { UtxoTransaction } from '../UtxoTransaction';
import { isLitecoin, Network, networks } from '../../networks';

export type LitecoinNetwork = typeof networks.litecoin | typeof networks.litecoinTest;

/**
 * We only care about reading a transaction that can have a potentially different advanced transaction flag,
 * but we dont need to write one.
 */
export class LitecoinTransaction<TNumber extends number | bigint = number> extends UtxoTransaction<TNumber> {
  static MWEB_PEGOUT_TX_FLAG = 0x08;

  constructor(network: Network, tx?: LitecoinTransaction<bigint | number>, amountType?: 'bigint' | 'number') {
    super(network, tx, amountType);

    if (!isLitecoin(network)) {
      throw new Error(`invalid network`);
    }
  }

  protected static newTransaction<TNumber extends number | bigint = number>(
    network: Network,
    transaction?: LitecoinTransaction<number | bigint>,
    amountType?: 'number' | 'bigint'
  ): LitecoinTransaction<TNumber> {
    return new LitecoinTransaction<TNumber>(network, transaction, amountType);
  }

  clone<TN2 extends bigint | number = TNumber>(amountType?: 'number' | 'bigint'): LitecoinTransaction<TN2> {
    return new LitecoinTransaction<TN2>(this.network, this, amountType);
  }

  static fromBuffer<TNumber extends number | bigint = number>(
    buffer: Buffer,
    noStrict: boolean,
    amountType: 'number' | 'bigint' = 'number',
    network?: LitecoinNetwork
  ): LitecoinTransaction<TNumber> {
    if (!network) {
      throw new Error(`must provide network`);
    }

    const bufferReader = new BufferReader(buffer);
    const txVersion = bufferReader.readInt32();
    const marker = bufferReader.readUInt8();
    const flag = bufferReader.readUInt8();

    if (
      marker === LitecoinTransaction.ADVANCED_TRANSACTION_MARKER &&
      flag === LitecoinTransaction.MWEB_PEGOUT_TX_FLAG
    ) {
      // Litecoin has an MWEB advanced transaction marker. Slice out the marker and 5th to last byte  and read like a normal transaction
      const bufferWriter = new BufferWriter(Buffer.allocUnsafe(buffer.length - 3));
      bufferWriter.writeUInt32(txVersion);
      bufferWriter.writeSlice(buffer.slice(6, buffer.length - 5));
      bufferWriter.writeSlice(buffer.slice(buffer.length - 4, buffer.length));
      return super.fromBuffer(bufferWriter.buffer, noStrict, amountType, network);
    }
    return super.fromBuffer(buffer, noStrict, amountType, network);
  }
}

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


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