Introduction

Safe Smart Accounts is a product by Safe (formerly Gnosis Safe) that enables the creation of ERC-4337-compatible smart accounts for your users. This integration allows you to leverage the power of Account Abstraction and other Safe features within your Para-powered application.

Safe Smart Accounts use the user’s Externally Owned Account (EOA) as the smart account’s signer. This builds upon the robust smart contract infrastructure that powers the widely-used Safe wallet.

Understanding EOAs and Smart Accounts

In this integration:

  • The user’s EOA (from Para) serves as the signer for their smart wallet (from Safe).
  • The smart wallet (Safe) holds all assets and submits transactions to the network.
  • The signer (Para) is responsible for producing signatures and initiating transaction flows.

Integration Steps

To create Safe smart accounts for your users with Para, follow these steps:

1

Install Dependencies

First, install the necessary dependencies:

npm install @getpara/viem-v2-integration viem @safe-global/protocol-kit @safe-global/api-kit @safe-global/safe-core-sdk-types
2

Import Required Modules

Import the necessary modules in your project:

import { createParaViemClient } from '@getpara/viem-v2-integration';
import { http, createPublicClient } from 'viem';
import { sepolia } from 'viem/chains';
import Safe, { EthersAdapter } from '@safe-global/protocol-kit';
import { SafeAccountConfig } from '@safe-global/safe-core-sdk-types';
3

Initialize Para VIEM Client

Set up the Para VIEM client:

const paraViemClient = createParaViemClient(para, {
  chain: sepolia, // Replace with your desired chain
  transport: http('https://rpc.sepolia.org'), // Replace with your RPC URL
});
4

Create Safe Account Configuration

Define the configuration for the Safe account:

const safeAccountConfig: SafeAccountConfig = {
  owners: [await paraViemClient.account.address],
  threshold: 1,
};
5

Initialize Safe SDK

Create an instance of the Safe SDK:

const ethAdapter = new EthersAdapter({
  ethers: paraViemClient,
  signerOrProvider: paraViemClient.account,
});

const safeSdk = await Safe.create({ ethAdapter, safeAccountConfig });
6

Deploy Safe Smart Account

Deploy the Safe smart account:

const safeAddress = await safeSdk.getAddress();
const safeTransaction = await safeSdk.createTransaction({ safeTransactionData: [] });
const safeTxHash = await safeSdk.getTransactionHash(safeTransaction);
const senderSignature = await safeSdk.signTransactionHash(safeTxHash);
await safeSdk.executeTransaction(safeTransaction, senderSignature);
7

Interact with the Safe Smart Account

Now you can interact with the Safe smart account using the Para VIEM client:

// Example: Send a transaction through the Safe smart account
const transaction = await paraViemClient.sendTransaction({
  account: safeAddress,
  to: '0x...',  // Recipient address
  value: 1000000000000000000n,  // 1 ETH in wei
});

console.log('Transaction hash:', transaction);