การคิด borrow/supply interest rate ใน Compound (Part 1)

Nattawat Songsom
3 min readAug 29, 2023

--

พอดีลองอ่าน 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 ประเภทคือ

  1. แบบที่ดอกเบี้ยการฝากเป็นเส้นโค้งไปหาเส้นดอกเบี้ยการกู้ โดยไม่มีการก้าวกระโดด อันนี้เป็นกราฟของเหรียญ Basic Attention Token

2. ดอกเบี้ยการฝากมีความโค้งเช่นกัน แต่ ณ จุดนึงดอกเบี้ยจะมีการกระโดด อันนี้เป็นกราฟของเหรียญ Wrapped BTC

3. ดอกเบี้ยการกู้มีการขึ้นน้อย และ ณ จุดนึงดอกเบี้ยจะมีการกระโดด เช่นกัน อันนี้เป็นกราฟของเหรียญ USDC

โอเค มาพูดถึงเหรียญ ที่มีการก้าวกระโดดของดอกเบี้ย ณ จุดๆนึงกันก่อน

เราจะเห็นว่าความแตกต่างของ Wrapped BTC/USDC กับ Basic Attention Token คือปริมาณการกู้ที่ห่างกันเยอะ (หลักหมื่นกับล้าน)

ซึ่งเหรียญที่มีการกู้กับฝาก ในจำนวนเยอะๆ มีโอกาสที่ platform จะให้เงินคนที่มาถอนไม่ได้

เนื่องจากเงินฝากที่เก็บไว้ ถูกเอาไปกู้หมดแล้ว

ดังนั้น ณ จุดนึง platform จะกระตุ้นให้ utilizationRate ลดลง เพื่อให้มีสภาพคล่องเพียงพอ ซึ่งทำได้ 2 วิธีคือ

  1. ลดการกู้
  2. เพิ่มการฝาก

เช่นจากกราฟ

เราจะเห็นได้ว่า เมื่อ utilizationRate สูงกว่า 90% จะทำให้

  1. ดอกเบี้ยการกู้สูงขึ้นแบบก้าวกระโดด => ทำให้มีการกู้น้อยลง
  2. ดอกเบี้ยการฝากสูงขึ้นแบบก้าวกระโดด => ทำให้มีการฝากเพิ่มขึ้นนั่นเอง

แต่ในเหรียญที่มีการกู้ยืมกันน้อย กราฟจะไม่มีการกระโดด

ซึ่งแปลว่า platform กระตุ้นให้มีการกู้ยืมกัน โดยลดมาตรการในการป้องกันสภาพคล่องออกนั่นเอง

แล้วกราฟแบบสุดท้ายที่เป็นของ stable coin ละ ? ทำไมเส้นดอกเบี้ยการกู้ถึงมีความชันน้อยกว่าเพื่อน ?

เพราะปกติแล้ว stable coin ราคาคงที่ (ไม่ตกและไม่ขึ้น) นั่นเอง

แล้วการที่ เหรียญที่เค้ากู้ออกไป จะราคาไม่ตก แปลว่าอะไร ?

แปลว่าเค้าจะไม่ค่อยอยากกู้

มาลองยกตัวอย่างกัน

สมมุติว่าเค้ากู้เหรียญ A ไป 10 เหรียญ โดยตอนที่กู้เหรียญ A มีราคา 1 $

แต่ตอนเค้าต้องมาคืน เหรียญ A กลับราคาตกลงมาที่ 0.5$

แปลว่าเค้ายืมไป 10$ แต่ต้องเอามาคืนแค่ 5$ นั่นเอง

แสดงว่า เหรียญที่ราคาไม่ตก คนก็ไม่อยากกู้กัน เพราะโอกาสได้กำไรจากส่วนนี้น้อย

ดังนั้น platform จึงต้องลดดอกเบี้ยการกู้ stablecoin เพื่อกระตุ้นให้มีการกู้ออกไปนั่นเอง

โอเค เหลืออีก 2 ค่าแล้วคือ

  1. JumpMultiplier คือ เรทการเพิ่มดอกเบี้ย เมื่อผ่านจุดที่ดอกเบี้ยมีการกระโดดมาแล้ว
  2. Kink คือ จุดที่ดอกเบี้ยจะมีการกระโดด เช่น หลังจาก utilizationRate มากกว่า 80% นั่นเอง

โอเค ประมาณนี้ก่อน เดี๋ยวมาต่อกัน

Referrences

--

--

No responses yet