UNPKG

@biconomy/abstractjs

Version:

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

153 lines 6.96 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.filterDeployments = filterDeployments; exports.resolveStatelessValidator = resolveStatelessValidator; exports.deriveOwnershipData = deriveOwnershipData; exports.addOwnership = addOwnership; exports.changeOwnership = changeOwnership; exports.cleanOwnership = cleanOwnership; exports.getOwnership = getOwnership; const viem_1 = require("viem"); const actions_1 = require("viem/actions"); const stxValidatorAbi = (0, viem_1.parseAbi)([ "function setOwnershipData(address statelessValidatorAddress, bytes ownershipData)", "function cleanOwnershipData(address statelessValidatorAddress)", "function getOwnershipData(address smartAccount, address statelessValidatorAddress) view returns (bytes)" ]); function filterDeployments(deployments, chainIds) { if (!chainIds || chainIds.length === 0) return deployments; const deployedChainIds = new Set(deployments.map((d) => d.client.chain?.id).filter(Boolean)); const missing = chainIds.filter((id) => !deployedChainIds.has(id)); if (missing.length > 0) { throw new Error(`No deployments found for chainIds: ${missing.join(", ")}. Available chainIds: ${[...deployedChainIds].join(", ")}`); } return deployments.filter((d) => { const id = d.client.chain?.id; return id !== undefined && chainIds.includes(id); }); } function resolveStatelessValidator(ownershipType, submodules) { if (ownershipType !== "eoa" && ownershipType !== "p256" && ownershipType !== "safe") { return ownershipType; } const mapping = { eoa: submodules?.EoaStatelessValidator, p256: submodules?.P256StatelessValidator, safe: submodules?.SafeAccountSubmodule }; const address = mapping[ownershipType]; if (!address) { throw new Error(`Stateless validator address for "${ownershipType}" not found in submodules. Ensure MEE version V3_0_0+ is configured.`); } return address; } function deriveOwnershipData(signer, ownershipType, ownershipDataOverride) { if (ownershipDataOverride) { return ownershipDataOverride; } if (ownershipType === "p256") { if (!signer.publicKey) { throw new Error("P256 signer must have a publicKey to derive ownership data"); } const x = `0x${signer.publicKey.slice(4, 68)}`; const y = `0x${signer.publicKey.slice(68, 132)}`; return (0, viem_1.encodePacked)(["bytes32", "bytes32"], [x, y]); } if (ownershipType === "eoa" || ownershipType === "safe") { return (0, viem_1.encodePacked)(["address"], [signer.address]); } throw new Error("ownershipData must be provided when using a custom stateless validator address"); } function addOwnership(account, params) { const { coreOwnershipParams, ownershipData: ownershipDataOverride } = params; const { ownershipType, chainIds } = coreOwnershipParams; const deployments = filterDeployments(account.deployments, chainIds); return deployments.map((deployment) => { const chainId = deployment.client.chain?.id; if (!chainId) throw new Error("Chain ID is not set"); const statelessValidator = resolveStatelessValidator(ownershipType, deployment.version.submodules); const ownershipData = deriveOwnershipData(account.signer, ownershipType, ownershipDataOverride); const data = (0, viem_1.encodeFunctionData)({ abi: stxValidatorAbi, functionName: "setOwnershipData", args: [statelessValidator, ownershipData] }); return { calls: [{ to: deployment.version.validatorAddress, data }], chainId }; }); } async function changeOwnership(account, params) { const { coreOwnershipParams, ownershipData: ownershipDataOverride } = params; const { ownershipType, chainIds } = coreOwnershipParams; const deployments = filterDeployments(account.deployments, chainIds); const instructions = await Promise.all(deployments.map(async (deployment) => { const chainId = deployment.client.chain?.id; if (!chainId) throw new Error("Chain ID is not set"); const statelessValidator = resolveStatelessValidator(ownershipType, deployment.version.submodules); const existing = await (0, actions_1.readContract)(deployment.client, { address: deployment.version.validatorAddress, abi: stxValidatorAbi, functionName: "getOwnershipData", args: [deployment.address, statelessValidator] }); if (!existing || existing === "0x" || existing === "0x0") { throw new Error(`No ownership data found on chain ${chainId} for ownership type "${ownershipType}". Use addOwnership instead.`); } const ownershipData = deriveOwnershipData(account.signer, ownershipType, ownershipDataOverride); const data = (0, viem_1.encodeFunctionData)({ abi: stxValidatorAbi, functionName: "setOwnershipData", args: [statelessValidator, ownershipData] }); return { calls: [{ to: deployment.version.validatorAddress, data }], chainId }; })); return instructions; } function cleanOwnership(account, params) { const { ownershipType, chainIds } = params; const deployments = filterDeployments(account.deployments, chainIds); return deployments.map((deployment) => { const chainId = deployment.client.chain?.id; if (!chainId) throw new Error("Chain ID is not set"); const statelessValidator = resolveStatelessValidator(ownershipType, deployment.version.submodules); const data = (0, viem_1.encodeFunctionData)({ abi: stxValidatorAbi, functionName: "cleanOwnershipData", args: [statelessValidator] }); return { calls: [{ to: deployment.version.validatorAddress, data }], chainId }; }); } async function getOwnership(account, params) { const { ownershipType, chainIds } = params; const deployments = filterDeployments(account.deployments, chainIds); const results = await Promise.all(deployments.map(async (deployment) => { const chainId = deployment.client.chain?.id; if (!chainId) throw new Error("Chain ID is not set"); const statelessValidator = resolveStatelessValidator(ownershipType, deployment.version.submodules); const data = await (0, actions_1.readContract)(deployment.client, { address: deployment.version.validatorAddress, abi: stxValidatorAbi, functionName: "getOwnershipData", args: [deployment.address, statelessValidator] }); return { chainId, data: data }; })); return results; } //# sourceMappingURL=ownership.js.map