ניטור נזילות פרוטוקול DeFi: התראות ודשבורדים

אובדן נזילות בבריכת DeFi לרוב אינו מורגש עד שמשתמשים נתקלים בהחלקת מחירים. אנו בונים מערכת ניטור העוקבת אחר מדדי נזילות מרכזיים ומתריעה מיידית על שינויים קריטיים. הצוות שלנו מספק את הפרויקט במפתח מלא—החל מהגדרת לוחות מחוונים ועד התראות טלגרם—תוך הבטחת פעילות אמינה ותמיכה מתמשכת.

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

שאלות נפוצות

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

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

פרוטוקול עם TVL של 50 מיליון דולר ללא ניטור נזילות DeFi אינו חוסך בכלים—זו ניהול סיכונים עיוור. כאשר 30% מהנזילות יוצאת מבריכה תוך 4 שעות עקב משיכת לוויתן, לצוות יש שתי אפשרויות: לגלות דרך התראת נזילות ולפעול, או ללמוד מציוץ שמשתמשים לא יכולים להחליף עקב החלקה גבוהה. אנו מציעים פתרון סוהר תוך 3-5 ימים: מאיסוף נתונים on-chain ועד מערכות התראה בטלגרם ו-PagerDuty. רקורד שלנו: 5+ שנים ב-DeFi, 20+ הטמעות ניטור לפרוטוקולים עם TVL מ-10 מיליון עד 500 מיליון דולר. אנו מבטיחים מסירת התראה תוך 10 שניות—פי 50 מהר יותר מסקר API של DeFi Llama. התמחור מתחיל ב-500 דולר לניטור בסיסי; פתרון מלא מ-2000 דולר. צרו קשר—נעריך את הפרויקט שלכם בחינם תוך יום אחד.

אילו מדדים לנטר ולמה זה לא טריוויאלי

ריכוז נזילות ב-Uniswap v3

ב-Uniswap v2, נזילות כוללת היא מדד ברור: reserve0 * reserve1 = k, k גדול יותר אומר החלקה טובה יותר. ב-Uniswap v3, נזילות מרוכזת ב-ticks. בריכה עשויה להיות עם TVL של 10 מיליון דולר, אבל אם 95% מרוכזים בטווח של ±2% סביב המחיר הנוכחי, תנועת מחיר מחוץ לטווח הזה מורידה את הנזילות האפקטיבית פי 20.

ניטור נכון: לא רק totalValueLocked, אלא activeLiquidity—נזילות בטווח הפעיל סביב המחיר הנוכחי. מדד מתוך ה-subgraph של Uniswap v3:

query ActiveLiquidity {
  pool(id: "0x...") {
    liquidity
    sqrtPrice
    tick
    ticks(where: { liquidityNet_not: "0" }, orderBy: tickIdx) {
      tickIdx
      liquidityNet
    }
  }
}

מהנתונים האלה אנו בונים תרשים עומק: כמה נזילות זמינה בתנועות מחיר של ±1%, ±5%, ±10%.

זיהוי משיכת לוויתן

ספק נזילות גדול יכול למשוך נזילות בבת אחת, ולקרוס את העומק בשוק מסוים. עבור פרוטוקול שתלוי בנזילות בבריכות מסוימות (למשל, בריכת stablecoin לפדיון), זהו סיכון קריטי.

אנו מנטרים אירועי query ActiveLiquidity { pool(id: "0x...") { liquidity sqrtPrice tick ticks(where: { liquidityNet_not: "0" }, orderBy: tickIdx) { tickIdx liquidityNet } } } (Uniswap v3) ו-Burn (Curve, Balancer) דרך מנוי WebSocket. אם ספק נזילות יחיד מושך >10% מהנזילות הכוללת—התראה מיידית.

ערימת ניטור

איסוף נתונים

שלוש שכבות של מקורות:

אירועי on-chain (זמן אמת). מנוי WebSocket של ethers.js ל-RemoveLiquidity, Sync, Swap, Mint אירועים של חוזי היעד. זמן השהיה—שניות מאישור עסקה. דורש צומת משלו או WSS מ-Alchemy/Infura עם תמיכה ב-Burn.

Subgraphs של The Graph (עיכוב של 1-5 דקות). שימושי למדדים מצטברים—TVL שעתי/יומי, נפח, עמלות. לנתונים היסטוריים ומגמות. Subgraphs רשמיים עבור Uniswap, Curve, Balancer, Aave, Compound זמינים ב-The Graph Explorer.

API של DeFi Llama (עיכוב של 10-60 דקות). שימושי להשוואות TVL בין פרוטוקולים ותמונה כוללת. לא מתאים להתראות בזמן אמת.

אחסון ויזואליזציה

TimescaleDB (הרחבת PostgreSQL)—אופטימלי לנתוני נזילות מסוג time-series. חלוקה לפי זמן, hypertables לארכיון אוטומטי של נתונים היסטוריים.

