Skip to main content

Safe (Gnosis)

Prompt users to connect to your app with their Safe wallet.

To connect to a safe wallet, a personal wallet must first be connected.

Usage

import { CoinbaseWallet, SafeWallet } from "@thirdweb-dev/wallets";
import { Ethereum } from "@thirdweb-dev/chains";

// First, connect the personal wallet
const personalWallet = new CoinbaseWallet();
await personalWallet.connect();

// Then, connect the Safe wallet
const wallet = new SafeWallet();
await wallet.connect({
personalWallet: personalWallet,
chain: Ethereum,
safeAddress: "{{contract_address}}",
});

Configuration

Optionally, provide a configuration object when instantiating the SafeWallet class.

clientId (recommended)

Provide clientId to use the thirdweb RPCs for given chains

You can create a client ID for your application from thirdweb dashboard.

chains

Provide an array of chains you want to support.

Must be an array of Chain objects, from the @thirdweb-dev/chains package.

Defaults to our default chains.

import { SafeWallet } from "@thirdweb-dev/wallets";
import { Ethereum } from "@thirdweb-dev/chains";

const walletWithOptions = new SafeWallet(
{
chains: [Ethereum],
},
);
dappMetadata

Information about your app that the wallet will display when your app tries to connect to it.

Must be an object containing name, url, description and logoUrl properties.

import { SafeWallet } from "@thirdweb-dev/wallets";

const walletWithOptions = new SafeWallet({
dappMetadata: {
name: "thirdweb powered dApp",
url: "https://thirdweb.com",
description: "thirdweb powered dApp",
logoUrl: "https://thirdweb.com/favicon.ico",
},
});
walletStorage

Some wallets need to store data in persistent storage. This is the storage that will be used for that.

Must be an object conforming to the AsyncStorage interface:

export interface AsyncStorage {
getItem(key: string): Promise<string | null>;
setItem(key: string, value: string): Promise<void>;
removeItem(key: string): Promise<void>;
}

Example:

import { SafeWallet } from "@thirdweb-dev/wallets";

const walletWithOptions = new SafeWallet(
{
walletStorage: {
getItem: (key) => {
// Implement your own storage logic here
},
removeItem: (key) => {
// Implement your own storage logic here
},
setItem: (key, value) => {
// Implement your own storage logic here
},
},
},
);
walletId

An ID for the wallet used to store the wallet in the walletStorage.

import { SafeWallet } from "@thirdweb-dev/wallets";

const walletWithOptions = new SafeWallet(
{
walletId: "wallet-id",
},
);

Methods

Inherits all the public methods from the AbstractClientWallet class.

connect

Prompt the user to connect their wallet to your app.

Note: A personal wallet must be connected before connecting to a Safe wallet.

import { CoinbaseWallet, SafeWallet } from "@thirdweb-dev/wallets";
import { Ethereum } from "@thirdweb-dev/chains";

// First, connect the personal wallet
const personalWallet = new CoinbaseWallet();
await personalWallet.connect();

// Then, connect the Safe wallet
const wallet = new SafeWallet();
await wallet.connect({
personalWallet: personalWallet, // Wallet that can sign transactions on the Safe
chain: Ethereum, // Chain that the Safe is on
safeAddress: "{{contract_address}}", // Smart contract address of the Safe
});
Configuration

personalWallet

The instance of a personal wallet that can sign transactions on the Safe.

Must be of type EVMWallet such as CoinbaseWallet or MetamaskWallet.

chain

The chain that the Safe smart contract is deployed to.

Must be a Chain object, from the @thirdweb-dev/chains package.

safeAddress

Smart contract address of the Safe wallet.

Must be a string.

Return Value

Returns a string containing the wallet address, or throws and error if connection failed.

string;