เริ่มต้นใช้งาน Wagmi

วันนี้เราจะรู้จัก wagmi wagmi เป็น hook ที่รวบรวม ทุกๆอย่างที่เกี่ยวข้องกับ ethreme ทำให้เราสามารถใช้งานได้ง่ายขึ้น ไม่ว่าจะเป็นการ "Connect Wallet" การแสดงข้อมูล ENS และ balance, การ sign messages และ interact กับ contracts

ซึ่งวันนี้เราจะมาสอนเรื่องการต่อ Connect Wallet แบบคร่าวๆ กัน

ขั้นตอนแรก การ  install wagmi

npm i wagmi viem
pnpm i wagmi viem
yarn add wagmi viem

หลังจากที่เรา install package wagmi กันเเล้ว เราจะเริ่มต้นทีการ config

โดยที่เราจะไปที่ App.tsx เราสามารถเลือก chain ที่เราจะใช้ในการ connect ได้ ในที่นี้ขอยกตัวอย่างของการเชื่อมกับ chain optimism กับ  optimismGoerli กัน

import { configureChains } from '@wagmi/core'
import { optimism, optimismGoerli } from '@wagmi/core/chains'
import { publicProvider } from '@wagmi/core/providers/public'
import { useState } from 'react'
import { WagmiConfig, createConfig } from 'wagmi'

import './App.css'

const { publicClient } = configureChains(
  [optimism, optimismGoerli],
  [publicProvider()]
)
const config = createConfig({
  autoConnect: true,
  publicClient: publicClient,
})

function App() {
  return (
    <WagmiConfig config={config}>
			{...}
    </WagmiConfig>
  )
}
export default App

จากนั้นเราจะสร้าง ปุ่มสำหรับการ connect กับ  wallet ของเรากัน

import { useAccount, useConnect, useDisconnect } from 'wagmi'
import { InjectedConnector } from 'wagmi/connectors/injected'

export default function ConnectWallet() {
  const { address, isConnected } = useAccount()
  const { connect } = useConnect({
    connector: new InjectedConnector(),
  })
  const { disconnect } = useDisconnect()

  if (isConnected)
    return (
      <div>
        Connected to {address}
        <button onClick={() => disconnect()}>Disconnect</button>
      </div>
    )
  return <button onClick={() => connect()}>Connect Wallet</button>
}
import { configureChains } from '@wagmi/core'
import { optimism, optimismGoerli } from '@wagmi/core/chains'
import { publicProvider } from '@wagmi/core/providers/public'
import { WagmiConfig, createConfig } from 'wagmi'
import './App.css'
import ConnectWallet from './ConnectWallet'

const { publicClient } = configureChains(
  [optimism, optimismGoerli],
  [publicProvider()]
)
const config = createConfig({
  autoConnect: true,
  publicClient: publicClient,
})

function App() {
  return (
    <WagmiConfig config={config}>
      <ConnectWallet />
    </WagmiConfig>
  )
}

export default App

จากนั้น เราก็จะได้หน้าตาแบบนี้

ตอนนี่เราก็สามารถต่อกับ wallet ของเราได้สำเร็จเเล้ว

แต่ว่า พอเราเชื่อมต่อเเล้ว Wallet ของเราไม่ได้ switch chain ให้  เป็น optimism ขั้นตอนต่อไปนี้จะเป็นการให้ Wallet ทำการ switch chain แล้วเพิ่ม chain เข้าไปกัน

แล้วเราจะทำการเปลี่ยน InjectedConnector เป็น metamask กัน

เราก็จะมาแก้ในส่วนของ config เรานิดหน่อย

ในการเพิ่ม supportChains เเล้วทำการ export const ไป  เพราะ เราต้องใช้การกันหลายที่เลย

import { optimism, optimismGoerli } from '@wagmi/core/chains'
import { publicProvider } from '@wagmi/core/providers/public'
import { configureChains, createConfig, WagmiConfig } from 'wagmi'
import { MetaMaskConnector } from 'wagmi/connectors/metaMask'
import './App.css'
import SwitchChain from './CheckChain'
import ConnectWallet from './ConnectWallet'

export const suportChains = [optimism, optimismGoerli]

const { chains, publicClient } = configureChains(
  suportChains,
  [publicProvider()]
)

const config = createConfig({
  autoConnect: true,
  publicClient,
  connectors: [
    new MetaMaskConnector({
      chains,
    }),
  ],
})

function App() {
  return (
    <WagmiConfig config={config}>
      <ConnectWallet />
      <SwitchChain />
    </WagmiConfig>
  )
}

export default App

ในส่วนของ connect Wallet พอเราเลือก  MetaMaskConnector เป็นตัว connector เเล้ว เราจะทำการโยน suportChains เพื่อให้ เมื่อเราทำการกด Switch chain เมื่อ Metamask เราไม่มี chain นั้นจะให้เราเพิ่ม chain เข้าไปใน wallet ของเรา

import { useAccount, useConnect, useDisconnect } from 'wagmi'
import { MetaMaskConnector } from 'wagmi/connectors/metaMask'
import { suportChains } from './App'

export default function ConnectWallet() {
  const { address, isConnected } = useAccount()
  const { connect } = useConnect({
    connector: new MetaMaskConnector({
      chains: suportChains,
      options: {
        shimDisconnect: true,
      },
    }),
  })
  const { disconnect } = useDisconnect()

  if (isConnected)
    return (
      <div>
        Connected to {address}
        <button onClick={() => disconnect()}>Disconnect</button>
      </div>
    )
  return <button onClick={() => connect()}>Connect Wallet</button>
}

ส่วนของการเปลี่ยน check chain กัน

import { useAccount, useNetwork, useSwitchNetwork } from 'wagmi'
import { suportChains } from './App'

export default function SwitchChain() {
  const { chain } = useNetwork()
  const { address } = useAccount()
  const { error, isLoading, pendingChainId, switchNetworkAsync } =
    useSwitchNetwork()
  const isNotSupport = !(
    chain &&
    suportChains &&
    suportChains.map((x) => x.id as number).includes(chain.id)
  )
  if (!address) {
    return null
  }
  return (
    <div>
      {isNotSupport
        ? 'Please Switch network'
        : chain && <div>Connected to {chain.name}</div>}

      {suportChains.map((x) => (
        <button
          disabled={
            !switchNetworkAsync ||
            x.id === chain?.id ||
            (pendingChainId === x.id && isLoading)
          }
          key={x.id}
          onClick={() => switchNetworkAsync?.(x.id)}
        >
          {x.name}
        </button>
      ))}

      <div>{error && error.message}</div>
    </div>
  )
}

ในที่สุดเราเราก็มาถึงจนจบการ การ connect wallet เเล้ว

เมื่อเราใช้  wagmi เเล้ว ทำให้เราสามารถต่อได้ง่ายขึ้นกว่าการที่เราต้องมาเขียน ether.js  หรือ web3 กันเพียวๆ สะดวกเเล้วรวดเร็ว ใครที่อยากหาอ่าน วิธีการใช้งานเพิ่มได้ ที่ https://wagmi.sh/

Aa

© 2023, All Rights Reserved, VulturePrime co., ltd.