Interactive Learn

Vault Fundamentals

v0.1.0Available

Block-composed Learn

خزانه چیست؟

Learning progress is session-only in this preview.
Chapter 1 · Section 1

خزانه چیست؟

با ساده‌ترین مدل خزانه شروع کنیم

خزانه یک قرارداد هوشمند است که دارایی یک یا چند کاربر را دریافت می‌کند و مشخص می‌کند هر کاربر چه مقدار از دارایی‌های تحت مدیریت خزانه را در اختیار دارد.

برای مثال، کاربران ممکن است USDC خود را در یک خزانه واریز کنند. خزانه می‌تواند این USDC را مستقیماً نگهداری کند یا آن را در یک استراتژی دیگر به کار بگیرد تا سود ایجاد کند.

نکته مهم این است که کاربران ادعای اقتصادی خود بر ارزش دارایی واریزشده را از دست نمی‌دهند. خزانه ثبت می‌کند چه مقدار از مخزن مشترک دارایی به هر کاربر تعلق دارد.

دارایی و سهم یک چیز نیستند

دارایی یا Asset همان توکنی است که کاربران در خزانه واریز می‌کنند. برای مثال، دارایی خزانه می‌تواند USDC باشد.

سهم یا Share یک واحد حسابداری است که میزان مالکیت هر کاربر از خزانه را نشان می‌دهد. سهم‌ها مشخص می‌کنند چه مقدار از مخزن مشترک دارایی به هر کاربر تعلق دارد.

فرض کنید آلیس 100 واحد USDC در یک خزانه خالی واریز می‌کند و 100 سهم دریافت می‌کند. در همان لحظه، هر سهم نماینده 1 واحد USDC است.

اما مقدار دارایی و تعداد سهم همیشه برابر باقی نمی‌ماند. اگر خزانه بعداً 20 واحد USDC سود به دست آورد، ممکن است 120 واحد USDC داشته باشد، درحالی‌که همچنان فقط 100 سهم وجود دارد. در این حالت، ارزش هر سهم برابر با 1.2 واحد USDC خواهد بود.

هنگام واریز چه چیزی تغییر می‌کند؟

وقتی آلیس 100 واحد USDC واریز می‌کند، دو تغییر مهم در وضعیت قرارداد رخ می‌دهد.

ابتدا موجودی USDC خزانه 100 واحد افزایش پیدا می‌کند. دارایی از کیف پول آلیس به خزانه منتقل می‌شود.

سپس خزانه برای آلیس سهم ایجاد می‌کند. در این مثال ساده، آلیس 100 سهم دریافت می‌کند.

پس از واریز:

• موجودی USDC آلیس 100 واحد کاهش یافته است.

• موجودی USDC خزانه 100 واحد افزایش یافته است.

• آلیس مالک 100 سهم خزانه است.

• تعداد کل سهم‌های خزانه 100 واحد افزایش یافته است.

انتقال دارایی و ایجاد سهم، دو بخش از یک عملیات واریز هستند. اگر یکی از این دو بخش انجام نشود، عملیات واریز نباید کامل در نظر گرفته شود.

یک تابع واریز سادهOriginal educational source authored for TraceFi.
SimpleVault.solSolidity · Read-only
  1. function deposit(uint256 assets) external returns (uint256 shares) {
  2. shares = assets; // Simplified 1 asset = 1 share model
  3. asset.safeTransferFrom(msg.sender, address(this), assets);
  4. _mint(msg.sender, shares);
  5. }
Loading SimpleVault.sol source

این تابع ساده‌شده همان دو تغییر وضعیتی را انجام می‌دهد که پیش‌تر توضیح دادیم: دارایی را از کاربر به خزانه منتقل می‌کند و برای ثبت سهم کاربر، توکن سهم ایجاد می‌کند. فعلاً فرض می‌کنیم هر یک واحد دارایی دقیقاً یک سهم ایجاد می‌کند.

تابع واریز را در سه مرحله بخوانیم

ابتدا خزانه مشخص می‌کند آلیس باید چند سهم دریافت کند. در این مثال مقدماتی، از رابطه ساده یک‌به‌یک میان دارایی و سهم استفاده می‌کنیم.

۱. محاسبه سهم‌هاOriginal educational source authored for TraceFi.
SimpleVault.solSolidity · Read-only
  1. shares = assets;
Loading SimpleVault.sol source

سپس خزانه مقدار مشخص‌شده USDC را از کیف پول آلیس به داخل خزانه منتقل می‌کند. آلیس باید پیش از آن، اجازه انتقال توکن‌هایش را به خزانه داده باشد.

۲. انتقال داراییOriginal educational source authored for TraceFi.
SimpleVault.solSolidity · Read-only
  1. asset.safeTransferFrom(msg.sender, address(this), assets);
Loading SimpleVault.sol source

در مرحله آخر، خزانه سهم‌های محاسبه‌شده را برای آلیس ایجاد می‌کند. با این کار هم موجودی سهم آلیس و هم تعداد کل سهم‌های خزانه افزایش پیدا می‌کند.

۳. ایجاد سهم‌هاOriginal educational source authored for TraceFi.
SimpleVault.solSolidity · Read-only
  1. _mint(msg.sender, shares);
Loading SimpleVault.sol source

این سه تغییر درون یک تراکنش انجام می‌شوند. اگر انتقال دارایی یا ایجاد سهم با خطا مواجه شود، کل تراکنش برمی‌گردد و عملیات واریز ثبت نمی‌شود.

What Is a Vault? | TraceFi