Vasin Peach
5 min readJul 5

--

https://walletconnect.com/

1.Introduce

การเชื่อมต่อ dApp แบบ seamless กับกระเป๋าใดๆ ก็ได้ที่รองรับ wallet connect

2.What is wallet connect?

ตัวอย่างการทำงาน ของ wallet connect กับ metamask mobile

3.Quick Start

ติดตั้ง package ที่จำเป็นสำหรับ web3modal ลงบน project react ของเรา

npm install @web3modal/ethereum @web3modal/react wagmi viem

เริ่มด้วยการ import Web3Modal และ Wagmi และตั้งค่าตามตัวอย่างด้านล่าง

import { EthereumClient, w3mConnectors, w3mProvider } from '@web3modal/ethereum'
import { Web3Modal } from '@web3modal/react'
import { configureChains, createConfig, WagmiConfig } from 'wagmi'
import { arbitrum, mainnet, polygon } from 'wagmi/chains'

const chains = [arbitrum, mainnet, polygon]
const projectId = 'YOUR_PROJECT_ID'

// ตั้งค่า provider
const { publicClient } = configureChains(chains, [w3mProvider({ projectId })])
const wagmiConfig = createConfig({
autoConnect: true,
connectors: w3mConnectors({ projectId, chains }),
publicClient
})
const ethereumClient = new EthereumClient(wagmiConfig, chains)

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

<Web3Modal projectId={projectId} ethereumClient={ethereumClient} />
</>
)
}
const chains = [arbitrum, mainnet, polygon]
const projectId = 'YOUR_PROJECT_ID'
function App() {
return (
<>
<WagmiConfig config={wagmiConfig}>
<HomePage />
</WagmiConfig>

<Web3Modal projectId={projectId} ethereumClient={ethereumClient} />
</>
)
}

ถ้าเราไม่ถูกใจ theme เบื้องต้นของ web3modal เราสามารถแต่ง theme ของ modal และ button ได้ตามนี้

<Web3Modal
themeVariables={{
'--w3m-accent-color': '#ed0000', // Color used for buttons, icons, labels, etc.
'--w3m-accent-fill-color': '#fff', // Color used for text and icons inside elements with accent color background
'--w3m-background-color': ' #0b0d0f', // Background color to be used instead of default animated gradient
}}
/>
ตัวอย่าง — w3m-accent-color เป็นสีแดง

บางกรณีที่เราใช้ Custom chain หรือ Token ของตัวเองแล้วเราต้องการเปลี่ยนรูปภาพเหล่านั้นสามารถทำได้โดย

<Web3Modal

// กำหนดรูปภาพให้กับ chain id
chainImages: {
1: "/images/ethereum.webp",
137: "/images/polygon.webp",
};

// กำหนดรูปภาพให้กับ token
tokenImages: {
ETH: "/images/eth.webp",
AVAX: "/images/avax.webp",
};

/>
Icon ของ Token และ Chain ถูกเปลี่ยนเป็น JFIN

วางปุ่มเชื่อมต่อของ web3modal ไว้ในจุดที่เราต้องการให้ผู้ใช้คลิ๊กเพื่อเชื่อมต่อกับกระเป๋า

ตัวอย่าง — w3m-accent-color เป็นสีแดง
เมื่อกดปุ่มเชื่อมต่อแล้วจะแสดง popup เลือกกระเป๋าที่ต้องการ
เชื่อมต่อกระเป๋าได้แล้วว~

4. Wagmi

Wallet Detail

import { useAccount } from 'wagmi'

function App() {
const { address, isConnecting, isDisconnected } = useAccount()

if (isConnecting) return <div>Connecting…</div>
if (isDisconnected) return <div>Disconnected</div>
return <div>{address}</div>
}
import { useBalance } from 'wagmi'

function App() {
const { data, isError, isLoading } = useBalance({
address: '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
})

if (isLoading) return <div>Fetching balance…</div>
if (isError) return <div>Error fetching balance</div>
return (
<div>
Balance: {data?.formatted} {data?.symbol}
</div>
)
}

Contract

ตัวอย่างไฟล์ ABI
import wagmiGotchiABI from './abi/wagmiGotchiABI'

const alive = useContractRead({
address: '0xeCB504D39723b0be0e3a9Aa33D646642D1051EE1',
abi: wagmiGotchiABI,
functionName: 'getAlive',
})
  const { config } = usePrepareContractWrite({
address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',
abi: wagmiGotchiABI,
functionName: 'feed',
})
const { config } = usePrepareContractWrite({
address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',
abi: wagmiGotchiABI,
functionName: 'feed',
})

const { data, isLoading, isSuccess, write } = useContractWrite(config)
return (
<div>
<button disabled={!write} onClick={() => write?.()}>
Feed
</button>
{isLoading && <div>Check Wallet</div>}
{isSuccess && <div>Transaction: {JSON.stringify(data)}</div>}
</div>
)

Read Event (Logs)

import { getPublicClient, getContract } from 'wagmi/actions'
import { getAbiItem } from 'viem'

const publicClient = getPublicClient()
const contract = getContract({
address: '0xecb504d39723b0be0e3a9aa33d646642d1051ee1',
abi: wagmiGotchiABI,
})

// เลือก event จาก abi ที่จะใช้ในการอ่าน event (log)
const abiItem = getAbiItem({ abi: contract.abi, name: 'CaretakerLoved' })

// อ่าน event (log)
const logs = await publicClient.getLogs({
event: abiItem,
fromBlock: 'earliest', // เริ่มต้น
toBlock: 'latest' // ท้ายสุด
})

--

--

Recommended from Medium

Lists

See more recommendations