Grafana + מקור נתונים של TimescaleDB—ערימה סטנדרטית לדשבורדים. פאנלים מוגדרים מראש עבור:

  • TVL של בריכה בזמן אמת
  • תרשים עומק (נזילות זמינה בהחלקה נתונה)
  • יחס נפח/נזילות (מדד לחץ)
  • ספקי נזילות מובילים וחלקם

מערכת התראות

מדד סף אזהרה סף קריטי ערוץ
ירידת TVL -10% בשעה -25% בשעה טלגרם
משיכת ספק נזילות יחיד >5% מהנזילות הכוללת >15% מהנזילות הכוללת PagerDuty
החלקה (עסקה של 1%) >0.5% >2% טלגרם
סטיית מחיר מהאורקל >2% >5% PagerDuty
ניצול (הלוואות) >80% >95% PagerDuty

PagerDuty או OpsGenie להתראות קריטיות—הודעת push לטלפון, ללא קשר לשעה ביום. בוט טלגרם להודעות אינפורמטיביות.

Tenderly Alerts—חלופה לאירועי on-chain ללא תשתית משלו: הגדרת טריגרים דרך ממשק משתמש, webhook ל-Discord/Slack/Telegram.

חישוב וניטור APY

APY ב-DeFi הוא משתנה: תלוי בנפח (עמלות מסחר), פליטות טוקנים (תגמולי כריית נזילות), וריבית בסיסית (להלוואות).

נוסחה ל-APY של ספק נזילות ב-Uniswap v3:

dailyFees = pool.volumeUSD24h * feeTier / 1_000_000 feeAPR = (dailyFees / pool.tvlUSD) * 365 

עם TVL של מיליון דולר ונפח יומי של 2 מיליון דולר בבריכה עם עמלה של 0.05% (500): eth_subscribe, dailyFees = pool.volumeUSD24h * feeTier / 1_000_000 feeAPR = (dailyFees / pool.tvlUSD) * 365 . אבל זה על TVL כולל. ספק נזילות עם פוזיציה מרוכזת בטווח הפעיל מרוויח פרופורציונלית יותר לפי הנזילות האפקטיבית שלהם.

אנו מנטרים APY לכל בריכה עם התראות על ירידות חדות—סימן לפעילות מסחר מופחתת או מעבר נפח לבריכה מתחרה.

איך לזהות משיכת נזילות גדולה?

מפורט למעלה: מעקב אחר אירועי Burn/RemoveLiquidity, הגדרת ספים וערוצי התראה. השתמשו ב-Tenderly או באינדקסר משלכם לאוטומציה.

תהליך ההטמעה

ההטמעה שלנו כוללת את השלבים הבאים:

  1. מלאי של חוזים ומדדים (יום אחד)
  2. הקמת איסוף נתונים (WebSocket + TimescaleDB) (1-2 ימים)
  3. יצירת דשבורד Grafana (יום אחד)
  4. הגדרת התראות (טלגרם, PagerDuty) (יום אחד)
  5. הדרכת צוות ומסירה (יום אחד)
שלב משך תוצאה
מלאי של חוזים ומדדים יום אחד רשימת אירועים וספים עדיפים
הקמת איסוף נתונים (WebSocket + TimescaleDB) 1-2 ימים רישום אירועי on-chain בזמן אמת
יצירת דשבורד Grafana יום אחד ויזואליזציה של TVL, תרשים עומק, נפח/נזילות
הגדרת התראות (טלגרם, PagerDuty) יום אחד הודעות עבור 5-6 מדדים קריטיים

מה כלול

  • תיעוד ארכיטקטורה לניטור
  • דשבורד Grafana מוגדר עם מדדים מרכזיים
  • מערכת התראות עם ספים וערוצי הודעה
  • סקריפטים לאיסוף נתונים ואינטגרציה עם בריכות חדשות
  • הדרכת צוות (1-2 שעות)
  • תמיכה לחודש אחד לאחר ההטמעה

הערכות זמן

ניטור בסיסי לפרוטוקול אחד (TVL, אירועים, התראות)—3-5 ימים. ניטור מקיף למספר פרוטוקולים עם תרשימי עומק, מעקב APY ודשבורד מותאם—עד שבועיים. התמחור נקבע באופן אישי לפי מספר הפרוטוקולים ומורכבות האינטגרציה.

דוגמת קוד לניטור אירוע Burn
const { ethers } = require("ethers");
const provider = new ethers.providers.WebSocketProvider(process.env.WSS_URL);
const poolContract = new ethers.Contract(POOL_ADDRESS, UNISWAP_V3_POOL_ABI, provider);

poolContract.on("Burn", (owner, tickLower, tickUpper, amount, amount0, amount1) => {
  console.log(`Burn: owner ${owner}, amount ${amount}`);
  // Проверяем долю от total liquidity
  checkWhaleWithdrawal(owner, amount);
});