Pimlico is an account abstraction infrastructure platform. Leverage Pimlico's paymasters and bundlers to create smart accounts for your application. Pimlico's core product is permissionless.js which is a TypeScript library built on viem for building with ERC-4337 smart accounts, bundlers, paymasters, and user operations. Permissionless.js focuses on having no dependencies, maximum viem compatibility and a small bundle size. Permissionless.js also supports the major ERC-4337 smart accounts including Safe, Kernel, Biconomy, and SimpleAccount.

Getting Started

Get started with Permissionless.js by following these steps. Follow these steps to create a Capsule signer.

Connecting Pimlico to a Capsule Signer

After creating a Capsule signer, you will have access to a CapsuleWeb3Provider object that you can use to create a SmartAccountSigner object

import Capsule from "@usecapsule/web-sdk"
import {createCapsuleViemClient} from "@usecapsule/viem-v2-integration"
import { walletClientToSmartAccountSigner } from "permissionless"
import { http } from "viem"
import { sepolia } from "viem/chains"
// Param options here will be specific to your project.  See the Capsule docs for more info.
const capsule = new Capsule(env, apiKey)
// Convert a Capsule viem client to a SmartAccountSigner
// Follow the Capsule docs for more instructions on creating the Viem client https://docs.usecapsule.com/integration-guide/signing-transactions
const viemClient = createCapsuleViemClient(capsule, {
	chain: sepolia,
	transport: http("https://rpc.ankr.com/eth_sepolia"),
const smartAccountSigner = walletClientToSmartAccountSigner(viemClient)

Use with permissionless.js

import { signerToSimpleSmartAccount } from "permissionless/accounts"
import { createPublicClient, http } from "viem"
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"
import { sepolia } from "viem/chains"
export const publicClient = createPublicClient({
	transport: http("https://rpc.ankr.com/eth_sepolia"),
	chain: sepolia,
const smartAccount = await signerToSimpleSmartAccount(publicClient, {
	signer: smartAccountSigner,
	factoryAddress: "0x9406Cc6185a346906296840746125a0E44976454",

Last updated