@ledgerhq/coin-canton
Version:
71 lines • 3.43 kB
JavaScript
import { AmountRequired, FeeNotLoaded, FeeRequired, FeeTooHigh, InvalidAddress, InvalidAddressBecauseDestinationIsAlsoSource, NotEnoughBalanceBecauseDestinationNotCreated, NotEnoughSpendableBalance, RecipientRequired, } from "@ledgerhq/errors";
import BigNumber from "bignumber.js";
import { formatCurrencyUnit } from "@ledgerhq/coin-framework/currencies/index";
import { isRecipientValid } from "../common-logic/utils";
import coinConfig from "../config";
export const getTransactionStatus = async (account, transaction) => {
const errors = {};
const warnings = {};
// reserveAmount is the minimum amount of currency that an account must hold in order to stay activated
const reserveAmount = new BigNumber(coinConfig.getCoinConfig().minReserve);
const estimatedFees = new BigNumber(transaction.fee || 0);
const totalSpent = new BigNumber(transaction.amount).plus(estimatedFees);
const amount = new BigNumber(transaction.amount);
if (amount.gt(0) && estimatedFees.times(10).gt(amount)) {
// if the fee is more than 10 times the amount, we warn the user that fee is high compared to what he is sending
warnings.feeTooHigh = new FeeTooHigh();
}
if (!transaction.fee) {
// if the fee is not loaded, we can't do much
errors.fee = new FeeNotLoaded();
}
else if (transaction.fee.eq(0)) {
// On some chains, 0 fee could still work so this is optional
errors.fee = new FeeRequired();
}
else if (totalSpent.gt(account.balance.minus(reserveAmount))) {
// if the total spent is greater than the balance minus the reserve amount, tx is invalid
errors.amount = new NotEnoughSpendableBalance("", {
minimumAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
disableRounding: true,
useGrouping: false,
showCode: true,
}),
});
}
else if (transaction.recipient && transaction.amount.lt(reserveAmount)) {
// if we send an amount lower than reserve amount AND target account is new, we need to warn the user that the target account will not be activated
errors.amount = new NotEnoughBalanceBecauseDestinationNotCreated("", {
minimalAmount: formatCurrencyUnit(account.currency.units[0], reserveAmount, {
disableRounding: true,
useGrouping: false,
showCode: true,
}),
});
}
if (!transaction.recipient) {
errors.recipient = new RecipientRequired("");
}
else if (account.freshAddress === transaction.recipient) {
// we want to prevent user from sending to themselves (even if it's technically feasible)
errors.recipient = new InvalidAddressBecauseDestinationIsAlsoSource();
}
else if (!isRecipientValid(transaction.recipient)) {
// We want to prevent user from sending to an invalid address
errors.recipient = new InvalidAddress("", {
currencyName: account.currency.name,
});
}
if (!errors.amount && amount.eq(0)) {
// if the amount is 0, we prevent the user from sending the tx (even if it's technically feasible)
errors.amount = new AmountRequired();
}
return {
errors,
warnings,
estimatedFees,
amount,
totalSpent,
};
};
//# sourceMappingURL=getTransactionStatus.js.map