{"library":"permissionless","title":"permissionless.js: ERC-4337 Account Abstraction Utilities","description":"permissionless.js is a robust, TypeScript-first utility library designed to simplify interaction with Ethereum's ERC-4337 Account Abstraction standard. It provides a comprehensive set of client interfaces and helper functions for integrating with ERC-4337 Bundlers and Paymasters, as well as tools for creating and managing Smart Accounts. This enables developers to build dApps with advanced features like gasless transactions, multi-signature accounts, and custom validation logic. The library leverages `viem` for core Ethereum interactions and `ox` for cryptographic operations, offering a type-safe and modular approach to account abstraction development. The current stable version is 0.3.5, with frequent patch releases addressing bug fixes and minor feature enhancements, alongside occasional minor releases for larger feature sets or dependency upgrades.","language":"javascript","status":"active","last_verified":"Sun Apr 19","install":{"commands":["npm install permissionless"],"cli":null},"imports":["import { createSmartAccountClient } from 'permissionless';","import { createBundlerClient } from 'permissionless';","import type { UserOperation } from 'permissionless/types';"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import { createPublicClient, http, privateKeyToAccount, Address } from 'viem';\nimport { optimismSepolia } from 'viem/chains';\nimport { createBundlerClient, createSmartAccountClient, createPimlicoPaymasterClient, ENTRYPOINT_ADDRESS_V07, signerToSimpleSmartAccount } from 'permissionless';\nimport { type UserOperation } from 'permissionless/types';\n\nconst privateKey = (process.env.PRIVATE_KEY as `0x${string}`) || '0x...'; // Replace with your private key\nconst pimlicoRpcUrl = process.env.PIMLICO_RPC_URL || 'https://api.pimlico.io/v2/optimism-sepolia/rpc?apikey=YOUR_PIMLICO_API_KEY';\n\nconst chain = optimismSepolia;\nconst publicClient = createPublicClient({\n  chain,\n  transport: http(chain.rpcUrls.default.http[0]),\n});\n\nconst bundlerClient = createBundlerClient({\n  chain,\n  transport: http(pimlicoRpcUrl),\n  entryPoint: ENTRYPOINT_ADDRESS_V07\n});\n\nconst paymasterClient = createPimlicoPaymasterClient({\n  chain,\n  transport: http(pimlicoRpcUrl),\n  entryPoint: ENTRYPOINT_ADDRESS_V07\n});\n\nasync function sendSimpleUserOperation() {\n  const signer = privateKeyToAccount(privateKey);\n\n  const simpleSmartAccountClient = await signerToSimpleSmartAccount(publicClient, {\n    signer,\n    entryPoint: ENTRYPOINT_ADDRESS_V07,\n    factoryAddress: '0x9406Cc6185a346906296840746125a0E447645E4' // Example SimpleAccountFactory\n  });\n\n  const smartAccountClient = createSmartAccountClient({\n    account: simpleSmartAccountClient,\n    chain,\n    transport: http(pimlicoRpcUrl),\n    entryPoint: ENTRYPOINT_ADDRESS_V07\n  });\n\n  console.log(`Smart account address: ${smartAccountClient.account.address}`);\n\n  const userOperation = await smartAccountClient.prepareUserOperation({\n    userOperation: {\n      callData: await smartAccountClient.account.encodeCallData({\n        to: smartAccountClient.account.address,\n        value: 0n,\n        data: '0x'\n      })\n    },\n    sponsorUserOperation: async ({ userOperation }) => {\n      return paymasterClient.sponsorUserOperation({\n        userOperation,\n        entryPoint: ENTRYPOINT_ADDRESS_V07\n      });\n    }\n  });\n\n  // For demonstration, not actually sending a transaction\n  console.log('Prepared UserOperation:', userOperation);\n\n  // To send, uncomment:\n  // const userOpHash = await smartAccountClient.sendUserOperation({\n  //   userOperation: userOperation,\n  //   entryPoint: ENTRYPOINT_ADDRESS_V07\n  // });\n  // console.log(`UserOperation sent, hash: ${userOpHash}`);\n  // const receipt = await bundlerClient.waitForUserOperationReceipt({ hash: userOpHash });\n  // console.log('UserOperation receipt:', receipt);\n}\n\nsendSimpleUserOperation().catch(console.error);\n","lang":"typescript","description":"Demonstrates setting up `viem` and `permissionless` clients, creating a simple smart account, preparing a user operation with paymaster sponsorship, and logging the prepared UserOperation.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":null}