מפתח משבץ סְווֹפּ (swap) לתוך dApp, ישירות לתוך מאגר נזילות יחיד של Uniswap v3 — ומשתמשים מתלוננים על שערים גרועים. הסיבה: עבור סְווֹפּים גדולים ($50K+), הנזילות של מאגר יחיד אינה אופטימלית. פיצול בין מספר מקורות (ניתוב מפוצל) יכול להניב שיפור מחיר של 0.3–0.8%. על סְווֹפּ של $100K, מדובר בהפרש של $300–800. זה בדיוק מה שאגרגטור DEX עושה — הוא מוצא את המסלול האופטימלי בין מספר DEXים בו-זמנית.
אנו מפתחים אגרגטור DEX מאפס: מתכנון מנוע ניתוב ועד פריסת חוזה חכם (Aggregator Router, SwapStep). למהנדסים שלנו יש ניסיון עם 10+ פרוטוקולים ואלפי מאגרי נזילות. האגרגטור מספק למשתמשים מחירים טובים יותר, מפחית החלקה (slippage), וחוסך בגז בהשוואה לחיפוש ידני אחר מאגרים. קבלו ייעוץ — נבחן את הפרויקט שלכם. הפורטפוליו שלנו כולל 10+ פרויקטי DeFi, עם אחריות לשקיפות קוד ועמידה בלוחות זמנים.
מורכבות טכנית: אלגוריתם ניתוב
גרף נזילות DEX ומציאת נתיב
בעיית הניתוב היא מציאת הנתיב האופטימלי בגרף מכוון שבו:
- צמתים = טוקנים
- קשתות = מאגרי נזילות (כל מאגר יוצר שתי קשתות: token0→token1 ולהיפך)
- משקל קשת = כמות הפלט עבור קלט נתון
עבור סְווֹפּ פשוט A→B, אנו צריכים את הנתיב הקצר ביותר (מקסום פלט). עבור ניתוב מפוצל, אנו מחלקים את הקלט ל-K חלקים ומוצאים K נתיבים שביחד נותנים את הפלט המקסימלי.
הגישה הנאיבית — בדיקת כל הנתיבים באורך 1–3 הופים, השוואת פלטים — עובדת עבור מספר קטן של מאגרים. עם 10,000+ מאגרים (ל-Uniswap v3 ברשת המרכזית יש >8,000 מאגרים פעילים), נדרש אופטימיזציה.
גישה מעשית:
- סינון מוקדם: רק מאגרים עם TVL > $100K ונפח מסחר > $10K ב-24 שעות
- Bellman-Ford למציאת כל הנתיבים עד 3 הופים
- לניתוב מפוצל: סימולציה של מספר פרופורציות (100/0, 80/20, 60/40, 50/50) דרך כל מסלול, בחירת המקסימום
עבור רשתות EVM עם גז גבוה (הרשת המרכזית של Ethereum), פיצול לשלושה חלקים כבר אינו אופטימלי: החיסכון ממחיר טוב יותר יכול להתקזז מול גז נוסף. ב-Arbitrum/Optimism (גז ~$0.01–0.05), ניתוב מפוצל מועיל אפילו עבור סְווֹפּים קטנים.
כיצד ניתוב מפוצל משפר את מחיר הסְווֹפּ
דרישה מרכזית: חישוב amountOut עבור כל מסלול במהירות ובדיוק ללא קריאות on-chain (יקרות ואיטיות).
Uniswap v2 (x*y=k): נוסחה אנליטית:
amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997) נתוני רזרבות דרך amountOut = (amountIn * 997 * reserveOut) / (reserveIn * 1000 + amountIn * 997) — קריאת RPC אחת לכל מאגר.
Uniswap v3 (נזילות מרוכזת): אין נוסחה אנליטית לכמויות שרירותיות. יש צורך בסימולציה tick-by-tick. getReserves() עושה זאת on-chain אך זו קריאת RPC עם סימולציית גז. לניתוב מהיר — השתמשו במתמטיקת tick מחוץ לרשת (QuoterV2.quoteExactInputSingle) עם נתוני tick במטמון מ-subgraph.
Curve: @uniswap/v3-sdk — פונקציית view, קריאה סטטית. כל מאגר Curve דורש קריאת RPC נפרדת, אך ניתן לאגד אותן דרך Multicall3.
התיישנות נתונים והפתרון
נתוני רזרבות ו-tick מתיישנים עם כל בלוק. בשווקים תנודתיים, המחיר יכול לזוז משמעותית ב-1–2 בלוקים. אסטרטגיות עדכון:
- הרשמה לאירועים:
get_dy(i, j, dx)(Uniswap v2),Sync(Uniswap v3/Curve) דרך WebSocket. בכל אירוע, עדכון המטמון עבור אותו מאגר ספציפי. - סקר תקופתי: כל 5–10 שניות עבור מאגרים פחות נזילים.
- רענון לפי דרישה: כאשר מתבקשת הצעת מחיר, עדכון נתונים עבור 10 המאגרים המובילים במסלול דרך Multicall.
הגישה שלנו: אירועי WebSocket עבור 100 המאגרים המובילים לפי TVL, סקר כל 15 שניות עבור השאר.
ארכיטקטורת האגרגטור
ניתוב On-chain לעומת Off-chain
Off-chain מלא: מנוע הניתוב מחשב את המסלול ומחזיר calldata מוכן עבור נתב הסְווֹפּ. החוזה החכם הוא רק מבצע, ללא לוגיקת בחירת נתיב. זו הגישה של 1inch v5 Aggregation Router. גז on-chain מינימלי, אך אמון בשרת האחורי.
היברידי: ניתוב off-chain, אימות on-chain של פלט מינימלי. החוזה מקבל נתיב + amountOutMinimum, מבצע דרך נתבי Uniswap/Curve, ובודק Swap. אם לא מתקיים, revert. זו הגישה המומלצת שלנו.
| קריטריון | Off-chain | היברידי |
|---|---|---|
| גז on-chain | מינימלי | קצת גבוה יותר (אימות) |
| אמון | אמון מלא בשרת האחורי | חלקי (אימות) |
| גמישות | גבוהה | גבוהה |
| אבטחה | בינונית | גבוהה |
חוזה נתב האגרגטור
contract AggregatorRouter {
function swap(
SwapParams calldata params
) external payable returns (uint256 amountOut) {
// Для каждого шага маршрута
for (uint i = 0; i < params.steps.length; i++) {
amountOut = _executeStep(params.steps[i], amountOut);
}
require(amountOut >= params.minAmountOut, "Insufficient output");
// Transfer output tokens to recipient
IERC20(params.tokenOut).safeTransfer(params.recipient, amountOut);
}
}require(amountOut >= amountOutMinimum) מכיל: contract AggregatorRouter { function swap( SwapParams calldata params ) external payable returns (uint256 amountOut) { // Для каждого шага маршрута for (uint i = 0; i < params.steps.length; i++) { amountOut = _executeStep(params.steps[i], amountOut); } require(amountOut >= params.minAmountOut, "Insufficient output"); // Transfer output tokens to recipient IERC20(params.tokenOut).safeTransfer(params.recipient, amountOut); } } (uniswap_v2/v3/curve/balancer), SwapStep, protocol, poolAddress, tokenIn (לניתוב מפוצל — כמה עובר דרך שלב זה).
עמלת אגרגטור
אגרגטורים גובים עמלות בשתי דרכים:
- מרווח (Spread): הצגת הצעת מחיר למשתמש מעט גרועה מהאמיתית, תוך שמירת ההפרש. לא שקוף.
- עמלה מפורשת: גביית N נקודות בסיס (bps) על הפלט. שקוף, טוב יותר למוניטין.
אופייני: 5–30 bps (0.05–0.30%) בהתאם לגודל הסְווֹפּ. מיושם בחוזה כ-tokenOut.
רב-רשתי וגישור
הרחבת האגרגטור לסְווֹפּ חוצה-רשת: המשתמש שולח USDC ב-Ethereum, ומקבל MATIC ב-Polygon. מתחת למכסה המנוע: סְווֹפּ USDC→bridgeToken ב-Ethereum, גישור דרך Across/Stargate, סְווֹפּ bridgeToken→MATIC ב-Polygon.
אינטגרציה עם Across Protocol v3: portion עם calldata יעד עבור הסְווֹפּ הסופי. זמן השהיית גישור: 1–5 דקות. גז: גבוה משמעותית מסְווֹפּ יחיד, כדאי מסכום של $1000 ומעלה.
מחסן טכנולוגי
מנוע ניתוב בשרת האחורי: TypeScript, viem לקריאות RPC, Redis לשמירת נתוני מאגרים במטמון, WebSocket להרשמות לאירועים. חוזים חכמים: Solidity 0.8.x + Foundry. חזית: React + wagmi + ייבוא טוקנים לפי תקן Uniswap Token Lists.
לנתוני subgraph (TVL, נפח מסחר, Uniswap v3 ticks): שירות The Graph המארח או subgraph מותאם על Graph Node.
מה כלול
- תיעוד ארכיטקטורה למנוע ניתוב וחוזים חכמים
- קוד מקור עם היסטוריית commit מלאה (Git)
- אינטגרציה עם מאגרי DEX: Uniswap v2/v3, Curve, Balancer, Sushiswap
- פריסת חוזים חכמים ברשת המרכזית/רשת בדיקות
- API לאחזור הצעות מחיר וביצוע סְווֹפּים
- ממשק חזית המציג מסלולים ופרטי עמלות
- גישה לניטור (Tenderly, Grafana)
- הדרכת צוות הלקוח (סדנה של שעתיים)
- תמיכה חודש אחרי השקה
תהליך
מנוע ניתוב (1-2 שבועות). גרף מאגרים, אלגוריתם מציאת נתיב, סימולציית פלט, מטמון. חוזה חכם (שבוע). נתב אגרגטור + בדיקות fork של הרשת המרכזית.
API וחזית (1-2 שבועות). API להצעות מחיר, ממשק סְווֹפּ עם הצגת מסלול. בדיקות. השוואת הצעות מחיר עם אמות מידה (1inch, Paraswap) על פני אלפי עסקאות.
הערכות לוחות זמנים
| רכיב | משך |
|---|---|
| מנוע ניתוב (1-2 DEXים) | 1-2 שבועות |
| חוזים חכמים + בדיקות | שבוע |
| API וחזית | 1-2 שבועות |
| אינטגרציה של Curve/Balancer | +שבוע |
| רב-רשתי (2-3 רשתות) | +2-4 שבועות |
| סְווֹפּ חוצה-רשת (Across) | +1-2 שבועות |
דוגמת חישוב ניתוב מפוצל
לסְווֹפּ של 10 ETH ל-USDC: Uniswap v3 8.2 ETH → 24600 USDC, Curve 1.8 ETH → 5430 USDC, סה"כ 30030 USDC. דרך מאגר Uniswap v3 יחיד: 10 ETH → 29800 USDC. רווח: 230 USDC (0.77%).לוח זמנים סופי: מ-2–3 שבועות ל-MVP ועד 2–3 חודשים למוצר מלא. צרו קשר — קבלו הערכה מפורטת לפרויקט שלכם. הניסיון של הצוות שלנו: 5+ שנים ב-DeFi, 10+ אגרגטורים מיושמים. הזמינו ייעוץ מהנדס.







