@ledgerhq/live-common
Version:
Common ground for the Ledger Live apps
112 lines • 4.71 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.useFeesStrategy = void 0;
exports.useBitcoinUtxoDisplayData = useBitcoinUtxoDisplayData;
const formatCurrencyUnit_1 = require("@ledgerhq/coin-framework/currencies/formatCurrencyUnit");
const bignumber_js_1 = require("bignumber.js");
const react_1 = require("react");
const logic_1 = require("./logic");
const types_1 = require("./types");
const useFeesStrategy = (a, t) => {
const networkInfo = t.networkInfo;
if (!networkInfo)
return [];
const strategies = networkInfo.feeItems.items
.map(feeItem => {
return {
label: feeItem.speed,
amount: feeItem.feePerByte,
unit: a.currency.units[a.currency.units.length - 1], // Should be sat
};
})
.reverse();
return strategies;
};
exports.useFeesStrategy = useFeesStrategy;
function isBitcoinBasedAccount(account) {
return "bitcoinResources" in account && account.bitcoinResources !== undefined;
}
function hasUtxoStrategy(tx) {
return "utxoStrategy" in tx && tx.utxoStrategy != null;
}
function isBitcoinTransactionStatus(s) {
return "txInputs" in s;
}
// Object.keys returns string[]; cast needed for keyof typeof
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
const pickingStrategyKeys = Object.keys(types_1.bitcoinPickingStrategy);
const pickingStrategyOptions = pickingStrategyKeys.map(key => ({
value: types_1.bitcoinPickingStrategy[key],
labelKey: `bitcoin.pickingStrategyLabels.${String(key)}`,
}));
function utxoToRowDisplayData(utxo, utxoStatus, context) {
const exclusionReason = utxoStatus.excluded ? utxoStatus.reason : undefined;
const isUsedInTx = (context.txInputs ?? []).some(input => input.previousOutputIndex === utxo.outputIndex && input.previousTxHash === utxo.hash);
const unconfirmed = exclusionReason === "pickPendingUtxo";
const isLastSelected = !utxoStatus.excluded && context.totalExcludedUTXOS + 1 === context.utxosLength;
const disabled = unconfirmed || isLastSelected;
const confirmations = utxo.blockHeight ? Math.max(0, context.blockHeight - utxo.blockHeight) : 0;
const formattedValue = (0, formatCurrencyUnit_1.formatCurrencyUnit)(context.accountUnit, utxo.value, {
showCode: true,
disableRounding: true,
locale: context.locale,
});
const address = utxo.address ?? "";
const addressLabel = address ? `${address.slice(0, 8)}...${address.slice(-4)}` : "";
const titleLabel = `#${context.rowIndex + 1} ${addressLabel}`.trim();
return {
utxo,
titleLabel,
formattedValue,
excluded: utxoStatus.excluded,
exclusionReason,
isUsedInTx,
unconfirmed,
isLastSelected,
disabled,
confirmations,
};
}
/**
* Fetches all parameters needed to display Bitcoin UTXO rows and the picking strategy selector,
* derived from account bitcoin resources, transaction utxoStrategy, and status.
* Returns null when the account is not Bitcoin-based or the transaction has no utxoStrategy.
*/
function useBitcoinUtxoDisplayData({ account, transaction, status, locale, }) {
return (0, react_1.useMemo)(() => {
if (!isBitcoinBasedAccount(account))
return null;
if (!hasUtxoStrategy(transaction))
return null;
if (!isBitcoinTransactionStatus(status))
return null;
const bitcoinAccount = account;
const bitcoinResources = bitcoinAccount.bitcoinResources;
if (!bitcoinResources?.utxos?.length)
return null;
const accountUnit = bitcoinAccount.currency.units[0];
const { utxoStrategy } = transaction;
const utxos = bitcoinResources.utxos;
const blockHeight = bitcoinAccount.blockHeight ?? 0;
const utxoStatuses = utxos.map(u => (0, logic_1.getUTXOStatus)(u, utxoStrategy));
const totalExcludedUTXOS = utxoStatuses.filter(s => s.excluded).length;
const txInputs = status.txInputs ?? [];
const utxoRows = utxos.map((utxo, rowIndex) => utxoToRowDisplayData(utxo, utxoStatuses[rowIndex], {
rowIndex,
txInputs,
totalExcludedUTXOS,
utxosLength: utxos.length,
blockHeight,
accountUnit,
locale,
}));
return {
pickingStrategyOptions,
pickingStrategyValue: utxoStrategy.strategy,
totalExcludedUTXOS,
totalSpent: status.totalSpent ?? new bignumber_js_1.BigNumber(0),
utxoRows,
};
}, [account, locale, status, transaction]);
}
//# sourceMappingURL=react.js.map