שילוב MetaMask ב-dApp עם wagmi ו-viem: מדריך מעשי

שילוב ארנק קריפטו ב-dApp הופך פעמים רבות לקרב מול באגים בחידוש חיבור ובמעבר בין רשתות. אנחנו בונים אינטגרציית MetaMask על בסיס המחסנית המודרנית wagmi ו-viem, שמטפלת באופן אמין בכל התרחישים—מארנקים מרובים בדפדפן ועד לקישורי עומק למובייל. הצוות שלנו מספק את הפרויקט במפתח מלא, תוך התחשבות במקרי קצה ומתן תמיכה שוטפת, כך שהמוצר שלכם פועל ביציבות.

שירותי פיתוח בלוקצ'יין

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1481
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1335
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1034
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1293
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    738
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1031

למה wagmi במקום קריאות window.ethereum ישירות?

MetaMask מזריק את window.ethereum לדף — אבל עבודה ישירה עם הספק בדרך כלל מסתיימת שם. כתיבת window.ethereum.request({ method: 'eth_requestAccounts' }) ישירות היא או אב טיפוס או חוב טכני. 80% מה-dApps עם ניהול ידני סובלים מבאגים בחיבור מחדש לאחר החלפת רשת או רענון דף. אינטגרציה נכונה באמצעות wagmi + viem מטפלת בכל מקרי הקצה: ארנקים מרובים בדפדפן, החלפת רשת, ניתוק חיבור, MetaMask לנייד דרך deeplink. לפי תיעוד wagmi, חיבור מחדש אוטומטי מכסה את רוב הבעיות. אנו משתמשים בסטACK זה באופן פעיל בכל dApp. הניסיון שלנו: 5 שנים ב-Web3, מעל 30 אינטגרציות ארנקי EVM — ואנו מבטיחים יציבות חיבור.

איך להגדיר חיבור עם wagmi + viem?

Wagmi v2 + viem הוא הסטנדרט המודרני. Viem מחליף את ethers.js כקוח טיפוסי ברמה נמוכה, בעוד wagmi מנהל את הקשר החיבור. התוצאה: פחות באגים, פיתוח מהיר יותר, ו-bundle קל ב-75%.

הוראות שלב אחר שלב:

  1. התקנת תלויות: npm install wagmi viem @wagmi/connectors
  2. יצירת config עם הרשתות הנדרשות (ראה קוד למטה)
  3. מימוש כפתור חיבור באמצעות ה-hook useConnect
  4. טיפול בהחלפת רשת עם useSwitchChain
  5. חתימת הודעות עם useSignTypedData
import { createConfig, http } from 'wagmi'
import { mainnet, base } from 'wagmi/chains'
import { metaMask } from 'wagmi/connectors'

export const config = createConfig({
  chains: [mainnet, base],
  connectors: [metaMask()],
  transports: {
    [mainnet.id]: http(),
    [base.id]: http(),
  },
})
import { useConnect, useAccount, useDisconnect } from 'wagmi'

function ConnectButton() {
  const { address, isConnected } = useAccount()
  const { connect, connectors } = useConnect()
  const { disconnect } = useDisconnect()

  if (isConnected) {
    return (
      <button onClick={() => disconnect()}>
        {address?.slice(0, 6)}...{address?.slice(-4)}
      </button>
    )
  }

  const metamask = connectors.find(c => c.id === 'metaMaskSDK')

  return (
    <button onClick={() => connect({ connector: metamask! })}>
      Connect MetaMask
    </button>
  )
}

מקרה בוחן: בפרויקט DeFi staking, נתקלנו במשתמשים ניידים שלא הצליחו להתחבר — MetaMask לא נפתח אוטומטית. פתרון: הגדרנו HTTPS וקונפיגורציה של deeplink דרך MetaMask connector של Wagmi. שיעור ההמרה לחיבור עלה ב-30%.

טיפול בהחלפת רשת והוספת רשת מותאמת אישית

בעיה נפוצה: משתמש ב-Ethereum mainnet, וה-dApp עובד על Base. יש לבקש החלפה, ואם הרשת לא נוספה — להוסיף אותה. Wagmi מספק את ה-hook import { createConfig, http } from 'wagmi' import { mainnet, base } from 'wagmi/chains' import { metaMask } from 'wagmi/connectors' export const config = createConfig({ chains: [mainnet, base], connectors: [metaMask()], transports: { [mainnet.id]: http(), [base.id]: http(), }, }) שקורא אוטומטית ל-import { useConnect, useAccount, useDisconnect } from 'wagmi' function ConnectButton() { const { address, isConnected } = useAccount() const { connect, connectors } = useConnect() const { disconnect } = useDisconnect() if (isConnected) { return ( <button onClick={() => disconnect()}> {address?.slice(0, 6)}...{address?.slice(-4)} </button> ) } const metamask = connectors.find(c => c.id === 'metaMaskSDK') return ( <button onClick={() => connect({ connector: metamask! })}> Connect MetaMask </button> ) } בשגיאה 4902.

