UNPKG

@biconomy/abstractjs

Version:

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

116 lines 4.43 kB
import { encodeAbiParameters, encodeFunctionData, pad, parseAbi, toHex } from "viem"; import { isVersionOlder } from "../index.js"; import { NexusBootstrapAbi } from "../../constants/abi/NexusBootstrapAbi.js"; import { NexusLegacyBootstrapAbi } from "../../constants/abi/NexusLegacyBootstrapAbi.js"; /** * Generates encoded factory data for K1 account creation * * @param params - {@link GetK1FactoryDataParams} Parameters for K1 account creation * @param params.signerAddress - The address of the EOA signer * @param params.index - Account index for deterministic deployment * @param params.attesters - Array of attester addresses * @param params.attesterThreshold - Minimum number of attesters required * * @returns Promise resolving to {@link Hex} encoded function data for account creation * * @example * const factoryData = await getK1FactoryData({ * signerAddress: "0x123...", * index: BigInt(0), * attesters: ["0xabc...", "0xdef..."], * attesterThreshold: 2 * }); */ export const getK1FactoryData = ({ signerAddress, index, attesters, attesterThreshold }) => encodeFunctionData({ abi: parseAbi([ "function createAccount(address eoaOwner, uint256 index, address[] attesters, uint8 threshold) external returns (address)" ]), functionName: "createAccount", args: [signerAddress, index, attesters, attesterThreshold] }); export const getFactoryData = (parameters) => { const { index, initData } = parameters; const salt = pad(toHex(index), { size: 32 }); return encodeFunctionData({ abi: parseAbi([ "function createAccount(bytes initData, bytes32 salt) external returns (address)" ]), functionName: "createAccount", args: [initData, salt] }); }; export const getInitData = (parameters) => { const { registryAddress, attesters, attesterThreshold, defaultValidator, prevalidationHooks, validators, executors, hook, fallbacks, bootStrapAddress, nexusVersion = "1.2.0" } = parameters; return registryAddress && attesters && attesterThreshold ? getInitDataWithRegistry({ bootStrapAddress, validators, registryAddress, attesters, attesterThreshold, nexusVersion }) : getInitDataNoRegistry({ defaultValidator, prevalidationHooks, validators, executors, hook, fallbacks, bootStrapAddress }); }; // Nexus 1.0.2 case: initializing it with single validator (validators[0]) and registry export const getInitDataWithRegistry = (params) => { const bootstrapData = isVersionOlder(params.nexusVersion, "1.2.0") ? encodeFunctionData({ abi: NexusLegacyBootstrapAbi, functionName: "initNexusWithSingleValidator", args: [ params.validators[0].module, params.validators[0].data, params.registryAddress, params.attesters, params.attesterThreshold ] }) : encodeFunctionData({ abi: NexusBootstrapAbi, functionName: "initNexusWithSingleValidator", args: [ params.validators[0].module, params.validators[0].data, { registry: params.registryAddress, attesters: params.attesters, threshold: params.attesterThreshold } ] }); return encodeAbiParameters([ { name: "bootstrap", type: "address" }, { name: "bootstrapData", type: "bytes" } ], [params.bootStrapAddress, bootstrapData]); }; // Nexus 1.2.0 case export const getInitDataNoRegistry = (params) => { return encodeAbiParameters([ { name: "bootstrap", type: "address" }, { name: "bootstrapData", type: "bytes" } ], [ params.bootStrapAddress, encodeFunctionData({ abi: NexusBootstrapAbi, functionName: "initNexusWithDefaultValidatorAndOtherModulesNoRegistry", args: [ params.defaultValidator.data, params.validators, params.executors, params.hook, params.fallbacks, params.prevalidationHooks ] }) ]); }; //# sourceMappingURL=getFactoryData.js.map