Uniswapの仕組み プールへの流動性提供で収入を得る

よこのじ(@yokonoji_work)です。

この記事では、分散型取引DEXを実現するUniswapの仕組みについて勉強した内容を紹介します。

Uniswapは、プロジェクトの成長を支援するEthereum Foundation助成金プログラムWave Ⅲの対象プロジェクトに選ばれました。

Uniswapが選ばれたのは、ユーザーエクスペリエンス(UX)を向上させるプロジェクトだからです。Vitalik ButerinもUXの向上について発言しているように、Uniswapは使いやすいDEXとして普及していくので注目してください。

Uniswapは、以前のDEXや基本的な中央型取引所を超えて、大きくUXが改善されています。

Uniswapとは?

Uniswapは、イーサリアム(Ethereum)上で動作する、ETHやERC-20トークンを交換するためのプロトコルです。つまり、DEX(分散型取引所)です。2018年11月にメインネットで稼働を開始して、すでに主要なDEXとして多くのユーザーに利用されています。

Uniswapは一般的な中央型取引所の板取引とは仕組みが異なります。Kyberのようにトークンを流動性として提供する仕組みと、Bancorのように価格を自動算出する仕組みを併せ持った動作によりDEXを実現しています。

Uniswapのユーザーは、次のような操作が行なえます。

  • Swap(交換):ETHやトークンの交換を行う
  • Send(送金):ETHやトークンを交換して指定のアドレスに送る
  • Pool(流動性提供):プールへの流動性提供や提供の解除などを行う

流動性提供者(Liquidity provider)はETHとERC-20トークンを1:1の割合で用意してUniswapのプールへロックすることができます。

例えば、134 DAIをプールへ提供する場合は、それに相当する額の1 ETHを一緒にプールにロックすることになります。

ETHとDAIをプール

DEXの取引ユーザーはプールへロックされた流動性の分だけ取引(ETHやトークンのスワップ)できますので、流動性が大きいことがUniswapの利便性を高めます。

流動性提供者はプールへロックした金額の大きさに応じて、Uniswapで発生したトレード額の0.3%から一部を受け取るインセンティブがあります(この点については後ほど詳しく見てみましょう)。

また、Uniswapは最適化された設計によりガス効率が高くなっています。ETH → ERC-20の取引ではBancorの1/10のガス代です。その他のDEXと比べてもとても安いガス代になっています。

Uniswapのガス代

Gas Benchmarks

ユーザーは利益を出すために少しでもコストを抑えたいので、Uniswapはそのような視点からも使われるDEXになっていくはずです。

Uniswapの成長と注目度

Uniswapには、2019年3月10日時点で22,000を超えるETHがロックされています。グラフのように金額規模は急激に増加しており、UniswapというDEXが大きく成長しているのが分かります。

ETH Locked in DeFi

ETH Locked in DeFi

この金額の内訳を一部確認してみると次のようになっています。

Uniswap Liquidity

Uniswap Liquidity

2019年3月9日時点のデータになりますが、TOP3で80%近くを占めます。これらのトークンであればかなり大きな額でも取引することができます。

  1. MKR:9,724 ETH相当(42%)
  2. DAI:6,491 ETH相当(28%)
  3. TUSD:1,623 ETH相当(7%)

Uniswapへのトークンのリストは自由に行うことができます。

なお、前の章で述べたように、Uniswapはトークンと同額のETHを一緒にロックする仕組みになっています。先ほど22,000 ETHがロックされていると紹介しましたが、実際にはこの2倍の金額がロックされていることになります。

こちらはDeFi(分散型金融、分散型ファイナンス)プロジェクトのランキングです。2倍した金額は$6.3M=約7億円で、DeFiの分野で3位にランキングしています。

DEFI PULSE

DEFI PULSE

MakerとCompoundに続くプロジェクトであることを見れば、UniswapがDeFiの分野で重要なプロジェクトであることが分かりますね。

参考

Awesome Decentralized Financeでは、DeFi関連のプロジェクトが紹介されています。
DEX、Stablecoin、Lendingなどのカテゴリーごとに分かれているので、目的ごとの主要プロジェクトを把握できます。イーサリアム(Ethereum)周辺のプロジェクトが多く、この分野を引っ張っていくのはイーサリアムで間違いなさそうです。

DexIndexDEX.AGは、トレードしたいトークンと数量を指定すると、最安値を提示するDEXを表示してくれるツールです。UniswapはKyberと並んで低価格を提示してくれるDEXで、特にプール内のロック量が多いMKRとDAIはUniswapが最安値となることが多いです。

