معيار القبو المرمز غير المتزامن ERC-7540
مقدمة
يوسع ERC-7540 معيار القبو المرمز ERC-4626 من خلال إضافة دعم لتدفقات الإيداع والاسترداد غير المتزامنة. يقدم نمط الطلب ثم المطالبة: يرسل المستخدمون أولاً طلباً (قفل أصولهم أو حصصهم)، ثم يطالبون بالنتيجة بعد أن يعالجها القبو.
هناك حاجة إلى ذلك عندما لا يتمكن القبو من إجراء تسوية فورية في معاملة واحدة، على سبيل المثال:
- بروتوكولات أصول العالم الحقيقي (RWA) مثل سندات الخزانة المرمزة، والائتمان الخاص، والأصول الأخرى ذات دورات تسوية T+1 أو T+2
- الإقراض غير المضمون بالكامل حيث تتم تقييمات الائتمان خارج السلسلة
- استراتيجيات القبو عبر السلاسل حيث يؤدي التجسير إلى حدوث تأخيرات
- رموز التخزين السائل (LST) ذات فترات فك الارتباط
يمكن للأقبية اختيار أن تكون غير متزامنة في الإيداعات فقط، أو الاستردادات فقط، أو كليهما. تتيح هذه المرونة لمطوري القبو إضافة تدفقات غير متزامنة فقط حيث تتطلب الاستراتيجية الأساسية ذلك، مع الحفاظ على الجانب الآخر متزامناً.
المتطلبات الأساسية
لفهم هذه الصفحة بشكل أفضل، نوصيك بقراءة معايير الرموز المميزة، وERC-20، وERC-4626 أولاً.
ERC-4626 مقابل ERC-7540
في ERC-4626، تتم تسوية الإيداع بشكل ذري: يرسل المستثمر الأصول ويتلقى الحصص في معاملة واحدة.
يقسم ERC-7540 هذا إلى خطوتين. يستدعي المستثمر أولاً requestDeposit() لقفل الأصول، ثم ينتظر مدير القبو لمعالجة الطلب. بمجرد التنفيذ، يستدعي المستثمر deposit() للمطالبة بحصصه. يتم تحديد أسعار الصرف في وقت التنفيذ، وليس في وقت الطلب.
يعمل تدفق الاسترداد بنفس الطريقة: يقفل requestRedeem() الحصص، وبمجرد التنفيذ يستدعي المستثمر redeem() للمطالبة بالأصول.
وظائف وميزات ERC-7540
يرث ERC-7540 واجهة ERC-4626 بالكامل ولكنه يعيد استخدام deposit/mint/withdraw/redeem كوظائف مطالبة. تتعامل الوظيفتان الجديدتان requestDeposit وrequestRedeem مع خطوة الطلب الأولية.
يمر كل طلب بثلاث حالات: معلق (تم إرساله، في انتظار المعالجة)، وقابل للمطالبة (تم تنفيذه وتسعيره)، ومطالب به (قام المستثمر بجمع حصصه أو أصوله).
تدفق طلب الإيداع
requestDeposit
function requestDeposit(uint256 assets, address controller, address owner) external returns (uint256 requestId)
يحول assets من owner إلى القبو ويرسل طلب إيداع. يتلقى العنوان controller التحكم في الطلب. يُرجع requestId يحدد دفعة الطلب.
pendingDepositRequest
function pendingDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)
يُرجع مقدار assets في طلب إيداع معلق (غير قابل للمطالبة بعد) للعنوان controller وrequestId المحددين.
claimableDepositRequest
function claimableDepositRequest(uint256 requestId, address controller) external view returns (uint256 assets)
يُرجع مقدار assets في طلب إيداع قابل للمطالبة (تم تنفيذه ولكن لم تتم المطالبة به بعد) للعنوان controller وrequestId المحددين.
المطالبة بالإيداعات
بمجرد أن يصبح طلب الإيداع قابلاً للمطالبة، يستدعي المستخدم وظيفة ERC-4626 القياسية deposit أو mint للمطالبة بحصصه. في ERC-7540، لم تعد هذه الوظائف تحول الأصول (حدث ذلك بالفعل في وقت الطلب). إنها تقوم فقط بسك الحصص للمستلم.
تدفق طلب الاسترداد
requestRedeem
function requestRedeem(uint256 shares, address controller, address owner) external returns (uint256 requestId)
يقفل shares من owner ويرسل طلب استرداد. يتلقى العنوان controller التحكم في الطلب.
pendingRedeemRequest
function pendingRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)
يُرجع مقدار shares في طلب استرداد معلق للعنوان controller وrequestId المحددين.
claimableRedeemRequest
function claimableRedeemRequest(uint256 requestId, address controller) external view returns (uint256 shares)
يُرجع مقدار shares في طلب استرداد قابل للمطالبة للعنوان controller وrequestId المحددين.
المطالبة بالاستردادات
بمجرد أن يصبح طلب الاسترداد قابلاً للمطالبة، يستدعي المستخدم وظيفة ERC-4626 القياسية redeem أو withdraw للمطالبة بأصوله.
إدارة المشغل
يتضمن ERC-7540 نمط مشغل (من ERC-6909 (يفتح في علامة تبويب جديدة)) يسمح لأطراف ثالثة بإدارة الطلبات نيابة عن المستخدم.
setOperator
function setOperator(address operator, bool approved) external returns (bool)
يوافق على أو يلغي operator للتصرف نيابة عن msg.sender لطلبات الإيداع/الاسترداد والمطالبات.
isOperator
function isOperator(address controller, address operator) external view returns (bool)
يُرجع ما إذا كان operator معتمداً للتصرف نيابة عن controller.
معرفات الطلب
تميز معرفات الطلب بين الدفعات المختلفة من الطلبات. جميع الطلبات التي تشترك في نفس requestId قابلة للاستبدال: فهي تنتقل بين الحالات معاً وتتلقى نفس سعر الصرف.
عندما يُرجع القبو requestId = 0 لجميع الطلبات، فإن العنوان controller فقط هو الذي يميز حالة الطلب. يتم تجميع الطلبات المتعددة من نفس المتحكم.
أحداث
حدث DepositRequest
يجب إصداره عند إرسال طلب إيداع عبر requestDeposit.
event DepositRequest(
address indexed controller,
address indexed owner,
uint256 indexed requestId,
address sender,
uint256 assets
)
حدث RedeemRequest
يجب إصداره عند إرسال طلب استرداد عبر requestRedeem.
event RedeemRequest(
address indexed controller,
address indexed owner,
uint256 indexed requestId,
address sender,
uint256 shares
)
حدث OperatorSet
يجب إصداره عند الموافقة على مشغل أو إلغائه عبر setOperator.
event OperatorSet(
address indexed controller,
address indexed operator,
bool approved
)
وظائف المعاينة
يجب أن تتراجع وظائف المعاينة فقط للتدفقات غير المتزامنة، لأن سعر الصرف غير معروف حتى يتم تنفيذ الطلب. في قبو الإيداع غير المتزامن، يجب أن تتراجع previewDeposit وpreviewMint، بينما تستمر previewRedeem وpreviewWithdraw في العمل كما هو الحال في ERC-4626 (والعكس صحيح بالنسبة لقبو الاسترداد غير المتزامن). هذا اختلاف سلوكي رئيسي عن ERC-4626.