Skip to content

Fireblocks

Fireblocks is an enterprise grade MPC wallet provider providing industry's most secure custodial and non-custodial wallets. Fireblocks has created a multi-layer security matrix that layers MPC, secure enclaves, our signature Policy Engine, and an asset transfer network to provide the strongest software and hardware defense available against evolving attack vectors.

Fireblocks' security structure provides a truly secure environment for storing, transferring, and issuing digital assets. This ensures that your assets are protected from cyberattacks, internal colluders, and human errors. As a result, Fireblocks serves as the foundation for thousands of digital asset businesses and has securely transferred over $3T in digital assets.

Fireblocks' MPC wallets are EOA accounts, which in any account abstraction enabled wallet is the root of their security & trust model. Using Fireblocks MPC based EOA wallets in combination with the Account Kit will give you the best of both worlds; Enterprise grade security for securing your off-chain key material, and the utmost flexibility of your on-chain smart accounts.

Integration

Install the Fireblocks Web3 Provider

Using FireblocksSigner in the aa-signers package requires installation of the @fireblocks/fireblocks-web3-provider SDK. aa-signers lists it as optional dependency.

bash
npm i -s @fireblocks/fireblocks-web3-provider
bash
yarn add @fireblocks/fireblocks-web3-provider

Note

Due to how Fireblocks parses a private key in their SDK, you must specific the private key in PEM Format if you chose to use FireblocksSigner in your app's client. Otherwise, if you choose FireblocksSigner in your app's server, you can also specify a path to a file containing your private key.

Create a SmartAccountSigner

Next, setup the Fireblocks SDK and create an authenticated FireblocksSigner using the aa-signers package:

ts
import { FireblocksSigner } from "@alchemy/aa-signers/fireblocks";
import { ChainId } from "@fireblocks/fireblocks-web3-provider";

export const createFireblocksSigner = async () => {
  const fireblocksSigner = new FireblocksSigner({
    privateKey: process.env.FIREBLOCKS_API_PRIVATE_KEY_PATH!,
    apiKey: process.env.FIREBLOCKS_API_KEY!,
    vaultAccountIds: process.env.FIREBLOCKS_VAULT_ACCOUNT_IDS,
    chainId: ChainId.SEPOLIA,
  });

  await fireblocksSigner.authenticate();

  return fireblocksSigner;
};

Use it with Modular Account

Let's see it in action with aa-alchemy:

ts
import { createModularAccountAlchemyClient } from "@alchemy/aa-alchemy";
import { sepolia } from "@alchemy/aa-core";
import { createFireblocksSigner } from "./fireblocks";

const chain = sepolia;
const provider = await createModularAccountAlchemyClient({
  apiKey: "ALCHEMY_API_KEY",
  chain,
  signer: await createFireblocksSigner(),
});
ts
import { FireblocksSigner } from "@alchemy/aa-signers/fireblocks";
import { ChainId } from "@fireblocks/fireblocks-web3-provider";

export const createFireblocksSigner = async () => {
  const fireblocksSigner = new FireblocksSigner({
    privateKey: process.env.FIREBLOCKS_API_PRIVATE_KEY_PATH!,
    apiKey: process.env.FIREBLOCKS_API_KEY!,
    vaultAccountIds: process.env.FIREBLOCKS_VAULT_ACCOUNT_IDS,
    chainId: ChainId.SEPOLIA,
  });

  await fireblocksSigner.authenticate();

  return fireblocksSigner;
};