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