UNPKG

@biconomy/abstractjs

Version:

SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.

117 lines 5.15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.prepareInstructions = exports.getFusionQuote = void 0; const viem_1 = require("viem"); const batchInstructions_1 = require("../../../account/utils/batchInstructions.js"); const Helpers_1 = require("../../../modules/utils/Helpers.js"); const composabilityCalls_1 = require("../../../modules/utils/composabilityCalls.js"); const getMmDtkQuote_1 = require("./getMmDtkQuote.js"); const getOnChainQuote_1 = require("./getOnChainQuote.js"); const getPaymentToken_1 = require("./getPaymentToken.js"); const getPermitQuote_1 = require("./getPermitQuote.js"); const getQuote_1 = require("./getQuote.js"); const getFusionQuote = async (client, parameters) => { if (parameters.delegatorSmartAccount) { return (0, getMmDtkQuote_1.default)(client, parameters); } if ("call" in parameters.trigger) { return (0, getOnChainQuote_1.default)(client, parameters); } const paymentTokenInfo = await (0, getPaymentToken_1.getPaymentToken)(client, parameters.trigger); let permitEnabled = false; if (paymentTokenInfo.paymentToken) { permitEnabled = paymentTokenInfo.paymentToken.permitEnabled || false; } else if (paymentTokenInfo.isArbitraryPaymentTokensSupported) { const modularSmartAccount = client.account.deploymentOn(parameters.trigger.chainId, true); permitEnabled = await (0, Helpers_1.isPermitSupported)(modularSmartAccount.walletClient, parameters.trigger.tokenAddress); } else { throw new Error(`Payment token (${parameters.trigger.tokenAddress}) not supported for chain ${parameters.trigger.chainId}`); } return permitEnabled ? (0, getPermitQuote_1.default)(client, parameters) : (0, getOnChainQuote_1.default)(client, parameters); }; exports.getFusionQuote = getFusionQuote; const prepareInstructions = async (client, parameters) => { const { resolvedInstructions, trigger, sender, scaAddress, recipient, account } = parameters; let triggerAmount = 0n; if (trigger.useMaxAvailableFunds) { const { publicClient } = client.account.deploymentOn(trigger.chainId, true); if (trigger.tokenAddress === viem_1.zeroAddress) { const [balance, gasPrice, gasLimit] = await Promise.all([ publicClient.getBalance({ address: sender }), publicClient.getGasPrice(), publicClient.estimateGas({ account: sender, to: sender, value: 1n }) ]); const gasLimitWithBuffer = (gasLimit * 150n) / 100n; const gasBuffer = 1.5; const baseCost = gasLimitWithBuffer * gasPrice; const gasReserve = BigInt(Math.ceil(Number(baseCost) * gasBuffer)); if (balance <= gasReserve) { throw new Error("Not enough native token to transfer"); } triggerAmount = balance - gasReserve; } else { triggerAmount = await publicClient.readContract({ address: trigger.tokenAddress, abi: viem_1.erc20Abi, functionName: "balanceOf", args: [sender] }); } } else { if (!trigger.amount) throw new Error("Trigger amount field is required"); triggerAmount = trigger.amount; } let isComposable = resolvedInstructions.some(({ isComposable }) => isComposable); let transferFromAmount = 0n; if (trigger.useMaxAvailableFunds && trigger.tokenAddress !== viem_1.zeroAddress) { transferFromAmount = (0, composabilityCalls_1.runtimeERC20AllowanceOf)({ owner: sender, spender: scaAddress, tokenAddress: trigger.tokenAddress, constraints: [(0, composabilityCalls_1.greaterThanOrEqualTo)(1n)] }); isComposable = true; } else { transferFromAmount = triggerAmount; } const triggerGasLimit = trigger.gasLimit ? trigger.gasLimit : getQuote_1.DEFAULT_GAS_LIMIT; if (trigger.tokenAddress === viem_1.zeroAddress) { const batchedInstructions = await (0, batchInstructions_1.batchInstructions)({ account, instructions: resolvedInstructions }); return { triggerGasLimit, triggerAmount, batchedInstructions }; } const params = { type: "transferFrom", data: { tokenAddress: trigger.tokenAddress, chainId: trigger.chainId, amount: transferFromAmount, recipient, sender, gasLimit: triggerGasLimit } }; const triggerTransfer = await (isComposable ? account.buildComposable(params) : account.build(params)); const batchedInstructions = await (0, batchInstructions_1.batchInstructions)({ account, instructions: [...triggerTransfer, ...resolvedInstructions] }); return { triggerGasLimit, triggerAmount, batchedInstructions }; }; exports.prepareInstructions = prepareInstructions; exports.default = exports.getFusionQuote; //# sourceMappingURL=getFusionQuote.js.map