เหตุผลที่เขียนบทความนี้เกิดขึ้นมาจากเหตุการณ์เล็กๆที่เกิดขึ้นกับตัวครับ (🤣)

Solidity

พอดีว่าผมกับเพื่อนๆในภาคเดียวกันหารกันซื้อ Antminer มาตัวนึง เพื่อที่จะขุด BTC โดยพวกเราก็เอาไปลง Pool ของ Binance พอได้ส่วนแบ่งก็จะได้โอนกันได้ง่ายๆ เผื่อใครอยากเอาไปเทรดก็เอาไปเทรดกันเลย หรือใครอยากเอาแปรธาตุ DeFi ก็เอาไปทำได้เลย

แน่นอนว่าทุกๆครั้งที่มีการปันผลเราก็จะต้องมานั่งโอน BTC ไปให้เพื่อนแต่ละคนๆ ตามหุ้นที่แต่ละคนหารกันไว้ ซึ่งถามว่ายากมั้ยก็ไม่ยากหรอก แต่มันไม่เท่ (🤣)

ว่าแล้วว่างๆผมก็เลยลองเขียน Smart Contract ขึ้นมา เพื่อที่จะแบ่ง BTC ที่ได้ไปที่กระเป๋าของแต่ละคนง่ายๆครับ


โครงสร้าง Smart Contract

ผมแบ่ง Smart Contract ไว้ 2 ส่วนคือ

  1. Partnership เป็น Contract กลางที่ทำหน้าที่แบ่งเงินของแต่ละคนออกตามสัดส่วนหุ้นที่แต่ละคนมี
  2. ShareToken เป็น Contract ของ Token ที่เอาไว้ represent หุ้นที่แต่ละคนถือไว้

Code

  1. ShareToken

ก่อนอื่นก็ Implement ตัว ShareToken ขึ้นมาก่อนครับ เพื่อความสะดวกผมไปใช้ ERC20 ของ Openzeppelin มาใช้เลย แล้วก็ทำการ mint เหรียญตั้งแต่แรกไว้เลย 100 เหรียญ เพื่อเป็นเหรียญแทนหุ้นทั้งหมดที่มี แล้วให้คน deploy contract โอนเหรียญ ShareToken ให้เพื่อนๆที่ถือหุ้นกันไว้ไปตามสัดส่วนเลย

เหตุผลที่ใช้ ERC20 เพราะว่าเวลาใครอยากขายหุ้นต่อให้ใครก็จะได้โอนให้กันได้เลย ไม่ต้องมายุ่งอะไรมากกับ Contract Partnership ครับ

2. Partnership

ใน Code ส่วน Partnership ซึ่งเป็นส่วนแบ่ง BTC ให้กระเป๋าอื่นๆ ก็ไม่ได้มีอะไรมากครับ ในที่นี้ผมใช้วิธีว่าถ้าใครอยากจะถอนก็จะต้องไปกดถอนเอง

(จะมีวิธีให้มีคนกดแล้วโอนให้ทุกคนเลยก็ได้ แต่ผมว่ามันจะไม่แฟร์กับคนที่มากดเพราะจะต้องเสียค่า fee อยู่คนเดียว)

แน่นอนครับ เนื่องจากว่าไม่อยากให้มี bug เกิดขึ้น ผมก็เลยไปยืม code PaymentSplitter ของ Openzeppelin มาเหมือนเดิม แล้วก็แก้ให้มาใช้ Token ของเราเป็นหุ้นและจาก โอน Ether ใน PaymentSplitter เป็นโอน ERC20 Token อื่นๆแทน

แต่เผื่อว่าจะมีอะไรไม่ดีเกิดขึ้นกับ Contract ผมก็เลยเพิ่มฟังค์ชัน emergencyWithdraw() ไปด้วย โดยจะสามารถถอน BTC ทั้งหมดออกมาได้ แต่ก็จำเป็นที่จะต้องมีหุ้นมากกว่าครึ่งนึงของ totalSupply ด้วย

ลองเอามาใช้งานดู

ผมลองเอาไป Deploy บน Testnet ของ BSC ดู ลองโอน ShareToken ไปให้กระเป๋า 2 ใบเป็นสัดส่วน 7:3 ลองโอน BTCB เข้าไปใน Partnership แล้วก็ลองกด withdraw ดูก็ได้ผลลัพท์ตามภาพครับ

ก็คือน่าจะใช้งานได้นั่นแหละ (😂)


โค้ดตัวเต็มสามารถดูได้ที่ Github Repos นี้ครับ สำหรับบทความนี้ก็ขอจบลงเท่านี้ ขอบคุณมากครับ

ป.ล. ตอนเขียนผมไม่ได้ใช้ SafeMath เวลาคำนวณนู่นคำนวณนี่เพราะเห็นเค้าบอกว่า Solidity เวอร์ชัน 0.8.3 เค้ามีเช็ค overflow มาให้แล้ว แต่เนื่องจากประสบการณ์ Solidity อันน้อยนิดของผม ก็เลยไม่แน่ใจตรงจุดนี้มากครับ 😭