PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo-forks/avalanchejs/src/vms/pvm/utxoCalculationFns
Просмотр файла: useSpendableLockedUTXOs.ts
import { verifySignaturesMatch } from '../../../vms/utils/calculateSpend/utils';
import {
TransferableOutput,
TransferOutput,
TransferableInput,
TransferInput,
} from '../../../serializable';
import { BigIntPr } from '../../../serializable/primitives';
import { StakeableLockOut, StakeableLockIn } from '../../../serializable/pvm';
import { isStakeableLockOut } from '../../../utils';
import { bigIntMin } from '../../../utils/bigintMath';
import type { UTXOCalculationState } from '../../utils/calculateSpend';
function createTransferableInput(utxo, lockedOutput, out, sigData) {
return new TransferableInput(
utxo.utxoId,
utxo.assetId,
new StakeableLockIn(
lockedOutput.lockTime,
TransferInput.fromNative(out.amount(), sigData.sigIndicies),
),
);
}
function createTransferableOutput(utxo, lockedOutput, out, amt) {
return new TransferableOutput(
utxo.assetId,
new StakeableLockOut(
lockedOutput.lockTime,
new TransferOutput(new BigIntPr(amt), out.outputOwners),
),
);
}
export function useSpendableLockedUTXOs({
amountsToBurn,
utxos,
fromAddresses,
amountsToStake,
options,
changeOutputs,
inputUTXOs,
inputs,
stakeOutputs,
...state
}: UTXOCalculationState): UTXOCalculationState {
const usableUTXOs = utxos
.filter((utxo) => {
const out = utxo.output;
if (!isStakeableLockOut(out)) {
return false;
}
return options.minIssuanceTime < out.getLocktime();
})
.map((utxo) => {
const assetId = utxo.assetId.value();
// If this is 0n then either we are not staking any of this asset or the amount left to stak is zero
const remainingAmountToStake = amountsToStake.get(assetId) ?? 0n;
const lockedOutput = utxo.output as StakeableLockOut;
return { utxo, assetId, remainingAmountToStake, lockedOutput };
})
.filter(({ remainingAmountToStake }) => {
return !!remainingAmountToStake;
})
.filter(({ lockedOutput }) => {
if (!(lockedOutput.transferOut instanceof TransferOutput)) {
throw new Error('unknown output type');
}
return options.minIssuanceTime < lockedOutput.lockTime.value();
});
verifySignaturesMatch(
usableUTXOs,
({ lockedOutput }) => {
return lockedOutput.transferOut as TransferOutput;
},
fromAddresses,
options,
).forEach(({ sigData, data: { utxo, assetId, lockedOutput } }) => {
const out = lockedOutput.transferOut as TransferOutput;
const remainingAmountToStake = amountsToStake.get(assetId) ?? 0n;
// if we have already reached the stake amount then there is nothing left to run beyond here
if (!remainingAmountToStake) return;
inputs.push(createTransferableInput(utxo, lockedOutput, out, sigData));
inputUTXOs.push(utxo);
// check if this UTXO value is greater than the amount left to stake
const amountToStake = bigIntMin(remainingAmountToStake, out.amt.value());
stakeOutputs.push(
createTransferableOutput(utxo, lockedOutput, out, amountToStake),
);
// update the remaining stake amount minus this UTXOs value
amountsToStake.set(assetId, remainingAmountToStake - amountToStake);
const remainingAmount = out.amount() - amountToStake;
if (remainingAmount > 0n) {
changeOutputs.push(
createTransferableOutput(utxo, lockedOutput, out, remainingAmount),
);
}
});
return {
...state,
amountsToBurn,
utxos,
fromAddresses,
amountsToStake,
options,
changeOutputs,
inputUTXOs,
inputs,
stakeOutputs,
};
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!