Uniswapの登場人物を実際のコントラクトで確認する
前回、Uniswapをはじめとした流動性プールの全体像を概念的に理解しました。
今回は、実際のコントラクトから流動性プールの構成をたどります。
uniswapのDocsに各ネットワークにおけるFactoryとRouterのコントラクトアドレスが掲載されています(今回はUniswap V2プロトコルを対象とします)。
例えば、Base Mainnetについて確認します。
Routerのコントラクトアドレスは0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24
とあります。
BaseScanでこのコントラクトアドレスを検索するとUniswap V2 Routerコントラクトを見つけることができます。
https://basescan.org/address/0x4752ba5dbc23f44d87826276bf6fd6b1c372ad24
ContractのRead Contractのfactory関数を見ると、
0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6
と書かれており、これはUniswap DocsにあるFactoryコントラクトのアドレスと一致します。
今度は、BaseScanでFactoryコントラクトを検索します。
https://basescan.org/address/0x8909Dc15e40173Ff4699343b6eB8132c65e18eC6
ContractのRead Contractにある関数を確認します。
allPairsには、各通貨ペアに対応するPoolのアドレスが配列形式で格納されています。
[tokenAとtokenBのpool, tokenCとtokenDのpool, tokenEとtokenFのpool, …., ]という感じです。
この場合、配列の0番目がtokenAとtokenBのpool、配列の1番目がtokenCとtokenDのpool、というような対応になります。
試しに、allPairsに0と入れて返り値を見てみます。
あるアドレスが返ってきました。これが配列0番目に格納されているPoolアドレスということになります。
では、返り値にあるアドレスをBaseScanで検索してみます。
https://basescan.org/address/0x88A43bbDF9D098eEC7bCEda4e2494615dfD9bB9C
ContractのRead Contractを見ると、token0とtoken1があります。
ここに入っているアドレス(ERC20トークン)を確認すると何と何のPoolなのかが分かります。
この2つのアドレスをBaseScanで検索してみます。
https://basescan.org/address/0x4200000000000000000000000000000000000006
一つはWETHだと分かりました。
もう一つは、
https://basescan.org/address/0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913
USDCだと分かりました。
つまり、Poolアドレス(0x88A43bbDF9D098eEC7bCEda4e2494615dfD9bB9C)はWETHとUSDCペアのPoolだということが分かりました。
逆に、WETHとUSDCのPoolアドレスを調べたい場合は、FactoryコントラクトのgetPair関数にWETHとUSDCのアドレスを入力します。
先ほどallPairsの配列0番目に格納されていたアドレスが返ってきました。
同様にallPairsの配列1番目、2番目、3番目、・・・というようにUniswapの各ペアのPoolアドレスがすべてここに存在することになります。
このように、前回記事で概念的に理解した流動性プールが、Base Mainnetに存在するということを確認できました。