LoginSignup
11
8

More than 1 year has passed since last update.

PancakeSwapのコントラクトの全体像(PancakeSwap勉強会②)

Posted at

BlockBaseのエンジニアの@suhara_pontaです。

【PancakeSwap勉強会シリーズ】

前の記事ではAMMについて基本的な概念を説明しました。今回は実際にコントラクトのコードを見ていきます。
なぜUniswapではなくPancakeSwapなのかというと、PancakeSwapのほうがFarmやらPoolやら機能が多い部分があり、シリーズ化していく上でやりやすいと感じたためです。(あと実際に動かしてみるときに、gasが安いというのもあります)
LP作成とswapについては、完全にUniswap V2のコードをコピペしているだけなので、Uniswap V2の解説だと考えていただいても大丈夫です。

githubレポジトリとコントラクトの全体像

PancakeSwapのgithubにはいくつかのレポジトリがあります。今回は

が対象になります。

全体像

スクリーンショット 2021-05-12 13.37.45.png
ユーザーがフロントエンドから触るコントラクトはperipheryレポジトリのRouterコントラクトです。Routerコントラクトを経由してcoreレポジトリのPancakeFactory.solやPancakePair.solのロジックを利用します。

ペアの作成

スクリーンショット 2021-05-12 13.37.04.png
addLiquidityという関数内で、pairがない場合はPancakeFactoryコントラクトのcreatePairという関数をコールして、ペアのコントラクトをデプロイします。

流動性提供

スクリーンショット 2021-05-12 15.27.54.png

ペア作成時と同じくRouterコントラクトのaddLiquidityから、PancakeLibraryというperipheryレポジトリ内のコントラクトの関数を呼び出します。getReservesでPancakePair内に存在するreserveのamountを取得し、それを元にquoteという関数でLPトークンの数量の見積もりをします。pairForという関数でPancakePairのアドレスを取得し、そこにそれぞれのトークンをtransferします。PancakePairのmintが呼ばれ、userに対してLPトークンが発行されます。

流動性提供を止める(remove liquidity)

スクリーンショット 2021-05-12 15.25.54.png
LPトークンを返還してトークンを償還する場合はRouterコントラクトのremoveLiquidityという関数を実行します。pairForでアドレスを取得してユーザーからpairのコントラクトへLPトークンをtransferします。その後PancakePairコントラクトのburnを実行して、関数内でLPトークンがburnされ、提供していたペアのトークンがそれぞれユーザーにtransferされます。

Swap

スクリーンショット 2021-05-12 15.23.33.png
swapExactTokensForTokensという関数を実行します(ちなみに微妙に関数名が違うものは、ETHがERC20ではないのでETHとのペアを使うときに実行する関数です)。LibraryのgetAmountsでswapで得られるトークンの量を計算します。libsレポジトリのtransferHelperを利用してユーザーからLPへtokenAをtransferします。Routerコントラクト内のprivate関数である_swapからPancakePairコントラクトのswapを呼んで、tokenBがユーザーにtransferされます。

まとめ

  • coreとperipheryの2つのレポジトリからなる。
  • 基本機能はcreatePair、addLiquidity、removeLiquidity、swap

以上がコントラクトの概観になります。次は実際にコントラクトのコードの詳細を見ていきます。

11
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
8