Uniswapプールへの流動性提供と損益

UniswapはDAO(自律分散型組織)です。流動性を提供する見返りに手数料から収入を得られる仕組みを利用すれば、UniswapというDEXを運営するビジネスオーナーになることができます。

人々は、MakerやUniswapなど、誰でも参加できるオンチェーンビジネスを構築しています。

Why Open Source Finance Will Win

これまでは、暗号通貨(仮想通貨)を持つことは値上がりを期待する投資家であるということでしたが、今ではビジネスオーナーになるという選択肢もあります。

それでは、どちらが儲けられるのか? この答えを知るためにUniswapの流動性提供者(Liquidity provider)になることで得られる収入を確認してみます。

 

まずは、Uniswapで取引が発生した際にロックしたETHとERC-20の数量がどのように変化するのかを見てみましょう。

次のコントラクトコードは、uniswap_exchange.vyの取引処理の記述が簡略化されたものです。

ETH → ERC-20トークンの取引

def ethToTokenSwap():
    fee: uint256 = msg.value * 0.003
    invariant: uint256 = self.eth_pool * self.token_pool
    new_eth_pool: uint256 = self.eth_pool + msg.value
    new_token_pool: uint256 = invariant / (new_eth_pool - fee)
    tokens_out: uint256 = self.token_pool - new_token_pool
    self.eth_pool = new_eth_pool
    self.token_pool = new_token_pool
    self.token.transfer(msg.sender, tokens_out)

ERC-20トークン → ETHの取引

def tokenToEthSwap(tokens_in: uint256):
    fee: uint256 = tokens_in * 0.003
    invariant: uint256 = self.eth_pool * self.token_pool
    new_token_pool: uint256 = self.token_pool + tokens_in
    new_eth_pool: uint256 = self.invariant / (new_token_pool - fee)
    eth_out: uint256 = self.eth_pool - new_eth_pool
    self.eth_pool = new_eth_pool
    self.token_pool = new_token_pool
    self.token.transferFrom(msg.sender, self, tokens_out)
    send(msg.sender, eth_out)

ETH → ERC-20トークンの取引を例として、処理の内容を確認してみます。

  • 1ETH = 150ドルとして、10ETH:1500DAI(ETHとトークンが1:1)をプールにロックしている状態
  • ユーザーが1ETH分のDAIを購入(プールにETHが追加されて、DAIが減る)
  1. fee: uint256 = msg.value * 0.003
    = 1ETH * 0.003 = 0.003ETH
  2. invariant: uint256 = self.eth_pool * self.token_pool
    = 10ETH * 1500DAI = 15000
  3. new_eth_pool: uint256 = self.eth_pool + msg.value
    = 10ETH + 1ETH = 11ETH
  4. new_token_pool: uint256 = invariant / (new_eth_pool – fee)
    = 15000 / (11ETH – 0.003) = 1364.01
  5. tokens_out: uint256 = self.token_pool – new_token_pool
    = 1500DAI – 1364.01 = 135.99
  6. self.eth_pool = new_eth_pool
    = 11ETH
  7. self.token_pool = new_token_pool]
    = 1364.01DAI

プールにロックしている10ETH:1500DAI が 11ETH:1364.01DAIになりました。ETHとERC-20の数量を掛けたinvariantは15000から15004.11になりましたので、確かに資産は増加しています。

また、同様に100ETH:15000DAIのロックから1ETH分のDAIを購入したときは次のようになります。

  1. fee: uint256 = msg.value * 0.003
    = 1ETH * 0.003 = 0.003ETH
  2. invariant: uint256 = self.eth_pool * self.token_pool
    = 100ETH * 15000DAI = 1500000
  3. new_eth_pool: uint256 = self.eth_pool + msg.value
    = 100ETH + 1ETH = 101ETH
  4. new_token_pool: uint256 = invariant / (new_eth_pool – fee)
    = 1500000 / (101ETH – 0.003) = 14851.93
  5. tokens_out: uint256 = self.token_pool – new_token_pool
    = 15000DAI – 14851.93 = 148.07
  6. self.eth_pool = new_eth_pool
    = 101ETH
  7. self.token_pool = new_token_pool]
    = 14851.93DAI

プールにロックしている100ETH:15000DAI が 101ETH:14851.93DAIになりました。invariantは1500000から1500044.93になっています。

 

ここで注目したいのが、1ETHの支払いでプールから出ていったDAIの数量(tokens_out)です。

  • 10ETH:1500DAIの場合、135.99DAI
  • 100ETH:15000DAIの場合、148.07DAI

