PHP WebShell

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

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

import { verifySignaturesMatch } from '../../../vms/utils/calculateSpend/utils';
import {
  TransferableOutput,
  TransferOutput,
  TransferableInput,
  TransferInput,
  OutputOwners,
} from '../../../serializable';
import { BigIntPr, Int } from '../../../serializable/primitives';
import type { StakeableLockOut } from '../../../serializable/pvm';
import {
  isTransferOut,
  isStakeableLockOut,
  addressesFromBytes,
} from '../../../utils';
import { bigIntMin } from '../../../utils/bigintMath';
import type { UTXOCalculationState } from '../../utils/calculateSpend';

export function useUnlockedUTXOs({
  amountsToBurn,
  utxos,
  fromAddresses,
  amountsToStake,
  options,
  changeOutputs,
  inputUTXOs,
  inputs,
  stakeOutputs,
  ...state
}: UTXOCalculationState): UTXOCalculationState {
  const changeOwner = new OutputOwners(
    new BigIntPr(0n),
    new Int(1),
    addressesFromBytes(options.changeAddresses),
  );
  const usableUTXOs = utxos.filter((utxo) => {
    if (isTransferOut(utxo.output)) {
      return true;
    }
    const out = utxo.output;
    if (!isStakeableLockOut(out) || !isTransferOut(out.transferOut)) {
      return false;
    }
    return out.getLocktime() < options.minIssuanceTime;
  });

  verifySignaturesMatch(
    usableUTXOs,
    (utxo) => {
      return (
        isTransferOut(utxo.output)
          ? utxo.output
          : (utxo.output as StakeableLockOut).transferOut
      ) as TransferOutput;
    },
    fromAddresses,
    options,
  ).forEach(({ sigData, data: utxo }) => {
    const remainingAmountToBurn = amountsToBurn.get(utxo.assetId.value()) ?? 0n;

    const remainingAmountToStake =
      amountsToStake.get(utxo.assetId.value()) ?? 0n;

    if (!remainingAmountToBurn && !remainingAmountToStake) {
      return;
    }

    const utxoTransferout = (
      isTransferOut(utxo.output)
        ? utxo.output
        : (utxo.output as StakeableLockOut).transferOut
    ) as TransferOutput;

    inputs.push(
      new TransferableInput(
        utxo.utxoId,
        utxo.assetId,
        TransferInput.fromNative(utxoTransferout.amount(), sigData.sigIndicies),
      ),
    );

    inputUTXOs.push(utxo);

    const amountToBurn = bigIntMin(
      remainingAmountToBurn,
      utxoTransferout.amt.value(),
    );

    amountsToBurn.set(
      utxo.assetId.value(),
      remainingAmountToBurn - amountToBurn,
    );

    const amountAvailableToStake = utxoTransferout.amount() - amountToBurn;

    const amountToStake = bigIntMin(
      remainingAmountToStake,
      amountAvailableToStake,
    );

    amountsToStake.set(
      utxo.assetId.value(),
      (amountsToStake.get(utxo.assetId.value()) ?? 0n) - amountToStake,
    );

    if (amountToStake > 0n) {
      stakeOutputs.push(
        new TransferableOutput(
          utxo.assetId,
          new TransferOutput(new BigIntPr(amountToStake), changeOwner),
        ),
      );
    }

    const remainingAmount = amountAvailableToStake - amountToStake;
    if (remainingAmount > 0) {
      changeOutputs.push(
        new TransferableOutput(
          utxo.assetId,
          new TransferOutput(new BigIntPr(remainingAmount), changeOwner),
        ),
      );
    }
  });

  return {
    ...state,
    amountsToBurn,
    utxos,
    fromAddresses,
    amountsToStake,
    options,
    changeOutputs,
    inputUTXOs,
    inputs,
    stakeOutputs,
  };
}

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


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