Skip to main content

Upgrade Guide

Web3Modal v5 to Reown AppKit - Web | Solana

This guide will help you migrate from Web3Modal v5 using Solana to the latest Reown AppKit.

Find here all the upgrades guides:

Installation

To upgrade from Web3Modal v5 to Reown AppKit, start by removing the Web3Modal v5 dependency @web3modal/solana.

npm uninstall @web3modal/solana

Next, install the Reown AppKit and Solana wallet adapter packages.

npm install @reown/appkit @reown/appkit-adapter-solana @solana/wallet-adapter-wallets

Implementation

Make sure you update the imports in your codebase to reflect the new package names.

- import { createWeb3Modal, defaultSolanaConfig, useWeb3ModalAccount, useWeb3ModalProvider } from '@web3modal/solana/react'
- import { solana, solanaTestnet, solanaDevnet } from '@web3modal/solana/chains'

+ import { solana, solanaTestnet, solanaDevnet } from '@reown/appkit/networks'
+ import { createAppKit } from '@reown/appkit/react'
+ import { SolanaAdapter } from '@reown/appkit-adapter-solana/react'
+ import { PhantomWalletAdapter, SolflareWalletAdapter } from '@solana/wallet-adapter-wallets'

Now, set up the Solana Adapter and the modal.

The chains property is now networks in Reown AppKit. You should import them from @reown/appkit/networks package instead of importing these networks other packages.

The metadata and the projectId are the same as before.

- const solanaConfig = defaultSolanaConfig({ ... });
- createWeb3Modal( ... });

+ const solanaAdapter = new SolanaAdapter({
+ wallets: [new PhantomWalletAdapter(), new SolflareWalletAdapter()]
+ })

+ const modal = createAppKit({
+ projectId,
+ metadata,
+ networks: [solana, solanaTestnet, solanaDevnet],
+ adapters: [solanaAdapter],
+ })

Trigger the modal

- import { useWeb3Modal } from '@web3modal/wagmi/react'
+ import { useAppKit } from '@reown/appkit/react'

function HomePage() {
const { open } = useAppKit()

return <button onClick={open}>Connect</button>
}

Learn more about Reown AppKit here

Properties

As you may have noticed, some of the properties of Web3Modal have changed as a consequence of the migration to Reown AppKit.

adapters

The adapters property is a new property that is an array of adapters that can be initialized.

networks

The chains property is now networks in Reown AppKit. You should import them from @reown/appkit/networks package instead of importing these networks from viem or other packages.

defaultNetwork

The defaultChain property is now defaultNetwork in Reown AppKit. This is a network object that specifies the default network for your Web3 app.

Utility Functions

The following methods are still available with the same nomenclature as before:

modal.getAddress()

This returns the connected address.

note

It returns the active namespace's address.

Example: You’ve initialized both the Wagmi and Solana adapters and connected to a dApp with an EVM-only wallet (e.g., Rainbow). In this case, the Solana adapter is still not connected. When your active network is one of the EVM chains, the address will return your wallet address. However, if you manually switch to the Solana network, the address will return undefined (unless you connect to a Solana wallet).

modal.getError()

This returns the error values.

modal.getChainId()

Returns the active network's chainId

note

In versions prior to v5, which were single-chain, getChainId() returned a single type rather than multiple types:

  • @web3modal/wagmi (along with ethers and ethers5) returned number | undefined.
  • @web3modal/solana returned string | undefined.

Now, in Reown AppKit, since both chains can be connected simultaneously, the type definition is number | string | undefined.

modal.switchNetwork(network)

This switches the active network to the different network being passed.

note

Unlike in v5, modal.switchNetwork takes the chain object as parameter rather than the chain id.

  • (v5) - switchNetwork(103) -> switches the chain to Solana Devnet as we are passing Solana Devnet's chain id.
  • (Reown AppKit v1) - switchNetwork(solanaDevnet) -> solanaDevnet is imported from @reown/appkit/networks.
modal.switchNetwork(103)
import { solanaDevnet } from '@reown/appkit/networks'
modal.switchNetwork(solanaDevnet)

modal.getIsConnected()

This returns if the selected network adapter is connected or not.

note

It returns the active namespace's connection status as a boolean.

Example: You've initialized both the Wagmi and Solana adapters and connected to the dApp with an EVM-only wallet (e.g., Rainbow). In this case, the Solana adapter is still not connected. When you manually switch to the Solana network from the network selection list, you will see a disconnected state because the Solana adapter cannot use Rainbow's connection. As a result, it will prompt you to connect with a Solana wallet.

modal.getWalletProvider()

This returns the active connection provider.

modal.getWalletProviderType()

This returns the active connection provider type.

modal.subscribeProvider(callback)

This is a listener that detects changes to the AppKit state, such as address, chainId, isConnected, provider, and providerType.

  • address - It returns the connected wallet address. The value returned is the same as modal.getAddress()
  • chainId - It returns the active network’s chainId . The value returned is the same as modal.getChainId()
  • isConnected - It returns if the selected network adapter is connected. The value returned is the same as modal.getIsConnected()
  • provider - It returns the active connection provider. The value returned is the same as modal.getWalletProvider()
  • providerType - It returns the active connection provider type. The value returned is the same as modal.getWalletProviderType()

The following methods and listeners are exactly the same and do not have any specific details related to the multiple chains feature.

  • modal.getState - it returns the modal state
    • open - it returns boolean that indicates if the modal is open or not
    • selectedNetworkId - it returns active network’s id
  • modal.subscribeState
  • modal.setThemeMode
  • modal.getThemeMode
  • modal.setThemeVariables
  • modal.getThemeVariables
  • modal.subscribeTheme
  • modal.getEvent
  • modal.subscribeEvents