手数料を考えない場合は1ETHで150DAIの取引が行われるはずです。ユーザー目線で見ると150DAIに近い数量を買える方がうれしいので、価格の乖離が小さいプール量が多いトークンの取引の方が有利ということになります。

ビジネス目線で見ると、取引額が多いほど利益が増えるので、需要が高いトークンに対しては多くの人がプールへロックするようになるでしょう(そうなると、ユーザーはより有利な価格で売買できますね)。

この辺りを見ると、Uniswapは需要と供給が高まるほど、取引をする人にもビジネスをする人にもメリットが大きくなるのが分かりますね。

しかし、流動性提供の競争が激しくなると利益は少なくなります。提供した流動性のプールにおけるシェア率(%)に応じて0.3%の利益分配されるからです。

もうひとつ。1ETH分のDAIの購入でも、プール量が少ないほど出ていくDAIの数量が少ないという見かたもできます。つまり、ビジネス目的の場合は、プール量が小さい方が有利という側面もあります(1取引について見た場合)。

ビジネス視点の内容を整理すると、次のようになります。

  • プール量が多い方がユーザーは有利な価格で売買できるので、取引額が増えやすい。取引額が増えれば、流動性提供者は0.3%の収入量が増える。
  • プール量が少ない方がユーザーに送るETH,トークンの数量が少ないので流動性提供者にとっては有利。ただし、価格に乖離が生じるので取引量は増えにくい。

Uniswapの価格はETHとトークンの数量のバランスにより決まることが先ほどの計算で分かってもらえたかと思いますが、このバランスは取引が発生するたびに変わります(「x*y=k market maker」方式:GitHub)。

例えば、先ほど計算した10ETH:1500DAIのプールで1ETH分のDAIを購入した後に、追加で1ETH分の購入を行ったとします。

この場合、1回目に1ETHで135.99DAI購入できたDAIは、2回目には113.35DAIになります。プール量が変わらなければ、需要が多いほど価格は上がっていくということです。

 

これらを踏まえると、流動性提供による収益を最大化するには取引ボリューム」と「プールされている全体量」と「プール内での自身のシェアのバランスを見極める必要があることが分かります。

これらは、グラフ表示で確認できます。

トークンのトレードボリューム

しかし、取引ボリュームやプール量が分かったからといって、そこから見込み利益を導くのは大変です。でも安心してください。Uniswapは過去の収益率を提示してくれています。

それが「Uniswap ROI By Token」というツールです。ROIとは、投資額に対してどれだけ利益を生み出せたかの比率です。

やはり、取引量が多いMKRとDAIは調子が良いようです(真ん中上部にリターンの割合が表示されています)。

UniswapのROI

  • 赤線:手数料収入
  • 青線:価格変動の損益
  • 黄線:手数料収入と価格変動の損益の合計

ここで注意したいのが、ETHとトークンの価格変動です。すべてETHで保持していた場合、またはすべてトークンで保持していた場合の方が値上がりによりパフォーマンスが良かったということもあり得るからです。

その状況は、画面右上にあるドロップダウンリストから切り替えて表示させることができます。

HodlとDeposit

Uniswapに流動性を提供すると手堅く利益を上げることはできますが、値上がり分と比べて良いパフォーマンスが得られないというリスクがあることは覚えておきたいです。

ひとつ例を示します。

1ETH = 150ドルで100ETH:15000DAIをプールにロックした場合、ドル換算で30000ドルの金額になります。

取引ユーザーが何度か取引を行った後のプールバランスが98ETH:15296DAIであったとします。プールからETHが減っているということは、ユーザーはETHを買う傾向にあったということです。このとき、1ETH = 156ドルに値上がりしています。

すると、資産額は30584ドルです。しかし、あなたがUniswapに流動性を提供せずに100ETHと15000DAIを保有していれば、18000+15000=30600ドルでした。あるいは、15000DAIもETHにして200ETHを保有していれば31200ドルでした。

結果として、16ドル(もしくは616ドル)損をしてしまったということになります。

この例を見て分かるように、ETHが将来的に大きく値上がりすると見込んでいても、流動性提供することでETHが減るということがあり得ます。

みんなが買う=値上がりしている通貨のプールバランスが減る、なので一方的に価格が上昇する場合は、Uniswapにロックしていると不利になるということです。

ETHの数量を保持したい場合は、ステーブルなDAIとのペアで流動性提供して、ETHが買われたら(DAIが増えたら)すぐにDAIでETHを購入して流動性提供の数量を調整していくような管理を行う必要があるでしょう。またはETHと同様に手堅く値上がりするであろうMKRとのペアで流動性提供するのもひとつの方法かと思います。

 

