# 【日本語】Napier Math (10/15~) [Sense Math](https://hackmd.io/f6QDr5jyRd278h6RMF37ew?view) 期間内に得られる利回りの価値$\Delta x$を$x$に足した$X$の量、それから発行された$Y$の量について ## PTとYTのIssue Collect型なので、PTとYTは同量発行される。PTとYTを発行する現時点$t_0$で獲得できる利子$∆x$をcollectする。 ユーザーが入金するターゲット$x$の量で、$y = x \cdot s(t_0)$の同量の$PT$ と $YT$を発行します。 $s(t_0) < S(t_0)$ の場合、ユーザーは発行されたばかりのYTから一定量のターゲットをすぐにCollectできます。このターゲットの増加額は、元の入金額に追加されると考えるのが合理的です。正確な追加量は、次の式から求めることができます。 $$ \Delta x = (x + \Delta x) \cdot s(t_0) \cdot \left( \frac{1}{s(t_0)} - \frac{1}{S(t_0)} \right) = (x + \Delta x) \cdot \left( 1 - \frac{s(t_0)}{S(t_0)} \right) \\ \Delta x \left( 1 - \left( 1 - \frac{s(t_0)}{S(t_0)} \right) \right) = x \cdot \left( 1 - \frac{s(t_0)}{S(t_0)} \right) \\ \Delta x \cdot \frac{s(t_0)}{S(t_0)} = x \cdot \left( 1 - \frac{s(t_0)}{S(t_0)} \right) \\ \Delta x = \frac{x \cdot \left( 1 - \frac{s(t_0)}{S(t_0)} \right)}{\frac{s(t_0)}{S(t_0)}} = x \cdot \left( \frac{S(t_0)}{s(t_0)} - 1 \right) $$ したがって、デポジットの全額は次のとおりです。 $$ X = x + \Delta x = x + x \cdot \left( \frac{S(t_0)}{s(t_0)} - 1 \right) = x \cdot \frac{S(t_0)}{s(t_0)} $$ 発行されたトークンの全額 (PTもYTも同じ) は次のとおりです。 $$ Y = X \cdot s(t_0) = x \cdot \frac{S(t_0)}{s(t_0)} \cdot s(t_0) = x \cdot S(t_0) $$ また、追加のトークンを発行するときにユーザーがすでにある程度の$YT$を持っている場合は、追加の$YT$を発行する前に、これらのYTの金額からそれまでに得られた利子分を回収する必要があります。 ユーザーがすでに$t_l$時点で$Y_l$のYTと最後に収集された利子分を持っていると仮定すると、ユーザーは保有する$YT$で、$xl$の金額の$Target$を徴収できます。 $$ x_l = Y_l \cdot \left( \frac{1}{s(t_l)} - \frac{1}{S(t_0)} \right) $$ したがって、$t_l$時点で保有するYTから得られた$Target$分を考慮した発行済みトークンの全額$Y$は次のとおりです。 $$ Y = \left( x + x_l \right) \cdot S(t_0) = \left( x + Y_l \cdot \left( \frac{1}{s(t_l)} - \frac{1}{S(t_0)} \right) \right) \cdot S(t_0) $$ <br> Napierでの流動性提供について ## Add Liquidity - 流動性提供時のデポジット資産はUnderlyingのみを受け付ける。 - 運用先の異なるプール(Aave, Compound, Yearn, Euler...)が複数存在するが、流動性提供者は流動性提供すると「Napier Principal Token(nPT)」と「Napier Interest Bearing Token(nIBT)」として仮想的に統一されたプールの流動性をシェアしたポジションを保有することになる。 ### Underlying Deposit $\rightarrow$ $nPT$ / $nIBT$ Pairs Pool ユーザーは、Compoundプリンシパルトークン($PT$)と $IBT$(Target) を取引するプールに、$z$の量のunderlyingを流動性提供したいと考えています。 ユーザーは元のunderlyingを $u = u' + u''$の2つの部分に分割します。ここでは、Compoundを使用します。 #### $u'$はプールに行くIBTを発行するために使用されます。 $cToken$の発行額 $i_{Compound}$ は次のとおりです。 $$ i_{Compound} = \frac{u'}{S_{comp}(t)} \tag{1} $$ #### Virtually calculate $IBT_{Compound}$ as $nIBT$ $u'$のUnderlyingから発行された$cToken (IBT_{comp})$は、$n_i$の$nIBT$としてシステムによって計算処理される必要があります。 このとき、$cToken$の準備金を$I_{Compound}$、$nIBT$のスケールを$S_i(t)$と定義とすると。(加重平均ではない!)と、以下のように記述できます $$ S_i(t) = \frac{I_{euler} * S_{euler}(t) + I_{comp} * S_{comp}(t) +…}{TotalSupply_{nIBT}} \tag{3} \\ = \frac{\sum^{ibt}_k{I_k \cdot S_k(t)}}{N_i} $$ 発行された$cToken$は同価値の$u'$相当の$nIBT$に換算され、プールに追加される。このとき、発行される$nIBT$の数量$n_i$はデポジットされた額(underlying建)に応じて比例配分される。 シェアの計算式(Appendix1) $s = \frac{aT}{B}$の式を用いて、 $$ n_i = \frac{u' \cdot N_i}{\sum^{ibt}_k{I_k \cdot S_k(t)}}\tag{4} $$ となる。ここでは、あるレンディングプロトコル$k$の$IBT$の発行量を$I_k$、スケールを$S_k(t)$とした。 > Appendix1: 式(4)の導出 > ref: [Vault Math - How much shares to mint? How much token to withdraw?](https://www.youtube.com/watch?v=k7WNibJOBXE) $$ Scale = \frac{B}{T} $$ $$ \frac{a+B}{B} = \frac{s+T}{T} $$ $$ s = \frac{aT}{B} $$ $n_i$を求めるために、各変数を以下のように置き換えることで、式(4)が得られる。 $s$ $\rightarrow$ $n_i$ $B$ $\rightarrow$ $N_i \cdot S_i(t)= \sum^{ibt}_k{I_k \cdot S_k(t)}$ $a$ $\rightarrow$ $u'$ $T$ $\rightarrow$ $N_i = TotalSupply_{nIBT}$ 「$\sum^{ibt}_k{I_k \cdot S_k(t)}$」: $nIBT$が保有するunderlying残高を算出するために、各$IBT$が保有するunderlying残高の総和をとる。 #### $u''$は、プールに行くPTを発行するために使用されます。 $PT_{Compound}$の発行額 $y_{Compound}$ は次のとおりです。 $$ y_{Compound} = {u'' \over{S_{comp}(t)}} \cdot S_{comp}(t) = u'' \tag{5} $$ #### Virtually calculate $PT_{Compound}$ as $nPT$ $u''$のUnderlyingから発行された$y_{Compound}$の$PT_{Compound}$は、$n_u$の$nPT$としてシステムによって計算処理される必要があります。 $P_u(t)$を$nPT$の価格とする。Compoundから発行されたPTの準備金を$Y_{Compound}$,そのPTの価格を$P_{Compound}(t)$と定義すると、以下のように記述できます。 $$ P_u(t) = \frac{Y_{euler} * P_{euler}(t) + Y_{comp} * P_{comp}(t) +…}{TotalSupply_{nPT}} \tag{6} \\ = \frac{\sum^{ibt}_k{Y_k \cdot P_k(t)}}{N_u} $$ あるレンディングプロトコル$k$のPTの価格$P_k(t)$は、[Yield Spaceの式(13)](https://docs.google.com/document/d/13i9e7J8_aXPImAvVWyNOFCi3gHpX16_96FXPbJlxd-c/edit?disco=AAAAhxVM9EM)より、債権の残存時間の関数として $$ P_{k}(t) = (\frac{Y_{k}}{I_{k} \cdot S_k(t)})^{t_m - t} $$ となる。ここで、PTの満期を時刻$t_m$とした。 シェアの計算式(Appendix1) $s = \frac{aT}{B}$の式を用いて、 $$ n_u = \frac{u'' \cdot N_u}{\sum^{ibt}_k{Y_k \cdot P_k(t)}}\tag{7} $$ #### まとめ プールのリザーブの$nIBT$の総量を$N_i$、プールのリザーブの$nPT$の総量を$N_u$とすると、ユーザーは同じ割合でトークンを提供する必要があるため、次のようになります。 $$ \frac{n_i}{n_u} = \frac{N_i}{N_u} $$ $$ \frac{\frac{u' \cdot N_i}{\sum^{ibt}_k{I_k \cdot S_k(t)}}}{\frac{u'' \cdot N_u}{\sum^{ibt}_k{Y_k \cdot P_k(t)}}} = \frac{N_i}{N_u} $$ $$ u''\cdot \sum^{ibt}_k{I_k \cdot S_k(t)} = u' \cdot \sum^{ibt}_k{Y_k \cdot P_k(t)} $$ $$ u'' = \frac {u' \cdot \sum^{ibt}_k{Y_k \cdot P_k(t)} }{\sum^{ibt}_k{I_k \cdot S_k(t)}} $$ ## Remove Liquidity - 満期後に流動性を取り除く時、ユーザーは、保有する$nPT$の量に比例したUnderlyingだけを受けとる。 - ユーザーの流動性撤回毎に引き出されるunderlyingの量を計算することはせず、満期を過ぎたプールのnIBTとnPTはプロトコルによって一括でunderlyingに償還される。 - ロールオーバーされたプールのポジションは除く - 満期後は償還されたunderlyingだけがプールに残る - ユーザーはバーンするLPトークンのシェアに比例した数量のunderlyingを引き出せる。 ### プロトコルが一括でプール内のアセットを償還する流れ 1. ロールオーバーされたポジションを除いた、nIBTとnPTのリザーブを計算する。 2. nIBTを構成する全てのターゲットをunderlyingに償還する。 3. nPTを構成する全てのPTを償還する。 - 各PTの裏付けであるターゲットを全てunderlyingにする。 以降、ロールオーバーがない場合を考える。 プロトコルが一括で償還する時の時刻を$t_r$、全てのnPT,nIBTを償還した後に得られるunderlyingをそれぞれ$U_{npt}$と$U_{nibt}$とすると、償還後のpool内のunderlyingは $$ U = U_{npt}+U_{nibt} $$ となる。ここで、 $$ U_{nibt} = \sum^{ibt}_k{I_k(t_r) \cdot S_k(t_r)} \\ U_{npt} = \sum^{ibt}_k{Y_k(t_r) / S_k(t_r) \cdot S_k(t_r)} \\ = \sum^{ibt}_k{Y_k(t_r)} $$ となる。$Y_k(t_r) / S_k(t_r)$は、あるプロトコル$k$のPTのリザーブ$Y_k$の裏付けであるターゲットの数量を表す。  --- <br> <br> <br> --- ## Notation $Underlying$:原資産、非利回り資産(例:DAI) $Target$:利回り資産(例:aDAI、cDAI) $Principal Token(PT)$ : ユーザーの Napier プロトコルへの預金額を表すトークン。これらのトークンは、満期時に原資産と 1 対 1 で償還可能。 $Napier Principal Token(PT)$ : 流動性提供時に得られる仮想的なトークン。$PT$と同様に、満期時に原資産と 1 対 1 で償還可能。 $Yield Token(YT)$ : 預金した資産から得られる利息を請求する権利を表すトークン。 $t_0$:発行時期 $t_m$:満期 $t_{m}-t$:満期までの時間 $s(t)$:$t$ 時点でのスケーリング係数($t$時点でのUnderlting建でのターゲットの価格) $S(t)$:$t$ 時点での最大スケーリング係数 例: [cUSDCのScale](https://etherscan.io/token/0x39aa39c021dfbae8fac545936693ac917d5e7563#readContract#F4) $W(t)$:流動性提供時に任意のPTをnPTへと仮想的に計算する加重平均スケーリング係数 $x$:ユーザーが預け入れたターゲットトークンの量 $X$ : The effective amount of the Target token being deposited $x$:ユーザーが預け入れたターゲットトークンの量 $y$:$PT$または$YT$の量 $y''$:$nPT$として計算処理された後の任意のプリンシパルトークンの量 $\Delta x$:発行時や、ユーザーが預け入れた金額によるターゲットの増加額 --- <br> <br> <br> --------- <br> <br> <br> <br> <br> -----アーカイブーーーーーー ### Underlying $\leftrightarrow$ PT Pool ユーザーは、プリンシパルトークン($nPT$)と underlyingを取引するプールに、$z$の量のunderlyingを流動性提供したいと考えています。 ユーザーは元のunderlyingを $z = z' + z''$の2つの部分に分割します。$z'$はプールに直接行き、もう一方は$z''$は、プールに行くPTを発行するために使用されます。ここでは、AaveのPTを発行するとします。$PT_{aave}$の発行額 $y$ は次のとおりです。 $$ y = z'' \cdot S(t) $$ #### Virtually calculate $PT_{aave}$ as $nPT$ ここで一つ注意する必要があります。$z''$のUnderlyingから発行された$PT_{aave}$は、$nPT$としてシステムによって計算処理される必要があります。 そのため計算処理後の $y''$は、加重平均スケーリング係数 $W(t)$を用いて以下のように定義されます。 $$ y'' = z'' \cdot W(t) $$ このとき、aaveから発行されたPTの準備金を$Y_{aave}$、スケールを$S(t)_{aave}$、CompoundやYearnのような利回りソースの場合も同様に定義すると、加重平均スケーリング係数は、$W(t)$は、以下のように記述できます。 $$ W(t) = \frac{Y_{aave} * S_{aave}(t) + Y_{comp} * S_{comp}(t) +…}{\Sigma{Y_i}} \tag{A} $$ $Z$はunderlyingの準備金プールであり、$Y_{all}$は複数の異なるPTで構成された準備金プールです。ユーザーは同じ割合でトークンを提供する必要があるため、$z''$は次のようになります。 $$ \frac{z'}{y''} = \frac{Z}{Y_{all}} \\ \frac{z'}{z'' \cdot W(t) } = \frac{Z}{Y_{all}} \\ \frac{z - z''}{z'' \cdot W(t) } = \frac{Z}{Y_{all}} \\ (z - z'') \cdot Y = z'' \cdot W(t) \cdot Z \\ z \cdot Y = z'' \cdot \left( W(t) \cdot Z + Y_{all} \right) \\ z'' = z \cdot \frac{Y}{W(t) \cdot Z + Y_{all}} $$
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up