@ledgerhq/coin-filecoin
Version:
Ledger Filecoin Coin integration
72 lines • 4.17 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareTransaction = void 0;
const bignumber_js_1 = __importDefault(require("bignumber.js"));
const jsHelpers_1 = require("@ledgerhq/coin-framework/bridge/jsHelpers");
const network_1 = require("../network");
const types_1 = require("../types");
const utils_1 = require("./utils");
const index_1 = require("../api/index");
const utils_2 = require("../common-logic/utils");
const tokenAccounts_1 = require("../erc20/tokenAccounts");
const prepareTransaction = async (account, transaction) => {
const { balance } = account;
const { address } = (0, utils_2.getAddress)(account);
const { useAllAmount } = transaction;
const recipient = transaction.recipient.toLowerCase();
const subAccount = (0, utils_2.getSubAccount)(account, transaction);
const tokenAccountTxn = !!subAccount;
if (recipient && address) {
const recipientValidation = (0, network_1.validateAddress)(recipient);
const senderValidation = (0, network_1.validateAddress)(address);
if (recipientValidation.isValid && senderValidation.isValid) {
const patch = {};
const method = (0, network_1.isFilEthAddress)(recipientValidation.parsedAddress) || tokenAccountTxn
? utils_1.Methods.InvokeEVM
: utils_1.Methods.Transfer;
const validatedContractAddress = (0, network_1.validateAddress)(subAccount?.token.contractAddress ?? "");
let finalRecipient = recipientValidation;
let params = undefined;
// used as fallback only for estimation of fees
let fallbackParams = "";
if (tokenAccountTxn && validatedContractAddress.isValid) {
finalRecipient = validatedContractAddress;
// If token transfer, the evm payload is required to estimate fees
if ((0, network_1.isEthereumConvertableAddr)(recipientValidation.parsedAddress)) {
params = (0, tokenAccounts_1.generateTokenTxnParams)(recipient, transaction.amount.isZero() ? (0, bignumber_js_1.default)(1) : transaction.amount);
}
else {
fallbackParams = (0, tokenAccounts_1.generateTokenTxnParams)(subAccount.token.contractAddress, (0, bignumber_js_1.default)(1));
}
}
const paramsForEstimation = params ? params : fallbackParams;
const result = await (0, index_1.fetchEstimatedFees)({
to: finalRecipient.parsedAddress.toString(),
from: senderValidation.parsedAddress.toString(),
methodNum: method,
blockIncl: types_1.BroadcastBlockIncl,
...(tokenAccountTxn && { params: (0, tokenAccounts_1.encodeTxnParams)(paramsForEstimation) }), // If token transfer, the eth call params are required to estimate fees
...(tokenAccountTxn && { value: "0" }), // If token transfer, the value should be 0 (avoid any native token transfer on fee estimation)
});
patch.gasFeeCap = new bignumber_js_1.default(result.gas_fee_cap);
patch.gasPremium = new bignumber_js_1.default(result.gas_premium);
patch.gasLimit = new bignumber_js_1.default(result.gas_limit);
patch.nonce = result.nonce;
patch.method = method;
patch.params = params;
const fee = (0, utils_1.calculateEstimatedFees)(patch.gasFeeCap, patch.gasLimit);
if (useAllAmount) {
patch.amount = subAccount ? subAccount.spendableBalance : balance.minus(fee);
patch.params =
tokenAccountTxn && params ? (0, tokenAccounts_1.generateTokenTxnParams)(recipient, patch.amount) : undefined;
}
return (0, jsHelpers_1.updateTransaction)(transaction, patch);
}
}
return transaction;
};
exports.prepareTransaction = prepareTransaction;
//# sourceMappingURL=prepareTransaction.js.map