前沿#
徐々に進行するチュートリアルであるため、最初からコードを書き始めるわけにはいきません。まるで永久機関を作りたい場合、まず永久機関がどのように動くかを知る必要があり、それを分解するためにはより良い方法があります。
したがって、この章では主に UniswapV3 をデプロイすることを目的としています。したがって、この章では UniswapV3 を迅速かつ簡単にデプロイし、将来のプログラムと Uni の統合に使用します。
Uni パッケージのインストール#
ただし、インストールする前に、第 2 章で構成したテンプレートを保存することをお勧めします。もちろん、これはオプションです。
まず、UniswapV3 をインストールする必要があります。Uniswap の契約は 2 つに分かれており、1 つはv3-periphery
で、もう 1 つはv3-core
です。これら 2 つのリポジトリの契約が何を表しているかを簡単に説明します。
v3-core#
core 契約は、プールとファクトリを管理するための Uniswap のリポジトリです。
プール:資金の保管と交換の計算を行う契約です。
ファクトリ:プールを一括作成するための契約です。
これら 2 つの契約は Uniswap の中核です。periphery がなくても正常に動作する最小の契約です。
v3-periphery#
periphery には、ユーザーと開発者に統一されたインターフェースや便利なトークンを提供する契約が格納されています。主要な契約には NFTManager と SwapRouter があります。
NFTManager:ユーザーが作成した流動性データを記録するための契約です。
SwapRouter:交換のさまざまなロジックをラップして抽象化するラッパークラスです。
ここでは、UniswapV3 のロジックを詳しく説明しません。重点は、どのようにデプロイするかです。
次のコマンドを実行してください。
yarn add @uniswap/v3-core @uniswap/[email protected]
まず、必要な 2 つの契約リポジトリをインストールします。注意点として、@uniswap/[email protected]
にはバージョン番号が付いていることに注意してください。これは、この記事を書いた時点で 1.4.2 バージョンに artifacts フォルダが欠落しているためです。関連する問題は以下の通りです。github-issue。この記事を見るときには、この問題が解決されている場合は、末尾のバージョン番号を指定する必要はありません。
ByteCode によるデプロイ#
実際の契約のデプロイには、ByteCode からのデプロイという方法しかありませんが、異なるツールは異なるレベルのカプセル化を提供します。最も基本的なデプロイ方法を使用して、原理を理解しやすくするために、この方法を使用します。
まず、デプロイファイルを作成します。deploy フォルダの下に 00_deploy_univ3.ts という名前のファイルを作成します。
コードの内容は次のとおりです。
import { DeployFunction } from "hardhat-deploy/types";
const func: DeployFunction = async function () {
}
export default func;
これは、デプロイファイルの基本的なフレームワーク関数です。最初にデプロイするのは、core の factory 契約です。したがって、コードを次のように変更します。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments,ethers } = hre
const [deployer] = await ethers.getSigners()
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
}
export default func;
"少し" の詳細を追加した後、コードが豊かになりました。ここで重要な内容を説明します。
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
このコードは、Uniswap が提供する公式パッケージから bytecode と abi データをインポートしており、それにより、以下の内容を直接入力できます。
await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
このコードは、V3Factory 契約をデプロイするコードです。ここで、deploy は hardhat-deploy プラグインが提供する関数であり、2 番目の引数で bytecode と abi を指定しています - 両方が必要です。
もちろん、tsconfig.json ファイルも変更する必要があります。 "resolveJsonModule": true のオプションを追加します。変更後のファイルは次のようになります。
{
"compilerOptions": {
"target": "es2020",
"module": "commonjs",
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true,
"resolveJsonModule": true
},
}
次は SwapRouter 契約です。同じようにコードを変更します。もちろん、自分で試してみることもできます。
import { DeployFunction } from "hardhat-deploy/types";
import {
abi as FACTORY_ABI,
bytecode as FACTORY_BYTECODE,
} from '@uniswap/v3-core/artifacts/contracts/UniswapV3Factory.sol/UniswapV3Factory.json'
import {
abi as SWAP_ROUTER_ABI,
bytecode as SWAP_ROUTER_BYTECODE,
} from '@uniswap/v3-periphery/artifacts/contracts/SwapRouter.sol/SwapRouter.json'
import { HardhatRuntimeEnvironment } from "hardhat/types";
import { constants } from "ethers";
const func: DeployFunction = async function (hre: HardhatRuntimeEnvironment) {
const { deployments, ethers } = hre
const [deployer] = await ethers.getSigners()
const factory = await deployments.deploy("UniV3Factory", {
from: deployer.address,
contract: {
bytecode: FACTORY_BYTECODE,
abi: FACTORY_ABI
},
})
await deployments.deploy("UniV3SwapRouter", {
from: deployer.address,
contract: {
abi: SWAP_ROUTER_ABI,
bytecode: SWAP_ROUTER_BYTECODE
},
args:[factory.address,constants.AddressZero]
// 上記は契約のデプロイのパラメータです。最初のパラメータはfactoryのアドレスで、2番目はWETHのアドレスです。ここでは便宜上、直接0アドレスを使用しています😁
})
}
export default func;
これで、デプロイスクリプトの作成は完了です。yarn hardhat deploy
コマンドを使用して、コードを任意のネットワークにデプロイできます。
ただし、ByteCode を直接デプロイすると、いくつかの問題が発生する場合があります。たとえば、エラーが発生した場合、ソースコードレベルのエラートレースを取得することができません。また、デプロイするのは不完全なバージョンです。なぜなら、NonfungiblePositionManager、NonfungibleTokenPositionDescriptor、NFTDescriptor 契約がまだ不足しているからですが、それらのデプロイ方法はすべて同じです。上記の方法を使用して追加してみてください。宿題として考えてください。
結論#
この章では、Uniswap を ByteCode を使用してデプロイするための基本ファイルを構築しましたが、実際の Uniswap の実行には十分ではありません。次の章では、別の方法で Uniswapv3 をデプロイし、テストケースを作成します。テストケースが合格したら、ソースコードをコンパイルして UniswapV3 をデプロイします。
PS:私は mirror がこのような技術記事を書くのには適していないことに気付きましたので、今後は他のプラットフォームに切り替えます。