มาต่อ Part ที่สอง ของการสร้าง ERC-20 token ด้วย ink! กันครับ ก่อนหน้านี้เราสร้าง Token ที่มี total_supply
มีการ Transfer token ได้แล้ว
สำหรับ part นี้ จะเป็นการทำให้ token สมบูรณ์แบบยิ่งขึ้น คือสามารถ transfer token ให้คนอื่นได้ โดยที่คนนั้นต้องอนุญาต (Approve) ให้เรา transfer นั่นเอง (คล้ายๆ Defi ทั้งหลาย ที่ Smart Contract ขออนุญาตเรา เพื่อให้เรา Approve contract เพื่อให้ contract transfer เงินเราได้ นั่นเอง)
Approval
ขั้นตอนนี้ เราจะเพิ่ง allowances
โดยใช้ Mapping
เพื่อเก็บว่า AccountId
นั้นๆ Allow ให้ Contract สามารถ spend เงินของเราได้เท่าไหร่
สิ่งที่เราต้องทำคือ สร้าง event สำหรับ Approval
ขึ้นมา เพิ่มต่อจาก event Transfer
ได้เลย
เพิ่ม Error
ใน enum Error
ต่อจาก InsufficientBalance
สุดท้าย struct Erc20
หลังจากเพิ่ม allowances
จะเป็นแบบนี้
เพิ่ม function approve
เพื่อให้เราอนุญาต ตัว Contract สามารถ transfer token เราได้
เพิ่ม function allowance
และ allowance_impl
Transfer Logic
หลังจากที่เรามี function approve
แล้ว ต่อมาต้องสร้าง function transfer_from
เพื่อไว้ transfer token ต่างจาก transfer_from_to
ที่ทำ Part 1 นะครับ function นั้น สำหรับเจ้าของ AccountId ส่งเงิน ให้ account อื่นๆ แต่ transfer_from
อันนี้ สำหรับ Contract
เพิ่ม transfer_from
ลงไป
จะสังเกตเห็นว่า transfer_from
จะไปเรียก transfer_from_to
ข้างใน function ครับ ในฟังค์ชันนี้คือเราเช็คว่า allowances
ไว้มี balance พอมั้ย สุดท้ายเมื่อ transfer เสร็จ เราก็ต้องอัพเดทค่า allowances
ด้วย
Testing
เพิ่ม test เพื่อเช็คว่า transfer_from
ใช้ได้มั้ย
จะสังเกตเห็นว่าในไฟล์ test ผมสามารถใช้ accounts
(เป็น Default ของ Substrate) ได้ จากฟังค์ชั่นนี้
ซึ่งมันคล้ายๆ กับ ถ้าใครใช้ Hardhat หรือ Ethers
ต่อมาเพิ่ม test ของ allowance()
รันเทสด้วยคำสั่ง
จะได้ผลลัพธ์ประมาณนี้
Test ผ่านหมดเลย จากนั้นลองไปทดสอบ Deploy Contract จริงๆกันครับ
Deploy with Contracts UI
เริ่มต้น เราต้อง start local substrate ขึ้นมาก่อน
จะได้ผลลัพธ์ประมาณนี้ แสดงว่า server start เรียบร้อยแล้ว
ต่อมา Build contract ครับ
จะได้ไฟล์ target/link/erc20.contract
ไฟล์นี้เราจะต้องเอาไป Deploy ผ่าน Contracts UI
เปิด Contracts UI ขึ้นมา ทดลอง Deploy contract ที่เรา build ไว้ ใส่ total_supply
ตามใจชอบ
ลอง Transfer ลอง Approve หรือลอง function อื่นๆ ดูครับ
หากใครไม่อยากใช้ local เราสามารถใช้ Canvas ได้ เวลาที่เราเปิด Contracts UI ก็เลือกเป็น Canvas ครับ
🎉 ยินดีด้วยคุณคือผู้โชคดีได้รับรางวัลมูลค่า xxx บาท จะบ้า หรอ
จบไปแล้วครับ สำหรับบทความ ERC-20 ด้วยภาษา ink! จริงๆ ต้องบอกว่าบทความ ส่วนใหญ่ผมก็อ้างอิงจาก Official ครับ สิ่งสำคัญคือ เราต้องอ่าน และลงมือทำครับ ไม่ใช่แค่อ่านอย่างเดียว
เวลาอ่าน Tutorial ก็พยายามลองแก้ ให้ต่างจาก tutorial ลองเล่น function อื่นๆ แล้วเดี๋ยวจะเข้าใจมากขึ้นครับ ส่วนตัวผม ก็เพิ่งได้หัดเขียน ink! และอยู่กับ Substrate น่าจะไม่ถึงเดือน แต่รู้สึกว่าสนุกดีครับ หากมีส่วนไหนผิดพลาด ต้องขออภัยด้วยครับ พยายามเรียนรู้เพิ่มเติมเรื่อยๆ
หวังว่าจะชอบบทความนี้นะครับ ไปละ สวัสดี
Happy Coding ❤️
References