import { useSwitchChain } from 'wagmi'

function NetworkGuard({ children, requiredChainId }: Props) {
  const { chainId } = useAccount()
  const { switchChain, isPending } = useSwitchChain()

  if (chainId !== requiredChainId) {
    return (
      <button
        onClick={() => switchChain({ chainId: requiredChainId })}
        disabled={isPending}
      >
        Switch to Base
      </button>
    )
  }

  return children
}

כך אנו נמנעים מטיפול ידני ב-90% משגיאות הרשת.

חתימת הודעות עם EIP-712

EIP-712 חתימת נתונים טיפוסית — לחתימות מובנות (permit, orders, auth tokens). ה-hook useSwitchChain מ-wagmi מפשט את המימוש.

import { useSignTypedData } from 'wagmi'

const { signTypedData } = useSignTypedData()

signTypedData({
  domain: {
    name: 'MyApp',
    version: '1',
    chainId: 8453,
  },
  types: {
    Login: [
      { name: 'address', type: 'address' },
      { name: 'nonce', type: 'string' },
    ],
  },
  primaryType: 'Login',
  message: {
    address: userAddress,
    nonce: sessionNonce,
  },
})

עבור SIWE (Sign-In with Ethereum), השתמשו בספריית wallet_addEthereumChain — היא מייצרת הודעה תקנית, והשרת מאמת באמצעות import { useSwitchChain } from 'wagmi' function NetworkGuard({ children, requiredChainId }: Props) { const { chainId } = useAccount() const { switchChain, isPending } = useSwitchChain() if (chainId !== requiredChainId) { return ( <button onClick={() => switchChain({ chainId: requiredChainId })} disabled={isPending} > Switch to Base </button> ) } return children } . זה מקצר את זמן פיתוח האימות ביומיים–שלושה.

שגיאות MetaMask נפוצות והטיפול בהן

קוד שגיאה סיבה טיפול
4001 המשתמש דחה את הבקשה הצגת toast
4902 הרשת לא נמצאה הוספה באמצעות useSignTypedData
-32002 בקשה כבר ממתינה התעלם או המתן
-32603 שגיאת JSON-RPC פנימית בדוק gas או revert

Wagmi מספק אובייקט שגיאה עם סוג השגיאה. ב-import { useSignTypedData } from 'wagmi' const { signTypedData } = useSignTypedData() signTypedData({ domain: { name: 'MyApp', version: '1', chainId: 8453 }, types: { Login: [ { name: 'address', type: 'address' }, { name: 'nonce', type: 'string' }, ], }, primaryType: 'Login', message: { address: userAddress, nonce: sessionNonce }, }) , טפלו ב-siwe, SiweMessage.verify() ואחרים. אל תנסו לכתוב handler משלכם — wagmi כבר עשה זאת.

אינטגרציה לנייד: Deeplink ו-MetaMask SDK

בנייד, MetaMask נפתח דרך deeplink wallet_addEthereumChain. ה-MetaMask connector של Wagmi מטפל בזה אוטומטית דרך MetaMask SDK. עבור iOS, נדרש HTTPS יחד עם useEffect מוגדר כראוי ברמת האפליקציה. ללא SDK, תצטרכו ליישם deeplink ידני, מה שעלול לגרום להפניות אינסופיות.

רשימת בדיקה לפני אינטגרציה

  • ודאו שהפרויקט משתמש ב-React 18+ ו-TypeScript.
  • בחרו רשתות נדרשות וציינו אותן ב-createConfig.
  • בדקו deeplink לנייד ב-iOS (נדרש HTTPS).
  • הוסיפו טיפול לכל קודי השגיאה מהטבלה.
  • השתמשו ב-viem לקריאות חוזה — זה מקטין את גודל ה-bundle ב-60 kB.

תהליך אינטגרציית MetaMask במפתח מלא

שלב ללא wagmi עם wagmi
ניתוח 1-2 ימים יום אחד
עיצוב 2-3 ימים 1-2 ימים
מימוש 5-7 ימים 2-3 ימים
בדיקות 3-5 ימים 1-2 ימים
פריסה 1-2 ימים יום אחד

עם wagmi, האינטגרציה אורכת 3 עד 7 ימים בהתאם למורכבות ה-dApp. המחיר מחושב באופן אישי.

מה כלול

  • תיעוד אינטגרציה וארכיטקטורה
  • קוד מקור לרכיבי חיבור (ConnectButton, NetworkGuard, טיפול בשגיאות)
  • הגדרת deeplink לנייד עבור iOS ו-Android
  • קונפיגורציית רשת ותחבורה
  • בדיקות על מכשירים אמיתיים ובדפדפן
  • גישה ל-repository בקריאה בלבד במהלך העבודה
  • שבועיים של תמיכה טכנית לאחר הפריסה

צרו קשר לייעוץ וקבלו הערכה ראשונית לפרויקט שלכם. הזמינו אינטגרציית MetaMask במפתח מלא — נממש את החיבור תוך 3–7 ימים.