@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
117 lines • 5.15 kB
JavaScript
;
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