PHP WebShell

Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo-forks/avalanchejs/src/serializable/avax

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

import { concatBytes } from '../../utils/buffer';
import { pack, unpack } from '../../utils/struct';
import {
  isStakeableLockIn,
  isTransferInput,
  isTransferOut,
} from '../../utils/typeGuards';
import type { Codec } from '../codec/codec';
import type { Amounter } from '../common/types';
import { serializable } from '../common/types';
import { Id } from '../fxs/common/id';
import { Input, TransferInput } from '../fxs/secp256k1';
import { BigIntPr, Int } from '../primitives';
import type { Utxo } from './utxo';
import { UTXOID } from './utxoId';
import { TypeSymbols } from '../constants';

/**
 * @see https://github.com/ava-labs/avalanchego/blob/master/vms/components/avax/transferables.go
 * @see https://docs.avax.network/specs/coreth-atomic-transaction-serialization#transferable-input
 * @see https://docs.avax.network/specs/avm-transaction-serialization#transferable-input
 * @see https://docs.avax.network/specs/platform-transaction-serialization#transferable-input
 */
@serializable()
export class TransferableInput {
  _type = TypeSymbols.TransferableInput;

  constructor(
    public readonly utxoID: UTXOID,
    public readonly assetId: Id,
    public readonly input: Amounter,
  ) {}

  static fromBytes(
    bytes: Uint8Array,
    codec: Codec,
  ): [TransferableInput, Uint8Array] {
    const [utxoID, assetId, remaining] = unpack(bytes, [UTXOID, Id]);
    const [input, rest] = codec.UnpackPrefix<Amounter>(remaining);

    return [new TransferableInput(utxoID, assetId, input), rest];
  }

  static fromNative(
    utxoId: string,
    outputIdx: number,
    assetId: string,
    amount: bigint,
    sigIndices: number[],
  ) {
    return new TransferableInput(
      UTXOID.fromNative(utxoId, outputIdx),
      Id.fromString(assetId),
      new TransferInput(
        new BigIntPr(amount),
        new Input(sigIndices.map((num) => new Int(num))),
      ),
    );
  }

  static fromUtxoAndSigindicies(utxo: Utxo, sigIndicies: number[]) {
    const out = utxo.output;
    if (!isTransferOut(out)) {
      throw new Error('utxo.output must be Transferout');
    }

    return new TransferableInput(
      utxo.utxoId,
      utxo.assetId,
      TransferInput.fromNative(out.amount(), sigIndicies),
    );
  }

  sigIndicies() {
    const input = this.input;

    if (isTransferInput(input)) {
      return input.sigIndicies();
    }
    if (isStakeableLockIn(input)) {
      const lockedInput = input.transferableInput;

      if (isTransferInput(lockedInput)) {
        return lockedInput.sigIndicies();
      }
    }
    throw new Error('Input must be TransferInput or StakeableLockIn');
  }

  static compare(input1: TransferableInput, input2: TransferableInput): number {
    return UTXOID.compare(input1.utxoID, input2.utxoID);
  }

  amount() {
    return this.input.amount();
  }

  getAssetId() {
    return this.assetId.toString();
  }

  toBytes(codec: Codec) {
    return concatBytes(
      pack([this.utxoID, this.assetId], codec),
      codec.PackPrefix(this.input),
    );
  }
}

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


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