Skip to content

How to use a Fireblocks signer with permissionless.js

Fireblocks is a user-friendly platform designed for building blockchain-based products and managing digital asset operations. It uses a direct custody approach, combining high performance with zero counterparty risk and multi-layered security. The platform includes secure MPC-based digital asset wallets, a policy engine for governance and transaction rules, and comprehensive treasury management. Fireblocks' security framework features multiple layers, including MPC-CMP technology, secure enclaves, and a robust policy engine, ensuring protection against cyberattacks, internal threats, and human errors. It's widely used for various operations like treasury, trading, and managing NFTs, smart contracts, and user wallets.

Setup

To use Fireblocks with permissionless.js, first create an application that integrates with Fireblocks.

  • Refer to the Fireblocks documentation site for instructions on setting up an application with the Fireblocks.
  • For a quick start, Fireblocks provides a guide, available here.

Integration

Integrating permissionless.js with Fireblocks is straightforward after setting up the project. Fireblocks provides an Externally Owned Account (EOA) wallet to use as a signer with permissionless.js accounts.

Create the Fireblocks object

After following the Fireblocks documentation, you will have access to a FireblocksWeb3Provider object as shown below which you can use to create a SmartAccountSigner object:

import {
	ChainId,
	FireblocksWeb3Provider,
	type FireblocksProviderConfig,
} from "@fireblocks/fireblocks-web3-provider"
import { providerToSmartAccountSigner } from "permissionless"
 
// Config options here will be specific to your project.  See the Fireblocks docs for more info.
const fireblocksProviderConfig: FireblocksProviderConfig = {
	apiKey: process.env.FIREBLOCKS_API_KEY,
	privateKey: process.env.FIREBLOCKS_API_PRIVATE_KEY_PATH,
	chainId: ChainId.SEPOLIA,
}
const fireblocksWeb3Provider = new FireblocksWeb3Provider(fireblocksProviderConfig)
 
// Convert the FireblocksWeb3Provider to a SmartAccountSigner
const smartAccountSigner = providerToSmartAccountSigner(fireblocksWeb3Provider)

Use with permissionless.js

SimpleAccount
import { signerToSimpleSmartAccount } from "permissionless/accounts"
import { createPimlicoBundlerClient, createPimlicoPaymasterClient } from "permissionless/clients/pimlico"
import { createPublicClient, http } from "viem"
import { generatePrivateKey, privateKeyToAccount } from "viem/accounts"
import { sepolia } from "viem/chains"
 
const pimlicoRpcUrl = `https://api.pimlico.io/v2/sepolia/rpc?apikey=<api-key>`
 
const pimlicoPaymaster = createPimlicoPaymasterClient({
    transport: http(pimlicoRpcUrl),
    entryPoint: ENTRYPOINT_ADDRESS_V06
})
 
const bundlerClient = createPimlicoBundlerClient({
    transport: http(pimlicoRpcUrl),
    entryPoint: ENTRYPOINT_ADDRESS_V06,
})
 
const publicClient = createPublicClient({
	transport: http("https://rpc.ankr.com/eth_sepolia"),
	chain: sepolia,
})
 
const smartAccount = await signerToSimpleSmartAccount(publicClient, {
	signer: smartAccountSigner,
	entryPoint: ENTRYPOINT_ADDRESS_V06,
})
 
const smartAccountClient = createSmartAccountClient({
	account: smartAccount,
	entryPoint: ENTRYPOINT_ADDRESS_V06,
	chain: sepolia, // or whatever chain you are using
	bundlerTransport: http(pimlicoRpcUrl, {
		timeout: 30_000 // optional
	}),
	middleware: {
		gasPrice: async () => (await bundlerClient.getUserOperationGasPrice()).fast,
		sponsorUserOperation: pimlicoPaymaster.sponsorUserOperation,
	},
})