isModuleInstalled
Checks if an ERC-7579 module is installed on the smart account. Check out this guide for a complete tutorial.
Usage
Create a smart account client with one of the following accounts that support ERC-7579:
import { publicClient } from "../publicClient"
import { createSmartAccountClient } from "permissionless"
import { sepolia } from "viem/chains"
import { http } from "viem"
import { entryPoint07Address } from "viem/account-abstraction"
import { createPimlicoClient } from "permissionless/clients/pimlico"
import { erc7579Actions } from "permissionless/actions/erc7579"
import { owner } from "../owner"
import { toKernelSmartAccount } from "permissionless/accounts"
const apiKey = "YOUR_PIMLICO_API_KEY"
const pimlicoUrl = `https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}`
const pimlicoClient = createPimlicoClient({
transport: http(pimlicoUrl),
chain: sepolia,
entryPoint: {
address: entryPoint07Address,
version: "0.7",
},
})
const kernelAccount = await toKernelSmartAccount({
client: publicClient,
owners: [owner],
version: "0.3.1",
})
// Extend the client with the ERC7579 actions
const smartAccountClient = createSmartAccountClient({
account: kernelAccount,
chain: sepolia,
bundlerTransport: http(pimlicoUrl),
paymaster: pimlicoClient,
userOperation: {
estimateFeesPerGas: async () => {
return (await pimlicoClient.getUserOperationGasPrice()).fast
},
},
}).extend(erc7579Actions())import { publicClient } from "../publicClient"
import { createSmartAccountClient } from "permissionless"
import { sepolia } from "viem/chains"
import { http } from "viem"
import { entryPoint07Address } from "viem/account-abstraction"
import { createPimlicoClient } from "permissionless/clients/pimlico"
import { erc7579Actions } from "permissionless/actions/erc7579"
import { owner } from "../owner"
import { toSafeSmartAccount } from "permissionless/accounts"
const apiKey = "YOUR_PIMLICO_API_KEY"
const pimlicoUrl = `https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}`
const pimlicoClient = createPimlicoClient({
transport: http(pimlicoUrl),
chain: sepolia,
entryPoint: {
address: entryPoint07Address,
version: "0.7",
},
})
const safeAccount = await toSafeSmartAccount({
client: publicClient,
owners: [owner],
version: "1.4.1",
entryPoint: {
address: entryPoint07Address,
version: "0.7",
},
safe4337ModuleAddress: "0x7579EE8307284F293B1927136486880611F20002",
erc7579LaunchpadAddress: "0x7579011aB74c46090561ea277Ba79D510c6C00ff",
attesters: ["0x000000333034E9f539ce08819E12c1b8Cb29084d"], // This address belongs to Rhinestone. By designating them as attesters, you authorize that only modules explicitly approved by Rhinestone can be installed on your safe.
attestersThreshold: 1,
})
// Extend the client with the ERC7579 actions
const smartAccountClient = createSmartAccountClient({
account: safeAccount,
chain: sepolia,
bundlerTransport: http(pimlicoUrl),
paymaster: pimlicoClient,
userOperation: {
estimateFeesPerGas: async () => {
return (await pimlicoClient.getUserOperationGasPrice()).fast
},
},
}).extend(erc7579Actions())import { publicClient } from "../publicClient"
import { createSmartAccountClient } from "permissionless"
import { sepolia } from "viem/chains"
import { http } from "viem"
import { entryPoint07Address } from "viem/account-abstraction"
import { createPimlicoClient } from "permissionless/clients/pimlico"
import { erc7579Actions } from "permissionless/actions/erc7579"
import { owner } from "../owner"
import { toNexusSmartAccount } from "permissionless/accounts"
const apiKey = "YOUR_PIMLICO_API_KEY"
const pimlicoUrl = `https://api.pimlico.io/v2/sepolia/rpc?apikey=${apiKey}`
const pimlicoClient = createPimlicoClient({
transport: http(pimlicoUrl),
chain: sepolia,
entryPoint: {
address: entryPoint07Address,
version: "0.7",
},
})
const nexusAccount = await toNexusSmartAccount({
client: publicClient,
owners: [owner],
version: "1.0.0",
})
// Extend the client with the ERC7579 actions
const smartAccountClient = createSmartAccountClient({
account: nexusAccount,
chain: sepolia,
bundlerTransport: http(pimlicoUrl),
paymaster: pimlicoClient,
userOperation: {
estimateFeesPerGas: async () => {
return (await pimlicoClient.getUserOperationGasPrice()).fast
},
},
}).extend(erc7579Actions())Use the isModuleInstalled method to check if a module is installed on the smart account.
const ownableExecutorModule = "0x4Fd8d57b94966982B62e9588C27B4171B55E8354"
const moduleData = encodePacked(["address"], ["0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"])
const isInstalled = await smartAccountClient.isModuleInstalled({
type: "executor",
address: ownableExecutorModule,
context: moduleData,
})Returns
- Type:
boolean
True if the module is installed, false otherwise.
Parameters
address
- Type:
Address
Address of the module to install.
type
- Type:
ModuleType
Type of the module to install. Accepted values are "validator" | "executor" | "fallback" | "hook".
context
- Type:
Hex
Context bytes that will be passed to the module as part of additionalContext.