שילוב Sablier לתשלומים ליניאריים והבשלה

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

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

שאלות נפוצות

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

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

שילוב Sablier לתשלומים ליניאריים והבשלה (Vesting)

אנו מספקים שילוב Sablier מלא עבור ה-dApp שלך, ופותרים את בעיית התשלום המדויק שחוזים מותאמים אישית סובלים ממנה. חישוב vestedAmount באמצעות block.timestamp הוא מלכודת קלאסית: ההפרש יכול להגיע עד 5% מהסכום הכולל — על זרם אסימונים של 10,000$, מדובר בפער של 500$. Sablier פותר זאת ברמת הפרוטוקול עם חישובים דטרמיניסטיים על-השרשרת עד השנייה. לצוות שלנו ניסיון של למעלה מ-10 שנים ב-DeFi וביצענו למעלה מ-40 שילובי Sablier. צרו קשר לניתוח מקרה כדי למצוא את הפתרון האופטימלי לפרויקט שלכם.

כיצד Sablier פותר את בעיית התשלום המדויק

Sablier v2 מורכב משני חוזים עיקריים:

  • streamedAmount — זרמים ליניאריים מנקודה A לנקודה B. תומך בתקופת צוק (cliff) ובהזרמה שנייה אחר שנייה מזמן ההתחלה.
  • SablierV2LockupLinear — זרמים דינמיים עם מקטעים מותאמים אישית לעקומות הבשלה שרירותיות (אקספוננציאליות, מדורגות וכו').

כל זרם הוא NFT (ERC-721). זו בחירה עיצובית מרכזית: ניתן להעביר את הזרם לכתובת אחרת (העברת זרם = העברת הזכות לתשלומים עתידיים), להשתמש בו כבטוחה בפרוטוקולי הלוואות, או להציגו בשווקי NFT. השולח יכול לבטל את הזרם (אם נוצר כניתן לביטול) — האסימונים הנותרים מוחזרים.

סוגי זרמים זמינים וכיצד לבחור

סוג זרם תיאור מתי להשתמש
LockupLinear שחרור ליניארי מ-startTime עד endTime, צוק אופציונלי הבשלה לצוות, משכורות, מענקים פשוטים
LockupDynamic מקטעים שרירותיים (מהירויות שונות במרווחים שונים) טוקנומיקה מורכבת, הבשלה אקספוננציאלית, אבני דרך מרובות

הבחירה בין LockupLinear ל-LockupDynamic תלויה בטוקנומיקה שלך. להבשלה קלאסית של צוות (4 שנים עם צוק של שנה), LockupLinear מתאים. אם יש צורך בבונוסים מואצים או עקומות אקספוננציאליות, השתמשו ב-LockupDynamic עם מקטעים. אנו עוזרים לתכנן את התצורה הנכונה בשלב הניתוח.

שילוב חוזה חכם

עבור dApps שיוצרים זרמים פרוגרמטית (למשל, DAO המשלם מענקים, פרוטוקול המחלק תגמולים באמצעות Sablier במקום הבשלה מותאמת אישית):

import { ISablierV2LockupLinear } from "@sablier/v2-core/interfaces/ISablierV2LockupLinear.sol";
import { LockupLinear, Broker } from "@sablier/v2-core/types/DataTypes.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

contract VestingManager {
    ISablierV2LockupLinear public immutable sablier;
    IERC20 public immutable token;

    constructor(address _sablier, address _token) {
        sablier = ISablierV2LockupLinear(_sablier);
        token = IERC20(_token);
    }

    function createVestingStream(
        address recipient,
        uint128 totalAmount,
        uint40 cliffDuration, // секунды
        uint40 totalDuration // секунды
    ) external returns (uint256 streamId) {
        token.approve(address(sablier), totalAmount);

        LockupLinear.CreateWithDurations memory params = LockupLinear.CreateWithDurations({
            sender: address(this),
            recipient: recipient,
            totalAmount: totalAmount,
            asset: token,
            cancelable: true, // DAO может отозвать
            transferable: false, // NFT нельзя передать (опционально)
            durations: LockupLinear.Durations({
                cliff: cliffDuration,
                total: totalDuration
            }),
            broker: Broker({
                account: address(0),
                fee: 0
            })
        });

        streamId = sablier.createWithDurations(params);
    }
}

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

להצגת זרמים פעילים, אנו משתמשים ב-The Graph. דוגמת שאילתת subgraph עבור כל הרשתות:

query GetStreams($recipient: String!) {
  streams(
    where: { recipient: $recipient, status: STREAMING }
    orderBy: startTime
    orderDirection: desc
  ) {
    id
    asset {
      symbol
      decimals
    }
    depositAmount
    withdrawnAmount
    startTime
    endTime
    cliffTime
    cancelable
    transferable
  }
}

ממשק משתמש: הצגה וניהול של זרמים

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

אילו נתונים נדרשים להצגת זרם?

Sablier מספקת subgraphs (The Graph) עבור כל הרשתות המרכזיות. השאילתה לזרמים הפעילים של נמען מוצגת למעלה. יתרה זמינה נוכחית — import { ISablierV2LockupLinear } from "@sablier/v2-core/interfaces/ISablierV2LockupLinear.sol"; import { LockupLinear, Broker } from "@sablier/v2-core/types/DataTypes.sol"; import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; contract VestingManager { ISablierV2LockupLinear public immutable sablier; IERC20 public immutable token; constructor(address _sablier, address _token) { sablier = ISablierV2LockupLinear(_sablier); token = IERC20(_token); } function createVestingStream( address recipient, uint128 totalAmount, uint40 cliffDuration, // секунды uint40 totalDuration // секунды ) external returns (uint256 streamId) { token.approve(address(sablier), totalAmount); LockupLinear.CreateWithDurations memory params = LockupLinear.CreateWithDurations({ sender: address(this), recipient: recipient, totalAmount: totalAmount, asset: token, cancelable: true, // DAO может отозвать transferable: false, // NFT нельзя передать (опционально) durations: LockupLinear.Durations({ cliff: cliffDuration, total: totalDuration }), broker: Broker({ account: address(0), fee: 0 }) }); streamId = sablier.createWithDurations(params); } } — מתקבלת באמצעות קריאה על-השרשרת ל-totalAmount. ה-subgraph נותן תמונת מצב באירוע האחרון; יש לקרוא את היתרה החיה מהחוזה.

חישוב התקדמות

לזרם ליניארי ללא צוק: התקדמות = totalAmount. עם צוק: הצגת 0% עד הצוק, ואז אינטרפולציה ליניארית. לזרמים דינמיים, בצעו אינטרפולציה בין מקטעים — ה-SDK של Sablier מספק פונקציית עזר transferFrom.

import { getStreamedAmount } from '@sablier/v2-sdk';

const streamed = getStreamedAmount({
  startTime: stream.startTime,
  endTime: stream.endTime,
  depositAmount: BigInt(stream.depositAmount),
  cliffTime: stream.cliffTime,
  currentTime: BigInt(Math.floor(Date.now() / 1000)),
  segments: stream.segments, // для dynamic streams
});

const progressPercent = Number(streamed * 100n / BigInt(stream.depositAmount));

מה כלול בעבודה

  • ניתוח לוגיקת ההבשלה והטוקנומיקה שלך, בחירת סוג הזרם האופטימלי.
  • תכנון חוזים עוטפים (במידת הצורך) עם שיקולי אבטחה (ניתן לביטול, ניתן להעברה).
  • יישום חוזים ב-Solidity באמצעות Foundry ו-fuzzing עם Echidna.
  • פיתוח ממשק המחבר את ה-subgraph של Sablier, פסי התקדמות ופעולות (משיכה/ביטול).
  • פריסה רב-רשתית עם אימות Etherscan עבור כל הרשתות הנתמכות.
  • תיעוד, קוד מקור, סקריפטים לפריסה, גישה למאגר תבניות.
  • הכשרת צוות (שעה מקוונת) ותמיכה של 3 חודשים לאחר המסירה.

תהליך עבודה ולוחות זמנים

  1. ניתוח — אנו בוחנים את לוגיקת ההבשלה והטוקנומיקה שלך, בוחרים סוג זרם (ליניארי או דינמי).
  2. תכנון — תכנון חוזים עוטפים (במידת הצורך), הגדרת פרמטרי אבטחה (ניתן לביטול, ניתן להעברה).
  3. יישום — כתיבת חוזים באמצעות Sablier SDK עם בדיקות מקיפות (foundry, echidna fuzzing).
  4. ממשק — חיבור ה-subgraph של Sablier, יישום פסי התקדמות ופעולות (משיכה/ביטול) באמצעות viem או ethers.js.
  5. פריסה — פריסה רב-רשתית עם אימות ב-Etherscan. Sablier v2 פרוסה על Ethereum mainnet, Arbitrum, Optimism, Polygon, Avalanche, BNB Chain, Base, Gnosis. כתובות החוזים יציבות.
  6. תמיכה — מסירת תיעוד, מקורות, סקריפטים לפריסה. אחריות לתיקון באגים תוך 48 שעות.

אינטגרציה בסיסית (יצירת זרם מחוזה + תצוגת ממשק) — 3-4 ימים. ממשק מלא עם ניהול, ויזואליזציה ותמיכה רב-רשתית — 5-7 ימים. העלות מחושבת באופן אישי, החל מ-2,000$ לאינטגרציה בסיסית ו-4,500$ לאינטגרציה מלאה.

למה Sablier במקום חוזה מותאם אישית?

Sablier v2 נבדקה על ידי Trail of Bits ו-Quantstamp, מה שמבטיח היעדר פרצות אבטחה קריטיות. היישום מהיר פי 10 מכתיבת חוזה מותאם אישית מאפס, וחיסכון בגז הוא 30-50% לכל יצירת זרם. זה מביא לחיסכון חודשי של עד 700$ עבור 1000 זרמים, ונמנעים מהעלות של 20,000$+ עבור ביקורת נפרדת.

קריטריון Sablier v2 חוזה מותאם אישית
ביקורת Trail of Bits ו-Quantstamp לעיתים קרובות ללא אימות פורמלי
סיכון Reentrancy אין (מתמטיקה דטרמיניסטית) גבוה אם מיושם ברשלנות
גמישות זרמים ליניאריים ודינמיים, צוק דורש שכתוב קוד
תמיכה ברשתות 8+ רשתות עם ממשק אחיד כל רשת דורשת פריסה נפרדת
גז (יצירת זרם) 200k גז ($0.5 בגז הנוכחי) 300k+ גז ($1.2)
חיסכון בעלות ביקורת מובנה בפרוטוקול (חיסכון של עד 80%) דורש ביקורת נפרדת (20,000$+)

Sablier אמינה יותר ומהירה פי 10 ליישום מאשר כתיבת חוזה מותאם אישית מאפס. חיסכון בגז הוא 30-50% לכל יצירת זרם. ב-1000 זרמים בחודש, החיסכון יכול להגיע ל-700$.

מקרי שימוש אופייניים

  • הבשלה לצוות: הבשלה ל-4 שנים עם צוק של שנה לצוות ולמשקיעים.
  • הזרמת מענקים: DAO מזרים מענקים חודשיים במקום תשלומים מראש.
  • משכורת בקריפטו: זרם USDC רציף כמשכורת.
  • תגמולי פרוטוקול: החלפת חוזי תגמול מותאמים אישית בזרמי Sablier.

אם אתם רוצים להוסיף תשלומי הזרמה ל-dApp שלכם, הזמינו שילוב Sablier — נבקר את הלוגיקה שלכם ונציע את הפתרון האופטימלי. קבלו ייעוץ למקרה שלכם — צרו קשר.