DaiのDev版、Saiを完全理解してみる その3 〜CDPを完全理解しよう!〜

DaiのDev版、Saiを完全理解してみる その3 〜CDPを完全理解しよう!〜

今回はメインのトークンの仕組みを規定しているTub.solとTap.sol(紛らわしいですね)を完全理解していきたいと思います!

まずはCDPの動作を規定しているTub.solについて見ていきましょう!
Tub.solは主に担保の扱いとCDPのオペレーションの二つの部分に別れています。それぞれ見ていきましょう。

まず担保(Skr)の扱いから。ここではJoin Price(担保を入れる価格)ExitPrice(担保を引き出す価格)の二つがあります。この二つの違いはGapという前回紹介した数値がどう働くかが違います。JoinはGapが正の方向に働き、Exitは負の方向に働きます。つまりGapが大きいほど入れる価格は上昇し、引き出す価格がへリます。

そしてJoin PriceでGem(WETH)を担保してSkrを入手し、Exit PriceでSkrをGem(WETH)で引き出すことができます。

これは現在の借りている額などに関係なく動作します。

次にオペレーションについて見ていきます。

CDPにはオーナー、ink(担保の数)、art(負債)、ire(ガバナンスフィーを考慮した負債額)の四つのパラメータがありうます。

1.開く

開く際は現在のCupの数+1を文字列にしたものをキーとしてオーナーをmsg.senderとして定義します。それを通してCDPを開きます。

2.  担保をロックする

担保をロックするとCupのink(担保の数)が増える一方、自分のアドレスにあるSkrがその分減ります。

3.  ロックした担保を引き出す

これはロックの反対にCupのinkを減らして自分のアドレスのSkrを増やすことができます。

4. Daiを借りる

Safeである(担保ink のドル建て価格 >= 借りたDaiの金額×mat)の場合Daiを借りることができます。

Daiを借りるとその分負債額(art)が増えますが、増える額は「借りる額÷今の税率」です。

なぜかというと税率のパラメータは全体のパラメーターであり、指数的に増加し続けます。(※1を参照)とりあえず「現在の税率」で割ってやることで、将来のある時点aで扱うときにはこれに対して「時点aでの税率」を用いることで借り始めから今までの税率の増分で計算したものと同じに成ります。

一方、CDPのオーナーのDai保有額が借りた額分増えます。

5. Daiを返す

Daiを返却すると先ほどと逆のことが起こります。

負債額が、返済した額÷税率分減少します。つまり、時間が立つほど返済に必要な額が増えることを意味しています。一方でCDPのオーナーが所有しているDaiをバーンします。また、MKRをガバナンスフィーとして借りた額にガバナンスフィー率をかけた額を支払います。

6. CDPを壊す

Daiを全額返済して担保を全て引き出します。

7. 没収する

もし、Safe出ない場合(担保ink のドル建て価格 < 借りたDaiの金額×mat)、負債がリセットされ、0になります。その代わり、担保が罰金分を含めた額が減少します。

具体的には

負債額(ガバナンスフィー含まず)×罰金率(1以上)のETHだて価格の分だけinkが失われます。その代わり借りたDaiが奪われることはありません。その一方でTap.solのコントラクトアドレスに対してsin(マイナスのSaiを発行します)

 

※1 税率ですが、税率の初期値をtとするとn秒目の税率は t^nで表され、税率の初期値の秒数乗で表されます。これは流動性フィーもガバナンスフィーもどちらも同じです。

 

これがメインのコントラクトであるTub.solでした。

最後にTap.solを見てみましょう。これはDaiをCDPの作成なしで売買するためのコントラクトです。売買といってもSkr⇄Dai間でのやりとりです。DaiとSkrを売買することで先ほどのSinを精算する事が目的です。

Daiを買ってSkrをうる価格とDaiを売ってSkrを買う価格はこれもまたGapによって差が開いています。Gapが大きいほどSaiを売るときに過小評価され、買うときに過大評価されるなど売買において損するようになっています。(式はTub.solのJoin/Exitと同じ)

ただし前回説明したようにTap.solのGapは基本マイナスであり、売買した方が得となってます。なぜでしょうか?

先ほどTub.solで、担保が不足して不渡りになってしまったDaiをSaiとして記録していました。そこでDaiを売ってくれる事でSinを打ち消してやることができるようになるわけです。実際heal()という関数ではコントラクトアドレスが所持しているSinとSaiを比較して少ない方の額を下図のように消去します。これにより分散型であっても健常な運営が可能になります。

 

また、このコントラクトは緊急シャットダウン後の挙動が特殊です。シャットダウン後であれば所有しているDaiを直接、Skrを経ずにGem(WETH)に変換できます。また、逆にWETHを直接Saiに変換できます。

以上です。次は分散型であっても価格固定制を維持する工夫について話します。