Web3Modal SDK & Wagmi
Installation
- npm
- Yarn
- pnpm
npm install @web3modal/ethers5 ethers@5.7.2
yarn add @web3modal/ethers5 ethers@5.7.2
pnpm add @web3modal/ethers5 ethers@5.7.2
Usage
On top of your app set up the following configuration, making sure that all functions are called outside any React component to avoid unwanted rerenders.
import { createWeb3Modal, defaultConfig } from '@web3modal/ethers5/react'
// 1. Get a Project ID from https://cloud.walletconnect.com/
const projectId = 'YOUR_PROJECT_ID'
// 2. Set chains
const celo = {
chainId: 42220,
name: 'Celo',
currency: 'CELO',
explorerUrl: 'https://explorer.celo.org/mainnet',
rpcUrl: 'https://forno.celo.org'
}
const alfajores = {
chainId: 44787,
name: 'Alfajores',
currency: 'CELO',
explorerUrl: 'https://explorer.celo.org/alfajores',
rpcUrl: 'https://alfajores-forno.celo-testnet.org'
}
// 3. Create modal
const metadata = {
name: 'My Celo App',
description: 'My Website description',
url: 'https://mywebsite.com',
icons: ['https://avatars.mywebsite.com/']
}
createWeb3Modal({
ethersConfig: defaultConfig({ metadata }),
chains: [celo, alfajores],
defaultChain: celo,
projectId
})
export default function App() {
return <YourApp/>
}
Use the <w3m-button />
web component anywhere in your app to open the wallet modal.
export default function ConnectButton() {
return <w3m-button />
}
info
Web components are global html elements that don't require importing.
Smart Contracts interaction
import { useWeb3ModalSigner, useWeb3ModalAccount } from '@web3modal/ethers5/react'
import { ethers } from 'ethers'
const USDTAddress = '0x617f3112bf5397D0467D315cC709EF968D9ba546'
// The ERC-20 Contract ABI, which is a common contract interface
// for tokens (this is the Human-Readable ABI format)
const USDTAbi = [
// Some details about the token
"function name() view returns (string)",
"function symbol() view returns (string)",
// Get the account balance
"function balanceOf(address) view returns (uint)",
// Send some of your tokens to someone else
"function transfer(address to, uint amount)",
// An event triggered whenever anyone transfers to someone else
"event Transfer(address indexed from, address indexed to, uint amount)"
];
function Components() {
const { address, chainId, isConnected } = useWeb3ModalAccount()
const { signer } = useWeb3ModalSigner()
async function getBalance(){
if(!isConnected) throw Error("User disconnected")
// The Contract object
const USDTContract = new ethers.Contract(USDTAddress, USDTAbi, signer)
const USDTBalance = await USDTContract.balanceOf(address)
console.log(ethers.utils.formatUnits(USDTBalance, 18))
}
return (
<button onClick={getBalance}>Get User Balance</button>
)
}