มูลค่า LP Token ที่เราฟาร์มบน Mirror มันคำนวณยังไงกันนะ ?

คือจริงๆ แล้วในหน้าเว็บ Mirror เนี้ย… เค้าก็มีบอกอยู่นะว่ามูลค่า LP Tokens ที่เราถืออยู่มันมีมูลค่าเท่าไร แต่ด้วยความจำเป็นบางอย่างทำให้ผมต้องเข้าใจที่มาว่า ทำไมถึงได้ตัวเลขมูลค่าเหล่านั้นออกมา เลยทำให้ต้องมานั่ง แกะ แงะ แคะ มูลค่า LP Token ด้วยตัวเอง…

ก่อนอื่นต้องขออธิบายคำศัพท์เบื้องต้นกันก่อนเผื่อใครยังไม่เข้าใจ

  • เหรียญ mAsset คือ Synthetic Asset ที่ได้จากการ Mint หุ้นบน Mirror เช่น mNFLX
  • เหรียญ UST คือ Stable Coin หลักที่ถูกใช้งานบน Terra
  • เหรียญ LP Token คือ เหรียญที่ได้จากการฟาร์มคู่เหรียญ mAsset-UST ใน Mirror เช่น การนำเหรียญหุ้น mUSO กับเงิน UST ไปวางในฟาร์มเพื่อรับเครดิตเป็น mUSO-UST LP ออกมา

ทุกอย่างจะเริ่มต้นด้วยสมการง่ายๆ นี้ ที่จะทำให้เราสู้มูลค่าของ LP Tokens ที่เราถืออยู่ ซึ่งก็คือ เอาจำนวน LP Token ที่เราถือมาคูณกับราคา LP Token แค่นี้ตามสมการ

EquityValue = LP_amount * Price_per_LP 

โดยที่

LP_amount คือ จำนวน LP Tokens ที่เรากำลังถือครองอยู่ ได้จากการนำเหรียญหุ้น (mAsset) กับเงิน UST ไปวางในฟาร์ม

Price_per_LP คือ ราคาของเหรียญ LP ต่อเหรียญ

