Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: composability #29

Draft
wants to merge 2 commits into
base: develop
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# @biconomy/abstractjs

## 0.2.2

### Patch Changes

- Added Composability support

## 0.2.1

### Patch Changes
Expand Down Expand Up @@ -53,7 +59,7 @@

- Nexus init using custom validator
- BREAKING: `getMeeFactoryData` helper now renamed to `getDefaultFactoryData`
- BREAKING: `getMeeNexusAddress` helper now renamed to `getDefaultNexusAddress`
- BREAKING: `getMeeNexusAddress` helper now renamed to `getUniversalNexusAddress`
- Moved useTestBundler datapoint to the bundler client instead of the account & renamed to 'mock'.
- Use pimlico gasEstimates if string 'pimlico' is in the bundlerUrl
- Added confirmations: 2 to waitForUserOperationReceipt in signOnChainQuote helper to avoid race condition
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@biconomy/abstractjs",
"version": "0.2.1",
"version": "0.2.2",
"author": "Biconomy",
"repository": "github:bcnmy/abstractjs",
"main": "./dist/_cjs/index.js",
Expand Down
7 changes: 1 addition & 6 deletions scripts/fund:nexus.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,7 @@ import { privateKeyToAccount } from "viem/accounts"
import { base, optimism } from "viem/chains"
import { toMultichainNexusAccount, toNexusAccount } from "../src/sdk/account"
import { getChain } from "../src/sdk/account/utils/getChain"
import {
NEXUS_ACCOUNT_FACTORY,
OWNABLE_VALIDATOR_ADDRESS,
TokenWithPermitAbi,
getOwnableValidator
} from "../src/sdk/constants"
import { TokenWithPermitAbi } from "../src/sdk/constants"
import { mcUSDC, testnetMcUSDC } from "../src/sdk/constants/tokens"

dotenv.config()
Expand Down
20 changes: 1 addition & 19 deletions src/sdk/account/decorators/getFactoryData.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,10 @@ import {
import type { MasterClient, NetworkConfig } from "../../../test/testUtils"
import {
BICONOMY_ATTESTER_ADDRESS,
BICONOMY_EXPERIMENTAL_ATTESTER,
MEE_VALIDATOR_ADDRESS,
RHINESTONE_ATTESTER_ADDRESS
} from "../../constants"
import type { NexusAccount } from "../toNexusAccount"
import { getDefaultFactoryData, getK1FactoryData } from "./getFactoryData"
import { getK1FactoryData } from "./getFactoryData"

describe("nexus.account.getFactoryData", async () => {
let network: NetworkConfig
Expand Down Expand Up @@ -68,20 +66,4 @@ describe("nexus.account.getFactoryData", async () => {
`"0x0d51f0b70000000000000000000000003079b249dfde4692d7844aa261f8cf7d927a0da50000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000333034e9f539ce08819e12c1b8cb29084d000000000000000000000000f9ff902cdde729b47a4cdb55ef16df3683a04eab"`
)
})

test("should check factory data with mee", async () => {
const factoryData = await getDefaultFactoryData({
validatorInitData: eoaAccount.address,
index: 0n,
attesters: [RHINESTONE_ATTESTER_ADDRESS, BICONOMY_EXPERIMENTAL_ATTESTER],
attesterThreshold: 1,
validatorAddress: MEE_VALIDATOR_ADDRESS,
publicClient: testClient as unknown as PublicClient,
walletClient
})

expect(factoryData).toMatchInlineSnapshot(
`"0xea6d13ac0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000879fa30248eeb693dcce3ea94a743622170a36580000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000014401fe9ff2000000000000000000000000fbcbf8314de6da57ea2bc4710115f5271041ca5000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000069e2a187aeffb852bf3ccdc95151b200000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000143079b249dfde4692d7844aa261f8cf7d927a0da50000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000333034e9f539ce08819e12c1b8cb29084d000000000000000000000000531b827c1221ec7ce13266e8f5cb1ec6ae470be500000000000000000000000000000000000000000000000000000000"`
)
})
})
183 changes: 90 additions & 93 deletions src/sdk/account/decorators/getFactoryData.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,15 @@
import {
type Address,
type Hex,
type PublicClient,
type WalletClient,
encodeFunctionData,
getContract,
pad,
parseAbi,
toHex
toHex,
zeroAddress,

Check failure on line 8 in src/sdk/account/decorators/getFactoryData.ts

View workflow job for this annotation

GitHub Actions / size report

'zeroAddress' is declared but its value is never read.
zeroHash

Check failure on line 9 in src/sdk/account/decorators/getFactoryData.ts

View workflow job for this annotation

GitHub Actions / size report

'zeroHash' is declared but its value is never read.
} from "viem"
import {
MEE_VALIDATOR_ADDRESS,
NEXUS_BOOTSTRAP_ADDRESS,
REGISTRY_ADDRESS
} from "../../constants"
import { NexusBootstrapAbi } from "../../constants/abi/NexusBootstrapAbi"
import { getVersion, isVersionOlder } from "../utils/getVersion"

