Skip to main content


We have added support for several wallets from the @thirdweb-dev/wallets package.

Below we'll show how to use them with our ThirdwebProvider.

Adding the wallets to the ThirdwebProvider

import {
} from "@thirdweb-dev/react-native";

const App = () => {
return (
name: "Example App",
description: "This is an example app",
logoUrl: "",
url: "",
supportedWallets={[metamaskWallet(), trustWallet(), localWallet()]}
<AppInner />

By default, supportedWallets will have rainbowWallet and metamaskWallet since these two are the easiest to configure.

Configuring wallets

MetaMask, Rainbow and Trust wallets

These wallets are implementations of Wallet Connect V1 and V2. The dAppMeta prop passed in the ThirdwebProvider above will be used when connecting to the wallets to show your app's information.

For more information on these wallets config, please see their base WalletConnectV1 and WalletConnectV2 specific info:

MetaMask and Rainbow are extensions of WalletConnectV1 since they have not added support for WC V2 and Trust is an extension of WalletConnectV2, this means that you can call:

metamaskWallet(config); // this config is the same as the one for wallet connect v1
rainbowWallet(config); // this config is the same as the one for wallet connect v1

trustWallet(config); // this config is the same as the one for wallet connect v2

Coinbase Wallet

To configure the Coinbase Wallet you need to follow the steps outlined in their Setup Guide. A few caveats before going through the guide:

  1. For Android, you only need to declare the <queries> tag in the AndroidManifest.xml if your app targets Android 11 (API level 30)
  2. For iOS, you need to setup UniversalLinks to allow the wallet to communicate back to your app, otherwise the wallet will not redirect you back to the app. You can pass your app's UniversalLink when you create the Coinbase Wallet:
import { coinbaseWallet } from "@thirdweb-dev/react-native";

const App = () => {
return (
callbackURL: new URL(""),
<AppInner />

Local Wallet

The local wallet works mostly the same as the web version, below we outline the key differences:


storage (optional)

This is the storage used for storing the private key, mnemonic or encrypted JSON. On React Native we need this storage to be encrypted since we store the private key to be able to recover your wallet for reconnections.

You can use any implementation of encrypted storage you want, as long as it conforms 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>;

If omitted, it defaults to Expo Secure Store, which stores the private key in your device in encrypted storage. We expose the createSecureStorage(name: string) utility function which creates a SecureStore instance that conforms to our AsyncStorage interface (see it in our GitHub)


import { createSecureStorage, LocalWallet } from "@thirdweb-dev/react-native";

const walletWithOptions = new LocalWallet(
storage: createSecureStorage("my-wallet"),

Smart Wallet

See our Smart Wallet documentation for a more comprehensive description of the mandatory fields of this wallet. Here we'll just describe what's needed to connect your wallet to any dApp.

Connect to a dApp

We have added extra configuration parameters to be able to connect to any dApp. Before you can use this feature of Smart Wallet you need to configure your app to support the camera usage to be able to scan WalletConnect QR codes:

yarn add react-native-camera && cd ios && pod install

Add the following code to your android/app/build.gradle file:

missingDimensionStrategy 'react-native-camera', 'general'
defaultConfig {
applicationId ""
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
missingDimensionStrategy 'react-native-camera', 'general'

Add the NSCameraUsageDescription in your Info.plist file to explain why your app needs to use the Camera. Example:

<string>The app uses the camera to scan QR codes</string>

After adding the camera package, you are ready to use the feature!


The following configuration enables Connect to App behavior in React Native:


Adds a UI component to the SmartWallet connected dialog to be able to scan a WalletConnect QR code or input a WalletConnect (wc://) uri.

Defaults to false.

import { Mumbai } from '@thirdweb-dev/chains';
import { ThirdwebProvider, metamaskWallet, smartWallet } from '@thirdweb-dev/react-native';


factoryAddress: "..."
thirdwebApiKey: "apiKey"
gasless: true,
personalWallets: [localWallet()],
enableConnectApp: true,

You can choose the WalletConnect version to support. Either 'v1' or 'v2'.

Defaults to 'v2'.

Note that WalletConnect v1 is no longer maintained and will be shutdown on June 28th, 2023


The WalletConnect V2 projectId. You can get one in the WalletConnect docs.

Defaults to a common projectId set by thirdweb. This should be ok for testing but note that if you want to deploy your mobile app it may make sense to create your own as WalletConnect may throttle traffic comming from the same projectId.


Define a custom Relay Server URL. Defaults to "wss://"


Metadata that will be displayed in the dApp once your SmartWallet is connected to it.

name: string; // defaults to: "Thirdweb Smart Wallet",
description: string; // defaults to: "Thirdweb Smart Wallet",
url: string: // defaults to: "",
icons: string[]; // defaults to: [""],

Synchronous storage needed by WalletConnect V2.

Defaults to synchronous storage implemented with MMKV.

Email/Phone Number Wallet

We implemented this feature using the Magic SDK.

Add Magic's dependencies

The @magic-sdk has a few dependencies you need to add to your app before using the SDK in React Native. For convenience you can run:

yarn add react-native-safe-area-context react-native-webview react-native-device-info && cd ios && pod install

which will install the following dependencies:

You also need a Magic api-key to pass it as part of the wallet config.

Using the new wallet

We suggest you add magicWallet as the first wallet in your supportedWallets list since the UI for it is a TextInput field:

import { Goerli } from '@thirdweb-dev/chains';
import { ThirdwebProvider, magicWallet, metamaskWallet } from '@thirdweb-dev/react-native';


apiKey: 'magic_api_key',

Building your own wallet

With our @thirdweb-dev/wallets sdk you can build your own wallets and integrate it into our ConnectWallet button. You can see how to build one in the Building a Wallet section of our wallets documentation.

Built-in wallets

You can look at how the built-in wallets in the @thirdweb-dev/react-native package are implemented for reference: