import type { Address, Chain, Client, Hex, Transport } from "viem" import { type PaymasterActions, type SmartAccount, sendUserOperation } from "viem/account-abstraction" import { getAction, parseAccount } from "viem/utils" import { AccountNotFoundError } from "../../errors/index.js" import { type EncodeUninstallModuleParameters, encodeUninstallModule } from "../../utils/encodeUninstallModule.js" export type UninstallModulesParameters< TSmartAccount extends SmartAccount | undefined > = EncodeUninstallModuleParameters & { 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 } export async function uninstallModules< TSmartAccount extends SmartAccount | undefined >( client: Client, parameters: UninstallModulesParameters ): Promise { const { account: account_ = client.account, maxFeePerGas, maxPriorityFeePerGas, nonce, modules, calls, paymaster, paymasterContext } = parameters if (!account_) { throw new AccountNotFoundError({ docsPath: "/docs/actions/wallet/sendTransaction" }) } const account = parseAccount(account_) as SmartAccount return getAction( client, sendUserOperation, "sendUserOperation" )({ calls: [ ...encodeUninstallModule({ account, modules }), ...(calls ?? []) ], paymaster, paymasterContext, maxFeePerGas, maxPriorityFeePerGas, nonce, account }) }