UNPKG

@biconomy/abstractjs

Version:

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

164 lines 7.33 kB
import { buildComposable as buildComposableDecorator, build as buildDecorator } from "./decorators/build.js"; import { buildActionPolicy as buildActionPolicyDecorator } from "./decorators/buildActionPolicy.js"; import { buildBridgeInstructions as buildBridgeInstructionsDecorator } from "./decorators/buildBridgeInstructions.js"; import { buildSessionAction as buildSessionActionDecorator } from "./decorators/buildSessionAction.js"; import { getUnifiedERC20Balance as getUnifiedERC20BalanceDecorator } from "./decorators/getUnifiedERC20Balance.js"; import { isDelegated as isDelegatedDecorator } from "./decorators/isDelegated.js"; import multichainRead, {} from "./decorators/multichainRead.js"; import { addOwnership as addOwnershipDecorator, changeOwnership as changeOwnershipDecorator, cleanOwnership as cleanOwnershipDecorator, getOwnership as getOwnershipDecorator } from "./decorators/ownership.js"; import { queryBridge as queryBridgeDecorator } from "./decorators/queryBridge.js"; import { unDelegate as unDelegateDecorator } from "./decorators/unDelegate.js"; import { waitForTransactionReceipts as waitForTransactionReceiptsDecorator } from "./decorators/waitForTransactionReceipts.js"; import { toNexusAccount } from "./toNexusAccount.js"; /** * Creates a multichain Nexus account across specified chains * * @param parameters - {@link MultichainNexusParams} Configuration for multichain account creation * @param parameters.signer - The signer instance used for account creation * @param parameters.chainConfigurations - Array of chain configuration objects where the account will be deployed * * @returns Promise resolving to {@link MultichainSmartAccount} instance * * @throws Error if account creation fails on any chain * * @example * const account = await toMultichainNexusAccount({ * signer: mySigner, * chainConfigurations: [ * { * chain: optimism, * transport: http(), * version: getMEEVersion(MEEversion.V2_1_0) * }, * { * chain: base, * transport: http(), * version: getMEEVersion(MEEversion.V2_1_0) * } * ] * }); * * // Get deployment on specific chain * const optimismDeployment = account.deploymentOn(10); * * // Check token balance across chains * const balance = await account.getUnifiedERC20Balance(mcUSDC); * * // Build bridge transaction * const bridgeInstructions = await account.buildBridgeInstructions({ * amount: BigInt("1000000"), // 1 USDC * mcToken: mcUSDC, * toChain: base * }); */ export async function toMultichainNexusAccount(multiChainNexusParams) { const { signer: unresolvedSigner, chainConfigurations, ...accountParameters } = multiChainNexusParams; if (chainConfigurations.length === 0) { throw new Error("No chain configuration provided"); } const deployments = await Promise.all(chainConfigurations.map((chainConfiguration) => toNexusAccount({ signer: unresolvedSigner, chainConfiguration, ...accountParameters }))); function deploymentOn(chainId, strictMode) { const deployment = deployments.find((dep) => dep.client.chain?.id === chainId); if (!deployment && strictMode) { throw new Error(`Deployment not found for chainId: ${chainId}`); } return deployment; } function addressOn(chainId, strictMode) { const deployment = deploymentOn(chainId, strictMode); return deployment?.address; } const meeVersions = deployments.map(({ version, chain }) => ({ chainId: chain.id, version })); const baseAccount = { signer: deployments[0].signer, // This signer is resolved deployments, deploymentOn, addressOn }; const getUnifiedERC20Balance = (mcToken) => getUnifiedERC20BalanceDecorator({ mcToken, account: baseAccount }); const build = (params, currentInstructions) => buildDecorator({ currentInstructions, accountAddress: baseAccount.signer.address, meeVersions }, params); const buildActionPolicy = (params) => { return buildActionPolicyDecorator(params); }; const buildSessionAction = (params) => { return buildSessionActionDecorator(params); }; const buildComposable = (params, currentInstructions) => { let composabilityVersion = undefined; let chainId = undefined; const type = params.type; if (type === "acrossIntent") { chainId = params.data.originChainId; } else if (type !== "batch") { chainId = params.data.chainId; } if (chainId) { composabilityVersion = getComposabilityVersion(chainId); } return buildComposableDecorator({ currentInstructions, accountAddress: baseAccount.signer.address, meeVersions }, params, composabilityVersion); }; const buildBridgeInstructions = (params) => buildBridgeInstructionsDecorator({ ...params }); const queryBridge = (params) => queryBridgeDecorator({ ...params }); const isDelegated = (parameters) => isDelegatedDecorator({ ...parameters, account: baseAccount }); const unDelegate = (parameters) => unDelegateDecorator({ ...parameters, account: baseAccount }); const waitForTransactionReceipts = (parameters) => waitForTransactionReceiptsDecorator({ ...parameters, account: baseAccount }); const getComposabilityVersion = (chainId) => { const chainConfiguration = chainConfigurations.find((chainConfiguration) => chainConfiguration.chain.id === chainId); if (!chainConfiguration) { throw new Error(`Chain configuration not found in mc account for chainId: ${chainId} that is used in the instruction params`); } return chainConfiguration.version.composabilityVersion; }; const getMeeVersion = (chainId) => { const chainConfiguration = chainConfigurations.find((chainConfiguration) => chainConfiguration.chain.id === chainId); if (!chainConfiguration) { throw new Error(`Chain configuration not found for chainId: ${chainId}`); } return chainConfiguration.version.version; }; const read = (params) => multichainRead(baseAccount, params); // The specific deployment doesn't matter here because chainId = 0 const toDelegation = async () => await deployments[0].toDelegation({ multiChain: true }); const addOwnership = (params) => addOwnershipDecorator(baseAccount, params); const changeOwnership = (params) => changeOwnershipDecorator(baseAccount, params); const cleanOwnership = (params) => cleanOwnershipDecorator(baseAccount, params); const getOwnership = (params) => getOwnershipDecorator(baseAccount, params); return { ...baseAccount, getUnifiedERC20Balance, build, buildComposable, buildActionPolicy, buildSessionAction, buildBridgeInstructions, queryBridge, isDelegated, getComposabilityVersion, getMeeVersion, unDelegate, waitForTransactionReceipts, read, toDelegation, addOwnership, changeOwnership, cleanOwnership, getOwnership }; } //# sourceMappingURL=toMultiChainNexusAccount.js.map