มาลองอ่าน code OpenZeppelin’s PaymentSplitter กัน
วันนี้เราจะมาลองอ่าน PaymentSplitter กัน ตาม link
เราจะไม่แก้ code ต้นฉบับเลย ดังนั้นจะได้ scenario ดังนี้
นาย A และนาย B เป็นหุ้นส่วนเปิดร้านกาแฟด้วยกันในอัตราส่วน 6 : 4 โดยทั้งคู่ต้องการ smart contract ในการรวบรวมกำไร (เป็นเงินสกุล eth) จากการเปิดร้านเอาไว้เป็นกองเดียว โดยการถอนจะถอนกำไรทั้งหมดของตัวเองทีเดียวเลย เช่นตอนนี้มีกำไร 100 a ต้องถอนได้ 60 เลย ไม่สามารถถอนออกมา 30 ได้
note จะใช้คำว่า a และ b แทน address ไปเลย เพื่อความเข้าใจง่าย
มาเริ่มจากการ deploy กัน ตัวแปรใน storage จะเปลี่ยนไปตามภาพ
ตอนนี้เราจะเก็บ address ของ payee แต่ละคน รวมถึงจำนวนหุ้นส่วนที่ payee คนนั้นมี และ จำนวนหุ้นของทุกคนรวมกัน ได้ละ โดยใช้ code ตามนี้
เมื่อยังไม่มีใครถอนเงินจาก smart contract ทำให้ storage มีค่าดั้งเดิมตามนี้
ต่อมา โอนกำไรจากร้านกาแฟ มาใน smart contract เป็นจำนวน 100 eth
โดยใช้ code ฟังชันก์ receive
จะได้ balance เป็น 100
ต่อมานาย a ต้องการถอนเงินทั้งหมดของตนออกจาก smart contract จะเกิด process ดังนี้
โดยตัวแปรใน storage จะเปลี่ยนไปตามนี้
ต่อมามีกำไรจากร้านกาแฟเข้ามาอีก 100
… a ต้องการถอนเงินอีก จะได้ process ตามนี้
โดยใน storage ค่าจะเปลี่ยนไปตามนี้
จะเห็นได้ว่า เงินทั้งหมดที่เคยโอนเข้ามาใน smart contract = 100 + 100 = 200
เป็นของ a = 200 * 6 / 10 = 120
และเป็นของ b =200 * 4 / 10 = 80
ซึ่ง 80 ของ b ยังอยู่ใน smart contract ครบ เพราะ b ยังไม่ได้ถอนเลยนั่นเอง
… โอเค code ที่ใช้จะเป็นตามนี้
โอเค จริงๆมี code ที่ใช้ในการโอนเงินสกุลอื่นที่ไม่ใช่ eth ด้วย ไว้มาดูกันอีกทีละกัน