การคิด borrow/supply interest rate ใน Compound (Part 1)
พอดีลองอ่าน doc Mendi (Compound based Defi) แล้วเค้าเขียนสูตรไม่ตรงกับ Compound ? งั้นมาแกะ Code เค้ากัน
เริ่มจากมาดู interest rate ตอนนี้ของ Mendi กันก่อน
เราจะเห็นว่า interest ของ WETH ค่อนข้างสูงเลย
เพื่อหาคำตอบว่าทำไมเลขถึงสูง เรามาลองดูสูตรการคิดเลขของเค้ากันดีกว่า
จาก Doc Mendi สูตรการคิด borrow interest rate คือ
Borrow Interest rate= Base
+ Multiplier
* min(UtilizationRate, Kink)
+ max(JumpMultiplier * UtilizationRate - Kink, 0)
ซึ่งเป็นสูตรที่คิดได้ทั้งแบบเมื่อเกิดการ Jump และ rate แบบปกติ
ประเด็นคือ พอลองไปเทียบกับสูตรของ Compound ซึ่งคือ
Borrow Interest rate= Base
+ Multiplier
* min(UtilizationRate, Kink)
+ JumpMultiplier * max(UtilizationRate - Kink, 0)
จริงๆสูตรต่างกันแค่ที่การคูณอยู่นอก max นี่ ? หรือว่าเค้าแค่เขียน doc ผิด ?
งั้นไปดู code กัน โดย code ของ Mendi คือ
function getBorrowRate(
uint256 cash,
uint256 borrows,
uint256 reserves
) public view override returns (uint256) {
uint256 util = utilizationRate(cash, borrows, reserves);
if (util <= kink) {
return util.mul(multiplierPerBlock).div(1e18).add(baseRatePerBlock);
} else {
uint256 normalRate = kink.mul(multiplierPerBlock).div(1e18).add(
baseRatePerBlock
);
uint256 excessUtil = util.sub(kink);
return
excessUtil.mul(jumpMultiplierPerBlock).div(1e18).add(
normalRate
);
}
}
ซึ่งพอมาแกะแล้วจะได้สูตร
Borrow Interest rate= Base
+ Multiplier
* min(UtilizationRate, Kink)
+ JumpMultiplier * max(UtilizationRate - Kink, 0)
แปลว่า doc Mendi เขียนผิดนั่นเอง
โอเค เราได้สูตรมาละ ก่อนจะไปลองหา borrow interest rate กัน เราจะมาเคลียร์ความหมายของแต่ละตัวแบบไวๆกันก่อน
Base = ดอกเบี้ยตั้งต้นของการยืมในแต่ละ block
Multiplier = rate การเพิ่มดอกเบี้ย ตาม utilizationRate
utilizationRate = อัตราส่วนระหว่างการยืม ต่อ จำนวนเหรียญทั้งหมดของ platform รวมที่ถูกยืมไปด้วยแต่ไม่รวมส่วนที่ platform หักออกมาเป็น reserve แล้ว
โดย ถ้า utilizationRate เยอะ แสดงว่ามีการยืมออกไปมาก และเหลือเงินส่วนที่ยังไม่ถูกกู้ออกไปน้อย
ในทางกลับกัน ถ้า utilizationRate น้อย แสดงว่ามีแต่คนมาฝาก แต่ไม่ค่อยมีคนกู้
โดยถ้าเรามาดูกราฟของ Compound เราจะเห็นความสัมพันธ์ของ utilizationRate และดอกเบี้ยการกู้/ยืมดังนี้
เราจะเห็นว่าดอกเบี้ยการกู้ มีการขึ้นแบบเส้นตรง
แต่ดอกเบี้ยการฝากมีการขึ้นแบบเส้นโค้ง ซึ่งขึ้นเร็วกว่าเส้นตรง
เช่นจากภาพ
เมื่อ utilizationRate เพิ่ม
ดอกเบี้ยการกู้จะเพิ่มขึ้น ((21.69–7.62)/7.62)*100 = 184%
แต่ดอกเบี้ยการฝากเพิ่มขึ้นถึง ((14.04–1.41)/1.41)*100 = 895%
จะเห็นได้ว่า platform มีการกระตุ้นให้คนมาฝากกันเยอะๆ เมื่อมีการกู้สูงขึ้น ซึ่งจะทำให้ platform มีสภาพคล่องนั่นเอง
แต่ประเด็นคือนอกจากกราฟรูปแบบนี้ เรายังเห็นกราฟอีก 2 แบบคือ
ดังนั้น pattern กราฟที่เราเห็น แบ่งได้เป็น 3 ประเภทคือ
- แบบที่ดอกเบี้ยการฝากเป็นเส้นโค้งไปหาเส้นดอกเบี้ยการกู้ โดยไม่มีการก้าวกระโดด อันนี้เป็นกราฟของเหรียญ Basic Attention Token
2. ดอกเบี้ยการฝากมีความโค้งเช่นกัน แต่ ณ จุดนึงดอกเบี้ยจะมีการกระโดด อันนี้เป็นกราฟของเหรียญ Wrapped BTC
3. ดอกเบี้ยการกู้มีการขึ้นน้อย และ ณ จุดนึงดอกเบี้ยจะมีการกระโดด เช่นกัน อันนี้เป็นกราฟของเหรียญ USDC
โอเค มาพูดถึงเหรียญ ที่มีการก้าวกระโดดของดอกเบี้ย ณ จุดๆนึงกันก่อน
เราจะเห็นว่าความแตกต่างของ Wrapped BTC/USDC กับ Basic Attention Token คือปริมาณการกู้ที่ห่างกันเยอะ (หลักหมื่นกับล้าน)
ซึ่งเหรียญที่มีการกู้กับฝาก ในจำนวนเยอะๆ มีโอกาสที่ platform จะให้เงินคนที่มาถอนไม่ได้
เนื่องจากเงินฝากที่เก็บไว้ ถูกเอาไปกู้หมดแล้ว
ดังนั้น ณ จุดนึง platform จะกระตุ้นให้ utilizationRate ลดลง เพื่อให้มีสภาพคล่องเพียงพอ ซึ่งทำได้ 2 วิธีคือ
- ลดการกู้
- เพิ่มการฝาก
เช่นจากกราฟ
เราจะเห็นได้ว่า เมื่อ utilizationRate สูงกว่า 90% จะทำให้
- ดอกเบี้ยการกู้สูงขึ้นแบบก้าวกระโดด => ทำให้มีการกู้น้อยลง
- ดอกเบี้ยการฝากสูงขึ้นแบบก้าวกระโดด => ทำให้มีการฝากเพิ่มขึ้นนั่นเอง
แต่ในเหรียญที่มีการกู้ยืมกันน้อย กราฟจะไม่มีการกระโดด
ซึ่งแปลว่า platform กระตุ้นให้มีการกู้ยืมกัน โดยลดมาตรการในการป้องกันสภาพคล่องออกนั่นเอง
แล้วกราฟแบบสุดท้ายที่เป็นของ stable coin ละ ? ทำไมเส้นดอกเบี้ยการกู้ถึงมีความชันน้อยกว่าเพื่อน ?
เพราะปกติแล้ว stable coin ราคาคงที่ (ไม่ตกและไม่ขึ้น) นั่นเอง
แล้วการที่ เหรียญที่เค้ากู้ออกไป จะราคาไม่ตก แปลว่าอะไร ?
แปลว่าเค้าจะไม่ค่อยอยากกู้
มาลองยกตัวอย่างกัน
สมมุติว่าเค้ากู้เหรียญ A ไป 10 เหรียญ โดยตอนที่กู้เหรียญ A มีราคา 1 $
แต่ตอนเค้าต้องมาคืน เหรียญ A กลับราคาตกลงมาที่ 0.5$
แปลว่าเค้ายืมไป 10$ แต่ต้องเอามาคืนแค่ 5$ นั่นเอง
แสดงว่า เหรียญที่ราคาไม่ตก คนก็ไม่อยากกู้กัน เพราะโอกาสได้กำไรจากส่วนนี้น้อย
ดังนั้น platform จึงต้องลดดอกเบี้ยการกู้ stablecoin เพื่อกระตุ้นให้มีการกู้ออกไปนั่นเอง
โอเค เหลืออีก 2 ค่าแล้วคือ
- JumpMultiplier คือ เรทการเพิ่มดอกเบี้ย เมื่อผ่านจุดที่ดอกเบี้ยมีการกระโดดมาแล้ว
- Kink คือ จุดที่ดอกเบี้ยจะมีการกระโดด เช่น หลังจาก utilizationRate มากกว่า 80% นั่นเอง
โอเค ประมาณนี้ก่อน เดี๋ยวมาต่อกัน