معيار الرمز القابل للدفع ERC-1363
آخر تحديث للصفحة: 4 أبريل 2025
مقدمة
ما هو ERC-1363؟
ERC-1363 هو واجهة توسيع لرموز ERC-20 تدعم تنفيذ منطق مخصص في عقد المستلم بعد التحويلات، أو في عقد المنفق بعد الموافقات، كل ذلك ضمن معاملة واحدة.
Differences from ERC-20
لا تسمح عمليات ERC-20 القياسية مثل transfer وtransferFrom وapprove بتنفيذ التعليمات البرمجية على عقد المستلم أو المنفق دون معاملة منفصلة.
وهذا ما يزيد من تعقيد تطوير واجهة المستخدم ويؤدي إلى احتكاك في التبني؛ لأن المستخدمين يجب أن ينتظروا تنفيذ المعاملة الأولى ثم إرسال المعاملة الثانية.
يجب عليهم أيضًا دفع رسوم الغاز مرتين.
يجعل معيار ERC-1363 الرموز القابلة للاستبدال قادرة على أداء الإجراءات بسهولة أكبر والعمل دون استخدام أي مستمع خارج السلسلة. فهو يسمح بإجراء استدعاء على عقد مستلم أو منفق، بعد التحويل أو الموافقة، في معاملة واحدة.
المتطلبات الأساسية
لفهم هذه الصفحة بشكل أفضل، نوصيك أولاً بالقراءة عن:
- معايير الرمز
- ERC-20
الجسد
يقدم معيار ERC-1363 واجهة برمجة تطبيقات قياسية لرموز ERC-20 للتفاعل مع العقود الذكية بعد transfer أو transferFrom أو approve.
يوفر هذا المعيار وظائف أساسية لنقل الرموز، بالإضافة إلى السماح بالموافقة على الرموز حتى يمكن إنفاقها من قبل طرف ثالث آخر على السلسلة، ثم إجراء استدعاء على عقد المستلم أو المنفق.
هناك العديد من الاستخدامات المقترحة للعقود الذكية التي يمكن أن تقبل استدعاءات ERC-20.
ومن الأمثلة على ذلك:
- المبيعات الجماعية: تؤدي الرموز المرسلة إلى تخصيص فوري للمكافآت.
- الخدمات: الدفع ينشط الوصول إلى الخدمة في خطوة واحدة.
- الفواتير: الرموز تسوي الفواتير تلقائيًا.
- الاشتراكات: الموافقة على السعر السنوي ينشط الاشتراك ضمن دفعة الشهر الأول.
لهذه الأسباب تمت تسميته في الأصل "الرمز القابل للدفع".
يوسع سلوك الاستدعاء من فائدته، مما يتيح تفاعلات سلسة مثل:
- التحصيص: تؤدي الرموز المحولة إلى القفل التلقائي في عقد التحصيص.
- التصويت: الرموز المستلمة تسجل الأصوات في نظام الحوكمة.
- المبادلة: موافقات الرموز تنشط منطق المبادلة في خطوة واحدة.
يمكن استخدام رموز ERC-1363 لمرافق محددة في جميع الحالات التي تتطلب تنفيذ استدعاء بعد استلام تحويل أو موافقة. يعتبر معيار ERC-1363 مفيدًا أيضًا في تجنب فقدان الرمز أو قفله في العقود الذكية عن طريق التحقق من قدرة المستلم على التعامل مع الرموز.
على عكس مقترحات توسيع ERC-20 الأخرى، لا يتجاوز ERC-1363 طرق transfer وtransferFrom لمعيار ERC-20 ويحدد معرّفات الواجهات التي سيتم تنفيذها مع الحفاظ على التوافق مع الإصدارات السابقة من ERC-20.
من EIP-1363 (opens in a new tab):
طرق
العقود الذكية التي تنفذ معيار ERC-1363 يجب أن تنفذ جميع الوظائف في واجهة ERC1363، بالإضافة إلى واجهات ERC20 وERC165.
1pragma solidity ^0.8.0;23/**4 * @title ERC13635 * @dev واجهة توسيع لرموز ERC-20 التي تدعم تنفيذ التعليمات البرمجية على عقد مستلم6 * بعد `transfer` أو `transferFrom`، أو تعليمات برمجية على عقد منفق بعد `approve`، في معاملة واحدة.7 */8interface ERC1363 is ERC20, ERC165 {9 /*10 * ملاحظة: معرف ERC-165 لهذه الواجهة هو 0xb0202a11.11 * 0xb0202a11 ===12 * bytes4(keccak256('transferAndCall(address,uint256)')) ^13 * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^14 * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^15 * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^16 * bytes4(keccak256('approveAndCall(address,uint256)')) ^17 * bytes4(keccak256('approveAndCall(address,uint256,bytes)'))18 */1920 /**21 * @dev ينقل كمية `value` من الرموز من حساب المتصل إلى `to`22 * ثم يستدعي `ERC1363Receiver::onTransferReceived` على `to`.23 * @param to العنوان الذي يتم نقل الرموز إليه.24 * @param value كمية الرموز المراد نقلها.25 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.26 */27 function transferAndCall(address to, uint256 value) external returns (bool);2829 /**30 * @dev ينقل كمية `value` من الرموز من حساب المتصل إلى `to`31 * ثم يستدعي `ERC1363Receiver::onTransferReceived` على `to`.32 * @param to العنوان الذي يتم نقل الرموز إليه.33 * @param value كمية الرموز المراد نقلها.34 * @param data بيانات إضافية بدون تنسيق محدد، يتم إرسالها في الاستدعاء إلى `to`.35 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.36 */37 function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);3839 /**40 * @dev ينقل كمية `value` من الرموز من `from` إلى `to` باستخدام آلية السماح41 * ثم يستدعي `ERC1363Receiver::onTransferReceived` على `to`.42 * @param from العنوان الذي سيتم إرسال الرموز منه.43 * @param to العنوان الذي يتم نقل الرموز إليه.44 * @param value كمية الرموز المراد نقلها.45 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.46 */47 function transferFromAndCall(address from, address to, uint256 value) external returns (bool);4849 /**50 * @dev ينقل كمية `value` من الرموز من `from` إلى `to` باستخدام آلية السماح51 * ثم يستدعي `ERC1363Receiver::onTransferReceived` على `to`.52 * @param from العنوان الذي سيتم إرسال الرموز منه.53 * @param to العنوان الذي يتم نقل الرموز إليه.54 * @param value كمية الرموز المراد نقلها.55 * @param data بيانات إضافية بدون تنسيق محدد، يتم إرسالها في الاستدعاء إلى `to`.56 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.57 */58 function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);5960 /**61 * @dev يحدد كمية `value` من الرموز على أنها سماحية `spender` على رموز المتصل62 * ثم يستدعي `ERC1363Spender::onApprovalReceived` على `spender`.63 * @param spender العنوان الذي سينفق الأموال.64 * @param value كمية الرموز التي سيتم إنفاقها.65 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.66 */67 function approveAndCall(address spender, uint256 value) external returns (bool);6869 /**70 * @dev يحدد كمية `value` من الرموز على أنها سماحية `spender` على رموز المتصل71 * ثم يستدعي `ERC1363Spender::onApprovalReceived` على `spender`.72 * @param spender العنوان الذي سينفق الأموال.73 * @param value كمية الرموز التي سيتم إنفاقها.74 * @param data بيانات إضافية بدون تنسيق محدد، يتم إرسالها في الاستدعاء إلى `spender`.75 * @return قيمة منطقية تشير إلى نجاح العملية ما لم يتم طرح استثناء.76 */77 function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);78}7980interface ERC20 {81 event Transfer(address indexed from, address indexed to, uint256 value);82 event Approval(address indexed owner, address indexed spender, uint256 value);83 function transfer(address to, uint256 value) external returns (bool);84 function transferFrom(address from, address to, uint256 value) external returns (bool);85 function approve(address spender, uint256 value) external returns (bool);86 function totalSupply() external view returns (uint256);87 function balanceOf(address account) external view returns (uint256);88 function allowance(address owner, address spender) external view returns (uint256);89}9091interface ERC165 {92 function supportsInterface(bytes4 interfaceId) external view returns (bool);93}إظهار الكلالعقد الذكي الذي يريد قبول رموز ERC-1363 عبر transferAndCall أو transferFromAndCall يجب أن ينفذ واجهة ERC1363Receiver:
1/**2 * @title ERC1363Receiver3 * @dev واجهة لأي عقد يريد دعم `transferAndCall` أو `transferFromAndCall` من عقود رموز ERC-1363.4 */5interface ERC1363Receiver {6 /**7 * @dev كلما تم نقل رموز ERC-1363 إلى هذا العقد عبر `ERC1363::transferAndCall` أو `ERC1363::transferFromAndCall`8 * بواسطة `operator` من `from`، يتم استدعاء هذه الدالة.9 *10 * ملاحظة: لقبول النقل، يجب أن تُرجع هذه الدالة11 * `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))`12 * (أي 0x88a7ca5c، أو محدد الدالة الخاص بها).13 *14 * @param operator العنوان الذي استدعى دالة `transferAndCall` أو `transferFromAndCall`.15 * @param from العنوان الذي يتم نقل الرموز منه.16 * @param value كمية الرموز المنقولة.17 * @param data بيانات إضافية بدون تنسيق محدد.18 * @return `bytes4(keccak256(\"onTransferReceived(address,address,uint256,bytes)\"))` إذا كان النقل مسموحًا به ما لم يتم طرح استثناء.19 */20 function onTransferReceived(address operator, address from, uint256 value, bytes calldata data) external returns (bytes4);21}إظهار الكلالعقد الذكي الذي يريد قبول رموز ERC-1363 عبر approveAndCall يجب أن ينفذ واجهة ERC1363Spender:
1/**2 * @title ERC1363Spender3 * @dev واجهة لأي عقد يريد دعم `approveAndCall` من عقود رموز ERC-1363.4 */5interface ERC1363Spender {6 /**7 * @dev كلما وافق `owner` رموز ERC-1363 على هذا العقد عبر `ERC1363::approveAndCall`8 * لإنفاق رموزه، يتم استدعاء هذه الدالة.9 *10 * ملاحظة: لقبول الموافقة، يجب أن تُرجع هذه الدالة11 * `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))`12 * (أي 0x7b04a2d0، أو محدد الدالة الخاص بها).13 *14 * @param owner العنوان الذي استدعى دالة `approveAndCall` وامتلك الرموز سابقًا.15 * @param value كمية الرموز التي سيتم إنفاقها.16 * @param data بيانات إضافية بدون تنسيق محدد.17 * @return `bytes4(keccak256(\"onApprovalReceived(address,uint256,bytes)\"))` إذا كانت الموافقة مسموحًا بها ما لم يتم طرح استثناء.18 */19 function onApprovalReceived(address owner, uint256 value, bytes calldata data) external returns (bytes4);20}إظهار الكل