แต่….. ถ้ามันง่ายแบบนั้นก็ดีสิ ประเด็นคือ การหา Price_per_LP หรือ ราคาต่อ LP Token นี้หละที่ทำให้งานมันซับซ้อนขึ้น โดยสมการในการหาราคาเหรียญ LP ก็สามารถทำได้ตามนี้ (อ้างอิงจาก https://dailydefi.org/articles/lp-token-value-calculation/)

Price_Per_LP = Total_Value_of_Liquidity_Pool / Circulation_Supply_of_LP_Tokens

โดยที่

Total_Value_of_Liquidity_Pool คือ มูลค่าทรัพสินย์ใน Pool ทั้งหมด

Circulation_Supply_of_LP_Tokens คือ จำนวน LP Tokens ทั้งหมดของ Pool นั้นๆ

และเดียวก๊อนนนนน!! Total_Value_of_Liquidity_Pool คือมูลค่าของ Liquidity Pool ทั้งหมด และอย่างที่เรารู้คือ Pool ของ Mirror คือการเอาคู่เหรียญ mAsset กับ UST ไปวางคู่กัน ดังนั้น เราต้องรู้มูลค่าของ mAsset และ UST ใน Pool ก่อนด้วยนะ เมื่อแตก Total_Value_of_Liquidity_Pool ในสมการนี้ออกมาแบบละเอียดจะได้ดังนี้

Price_Per_LP = ((UST_amount * UST_Price) + (mUSO_amount * mUSO_Price)) / Circulation_Supply_of_LP_Tokens

พอเอามารวมกับสมการตั้งต้นแรก ก็จะได้สมการของการหามูลค่า LP Tokens ที่ถือครองอยู่ ดังนี้

EquityValue = LP_Amount * (((UST_amount * UST_Price) + (mUSO_amount * mUSO_Price)) / Circulation_Supply_of_LP_Tokens)

พอแตกสมการออกมาแบบนี้แล้วจะเห็นได้ว่า ข้อมูลที่เราต้องการหามีเยอะมาก

  1. LP_amount จำนวน LP ที่เรากำลังถือครองอยู่ใน Pool นั้นๆ (ในที่นี้จะหมายถึง mUSO-UST LP)
  2. UST_amount จำนวน UST ทั้งหมดใน Pool
  3. mUSO_amount จำนวน mUSO ทั้งหมดใน Pool
  4. Circulation_Supply_of_LP_Tokens จำนวน LP Tokens ทั้งหมดใน Pool
  5. UST_price ราคาตลาดของ UST ณ ปัจจุบัน
  6. mUSO_price ราคาตลาดของ mUSO ณ ปัจจุบัน

ปะ เริ่มไล่หาไปทีละตัว…~~~ T__T ~~~

1. หา LP_amount

วิธีการดูว่าเรา Stake อะไรไว้บ้าง https://mantle.terra.dev/

{WasmContractsContractAddressStore(ContractAddress:"terra17f7zu97865jmknk7p2glqvxzhduk78772ezac5",QueryMsg:"{\"reward_info\":{\"staker_addr\":\"__terra_address__\"}}"){ Height Result }}

จะได้ Result ออกมาประมาณนี้ (ในตัวอย่างผม stake mUSO)

{
  "data": {
    "WasmContractsContractAddressStore": {
      "Height": "4357321",
      "Result": "{\"reward_infos\":[{\"asset_token\":\"terra1lvmx8fsagy70tv0fhmfzdw9h6s3sy4prz38ugf\",\"bond_amount\":\"75103953\",\"is_short\":false,\"pending_reward\":\"1761838\"}],\"staker_addr\":\"__terra_address__\"}"
    }
  }
}

จากด้านบนเราจะได้จำนวน LP Tokens (bond_amount) ของเรา และ address ของเหรียญ mUSO (asset_token) ของแต่ละ Pool ออกมา จดทั้ง 2 ค่านี้ไว้ แล้วเดี่ยวเราเอามาหาราคา Price_per_LP ต่อ

2. หาจำนวน UST_amount, mUSO_amount, mUSO_price และ Circulation_Supply_of_LP_Tokens ที่อยู่ใน Liquidity Pool

จำ asset_token จากข้อที่ 1 ตอนที่เราหา LP_amount ของ Pool ที่เรากำลังฟาร์มอยู่ได้ไหม เราต้องใช้ Address นั้นในการหา Pool address ของคู่เหรียญ mAsset-UST นั้นก่อน เพื่อที่จะได้รู้ว่ามีคนฝากเงิน UST กับ เหรียญ mUSO ไว้จำนวนเท่าไร ขั้นตอนการหาก็ทำได้โดยการ Query ข้อมูลที่ graph.mirror.finance เลย

query { assets { symbol pair pair prices { price oraclePrice } } }

จะได้ผลลัพธ์กลับมาดังนี้

{
  "data": {
    "assets": [
      ...
      {
        "symbol": "mUSO",
        "pair": "terra1zey9knmvs2frfrjnf4cfv4prc4ts3mrsefstrj",
        "prices": {
          "price": "49.205331",
          "oraclePrice": "48.170000"
        }
      },
      ...
    ]
  }
}

ซึ่งเราก็จะสนใจค่า pair และค่า price (mUSO_price) ที่อยู่ในผลลัพธ์ เพราะมันคือ address ของ Pool (mUSO-UST) ที่เราไปลงและราคาตลาดของเหรียญ mUSO ณ ปัจจุบัน (ตรงนี้ผมจะเลือกใช้ price มากกว่า oraclePrice เพราะมันคือราคาที่ซื้อขายกันจริงๆ ซึ่งส่วนใหญ่ราคาจะ premium กว่า oracle)

จด Market Price ที่ได้เอาไว้ แล้วนำ pair address ที่ได้มาดูหาจำนวน UST / mUSO ใน Pool ณ ขณะนั้นต่อ โดยเข้าไปที่ mantle.terra.dev แล้วใส่คำสั่ง Query ไปตามด้านล่าง

query pairPool { **__masset_token_address__**: WasmContractsContractAddressStore(ContractAddress: "**__pair_address__**", QueryMsg: "{\\"pool\\":{}}") {Height Result} }

เช่น

query pairPool { terra1lvmx8fsagy70tv0fhmfzdw9h6s3sy4prz38ugf: WasmContractsContractAddressStore(ContractAddress: "terra1zey9knmvs2frfrjnf4cfv4prc4ts3mrsefstrj", QueryMsg: "{\\"pool\\":{}}") {Height Result} }

ผลลัพธ์หลังจาก Query

{
  "data": {
    "terra1lvmx8fsagy70tv0fhmfzdw9h6s3sy4prz38ugf": {
      "Height": "4345781",
      "Result": "{\\"assets\\":[{\\"amount\\":\\"10459974381697\\",\\"info\\":{\\"native_token\\":{\\"denom\\":\\"uusd\\"}}},{\\"amount\\":\\"211606615133\\",\\"info\\":{\\"token\\":{\\"contract_addr\\":\\"terra1lvmx8fsagy70tv0fhmfzdw9h6s3sy4prz38ugf\\"}}}],\\"total_share\\":\\"1417569745753\\"}"
    }
  }
}

ตรงนี้ เราจะได้ข้อมูลมา 3 อย่างเลย ก็คือ UST_amount (assets.0.amount) กับ mUSO_amount (assets.1.amount) และสุดท้ายคือ Circulation_Supply_of_LP_Tokens (total_share) ให้จด 3 ค่านี้ไว้

3. หาราคา UST_price

จริงๆ แล้วราคาของ UST_price จะ peg อยู่ที่ $1 เสมอ ในกรณีที่ไม่ได้ต้องการความเป๊ะมาก ก็อาจจะแค่ระบุเป็นค่า constant เท่ากับ 1 ไปเลย แต่หากใครที่ต้องการความแม่นยำระดับทศนิยมก็ควรที่จะใช้ราคาจาก Oracle อีกทีนึง เช่น https://api.extraterrestrial.money/v1/api/prices หรือ Coingecko หรือใช้มันมากกว่า 1 ที่จะดีมากที่สุด

พอเราได้ข้อมูลครบถ้วนแล้วก็จับมาใส่สมการ ตอนต้นเลย

EquityValue = 75103953 * (((10459974381697 * 1) + (211606615133 * 49.205331)) / 1417569745753)
EquityValue = 1105822709

จะได้ผลลัพธ์เท่ากับ 1105822709 ซึ่งถ้าเอามาหารกับ Default Decimals (1000000) ของเหรียญบน Terra แล้วก็จะทำให้ได้จำนวนมูลค่าของ LP Tokens ของเราใน mUSO-UST LP นั่นคือ 1105.822709 UST นั่นเอง…

Leave a Reply