@ledgerhq/coin-tezos
Version:
70 lines (59 loc) • 2.3 kB
text/typescript
import BigNumber from "bignumber.js";
import { AccountBridge } from "@ledgerhq/types-live";
import { TezosAccount, Transaction } from "../types";
import { validateRecipient } from "../logic";
import getEstimatedFees from "./getFeesForTransaction";
import coinConfig from "../config";
function bnEq(a: BigNumber | null | undefined, b: BigNumber | null | undefined): boolean {
return !a && !b ? true : !a || !b ? false : a.eq(b);
}
function maxBigNumber(a: BigNumber, b: BigNumber): BigNumber {
return a.isGreaterThan(b) ? a : b;
}
export const prepareTransaction: AccountBridge<
Transaction,
TezosAccount
>["prepareTransaction"] = async (account, transaction) => {
if (account.balance.lte(0)) {
return Promise.resolve(transaction);
}
// basic check to confirm the transaction is "complete"
if (transaction.mode !== "undelegate") {
if (!transaction.recipient) {
return Promise.resolve(transaction);
}
const { recipientError } = await validateRecipient(transaction.recipient);
if (recipientError) {
return Promise.resolve(transaction);
}
}
const estimation = await getEstimatedFees({ account, transaction });
const minGasLimit = coinConfig.getCoinConfig().fees.minGasLimit;
const minStorageLimit = coinConfig.getCoinConfig().fees.minStorageLimit;
const minFees = coinConfig.getCoinConfig().fees.minFees;
const minEstimatedFees = coinConfig.getCoinConfig().fees.minEstimatedFees;
estimation.gasLimit = maxBigNumber(estimation.gasLimit, new BigNumber(minGasLimit));
estimation.storageLimit = maxBigNumber(estimation.storageLimit, new BigNumber(minStorageLimit));
estimation.fees = maxBigNumber(estimation.fees, new BigNumber(minFees));
estimation.estimatedFees = maxBigNumber(
estimation.estimatedFees,
new BigNumber(minEstimatedFees),
);
const tx: Transaction = {
...transaction,
...estimation,
};
// nothing changed
if (
bnEq(tx.estimatedFees, transaction.estimatedFees) &&
bnEq(tx.fees, transaction.fees) &&
bnEq(tx.gasLimit, transaction.gasLimit) &&
bnEq(tx.storageLimit, transaction.storageLimit) &&
bnEq(tx.amount, transaction.amount) &&
tx.taquitoError === transaction.taquitoError
) {
return transaction;
}
return tx;
};
export default prepareTransaction;