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

تحويلات وموافقة الرموز المميزة ⁦ERC-20⁩ من عقد ذكي بلغة ⁦Solidity⁩

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

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

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

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

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

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

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

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

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

دالة الشراء

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

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

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

function buy() payable public {
    uint256 amountTobuy = msg.value;
    uint256 dexBalance = token.balanceOf(address(this));
    require(amountTobuy > 0, "You need to send some ether");
    require(amountTobuy <= dexBalance, "Not enough tokens in the reserve");
    token.transfer(msg.sender, amountTobuy);
    emit Bought(amountTobuy);
}

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

Two events in the transaction: Transfer and Bought

دالة البيع

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

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

function sell(uint256 amount) public {
    require(amount > 0, "You need to sell at least some tokens");
    uint256 allowance = token.allowance(msg.sender, address(this));
    require(allowance >= amount, "Check the token allowance");
    token.transferFrom(msg.sender, address(this), amount);
    payable(msg.sender).transfer(amount);
    emit Sold(amount);
}

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

Two events in the transaction: Transfer and Sold


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

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

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