אם ה-dApp שלך משתמש רק ב-MetaMask, אתה מפסיד עד 70% מהמשתמשים שמעדיפים ארנקים אחרים. Web3Modal v3 מ-WalletConnect פותר את בעיית התאימות, אך האינטגרציה דורשת הבנה של מספר מלכודות: SSR hydration, הגדרת Project ID, רשתות מותאמות אישית ואופטימיזציה של מגבלת גז. נעבור איתך על כל שלב — מהתקנה ועד פריסה, בהסתמך על 5+ שנות ניסיון בפיתוח בלוקצ'יין ו-20+ dApps מוצלחים עם Web3Modal. אנו מבטיחים פעילות יציבה ותמיכה לאחר פריסה. חיסכון של עד 40% מהתקציב שלך, אתה מקבל פתרון מוכן במקום סלקטור מותאם אישית.
Web3Modal טוב פי 10 מסלקטור ארנקים מותאם אישית מבחינת מספר הארנקים הנתמכים: 300+ לעומת 2–3 בפיתוח עצמי. WalletConnect מציינים שאינטגרציה של Web3Modal מגדילה את המרת החיבור ב-40%. לפי התיעוד הרשמי, Web3Modal הוא הכלי הפופולרי ביותר לחיבור ארנקים.
בפרויקט אחד, הלקוח בילה 3 שבועות בתחזוקת סלקטור מותאם אישית שעדיין החמיץ באגי אבטחה. לאחר מעבר ל-Web3Modal, צמצמנו את זמן הפיתוח ליומיים וביטלנו לחלוטין פגיעויות reentrancy בממשק החיבור.
יתרונות Web3Modal על פני סלקטור מותאם אישית
סלקטור ארנקים מותאם אישית לוקח 2–3 שבועות לפיתוח ומציג 5+ באגי אבטחה פוטנציאליים. Web3Modal מספק 300+ ארנקים, תמיכה ב-WalletConnect, deeplinks למובייל והתחברות באמצעות אימייל מחוץ לקופסה. השוואה בין פתרונות פופולריים:
| תכונה | Web3Modal | RainbowKit | ConnectKit |
|---|---|---|---|
| מספר ארנקים | 300+ | 20+ (עיקריים) | 50+ (פופולריים) |
| רכישת קריפטו מובנית (fiat on-ramp) | כן (באמצעות enableOnramp) | לא | לא |
| התחברות אימייל/חברתית | כן (Web3Auth) | לא | לא |
| רשתות מותאמות אישית | כן (defineChain) | כן | כן |
| מחיר | חינם (בסיסי) | חינם | חינם |
הגדרת Web3Modal: התקנה ותצורה
npm install @web3modal/wagmi wagmi viem @tanstack/react-query // config/web3modal.ts
import { createWeb3Modal } from '@web3modal/wagmi/react'
import { defaultWagmiConfig } from '@web3modal/wagmi/react/config'
import { mainnet, arbitrum, base, polygon } from 'wagmi/chains'
const projectId = import.meta.env.VITE_WC_PROJECT_ID
const metadata = {
name: 'My dApp',
description: 'My dApp description',
url: 'https://mydapp.xyz',
icons: ['https://mydapp.xyz/icon.png'],
}
export const config = defaultWagmiConfig({
chains: [mainnet, arbitrum, base, polygon],
projectId,
metadata,
})
createWeb3Modal({
wagmiConfig: config,
projectId,
enableAnalytics: true,
enableOnramp: true,
themeMode: 'dark',
themeVariables: {
'--w3m-accent': '#7c3aed',
'--w3m-border-radius-master': '4px',
},
})ה-Project ID מתקבל מ-cloud.walletconnect.com. בלעדיו, ה-Modal יופעל, אך חיבורי WalletConnect לא יעבדו.
אינטגרציה ב-React
// main.tsx
import { WagmiProvider } from 'wagmi'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { config } from './config/web3modal'
const queryClient = new QueryClient()
export function App() {
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
<Router />
</QueryClientProvider>
</WagmiProvider>
)
}
// Component with connect button
import { useWeb3Modal } from '@web3modal/wagmi/react'
import { useAccount } from 'wagmi'
function ConnectWallet() {
const { open } = useWeb3Modal()
const { address, isConnected } = useAccount()
return (
<button onClick={() => open()}>
{isConnected ? `${address?.slice(0,6)}...${address?.slice(-4)}` : 'Connect Wallet'}
</button>
)
} איך להימנע משגיאות Hydration ב-Next.js?
ב-Next.js App Router, מתרחשת בעיית hydration: Web3Modal מאותחל בצד הלקוח, אך השרת מרנדר HTML שונה. זה קורה כי הארנק אינו זמין בשרת. הפתרון הוא ההוראה npm install @web3modal/wagmi wagmi viem @tanstack/react-query ו-guard של mounted. SSR hydration הוא הבאג הנפוץ ביותר במהלך אינטגרציה.
// providers/Web3Provider.tsx
'use client'
import { createWeb3Modal } from '@web3modal/wagmi/react'
import { useEffect, useState } from 'react'
createWeb3Modal({ wagmiConfig: config, projectId })
export function Web3Provider({ children }: { children: React.ReactNode }) {
const [mounted, setMounted] = useState(false)
useEffect(() => setMounted(true), [])
return (
<WagmiProvider config={config}>
<QueryClientProvider client={queryClient}>
{mounted ? children : null}
</QueryClientProvider>
</WagmiProvider>
)
} אילו רשתות אפשר להוסיף?
הוסף רשת משלך באמצעות // config/web3modal.ts import { createWeb3Modal } from '@web3modal/wagmi/react' import { defaultWagmiConfig } from '@web3modal/wagmi/react/config' import { mainnet, arbitrum, base, polygon } from 'wagmi/chains' const projectId = import.meta.env.VITE_WC_PROJECT_ID const metadata = { name: 'My dApp', description: 'My dApp description', url: 'https://mydapp.xyz', icons: ['https://mydapp.xyz/icon.png'], } export const config = defaultWagmiConfig({ chains: [mainnet, arbitrum, base, polygon], projectId, metadata, }) createWeb3Modal({ wagmiConfig: config, projectId, enableAnalytics: true, enableOnramp: true, themeMode: 'dark', themeVariables: { '--w3m-accent': '#7c3aed', '--w3m-border-radius-master': '4px', }, }) מ-viem:
import { defineChain } from 'viem'
const sonic = defineChain({
id: 146,
name: 'Sonic',
nativeCurrency: { name: 'Sonic', symbol: 'S', decimals: 18 },
rpcUrls: {
default: {
http: ['https://rpc.soniclabs.com'],
},
},
blockExplorers: {
default: {
name: 'SonicScan',
url: 'https://sonicscan.org',
},
},
})
export const config = defaultWagmiConfig({
chains: [mainnet, sonic],
// ...
})כדי להחליף רשתות באופן תוכנתי, השתמש ב-// main.tsx import { WagmiProvider } from 'wagmi' import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import { config } from './config/web3modal' const queryClient = new QueryClient() export function App() { return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> <Router /> </QueryClientProvider> </WagmiProvider> ) } // Component with connect button import { useWeb3Modal } from '@web3modal/wagmi/react' import { useAccount } from 'wagmi' function ConnectWallet() { const { open } = useWeb3Modal() const { address, isConnected } = useAccount() return ( <button onClick={() => open()}> {isConnected ? `${address?.slice(0,6)}...${address?.slice(-4)}` : 'Connect Wallet'} </button> ) } .
התחברות אימייל וחברתית: כניסה ללא ארנק קריפטו
Web3Modal תומך בארנקים לא-משמורנים (non-custodial) באמצעות Web3Auth. הפעל זאת בתצורה עם 'use client'. המשתמש מזין אימייל, מקבל OTP ויוצר ארנק המנוהל על ידי חוזה חכם. עבור קהל רחב, זה מוריד את חסם הכניסה פי 10. בנוסף, מומלץ להגדיר // providers/Web3Provider.tsx 'use client' import { createWeb3Modal } from '@web3modal/wagmi/react' import { useEffect, useState } from 'react' createWeb3Modal({ wagmiConfig: config, projectId }) export function Web3Provider({ children }: { children: React.ReactNode }) { const [mounted, setMounted] = useState(false) useEffect(() => setMounted(true), []) return ( <WagmiProvider config={config}> <QueryClientProvider client={queryClient}> {mounted ? children : null} </QueryClientProvider> </WagmiProvider> ) } בתצורת Wagmi לתאימות עם Web3Auth.
שלבי אינטגרציה של Web3Modal
- ניתוח דרישות ורישום Project ID ב-WalletConnect Cloud
- התקנת חבילות והגדרת תצורת Wagmi בסיסית
- פיתוח Provider ופתרון SSR hydration עבור Next.js
- אינטגרציה של רשתות מותאמות אישית באמצעות defineChain
- הגדרת התחברות אימייל/חברתית באמצעות Web3Auth והפעלת fiat on-ramp
- בדיקות ב-mainnet/testnet ואופטימיזציה של מגבלת גז
- תיעוד והדרכת צוות
מה כלול בעבודה
- תצורת Web3Modal מותאמת לפרויקט שלך
- פיתוח Provider עבור React/Next.js עם פתרון SSR hydration
- הוספת רשתות מותאמות אישית והגדרת מעבר בין רשתות
- אינטגרציה של התחברות אימייל/חברתית ו-fiat on-ramp
- בדיקות ב-mainnet ו-testnet, אופטימיזציה של מגבלת גז
- תיעוד והדרכת צוות
- תמיכה לאחר פריסה
תהליך עבודה ולוח זמנים
| שלב | משך |
|---|---|
| ניתוח דרישות והגדרת Project ID | 1–2 ימים |
| פיתוח Provider ופתרון SSR hydration | 2–3 ימים |
| אינטגרציה של רשתות מותאמות אישית | יום אחד |
| הגדרת התחברות אימייל/חברתית ו-fiat on-ramp | 1–2 ימים |
| בדיקות ב-mainnet/testnet | 2–3 ימים |
| תיעוד והדרכת צוות | 1–2 ימים |
לוחות הזמנים הסופיים תלויים במורכבות הפרויקט. עבור dApp טיפוסי עם שתי רשתות והתחברות אימייל — בין 7 ל-10 ימי עבודה. המחיר מחושב באופן אישי.
קבל ייעוץ לפרויקט שלך — צור קשר כדי לדון בפרטים. הזמן אינטגרציה היום וחסוך שבועות של פיתוח.







