تخطي إلى المحتوى الرئيسي

تحويلات رموز ERC-20 والموافقة عليها من عقد سوليديتي ذكي

العقود الذكيه
tokens
Solidity
erc-20
المستوى المتوسط
jdourlens
7 أبريل 2020
6 دقيقة قراءة

في الدرس التعليمي السابق درسنا تشريح رمز ERC-20 في سوليديتي على بلوكتشين إيثريوم. في هذه المقالة، سنرى كيف يمكننا استخدام عقد ذكي للتفاعل مع رمز باستخدام لغة سوليديتي.

لهذا العقد الذكي، سننشئ منصة تداول لامركزية وهمية حقيقية حيث يمكن للمستخدم تداول الإيثر مقابل رمز ERC-20 الذي نشرناه حديثًا.

في هذا الدرس التعليمي، سنستخدم النص البرمجي الذي كتبناه في الدرس التعليمي السابق كأساس. ستقوم منصة التداول اللامركزية الخاصة بنا بإنشاء مثيل للعقد في الدالة الإنشائية الخاصة به وتنفيذ العمليات التالية:

  • استبدال الرموز بالإيثر
  • استبدال الإيثر بالرموز

سنبدأ النص البرمجي لمنصة التداول اللامركزية الخاصة بنا بإضافة قاعدة التعليمات البرمجية البسيطة الخاصة بـ ERC20:

سيقوم عقدنا الذكي الجديد الخاص بمنصة التداول اللامركزية بنشر ERC-20 والحصول على كل ما تم توفيره:

لذا، لدينا الآن منصة التداول اللامركزية الخاصة بنا وكل احتياطي الرموز متاح لديها. يحتوي العقد على وظيفتين:

  • الشراء: يمكن للمستخدم إرسال الإيثر والحصول على رموز في المقابل
  • البيع: يمكن للمستخدم أن يقرر إرسال الرموز لاستعادة الإيثر

وظيفة الشراء

لنقم بكتابة النص البرمجي لوظيفة الشراء. سنحتاج أولاً إلى التحقق من كمية الإيثر التي تحتويها الرسالة والتحقق من أن العقد يمتلك رموزًا كافية وأن الرسالة تحتوي على بعض الإيثر. إذا كان العقد يمتلك رموزًا كافية، فسيرسل عدد الرموز إلى المستخدم ويصدر حدث Bought.

لاحظ أنه إذا استدعينا وظيفة require في حالة حدوث خطأ، فسيتم إرجاع الإيثر المرسل مباشرة وإعادته إلى المستخدم.

لتبسيط الأمور، سنقوم بتبديل رمز واحد مقابل 1 واي.

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "تحتاج إلى إرسال بعض الإيثر");
    require(amountTobuy <= dexBalance, "لا توجد رموز كافية في الاحتياطي");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

في حالة نجاح عملية الشراء، يجب أن نرى حدثين في المعاملة: حدث Transfer للرمز وحدث Bought.

حدثان في المعاملة: Transfer و Bought

وظيفة البيع

الوظيفة المسؤولة عن البيع ستتطلب أولاً من المستخدم أن يكون قد وافق على المبلغ عن طريق استدعاء وظيفة approve مسبقاً. تتطلب الموافقة على التحويل أن يتم استدعاء رمز ERC20Basic الذي تم إنشاؤه بواسطة منصة التداول اللامركزية من قِبل المستخدم. يمكن تحقيق ذلك عن طريق استدعاء وظيفة token() الخاصة بعقد منصة التداول اللامركزية أولاً لاسترداد العنوان الذي نشرت فيه منصة التداول اللامركزية عقد ERC20Basic المسمى token. ثم نقوم بإنشاء مثيل لهذا العقد في جلستنا ونستدعي وظيفة approve الخاصة به. بعد ذلك، يمكننا استدعاء وظيفة sell الخاصة بمنصة التداول اللامركزية واستبدال رموزنا مرة أخرى بالإيثر. على سبيل المثال، هكذا يبدو هذا في جلسة Brownie تفاعلية:

بعد ذلك، عند استدعاء وظيفة البيع، سنتحقق مما إذا كان التحويل من عنوان المتصل إلى عنوان العقد قد تم بنجاح، ثم نعيد إرسال الإيثر إلى عنوان المتصل.

function sell(uint256 amount) public {
    require(amount > 0, "تحتاج إلى بيع بعض الرموز على الأقل");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "تحقق من بدل الرمز");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

إذا سار كل شيء على ما يرام، يجب أن ترى حدثين (Transfer و Sold) في المعاملة وتحديث رصيد الرمز ورصيد الإيثر لديك.

حدثان في المعاملة: Transfer و Sold

من هذا الدرس التعليمي، رأينا كيفية التحقق من الرصيد والبدل لرمز ERC-20، وكذلك كيفية استدعاء Transfer وTransferFrom لعقد ERC20 ذكي باستخدام الواجهة.

بمجرد إجراء معاملة، لدينا درس تعليمي لجافا سكريبت للانتظار والحصول على تفاصيل حول المعاملات (opens in a new tab) التي أُجريت على عقدك ودرس تعليمي لفك تشفير الأحداث الناتجة عن تحويلات الرموز أو أي أحداث أخرى (opens in a new tab) طالما أنك تملك واجهة التطبيق الثنائية (ABI).

إليك النص البرمجي الكامل للدرس التعليمي:

آخر تحديث للصفحة: 3 مارس 2026

هل كان هذا البرنامج التعليمي مفيداً؟