בוט מסחר שמבצע קריאות ישירות לחוזים של SushiSwap במקום להשתמש ב-SDK עלול לאבד עד 30% מהמסלולים. ההבדל הוא שה-SDK מספק אוטומטית כתובות ראוטר עדכניות ביותר מ-30 רשתות ובונה מסלולים דרך בריכות v3 שקוד legacy פשוט מתעלם מהן. בניסיון שלנו, אנו נתקלים לעתים קרובות בפרויקטים שבהם האינטגרציה עוקפת את ה-SDK, מה שגורם לאובדן נזילות ולהפחתת רווחים. לקוח אחד עם בוט ארביטראז' על Arbitrum הגדיל את מספר המסלולים המוצלחים ב-24% והפחית את עלויות הגז ב-18% לאחר מעבר ל-@sushiswap/router, הודות לתמחור גז דינמי.
אנחנו צוות עם ניסיון רב שנים בפיתוח בלוקצ'יין. במהלך הזמן הזה, השלמנו למעלה מ-40 אינטגרציות של בוטי מסחר על SushiSwap ו-DEXים אחרים. במאמר זה, אנו חולקים היבטים מרכזיים שיש לקחת בחשבון בעת חיבור בוט ל-SushiSwap SDK.
איזו גרסה של SushiSwap SDK לבחור עבור בוט מסחר?
SushiSwap SDK v3 (@sushiswap/sdk) וה-@sushiswap/router החדש יותר הם חבילות שונות עם API שונה. @sushiswap/router הוא התקן הנוכחי, התומך ב-SushiSwap v3 (נזילות מרוכזת), v2, וניתוב דרך מספר פרוטוקולים בו-זמנית. ה-@sushiswap/sdk הישן עובד רק עם בריכות v2—הוא מיושן עבור רוב המשימות. ראינו בוטים שרצו על ה-SDK הישן במשך שנים, מבלי לדעת שהם מאבדים 20-30% מהמסלולים בגלל היעדר בריכות v3.
| גרסה | תמיכה ב-v2 | תמיכה ב-v3 | ריבוי-רשתות | סטטוס |
|---|---|---|---|---|
@sushiswap/sdk |
כן | לא | כן | Legacy |
@sushiswap/router |
כן | כן | כן | פעיל |
מדוע העברת gasPrice מדויק חיונית לרווח הנקי?
import { Router } from '@sushiswap/router'
import { ChainId } from '@sushiswap/chain'
const trade = await Router.getBestRoute({
chainId: ChainId.ARBITRUM,
fromToken: WETH,
toToken: USDC,
amount: parseUnits('1', 18),
gasPrice: await provider.getGasPrice(),
})import { Router } from '@sushiswap/router' import { ChainId } from '@sushiswap/chain' const trade = await Router.getBestRoute({ chainId: ChainId.ARBITRUM, fromToken: WETH, toToken: USDC, amount: parseUnits('1', 18), gasPrice: await provider.getGasPrice(), }) מחזיר את המסלול האופטימלי תוך התחשבות בגז. אם מועבר getBestRoute אפס או מיושן, המסלול מותאם רק לפי כמות הטוקן הפלט, תוך התעלמות מהרווח הנקי. הנוסחה עבור בוט מסחר היא: gasPrice. יש להביא את ה-gasPrice מה-mempool, לא מ-cache. בפרויקט אחד, הפחתנו את עלויות הגז ב-18% לאחר יישום תמחור גז דינמי.
כיצד ניטור בריכות דרך The Graph עוזר לבוט?
ל-SushiSwap יש subgraphs עבור כל רשת. עבור בוט שמנטר אירועי נזילות או עוקב אחר שינויי מחירים, שאילתות דרך The Graph יעילות יותר מקריאות on-chain ישירות. עם זאת, ל-The Graph יש עיכוב של כמה שניות, ולכן עבור זמן אמת, מנויי WebSocket לאירועי netProfit = outputAmount - inputAmount - gasCost (v2) או Sync (v3) דרך ethers.js עדיפים. השוואת שיטות:
| שיטה | זמן השהיה | עומס RPC | מתאים עבור |
|---|---|---|---|
| The Graph | 2-10 שניות | נמוך | עדכוני מחירים לא תכופים |
| WebSocket (ethers.js) | 100-500 אלפיות השנייה | בינוני | ארביטראז', HFT |
| On-chain (פולינג) | 1-12 שניות | גבוה | אפשרות גיבוי |
סיכונים בשימוש בגרסת SDK מיושנת?
ה-Swap הישן אינו תומך במסלולי v3, מה שמוביל לאובדן של 20-30% מהנזילות הזמינה. בנוסף, ייתכן שהוא לא תומך ברשתות חדשות או ב-EIPs, מה שגורם לשגיאות בעסקאות. לדוגמה, לאחר המעבר ל-EIP-1559, קוד ללא עדכון SDK אינו יכול להגדיר נכון את @sushiswap/sdk, מה שגורם לעסקאות להיתקע. עדכנו את ה-SDK לגרסה העדכנית ביותר—צוות SushiSwap מוסיף תמיכה ברשתות חדשות ומתקן באגים.
תצורת ריבוי-רשתות
ה-SDK פותר אוטומטית כתובות חוזה לפי maxPriorityFeePerGas, אך עבור תצורות מותאמות אישית (צומת פרטי, RPC מותאם), יש להעביר את מפת chainId במפורש:
import { providers } from 'ethers'
const providerMap = {
[ChainId.ETHEREUM]: new providers.JsonRpcProvider(ETH_RPC),
[ChainId.ARBITRUM]: new providers.JsonRpcProvider(ARB_RPC),
[ChainId.POLYGON]: new providers.JsonRpcProvider(POLY_RPC),
}שימוש ב-RPC ציבורי (Infura, Alchemy free tier) מוביל להגבלת קצב תחת ניטור אינטנסיבי. עבור בוט ייצור, אנו ממליצים על צומת פרטי או תוכנית בתשלום עם תפוקה מובטחת.
ביצוע ה-swap דרך הראוטר
הראוטר של SushiSwap v3 על Arbitrum הוא providers. ה-SDK מייצר calldata עבור import { providers } from 'ethers' const providerMap = { [ChainId.ETHEREUM]: new providers.JsonRpcProvider(ETH_RPC), [ChainId.ARBITRUM]: new providers.JsonRpcProvider(ARB_RPC), [ChainId.POLYGON]: new providers.JsonRpcProvider(POLY_RPC), } אוטומטית:
const { routeProcessorAddr, routeCode } = trade
const tx = await routeProcessor.processRoute(
fromToken.address,
amountIn,
toToken.address,
minAmountOut, // amountOut * (1 - slippage)
recipient,
routeCode,
)0x...RouteProcessor3 הוא הגנה מפני החלקה. עבור בוט ארביטראז', סובלנות החלקה צריכה להיות מינימלית (0.1-0.3%), אחרת העסקה עלולה להתבצע בהפסד אם השוק יזוז בין סימולציה להכללת בלוק.
מה העבודה שלנו כוללת
- ניתוח הארכיטקטורה הנוכחית של הבוט ואסטרטגיית המסחר.
- תכנון ניתוב תוך התחשבות בריבוי-רשתות וריבוי-גרסאות.
- כתיבת קוד באמצעות
processRoute(), הגדרת RPC, ניהול גז. - בדיקות על testnet עם עומסי שיא מדומים.
- פריסה ל-mainnet עם הגדלת נפח הדרגתית.
- ניטור והתראות—אינטגרציה עם Tenderly או backend מותאם אישית.
- תיעוד תצורה ותפעול.
- תמיכה לחודש לאחר ההשקה.
הערכות זמנים
אינטגרציה של בוט מסחר עם SushiSwap SDK אורכת 3–5 ימים עבור רשת אחת. מערכת ריבוי-רשתות עם ניתוב דרך מספר גרסאות פרוטוקול וניטור בריכות אורכת עד שבוע. כולל בדיקות testnet ותיעוד. צרו קשר להערכת פרויקט—נכין הצעה מסחרית תוך התחשבות באסטרטגיה שלכם. קבלו ייעוץ כדי ללמוד כיצד לייעל את הבוט שלכם לארכיטקטורה הנוכחית.







