איגום יתרות פורטפוליו של מטבעות קריפטו הוא אחת המשימות המאתגרות ביותר בפיתוח Web3. משתמש עשוי להחזיק נכסים בעשרות רשתות (Ethereum, Polygon, Arbitrum, Solana), במאות טוקנים, בפרוטוקולי DeFi כמו Uniswap V3 עם מתמטיקת פוזיציות ייחודית, ובבורסות מרכזיות. כל מקור דורש גישה משלו לאחזור נתונים. אם לא מתכננים את הארכיטקטורה מההתחלה, המערכת תפגר, תמצה את מגבלות ה-RPC, ותפיק PnL שגוי. צברנו ניסיון על 30+ פרויקטים כאלה ואנחנו יודעים כיצד להימנע מהמלכודות. Multicall3 הוא אחד הכלים המרכזיים המאפשר איגום נתונים מרשתות EVM עם תקורה מינימלית.
החלטות ארכיטקטוניות מרכזיות
כיצד לאגד יתרות מרשתות שונות?
יתרות On-chain
רשתות EVM: יתרה מקומית דרך eth_getBalance, יתרות ERC-20 מורכבות יותר — קריאת RPC אחת מחזירה את היתרה של טוקן אחד בכתובת אחת. עם 50 טוקנים × 5 רשתות = 250 קריאות. הפתרון הוא Multicall3 (פרוס על כל רשתות ה-EVM בכתובת 0xcA11bde05977b3631167028862bE2a173976CA11). קריאת RPC אחת במקום 50 — זה פי 50 מהר יותר ומפחית עלויות תשתית בעד 90%. Multicall3 הוא חוזה מנוסה בשימוש באלפי פרויקטים. תיעוד Multicall3 ממליץ על בקשות אצווה להפחתת עומס.
import { createPublicClient, http, parseAbi } from "viem"; import { mainnet } from "viem/chains"; const client = createPublicClient({ chain: mainnet, transport: http() }); const MULTICALL3 = "0xcA11bde05977b3631167028862bE2a173976CA11"; const ERC20_ABI = parseAbi(["function balanceOf(address) view returns (uint256)"]); async function getTokenBalances( walletAddress: `0x${string}`, tokenAddresses: `0x${string}`[] ) { const calls = tokenAddresses.map((tokenAddress) => ({ address: tokenAddress, abi: ERC20_ABI, functionName: "balanceOf" as const, args: [walletAddress], })); return client.multicall({ contracts: calls }); } חלופה: Alchemy/Moralis Token API — בקשה אחת מחזירה את כל יתרות ה-ERC-20 עם מטא数据和 מחיר בדולרים. בתשלום, אבל חוסך זמן פיתוח. עבור Solana אנו משתמשים ב-import { createPublicClient, http, parseAbi } from "viem"; import { mainnet } from "viem/chains"; const client = createPublicClient({ chain: mainnet, transport: http() }); const MULTICALL3 = "0xcA11bde05977b3631167028862bE2a173976CA11"; const ERC20_ABI = parseAbi(["function balanceOf(address) view returns (uint256)"]); async function getTokenBalances( walletAddress: `0x${string}`, tokenAddresses: `0x${string}`[] ) { const calls = tokenAddresses.map((tokenAddress) => ({ address: tokenAddress, abi: ERC20_ABI, functionName: "balanceOf" as const, args: [walletAddress], })); return client.multicall({ contracts: calls }); } או Anchor לקריאת חשבונות.
פוזיציות DeFi
זה החלק המורכב ביותר בטראקר. פוזיציית נזילות ב-Uniswap V3, בטחון ב-Aave, טוקנים מוחזקים ב-Curve — כל פרוטוקול מאחסן נתונים אחרת. השוו בין גישות:
| גישה | מהירות | מורכבות | עלות |
|---|---|---|---|
| קריאות חוזה ישירות | גבוהה (תלוי במספר הבקשות) | גבוהה (נדרשת מתמטיקת ticks) | חינם (רק גז) |
| The Graph subgraphs | בינונית (שאילתות GraphQL) | בינונית (לימוד הסכמה) | חינם (אירוח) |
| אגרגטורים (DeBank, Zapper) | גבוהה (נתונים במטמון) | נמוכה (API יחיד) | בתשלום (מנוי) |
עבור רוב הפרויקטים, אנו ממליצים על שילוב: קריאות ישירות לפרוטוקולים מרכזיים + אגרגטורים לזנב הארוך. לדוגמה, עבור Uniswap V3 אנו משתמשים בחוזי getMultipleAccounts ו-positions, ועבור Curve ב-tick. שגיאת חישוב PnL יכולה להתרחש עקב דה-סנכרון בין מחיר לבלוק — אנו פותרים זאת על ידי קשירת תמונות מצב למספרי בלוקים.
יתרות CEX
APIs של בורסות מחזירות יתרות באופן מיידי אך דורשות מפתח API לקריאה בלבד מהמשתמש. אנו משתמשים ב-CCXT — ספרייה עם ממשק אחיד ל-100+ בורסות.
import ccxt from "ccxt"; async function getBinanceBalances(apiKey: string, secret: string) { const exchange = new ccxt.binance({ apiKey, secret, sandbox: false }); const balance = await exchange.fetchBalance(); return balance.total; // { BTC: 0.5, ETH: 2.3, USDT: 1000 } } CCXT היא ספריית קוד פתוח פופולרית התומכת ב-100+ בורסות.
מדוע אסטרטגיית עדכון נתונים חשובה
יש לעדכן נתונים, אבל לא להכות ב-RPC כל שנייה. אסטרטגיה:
| סוג נתונים | תדירות עדכון | סיבה |
|---|---|---|
| יתרות On-chain | כל 30–60 שניות | בלוק חדש |
| יתרות CEX | כל 30 שניות | מגבלות API |
| פוזיציות DeFi | כל 2–5 דקות | משתנות לאט |
| מחירי טוקנים | כל 10–30 שניות | קריטי ל-P&L |
| PnL היסטורי | משימת רקע, 1/שעה | חישוב כבד |
משימות רקע דרך Redis + BullMQ עם תורים נפרדים. תוצאות נשמרות במטמון ב-Redis, והפרונטאנד קורא מהמטמון. לזמן אמת, השתמשו ב-Server-Sent Events או WebSocket עם עדכוני push.
אחסון נתונים היסטוריים
למעקב P&L, יש צורך בתמונות מצב של הפורטפוליו לאורך זמן. TimescaleDB (הרחבת PostgreSQL) הוא אידיאלי:
CREATE TABLE portfolio_snapshots ( user_id UUID, snapshot_at TIMESTAMPTZ NOT NULL, total_usd NUMERIC(20, 2), breakdown JSONB ); SELECT create_hypertable('portfolio_snapshots', 'snapshot_at'); שאילתת P&L על פני תקופה:
SELECT time_bucket('1 day', snapshot_at) AS day, last(total_usd, snapshot_at) AS end_of_day_value FROM portfolio_snapshots WHERE user_id = $1 AND snapshot_at > NOW() - INTERVAL '30 days' GROUP BY day ORDER BY day; כיצד להגדיר Multicall3 בפרויקט שלך
- התקן את viem:
get_balances. - ייבא את createPublicClient ותצורת רשת.
- קרא ל-
import ccxt from "ccxt"; async function getBinanceBalances(apiKey: string, secret: string) { const exchange = new ccxt.binance({ apiKey, secret, sandbox: false }); const balance = await exchange.fetchBalance(); return balance.total; // { BTC: 0.5, ETH: 2.3, USDT: 1000 } }עם מערך של חוזים ופונקציות. - עבד את התוצאה — היא מחזירה מערך של אובייקטים עם שדות result ו-error.
גישה סטנדרטית זו, המתוארת בתיעוד OpenZeppelin, ממליצה להשתמש ב-Multicall3 לבקשות אצווה להפחתת עומס RPC.
מה כלול בעבודה
אנו מספקים סט מלא של תיעוד, קוד מקור עם הערות, הוראות פריסה, גישה למאגר Git, וחודש תמיכה לאחר ההשקה. במידת הצורך, אנו מאמנים את הצוות שלך על השימוש במערכת.
הערכות לוחות זמנים
טראקר פורטפוליו MVP יכול להיות מוכן תוך שבועיים בלבד. פתרונות מלאים עם רשתות מרובות, אינטגרציות DeFi ו-P&L היסטורי אורכים בדרך כלל 4–8 שבועות בהתאם למורכבות. לוח הזמנים המדויק נקבע לאחר ביקורת טכנית ראשונית.
טעויות נפוצות שיש להימנע מהן
- שימוש בקריאות RPC בודדות לכל טוקן במקום אצווה עם Multicall3.
- התעלמות מחותמות זמן ברמת הבלוק בעת חישוב PnL, הגורמת לאי-התאמות מחירים.
- אי-שמירת תגובות API במטמון כראוי, מה שמוביל לבעיות מגבלת קצב.
- שכחת טיפול במקרי קצה כמו טוקנים עם יתרת אפס או קריאות חוזה שנכשלו.
נתקלנו בכל המלכודות הללו בפרויקטים שלנו ואנחנו יודעים כיצד לבנות מערכות חזקות מההתחלה.
דונו בדרישות שלכם עם המהנדסים שלנו — נבחן את הפרויקט ביום אחד ונציע את הפתרון האופטימלי. הזמינו טראקר פורטפוליו סוהר עם אחריות איכות ומסירה בזמן. צרו קשר כדי להתחיל.







