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