תארו לעצמכם: פרוטוקול ה-DeFi שלכם מייצר 20,000 דולר בעמלות מדי חודש, אבל מחיר הטוקן לא עולה — חקלאות ללא מנגנון החזר ערך רק יוצרת לחץ מכירה. מנגנון ה-buyback-and-distribute פותר זאת: המערכת קונה אוטומטית טוקנים ב-DEX באמצעות TWAP ומחלקת אותם למחזיקי הסטייקינג ללא אירוע מס. עבור לקוח אחד עם הכנסות של 20,000 דולר בחודש, מנגנון זה הגדיל את ה-TVL ב-2 מיליון דולר על ידי חיזוק המוטיבציה של מחזיקים לטווח ארוך. המערכת כוללת חוזה חכם ל-buyback, מחלק תגמולים לסטייקינג, אוטומציה באמצעות Chainlink Automation או Gelato, וביקורת חובה על חוזה ה-buyback. יישמנו פתרונות דומים עבור יותר מ-20 פרוטוקולים עם TVL משולב של מעל 100 מיליון דולר. צרו קשר כדי לדון בפרויקט שלכם.
למה buyback-and-distribute עדיף על דיבידנדים?
חלוקה ישירה של עמלות ב-USDC מובנת למחזיקים אך אינה משפיעה על מחיר הטוקן. Buyback יוצר תיאורטית לחץ קנייה. בפועל, ההשפעה תלויה בגודל ה-buyback ביחס לנפח המסחר (אם buyback = 0.1% מהנפח היומי, ההשפעה מזערית), בשיטת הביצוע (TWAP יעיל יותר מחד-פעמי), ובטיפול שלאחר מכן בטוקנים (שריפה מפחיתה היצע, חלוקה למחזיקי סטייקינג מתמרצת סטייקינג). בכנות: buyback-and-distribute הוא כלי לתגמול מחזיקים מחויבים, לא לניהול מחירים.
איך המערכת עובדת ברמת החוזה?
המערכת מורכבת מארבעה רכיבים:
- FeeCollector — צובר הכנסות פרוטוקול (עמלות מסחר, ריבית, עמלות פרוטוקול) בחוזה אחד.
- BuybackExecutor — מקבל stablecoin מ-FeeCollector, מבצע החלפה ב-DEX, ומחזיר טוקנים שנרכשו.
- RewardDistributor — מקבל טוקנים שנרכשו ומחלק אותם בין מחזיקי הסטייקינג באופן יחסי להחזקותיהם.
- חוזה סטייקינג — מאחסן מידע על החזקות ומהווה מקור אמת עבור RewardDistributor.
contract BuybackExecutor { ISwapRouter public immutable router; // Uniswap V3 Router IERC20 public immutable revenueToken; // USDC/WETH IERC20 public immutable protocolToken; // токен протокола address public immutable distributor; uint24 public poolFee = 3000; // 0.3% пул uint256 public minBuybackInterval = 24 hours; uint256 public lastBuybackTime; uint256 public maxSlippageBps = 100; event BuybackExecuted(uint256 revenueSpent, uint256 tokensBought); function executeBuyback(uint256 amountIn) external onlyRole(EXECUTOR_ROLE) { require(block.timestamp >= lastBuybackTime + minBuybackInterval, "Too soon"); require(amountIn <= revenueToken.balanceOf(address(this)), "Insufficient revenue"); uint256 expectedOut = _getQuote(amountIn); uint256 minOut = expectedOut * (10000 - maxSlippageBps) / 10000; revenueToken.approve(address(router), amountIn); ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ tokenIn: address(revenueToken), tokenOut: address(protocolToken), fee: poolFee, recipient: distributor, deadline: block.timestamp + 15 minutes, amountIn: amountIn, amountOutMinimum: minOut, sqrtPriceLimitX96: 0 }); uint256 amountOut = router.exactInputSingle(params); lastBuybackTime = block.timestamp; emit BuybackExecuted(amountIn, amountOut); } } TWAP לעומת buyback מיידי: מתי לבחור באיזה?
Buyback מיידי (כל הנפח בעסקה אחת) פגיע: בוטים של MEV רואים את העסקה ב-mempool ותוקפים ב-sandwich. הפסדים יכולים להגיע ל-2-5% מהנפח. לפי תיעוד Uniswap V3, TWAP מפחית את הפגיעות ל-MEV ל-0.5%.
Buyback ב-TWAP מפצל את הנפח לחלקים לאורך זמן. עבור פרוטוקולים קטנים (buyback < 10,000 דולר בחודש), buyback מיידי דרך mempool פרטי (הגנת Flashbots) מספיק. TWAP נחוץ עבור סכומים מ-50,000 דולר בחודש. יעילות TWAP: מפחית הפסדי MEV ב-80%.
| מאפיין | Buyback מיידי | Buyback ב-TWAP |
|---|---|---|
| פגיעות ל-MEV | גבוהה | נמוכה |
| מורכבות יישום | נמוכה | בינונית |
| עלויות גז | עסקה אחת | עסקאות מרובות |
| נפח מומלץ | < 10,000 דולר בחודש | > 10,000 דולר בחודש |
דוגמה ללוגיקת TWAP
contract TWAPBuyback { uint256 public totalAllocation; uint256 public spentAmount; uint256 public tranchSize; uint256 public tranchInterval; function executeNextTranch() external { require(block.timestamp >= lastExecution + tranchInterval, "Too soon"); require(spentAmount < totalAllocation, "Allocation exhausted"); uint256 amount = min(tranchSize, totalAllocation - spentAmount); spentAmount += amount; lastExecution = block.timestamp; _swap(amount); } } RewardDistributor: מכניקת חלוקה
שתי גישות עיקריות: Push ו-Pull (reward-per-token). שיטת Push עוברת על כל המחזיקים ומעבירה לכל אחד — פשוטה אך מוגבלת בגז עם מחזיקים רבים. שיטת Pull מאחסנת תגמול מצטבר לכל טוקן, והמחזיק תובע את התגמול בעצמו. זהו מודל התגמולים הקלאסי של Synthetix — מנוסה ומבוסס, בשימוש במאות פרוטוקולים. עלויות הגז של שיטת Pull נמוכות ב-30% כשהתגמולים מצטברים.
contract RewardDistributor { uint256 public rewardPerTokenStored; uint256 public totalStaked; mapping(address => uint256) public userRewardPerTokenPaid; mapping(address => uint256) public rewards; mapping(address => uint256) public stakes; modifier updateReward(address account) { rewardPerTokenStored = rewardPerToken(); if (account != address(0)) { rewards[account] = earned(account); userRewardPerTokenPaid[account] = rewardPerTokenStored; } _; } function rewardPerToken() public view returns (uint256) { if (totalStaked == 0) return rewardPerTokenStored; return rewardPerTokenStored + (pendingRewards * 1e18 / totalStaked); } function earned(address account) public view returns (uint256) { return stakes[account] * (rewardPerToken() - userRewardPerTokenPaid[account]) / 1e18 + rewards[account]; } function notifyRewardAmount(uint256 amount) external onlyBuybackExecutor { rewardPerTokenStored = rewardPerToken(); pendingRewards = amount; } function claimReward() external updateReward(msg.sender) { uint256 reward = rewards[msg.sender]; require(reward > 0, "Nothing to claim"); rewards[msg.sender] = 0; protocolToken.safeTransfer(msg.sender, reward); } } אוטומציה: Chainlink לעומת Gelato
לא ניתן להשאיר את ה-buyback לביצוע ידני — זה יוצר ריכוזיות וסיכון למניפולציה. אוטומציה פותרת זאת:
- Chainlink Automation (לשעבר Keepers): תנאים על-השרשרת (
contract BuybackExecutor { ISwapRouter public immutable router; // Uniswap V3 Router IERC20 public immutable revenueToken; // USDC/WETH IERC20 public immutable protocolToken; // токен протокола address public immutable distributor; uint24 public poolFee = 3000; // 0.3% пул uint256 public minBuybackInterval = 24 hours; uint256 public lastBuybackTime; uint256 public maxSlippageBps = 100; event BuybackExecuted(uint256 revenueSpent, uint256 tokensBought); function executeBuyback(uint256 amountIn) external onlyRole(EXECUTOR_ROLE) { require(block.timestamp >= lastBuybackTime + minBuybackInterval, "Too soon"); require(amountIn <= revenueToken.balanceOf(address(this)), "Insufficient revenue"); uint256 expectedOut = _getQuote(amountIn); uint256 minOut = expectedOut * (10000 - maxSlippageBps) / 10000; revenueToken.approve(address(router), amountIn); ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({ tokenIn: address(revenueToken), tokenOut: address(protocolToken), fee: poolFee, recipient: distributor, deadline: block.timestamp + 15 minutes, amountIn: amountIn, amountOutMinimum: minOut, sqrtPriceLimitX96: 0 }); uint256 amountOut = router.exactInputSingle(params); lastBuybackTime = block.timestamp; emit BuybackExecuted(amountIn, amountOut); } }) מפעילים אתcontract TWAPBuyback { uint256 public totalAllocation; uint256 public spentAmount; uint256 public tranchSize; uint256 public tranchInterval; function executeNextTranch() external { require(block.timestamp >= lastExecution + tranchInterval, "Too soon"); require(spentAmount < totalAllocation, "Allocation exhausted"); uint256 amount = min(tranchSize, totalAllocation - spentAmount); spentAmount += amount; lastExecution = block.timestamp; _swap(amount); } }. מבוזר ואמין. עלות: טוקני LINK למשימות ממומנות. - Gelato Network: אוטומציית web3 עם טריגרים גמישים יותר (זמן, תנאי על-השרשרת, אירוע מחוץ לשרשרת). קל יותר להגדרה, תומך ב-ERC-4337.
עבור רוב הפרוטוקולים, Gelato עם טריגר מבוסס זמן מספיק: בדיקת עמלות מצטברות פעם ב-24 שעות, אם > סף, הפעלת buyback. צרו קשר כדי שנבחר את האפשרות האופטימלית עבור הפרוטוקול שלכם.
פרמטרים מרכזיים ובקרת ממשל
| פרמטר | תיאור | טווח מומלץ |
|---|---|---|
| buybackRatio | אחוז מההכנסות ל-buyback | 20-50% |
| burnRatio | אחוז מהטוקנים שנרכשו לשריפה | 0-50% |
| tranchSize | גודל buyback אחד (בדולרים) | תלוי בנזילות |
| maxSlippageBps | סטייה מקסימלית | 50-200 נקודות בסיס |
| minBuybackInterval | מרווח מינימלי | 12-48 שעות |
שינוי פרמטרים אלה דרך timelock (השהיה של 48-72 שעות) הוא חובה. אחרת, הבעלים עלול לתמרן את ה-buyback לטובתו האישית.
מה כלול בפיתוח
- תיעוד ארכיטקטורה ו-API של החוזים.
- קוד מקור של החוזים החכמים (FeeCollector, BuybackExecutor, RewardDistributor, Staking) עם הערות.
- סט מלא של בדיקות יחידה ואינטגרציה (Foundry).
- הגדרת אוטומציה (Gelato או Chainlink).
- הכשרת צוות הלקוח לתפעול המערכת.
- תמיכה מובטחת לחודש אחד לאחר ההשקה.
תהליך הפיתוח
- ניתוח: הערכת מקורות הכנסה, עומק נזילות, טוקנומיקה (3-5 ימים).
- עיצוב: ארכיטקטורת חוזים, בחירת DEX, הגדרת פרמטרי buyback.
- פיתוח: כתיבת FeeCollector, BuybackExecutor עם TWAP, RewardDistributor, Staking (3-4 שבועות).
- אוטומציה: הגדרת Gelato או Chainlink לביצוע buyback קבוע.
- בדיקות: forks עם מאגרי נזילות אמיתיים (Foundry), בדיקת עמידות ל-MEV.
- ביקורת: ביקורת חיצונית על ידי חברות מובילות (Certik, Hacken).
- השקה וניטור: תמיכה, אחריות לחודש אחד.
הזמינו פיתוח מערכת buyback-and-distribute — קבלו ייעוץ והערכת לוחות זמנים ראשונית תוך 2 ימי עסקים. אנו מבטיחים תיעוד מלא וקוד שקוף. צרו קשר כדי לדון בפרוטוקול שלכם.







