Skip to content

Commit

Permalink
chore: simple test
Browse files Browse the repository at this point in the history
  • Loading branch information
joepegler committed Mar 11, 2025
1 parent e4cd768 commit 30acef1
Show file tree
Hide file tree
Showing 52 changed files with 562 additions and 781 deletions.
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"`
)
})
})
201 changes: 73 additions & 128 deletions src/sdk/account/decorators/getFactoryData.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
import {
type Address,
type Hex,
type PublicClient,
type WalletClient,
encodeFunctionData,
getContract,
pad,
parseAbi,
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 { COMPOSABILITY_MODULE_ADDRESS } from "../../modules/composability/toComposabilityFallback"
import { getVersion, isVersionOlder } from "../utils/getVersion"

/**
* Parameters for generating K1 factory initialization data
Expand Down Expand Up @@ -52,12 +44,12 @@ export type GetK1FactoryDataParams = {
* 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 @@ -66,92 +58,17 @@ export const getK1FactoryData = async ({
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
attesters: Address[]
attesterThreshold: number
validatorAddress?: Address
registryAddress?: Address
publicClient: PublicClient
walletClient: WalletClient
bootStrapAddress?: 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> => {
const {
validatorAddress = MEE_VALIDATOR_ADDRESS,
attesters,
registryAddress = REGISTRY_ADDRESS,
attesterThreshold,
publicClient,
walletClient,
bootStrapAddress = NEXUS_BOOTSTRAP_ADDRESS,
validatorInitData,
index
} = parameters

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

const initData =
await nexusBootstrap.read.getInitNexusWithSingleValidatorCalldata([
{
module: validatorAddress,
data: validatorInitData
},
registryAddress,
attesters,
attesterThreshold
])

export const getUniversalFactoryData = ({
initData,
index
}: GetUniversalFactoryDataParams): Hex => {
const salt = pad(toHex(index), { size: 32 })

return encodeFunctionData({
Expand All @@ -163,51 +80,79 @@ export const getDefaultFactoryData = async (
})
}

export type GetComposabilityFactoryDataParams = {
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
validatorInitData: Hex
composabilityModuleAddress?: Address
registryAddress?: Address
/** Optional registry contract address */
registryAddress: Address
}

export const getComposabilityFactoryData = async (
parameters: GetComposabilityFactoryDataParams
): Promise<Hex> => {
const {
validatorAddress,
validatorInitData,
composabilityModuleAddress = COMPOSABILITY_MODULE_ADDRESS,
registryAddress = REGISTRY_ADDRESS,
attesters,
attesterThreshold
} = parameters

const fallback = {
module: composabilityModuleAddress,
data: toHex("0x7192a248")
}

export const getFactoryInitData = ({
validators,
executors,
hook,
fallbacks,
attesters,
attesterThreshold,
registryAddress
}: GetFactoryInitDataParams): Hex => {
return encodeFunctionData({
abi: NexusBootstrapAbi,
functionName: "initNexus",
args: [
[
{
module: validatorAddress,
data: validatorInitData
}
],
[fallback],
{
module: zeroAddress,
data: zeroHash
},
[fallback],
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 {
initData,
index,
attesters,
attesterThreshold,
useK1Config,
signerAddress
} = params

if (isVersionOlder(getVersion(), "0.2.2") && useK1Config) {
return getK1FactoryData({
signerAddress,
index,
attesters,
attesterThreshold
})
}

return getUniversalFactoryData({
index,
initData
})
}
Loading

0 comments on commit 30acef1

Please sign in to comment.