@biconomy/abstractjs
Version:
SDK for Biconomy integration with support for account abstraction, smart accounts, ERC-4337.
101 lines • 4.59 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getMeeVersionsForQuote = exports.signQuote = exports.formatSignedQuotePayload = exports.prepareTypedDataSignableQuotePayload = exports.preparePersonalSignableQuotePayload = void 0;
const viem_1 = require("viem");
const Constants_1 = require("../../../account/utils/Constants.js");
const getVersion_1 = require("../../../account/utils/getVersion.js");
const toP256Signer_1 = require("../../../account/utils/toP256Signer.js");
const constants_1 = require("../../../constants/index.js");
const createMeeClient_1 = require("../../createMeeClient.js");
const DEFAULT_PREFIX = "0x177eee00";
const preparePersonalSignableQuotePayload = (quote) => {
return {
signablePayload: {
message: { raw: quote.hash }
},
metadata: {}
};
};
exports.preparePersonalSignableQuotePayload = preparePersonalSignableQuotePayload;
const prepareTypedDataSignableQuotePayload = (quote, eip712Domain) => {
const isTrustedSponsorship = quote.userOps[0].userOp.sender.toLowerCase() ===
createMeeClient_1.DEFAULT_MEE_SPONSORSHIP_PAYMASTER_ACCOUNT.toLowerCase();
const signablePayload = {
domain: {
name: eip712Domain.domain.name
},
types: {
MeeUserOp: [
{ name: "userOpHash", type: "bytes32" },
{ name: "lowerBoundTimestamp", type: "uint256" },
{ name: "upperBoundTimestamp", type: "uint256" }
],
SuperTx: [{ name: "meeUserOps", type: "MeeUserOp[]" }]
},
primaryType: "SuperTx",
message: {
meeUserOps: (isTrustedSponsorship
? quote.userOps.slice(1)
: quote.userOps).map((userOp) => ({
userOpHash: userOp.userOpHash,
lowerBoundTimestamp: userOp.lowerBoundTimestamp,
upperBoundTimestamp: userOp.upperBoundTimestamp
}))
}
};
return {
signablePayload,
metadata: {}
};
};
exports.prepareTypedDataSignableQuotePayload = prepareTypedDataSignableQuotePayload;
const formatSignedQuotePayload = (quote, _metadata, signature, meeVersions, isP256) => {
const prefix = isP256 ? Constants_1.SIG_TYPE_SIMPLE_P256 : DEFAULT_PREFIX;
return {
...quote,
signature: (0, viem_1.concatHex)([prefix, signature]),
meeVersions: meeVersions,
isEIP712TrustedSponsorshipSupported: true
};
};
exports.formatSignedQuotePayload = formatSignedQuotePayload;
const signQuote = async (client, params) => {
const { account: account_ = client.account, quote } = params;
const signer = account_.signer;
const isP256 = (0, toP256Signer_1.isP256Signer)(signer);
const startIndex = quote.paymentInfo.sponsored ? 1 : 0;
const chainId = quote.userOps[startIndex].chainId;
const meeVersions = (0, exports.getMeeVersionsForQuote)(account_, quote.userOps.slice(startIndex));
if ((0, getVersion_1.versionIsAtLeast)(meeVersions[0].version.version, constants_1.MEEVersion.V2_2_1)) {
const deployment = account_.deploymentOn(Number(chainId), true);
const eip712Domain = await deployment.getEip712Domain();
if (!eip712Domain) {
throw new Error(`EIP-712 domain data not found for the multichain account on chain ${chainId}`);
}
const result = (0, exports.prepareTypedDataSignableQuotePayload)(quote, eip712Domain);
const { signablePayload, metadata } = result;
const typedDataSignature = await signer.signTypedData(signablePayload);
return (0, exports.formatSignedQuotePayload)(quote, metadata, typedDataSignature, meeVersions, isP256);
}
const result = (0, exports.preparePersonalSignableQuotePayload)(quote);
const { signablePayload, metadata } = result;
const personalSignature = await signer.signMessage(signablePayload);
return (0, exports.formatSignedQuotePayload)(quote, metadata, personalSignature, meeVersions, isP256);
};
exports.signQuote = signQuote;
const getMeeVersionsForQuote = (account, userOps) => {
const usedChains = new Set();
for (const op of userOps) {
usedChains.add(Number(op.chainId));
}
return Array.from(usedChains, (chainId) => {
const deployment = account.deploymentOn(chainId, true);
return {
version: deployment.version,
chainId
};
});
};
exports.getMeeVersionsForQuote = getMeeVersionsForQuote;
exports.default = exports.signQuote;
//# sourceMappingURL=signQuote.js.map