לעתים קרובות אנו נתקלים במצבים שבהם לקוח רוצה לאגד תשואות מפרוטוקולי DeFi שונים, אך נתקל בגן חיות של ממשקים שאינם תואמים. לפני ERC-4626, כל vault תשואה יישם ממשק משלו: Yearn V2 השתמש ב-pricePerShare(), Compound השתמש ב-exchangeRate(), Aave עבד דרך aToken עם ריבסינג. כתיבת אגרגטור שעובד עם מספר vaults בו-זמנית משמעותה תחזוקה של גן חיות של מתאמים. ERC-4626 תקן זאת: ממשק אחד לכל ה-vaults הממותגים. כיום תקן זה נמצא בשימוש על ידי Yearn V3, Morpho Blue, רוב פרוטוקולי הסטייקינג הנזיל, וכל האגרגטורים המרכזיים להלוואות. זהו התקן דה-פקטו עבור טוקנים נושאי תשואה. בין אם אתה צריך Solidity vault מותאם אישית או DeFi vault לאגרגציית תשואות, יש לנו את המומחיות. הזמינו פיתוח vault במפתח פתוח—חסכו זמן על אינטגרציה וביקורות. עם ניסיון של 5+ שנים ויותר מ-30 פרויקטי DeFi שסופקו, אנו מבטיחים פתרונות באיכות גבוהה.
ERC-4626 הוא הרחבה של ERC-20 עם מתודות להפקדה/משיכה של נכסים (נכס בסיסי), הנפקה/פדיון של מניות (טוקן vault), והמרה בין נכסים למניות. הוא יוצר vault ממותג עבור טוקנים נושאי תשואה. טוקן ה-vault (מניות) הוא ERC-20 רגיל שניתן לסחור בו ולהעבירו. מחיר המניה עולה ככל שהתשואה מצטברת. זה שונה מהותית מריבסינג (stETH), שבו יתרת הטוקן משתנה בעוד המחיר נשאר קבוע.
מתמטיקת Vault: מחיר למניה
המחיר למניה ב-ERC-4626 הוא: pricePerShare = totalAssets / totalShares.
| תרחיש | נוסחה למניות | שיקול מיוחד |
|---|---|---|
| הפקדה ראשונה | מניות = נכסים | דורש אתחול עם מניות וירטואליות |
| הפקדות עוקבות | מניות = נכסים * סך המניות / סך הנכסים | עיגול למטה |
| משיכה | נכסים = מניות * סך הנכסים / סך המניות | עיגול למעלה |
בהפקדה הראשונה (סך המניות = 0), כל נוסחה שמחלקת באפס אינה תקפה. OpenZeppelin פותר זאת באמצעות מניות וירטואליות: אתחול עם סך מניות = 10^decimals, סך נכסים = 10^decimals, מה שנותן מחיר התחלתי למניה = 1. ראה תיעוד OpenZeppelin ERC4626.
מתקפת אינפלציה על Vault
זוהי פרצת אבטחה אמיתית המאפשרת למפקיד הראשון להרוויח על חשבון המפקידים הבאים. תרחיש: תוקף מפקיד 1 wei, מקבל מניה אחת, ואז תורם סכום גדול של הנכס (עוקף את ההפקדה), ומעלה בחדות את המחיר למניה. המשתמש הבא מפקיד 1000 USDC אך, בשל עיגול למטה, מקבל 0 מניות—הנכסים שלו הולכים לתוקף.
כיצד להתגונן מפני מתקפת אינפלציה
ה-ERC4626 של OpenZeppelin (v5.0+) מגן באמצעות מניות וירטואליות עם _decimalsOffset(). הגדרת offset=3 יוצרת רזרבה וירטואלית של 10^(3+decimals) מניות מול 10^decimals נכסים. התוקף יצטרך להפקיד סכום עצום עבור רווח מזערי—המתקפה הופכת לבלתי כדאית כלכלית.
function _decimalsOffset() internal view virtual returns (uint8) {
return 0; // Увеличьте до 3 для дополнительной защиты
} מימוש Vault ERC-4626 בסיסי
אנו משתמשים ב-Foundry, Solidity 0.8.24, OpenZeppelin. הנקודה המרכזית: ה-vault עוקף את function _decimalsOffset() internal view virtual returns (uint8) { return 0; // Увеличьте до 3 для дополнительной защиты } כדי להתחשב לא רק ביתרת ה-vault אלא גם בנכסים הפרוסים באסטרטגיה. ה-hooks totalAssets() ו-_afterDeposit מנהלים פריסה והחזרת כספים.
הצג את חוזה ה-Vault המלא
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract SimpleYieldVault is ERC4626, Ownable {
address public strategy;
uint256 public performanceFee; // 500 = 5%
constructor(
IERC20 asset_,
string memory name_,
string memory symbol_
) ERC4626(asset_) ERC20(name_, symbol_) Ownable(msg.sender) {}
function totalAssets() public view virtual override returns (uint256) {
uint256 vaultBalance = IERC20(asset()).balanceOf(address(this));
uint256 strategyBalance = strategy != address(0) ? IStrategy(strategy).totalAssets() : 0;
return vaultBalance + strategyBalance;
}
function _afterDeposit(uint256 assets, uint256) internal virtual {
if (strategy != address(0)) {
IERC20(asset()).approve(strategy, assets);
IStrategy(strategy).invest(assets);
}
}
function _beforeWithdraw(uint256 assets, uint256) internal virtual {
uint256 vaultBalance = IERC20(asset()).balanceOf(address(this));
if (assets > vaultBalance && strategy != address(0)) {
IStrategy(strategy).divest(assets - vaultBalance);
}
}
} מדוע כיווני העיגול חשובים?
ERC-4626 מציין במפורש את העיגול: _beforeWithdraw ו-// SPDX-License-Identifier: MIT pragma solidity ^0.8.24; import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract SimpleYieldVault is ERC4626, Ownable { address public strategy; uint256 public performanceFee; // 500 = 5% constructor( IERC20 asset_, string memory name_, string memory symbol_ ) ERC4626(asset_) ERC20(name_, symbol_) Ownable(msg.sender) {} function totalAssets() public view virtual override returns (uint256) { uint256 vaultBalance = IERC20(asset()).balanceOf(address(this)); uint256 strategyBalance = strategy != address(0) ? IStrategy(strategy).totalAssets() : 0; return vaultBalance + strategyBalance; } function _afterDeposit(uint256 assets, uint256) internal virtual { if (strategy != address(0)) { IERC20(asset()).approve(strategy, assets); IStrategy(strategy).invest(assets); } } function _beforeWithdraw(uint256 assets, uint256) internal virtual { uint256 vaultBalance = IERC20(asset()).balanceOf(address(this)); if (assets > vaultBalance && strategy != address(0)) { IStrategy(strategy).divest(assets - vaultBalance); } } } מעגלים למטה (floor), convertToShares מעגל למעלה (ceil), previewDeposit מעגל למטה. הפרה של זה היא ממצא בביקורת. העיגול תמיד לטובת ה-vault; אחרת, ניקוז דרך פעולות קטנות רבות אפשרי.
מקרי קצה חשובים
אם הנכס הבסיסי הוא טוקן עם עמלת העברה (fee-on-transfer), ה-vault מקבל פחות מהמצוין. פתרון: מדידת היתרה בפועל לאחר ההעברה וחישוב מחדש של המניות. זה נלקח בחשבון בקוד.
השוואת תקני טוקני תשואה
| תקן | סוג | קלות אינטגרציה | סיכון מניפולציה |
|---|---|---|---|
| ERC-4626 | מבוסס מניות | גבוהה (טוב פי 2-3 ממותאם אישית) | נמוך (הגנה מפני מתקפת אינפלציה) |
| ריבסינג | שינוי יתרה | בינונית | בינוני (מורכבות אגרגציה) |
| מותאם אישית | מגוון | נמוכה | גבוה (אין ממשק אחיד) |
ERC-4626 טוב פי 2-3 לאינטגרציות מאשר פתרונות מותאמים אישית או ריבסינג. זה מאושר על ידי הפרקטיקה: פרוטוקולים רבים עוברים לתקן זה, ומפחיתים עלויות פיתוח וביקורת.
בדיקות וביקורת
אנו משתמשים בבדיקות המאפיינים הרשמיות: ERC4626 Properties. בדיקות ה-fuzz של Foundry מכסות מאפייני roundtrip ואינווריאנטים. אנו מבטיחים שביקורת ה-ERC-4626 שלך מכסה את כל הפרצות, כולל תרחיש מתקפת האינפלציה על vault.
function testFuzz_DepositRedeem(uint256 assets) public {
assets = bound(assets, 1, 1e30);
vm.assume(assets <= token.balanceOf(user));
uint256 shares = vault.deposit(assets, user);
uint256 assetsBack = vault.redeem(shares, user, user);
// Потери на округление не более 1 wei
assertApproxEqAbs(assetsBack, assets, 1);
}אנו מבטיחים מעבר בביקורות חיצוניות: חוזים עוברים את Slither, Mythril, Echidna. קבל ייעוץ לגבי מוכנות לביקורת. עלויות ביקורת טיפוסיות נעות בין $2,000 ל-$5,000 בהתאם למורכבות.
מה כלול בפיתוח Vault ERC-4626
- ניתוח דרישות — דיון באסטרטגיית תשואה, מודל עמלות, רשת יעד (Ethereum, Polygon, Arbitrum וכו').
- עיצוב ארכיטקטורה — תוכנית אינטראקציה של vault, אסטרטגיות, harvester.
- מימוש חוזה חכם — Solidity 0.8.x, Foundry, OpenZeppelin.
- בדיקות — יחידה, fuzz, אינטגרציה (כיסוי >95%).
- פריסה ואימות ב-Etherscan.
- תמיכה במהלך ביקורת חיצונית — ייעוץ ותיקונים.
- תיעוד טכני — תיאורי חוזה, זרימות קריאה.
במשך יותר מ-5 שנים, סיפקנו יותר מ-30 פרויקטי DeFi, כולל פתרונות vault לפרוטוקולים עם TVL מעל $100M. זה מאפשר לנו לצפות בעיות טיפוסיות ולתת המלצות ארכיטקטוניות.
לוחות זמנים ועלות
Vault ERC-4626 בסיסי עם אסטרטגיה אחת: 3-5 ימי עסקים, החל מ-$5,000. Vault מלא עם harvester, מנגנון עמלות ומספר אסטרטגיות: 2-3 שבועות, החל מ-$15,000. חסכו עד $10,000 בעלויות פיתוח בהשוואה לבנייה מאפס עם ממשקים מותאמים אישית.
פיתוח החוזים החכמים שלנו עבור מאגרי נזילות ממותגים וטוקניזציה של אסטרטגיות תשואה מבטיח vault ERC-4626 חזק שעובר את כל בדיקות האבטחה.
צור קשר כדי להעריך את הפרויקט שלך—אנו נבחר את הארכיטקטורה האופטימלית. הזמינו פיתוח vault במפתח פתוח וקבלו חוזה עובד עם בסיס בדיקות מוכן.
קבל ייעוץ לפרויקט שלך—המהנדסים שלנו יעזרו לבחור את האסטרטגיה האופטימלית ולהפחית סיכונים.







