UNPKG

permissionless

Version:

A utility library for working with ERC-4337

100 lines (94 loc) 2.86 kB
import type { Address, Client, Hex, OneOf, SignedAuthorization } from "viem" import { type GetSmartAccountParameter, type PaymasterActions, type SmartAccount, sendUserOperation } from "viem/account-abstraction" import { getAction, parseAccount } from "viem/utils" import { AccountNotFoundError } from "../../errors/index.js" import { encodeInstallModule } from "../../utils/encodeInstallModule.js" import type { ModuleType } from "./supportsModule.js" export type InstallModuleParameters< TSmartAccount extends SmartAccount | undefined > = GetSmartAccountParameter<TSmartAccount> & { authorization?: SignedAuthorization<number> | undefined type: ModuleType address: Address maxFeePerGas?: bigint maxPriorityFeePerGas?: bigint nonce?: bigint calls?: readonly { to: Address value?: bigint | undefined data?: Hex | undefined }[] paymaster?: | Address | true | { /** Retrieves paymaster-related User Operation properties to be used for sending the User Operation. */ getPaymasterData?: | PaymasterActions["getPaymasterData"] | undefined /** Retrieves paymaster-related User Operation properties to be used for gas estimation. */ getPaymasterStubData?: | PaymasterActions["getPaymasterStubData"] | undefined } | undefined /** Paymaster context to pass to `getPaymasterData` and `getPaymasterStubData` calls. */ paymasterContext?: unknown | undefined } & OneOf< | { context: Hex } | { initData: Hex } > export function installModule<TSmartAccount extends SmartAccount | undefined>( client: Client, parameters: InstallModuleParameters<TSmartAccount> ): Promise<Hex> { const { account: account_ = client.account, maxFeePerGas, maxPriorityFeePerGas, nonce, address, context, initData, type, calls, paymaster, authorization, paymasterContext } = parameters if (!account_) { throw new AccountNotFoundError({ docsPath: "/docs/actions/wallet/sendTransaction" }) } const account = parseAccount(account_) as SmartAccount return getAction( client, sendUserOperation, "sendUserOperation" )({ calls: [ ...encodeInstallModule({ account, modules: [{ address, context: context ?? initData, type }] }), ...(calls ?? []) ], paymaster, paymasterContext, maxFeePerGas, maxPriorityFeePerGas, nonce, authorization, account }) }