Skip to content

Interacting with an existing contract (from the browser)

Lets say we want to interact with the USDT contract - https://etherscan.io/address/0xdac17f958d2ee523a2206206994597c13d831ec7

It has a function called totalSupply

Screenshot 2024-12-27 at 3.13.14 PM.png

How can we call this function from a frontend?

Steps

  • Initialise empty react project
npm create vite@latest
  • Install wagmi
yarn add wagmi viem@2.x @tanstack/react-query
  • Create config.ts
import { http, createConfig } from 'wagmi'
import { mainnet } from 'wagmi/chains'
export const config = createConfig({
chains: [mainnet],
transports: {
[mainnet.id]: http(),
},
})
  • Add wagmi provider
import { WagmiProvider } from 'wagmi'
import { config } from './config'
function App() {
return <WagmiProvider config={config}>
</WagmiProvider>
}
export default App
  • Setup tanstack query
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { WagmiProvider } from 'wagmi'
import { config } from './config'
const queryClient = new QueryClient()
function App() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
</QueryClientProvider>
</WagmiProvider>
)
}
export default App;
import { http, createConfig } from 'wagmi'
import { mainnet } from 'wagmi/chains'
import { injected, metaMask } from 'wagmi/connectors'
export const config = createConfig({
chains: [mainnet, base],
connectors: [
injected(),
metaMask(),
],
transports: {
[mainnet.id]: http(),
},
})
  • Create wallet-options.tsx
import * as React from 'react'
import { Connector, useConnect } from 'wagmi'
export function WalletOptions() {
const { connectors, connect } = useConnect()
return connectors.map((connector) => (
<button key={connector.uid} onClick={() => connect({ connector })}>
{connector.name}
</button>
))
}
  • Create Account.tsx
import { useAccount, useDisconnect, useEnsAvatar, useEnsName } from 'wagmi'
export function Account() {
const { address } = useAccount()
const { disconnect } = useDisconnect()
const { data: ensName } = useEnsName({ address })
const { data: ensAvatar } = useEnsAvatar({ name: ensName! })
return (
<div>
{ensAvatar && <img alt="ENS Avatar" src={ensAvatar} />}
{address && <div>{ensName ? `${ensName} (${address})` : address}</div>}
<button onClick={() => disconnect()}>Disconnect</button>
</div>
)
}
  • Update App.tsx
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { WagmiProvider, useAccount } from 'wagmi'
import { config } from './config'
import { Account } from './account'
import { WalletOptions } from './wallet-options'
const queryClient = new QueryClient()
function ConnectWallet() {
const { isConnected } = useAccount()
if (isConnected) return <Account />
return <WalletOptions />
}
function App() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<ConnectWallet />
</QueryClientProvider>
</WagmiProvider>
)
}
export default App;

Screenshot 2024-12-27 at 3.34.12 PM.png