UNPKG

@ledgerhq/live-common

Version:
80 lines 3.5 kB
import { getAlpacaApi } from "./alpaca"; import { transactionToIntent } from "./utils"; import BigNumber from "bignumber.js"; import { decodeTokenAccountId } from "@ledgerhq/coin-framework/account/index"; function bnEq(a, b) { return !a && !b ? true : !a || !b ? false : a.eq(b); } function assetInfosFallback(transaction) { return { assetReference: transaction.assetReference ?? "", assetOwner: transaction.assetOwner ?? "", }; } export function genericPrepareTransaction(network, kind) { return async (account, transaction) => { const { getAssetFromToken, computeIntentType, estimateFees, validateIntent } = getAlpacaApi(account.currency.id, kind); const { assetReference, assetOwner } = getAssetFromToken ? getAssetInfos(transaction, account.freshAddress, getAssetFromToken) : assetInfosFallback(transaction); const customParametersFees = transaction.customFees?.parameters?.fees; let fees = customParametersFees || null; if (fees === null) { fees = (await estimateFees(transactionToIntent(account, { ...transaction, }, computeIntentType))).value; } if (!bnEq(transaction.fees, new BigNumber(fees.toString()))) { const next = { ...transaction, fees: new BigNumber(fees.toString()), assetReference, assetOwner, customFees: { parameters: { fees: customParametersFees ? new BigNumber(customParametersFees.toString()) : undefined, }, }, }; // propagate storageLimit fee parameter when present (ex: tezos) const feeEstimation = await estimateFees(transactionToIntent(account, { ...transaction, }, computeIntentType)); const params = feeEstimation?.parameters; if (params) { const storageLimit = params["storageLimit"]; if (storageLimit !== undefined && (typeof storageLimit === "bigint" || typeof storageLimit === "number" || typeof storageLimit === "string")) { next.storageLimit = new BigNumber(storageLimit.toString()); } } // align with stellar/xrp: when send max (or staking intents), reflect validated amount in UI if (transaction.useAllAmount || transaction["mode"] === "stake" || transaction["mode"] === "unstake") { const { amount } = await validateIntent(transactionToIntent(account, { ...transaction, }, computeIntentType)); next.amount = new BigNumber(amount.toString()); } return next; } return transaction; }; } export function getAssetInfos(tr, owner, getAssetFromToken) { if (tr.subAccountId) { const { token } = decodeTokenAccountId(tr.subAccountId); if (!token) return assetInfosFallback(tr); const asset = getAssetFromToken(token, owner); return { assetOwner: ("assetOwner" in asset && asset.assetOwner) || "", assetReference: ("assetReference" in asset && asset.assetReference) || "", }; } return assetInfosFallback(tr); } //# sourceMappingURL=prepareTransaction.js.map