/**
* Parameters for generating K1 factory initialization data
Expand Down Expand Up @@ -49,12 +44,12 @@
* attesterThreshold: 2
* });
*/
export const getK1FactoryData = async ({
export const getK1FactoryData = ({
signerAddress,
index,
attesters,
attesterThreshold
}: GetK1FactoryDataParams): Promise<Hex> =>
}: GetK1FactoryDataParams): Hex =>
encodeFunctionData({
abi: parseAbi([
"function createAccount(address eoaOwner, uint256 index, address[] attesters, uint8 threshold) external returns (address)"
Expand All @@ -63,99 +58,101 @@
args: [signerAddress, index, attesters, attesterThreshold]
})

/**
* Parameters for generating MEE factory initialization data
* @property signerAddress - {@link Address} The address of the EOA signer
* @property index - Account index as BigInt for deterministic deployment
* @property attesters - Array of {@link Address} attester addresses for account verification
* @property attesterThreshold - Minimum number of attesters required for validation
* @property validatorAddress - Optional {@link Address} of the validator (defaults to MEE_VALIDATOR_ADDRESS)
* @property registryAddress - Optional {@link Address} of the registry contract (defaults to REGISTRY_ADDRESS)
* @property publicClient - {@link PublicClient} Viem public client instance
* @property walletClient - {@link WalletClient} Viem wallet client instance
* @property bootStrapAddress - Optional {@link Address} of the bootstrap contract (defaults to NEXUS_BOOTSTRAP_ADDRESS)
*/
export type GetDefaultFactoryDataParams = {
validatorInitData: Hex
export type GetUniversalFactoryDataParams = {
/** Hex string of the validator init data */
initData: Hex
/** Account index for deterministic deployment */
index: bigint
}

export const getUniversalFactoryData = ({
initData,
index
}: GetUniversalFactoryDataParams): Hex => {
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 type ModuleConfig = {
module: Address
data: Hex
}

export type GetFactoryInitDataParams = {
/** Array of validator modules with their initialization data */
validators: Array<ModuleConfig>
/** Array of executor modules with their initialization data */
executors: Array<ModuleConfig>
/** Hook module with its initialization data */
hook: ModuleConfig
/** Array of fallback modules with their initialization data */
fallbacks: Array<ModuleConfig>
/** Array of attester addresses for account verification */
attesters: Address[]
/** Minimum number of attesters required for validation */
attesterThreshold: number
validatorAddress?: Address
registryAddress?: Address
publicClient: PublicClient
walletClient: WalletClient
bootStrapAddress?: Address
/** Optional registry contract address */
registryAddress: Address
}

/**
* Generates encoded factory data for MEE account creation
*
* @param params - {@link GetDefaultFactoryDataParams} Parameters for MEE account creation
* @param params.validatorAddress - Optional validator address
* @param params.attesters - Array of attester addresses
* @param params.registryAddress - Optional registry contract address
* @param params.attesterThreshold - Minimum number of attesters required
* @param params.publicClient - Viem public client instance
* @param params.walletClient - Viem wallet client instance
* @param params.bootStrapAddress - Optional bootstrap contract address
* @param params.signerAddress - The address of the EOA signer
* @param params.index - Account index for deterministic deployment
*
* @returns Promise resolving to {@link Hex} encoded function data for account creation
*
* @example
* const factoryData = await getDefaultFactoryData({
* signerAddress: "0x123...",
* index: BigInt(0),
* attesters: ["0xabc...", "0xdef..."],
* attesterThreshold: 2,
* publicClient: viemPublicClient,
* walletClient: viemWalletClient,
* validatorAddress: "0x789..." // optional
* });
*/
export const getDefaultFactoryData = async (
parameters: GetDefaultFactoryDataParams
): Promise<Hex> => {
export const getFactoryInitData = ({
validators,
executors,
hook,
fallbacks,
attesters,
attesterThreshold,
registryAddress
}: GetFactoryInitDataParams): Hex => {
return encodeFunctionData({
abi: NexusBootstrapAbi,
functionName: "initNexus",
args: [
validators,
executors,
hook,
fallbacks,
registryAddress,
attesters,
attesterThreshold
]
})
}

export type GetFactoryDataParams = {
// Deprecated field for older versions of the SDK. Useful until version 0.2.2
useK1Config: boolean
} & GetK1FactoryDataParams &
GetUniversalFactoryDataParams

export const getFactoryData = (params: GetFactoryDataParams): Hex => {
const {
validatorAddress = MEE_VALIDATOR_ADDRESS,
initData,
index,
attesters,
registryAddress = REGISTRY_ADDRESS,
attesterThreshold,
publicClient,
walletClient,
bootStrapAddress = NEXUS_BOOTSTRAP_ADDRESS,
validatorInitData,
index
} = parameters
useK1Config,
signerAddress
} = params

const nexusBootstrap = getContract({
address: bootStrapAddress,
abi: NexusBootstrapAbi,
client: {
public: publicClient,
wallet: walletClient
}
})

const initData =
await nexusBootstrap.read.getInitNexusWithSingleValidatorCalldata([
{
module: validatorAddress,
data: validatorInitData
},
registryAddress,
if (isVersionOlder(getVersion(), "0.2.2") && useK1Config) {
return getK1FactoryData({
signerAddress,
index,
attesters,
attesterThreshold
])

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]
return getUniversalFactoryData({
index,
initData
})
}
68 changes: 0 additions & 68 deletions src/sdk/account/decorators/getNexusAddress.test.ts

This file was deleted.

Loading
Loading