Interactive Learn

Popcorn: ERC-4626 Adapter Vault

v0.1.0Available

Block-composed Learn

پیاده‌سازی Popcorn Vault متصل به ERC-4626 Adapter

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

اتصال Vault به Adapter

قراردادهای پشت Vault

Popcorn Vault دارایی کاربران را به‌صورت بیکار داخل Vault بیرونی نگه نمی‌دارد. در عوض، دارایی‌ها را به یک Adapter می‌فرستد تا موقعیت دارایی پایه را مدیریت کند.

با این معماری، دو لایه حسابداری مرتبط با یکدیگر ایجاد می‌شود.

کاربران با Popcorn Vault تعامل می‌کنند و Popcorn Share دریافت می‌کنند. خود Popcorn Vault با Adapter تعامل می‌کند و Adapter Share دریافت می‌کند.

اگرچه هر دو توکن Share نامیده می‌شوند، اما مالکیت در دو قرارداد متفاوت را نمایش می‌دهند و نباید آن‌ها را یک واحد یکسان در نظر بگیریم.

نموداری که نشان می‌دهد کاربر دارایی پایه را داخل Popcorn Vault سپرده‌گذاری می‌کند، Popcorn Vault دارایی را داخل ERC-4626 Adapter قرار می‌دهد و Adapter موقعیت زیرین را مدیریت می‌کند. کاربر مالک Popcorn Shareها و Popcorn Vault مالک Adapter Shareها است.
دارایی‌ها از طریق Popcorn Vault وارد ERC-4626 Adapter می‌شوند و مالکیت در هر لایه با یک نوع Share جداگانه نمایش داده می‌شود.

تعریف Asset و Adapter

Vault بیرونی باید آدرس دو قرارداد را نگه دارد.

قرارداد اول، توکن ERC-20 است که کاربران آن را سپرده‌گذاری می‌کنند. قرارداد دوم، ERC-4626 Adapter است که آن دارایی را دریافت و مدیریت می‌کند.

Popcorn Vault همچنین ERC-20 Share مخصوص خودش را صادر می‌کند. این Shareها مالکیت کاربر در Vault بیرونی را نمایش می‌دهند، نه مالکیت مستقیم در موقعیت Adapter.

آدرس هر دو قرارداد به‌صورت immutable ذخیره می‌شود. بعد از شروع صدور Share، تغییر Asset یا Adapter می‌تواند چیزی را که Shareهای موجود نمایش می‌دهند عوض کند.

CodeOriginal educational source authored for TraceFi.
PopcornVault.solSolidity · Read-only
  1. // SPDX-License-Identifier: MIT
  2. pragma solidity ^0.8.24;
  3. import {ERC20} from
  4. "@openzeppelin/contracts/token/ERC20/ERC20.sol";
  5. import {IERC20} from
  6. "@openzeppelin/contracts/token/ERC20/IERC20.sol";
  7. import {IERC4626} from
  8. "@openzeppelin/contracts/interfaces/IERC4626.sol";
  9. import {SafeERC20} from
  10. "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
  11. contract PopcornVault is ERC20 {
  12. using SafeERC20 for IERC20;
  13. IERC20 public immutable underlying;
  14. IERC4626 public immutable adapter;
  15. constructor(
  16. IERC20 underlying_,
  17. IERC4626 adapter_
  18. ) ERC20("Popcorn Vault Share", "pVAULT") {
  19. underlying = underlying_;
  20. adapter = adapter_;
  21. }
  22. }
Loading PopcornVault.sol source

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

متغیر underlying به توکن ERC-20 اشاره می‌کند که Vault از کاربران دریافت خواهد کرد. متغیر adapter نیز به ERC-4626 Vaultای اشاره می‌کند که آن دارایی را مدیریت خواهد کرد.

قرارداد PopcornVault از ERC20 ارث‌بری می‌کند، زیرا Shareهای قابل‌انتقال مخصوص خودش را برای کاربران صادر خواهد کرد.

در حال حاضر Constructor فقط آدرس این دو قرارداد را ذخیره می‌کند. در سکشن بعدی، Asset مربوط به Adapter را اعتبارسنجی می‌کنیم و مجوز انتقال توکن را در اختیار آن قرار می‌دهیم.

آنچه تا اینجا ساخته‌ایم

اکنون Vault بیرونی به Asset پایه و ERC-4626 Adapter متصل شده است.

کاربران با Popcorn Vault تعامل می‌کنند و Popcorn Vault نیز با Adapter تعامل خواهد کرد.

کاربران مالک Popcorn Shareها هستند. Popcorn Vault مالک Adapter Shareها است و Adapter دارایی‌های پایه را مدیریت می‌کند.

هنوز تابع Deposit را پیاده‌سازی نکرده‌ایم. در Chapter بعدی، از موقعیت Popcorn Vault در Adapter برای محاسبه totalAssets استفاده می‌کنیم و پیاده‌سازی حسابداری Asset و Share را آغاز خواهیم کرد.