ここまでわかると、Uniswapから手数料収入を得るのと、値上がり(価格変動)で損する分岐点がどこであるかが気になります。

ここで比べるのは、「ETH:トークンを1:1で保有している場合」「ETH:トークン(1:1)をUniswapにロックした場合」です(値上がり益を期待するのであれば、ETH 100%かトークン100%で保有するのが良いのは言うまでもありません。)。

Uniswap: A Good Deal for Liquidity Providers?」という記事によると、値上がりと損の関係は次の式で表せるそうです(手数料収入は考えない)。(別の検証もあるのでご参考に)

impermanent_loss = 2 * sqrt(price_ratio) / (1+price_ratio) – 1

price_ratio(価格比)= 流動性提供の解除時の価格 / 流動性提供の開始時の価格

詳しくは元記事を参照いただきたいと思いますが、次のようなことが考慮された計算式になっています。

  • 取引が発生するとETHとトークンの数量のバランスが変わる(先ほどの例では値上がりしたETHの量が減ってDAIが増えた)
  • 通貨の量は減るが値上がりはする

計算式をグラフにしたのがこの図になります。

Losses to liquidity providers due to price variation

  • 1.25倍の変動で0.6%の損
  • 1.5倍の変動で2.0%の損
  • 1.75倍の変動で3.8%の損
  • 2倍の変動で5.7%の損
  • 3倍の変動で13.4%の損
  • 4倍の変動で20.0%の損
  • 5倍の変動で25.5%の損

このように、Uniswapに流動性を提供したトークンの価格が変動すると、提供しない場合と比べてパフォーマンスが低下した分の損が出ます(売り方向の値下がりについて考える場合は、50%の下落で5.7%の損です)。

ここに手数料収入を加えてみます。

この図はETH-DAIペアで流動性提供した場合のROIです。

UniswapのROI

2018年12月13日~2019年3月13日の3ヶ月で、3月13日時点の状況は次のようになっています。

  • 手数料収入は4.22%(赤線)
  • 価格変動-2.11%(青線)
  • 合計2.02%(黄線)

手数料収入はプールした量のシェア率やトレード量により変動しますが、4.22%を参考にすると年間で16.88%(実際は複利でもう少し高いかも)の手数料収入が見込めることになります。

値上がりによる損は、このようになっていました。

  • 2倍の変動で5.7%の損
  • 3倍の変動で13.4%の損
  • 4倍の変動で20.0%の損

よって、ETH-DAIペアのこれまでの実績においては、年間で3倍の値上がりがあっても損はしないということです(シェア率やトレード量によるので今後の見通しは常に考える必要があります)。

手数料収入を含めた値上がりと損の関係については、「Uniswap: 流動性提供の損益」の記事で素晴らしい検証とグラフの提示が行われています。

Uniswap手数料収入と値上がり損の関係

縦軸:トレード量のプール量に対する割合 / 横軸:流動性提供 開始と終了の価格比

縦軸については、上にいくほどプールの規模に対してトレード量が多いことを示し、手数料収入の利率が増えるということになります。横軸については、先ほどの計算式と同様に価格が何倍に値上がりしたかを示します。

黒い線が年間の利益率を示していますので、0.000の線よりも上側であれば、単にETH:トークンを1:1で保有するよりもUniswapにロックする方が良いということになります(利益が出るということ)。

例えば、プールに対するトレード量が20%(縦軸)であれば、3.0倍に値上がり(横軸)しても約10%の利益が見込めます。

以上が、Uniswapへ流動性提供をしてどのくらいの損益が見込めるかのヒントになります。トークンの値上がりをどの程度見込むのか?「取引ボリューム」と「プールされている全体量」の割合はいくらなのか?を考慮してプールへのロックをご検討ください。

 

中央型の取引所とは違って自分ですべてを管理できるDEXは、様々なハッキング事件を受けてセキュリティ面でも注目されていますよね。実際に使ってみると、ウォレットからダイレクトに取引ができる利便性にも気付くはずです。

そして、Uniswapは使う人が増えるほど有利な価格でトレードできる仕組みです。

これにより取引量が増え、ビジネス目的の流動性提供者は収入が増えるので、さらにプールへの流動性提供を増やそうとします。そうなれば価格はより有利になります。0.3%の手数料がプールに入ることもそれを後押しします。

このような正の循環によって今後さらに利用者が増えるDEXになりそうですので、今後の成長に期待しましょう。