イントロダクション#
このチュートリアルは段階的なものなので、最初からコードを書き始めるわけにはいきません。まるで永久機関を作りたい場合、まずその永久機関がどのように動くのかを知る必要があります。それによって、より良い分解ができるようになります。
したがって、このセクションでは主に UniswapV3 のデプロイに焦点を当てます。このセクションの目的は、将来のプログラムと Uni の統合のために、迅速かつ簡単に UniswapV3 をデプロイすることです。
Uni パッケージのインストール#
ただし、インストールする前に、2 章で設定したテンプレートを保存することをお勧めします。もちろん、これはオプションです。
まず、UniswapV3 をインストールする必要があります。Uniswap のコントラクトは 2 つに分かれています。1 つはv3-periphery
で、もう 1 つはv3-core
です。これら 2 つのリポジトリのコントラクトが何を表しているかを簡単に説明します。
v3-core#
core コントラクトは、pool と factory を管理するためのものです。
pool:資金の保管と交換の計算を行うコントラクトです。
factory:複数のプールを一括作成するためのコントラクトです。
これら 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 フォルダが欠落しているためです。関連する issue は以下の通りです。github-issue。もし、この記事を見るときには、この issue が解決されている場合は、バージョン番号を指定する必要はありません。
ByteCode を使用したデプロイ#
実際のところ、コントラクトのデプロイには 1 つの方法しかありません。それは、バイトコードからデプロイすることですが、異なるツールによっては、さまざまなレベルのカプセル化が提供されます。最も極端な場合、コントラクト名を入力するだけでデプロイできます。ただし、原理を理解するために、最も基本的なデプロイ方法を使用してデプロイします。
まず、デプロイファイルを作成します。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 が提供する公式パッケージからバイトコードと 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
コマンドを使用して、コードを任意のネットワークにデプロイできます。
ただし、バイトコードを直接デプロイすると、いくつかの問題が発生する可能性があります。たとえば、エラーが発生した場合、ソースコードレベルのエラートレースを取得することはできません。また、デプロイするのは不完全なバージョンです。なぜなら、NonfungiblePositionManager、NonfungibleTokenPositionDescriptor、NFTDescriptor コントラクトが不足しているからですが、これらのデプロイ方法はすべて同じです。上記の方法を使用して追加してみてください。宿題として取り組んでみてください。
結論#
このセクションでは、Uniswap をバイトコードを使用してデプロイするための基本的なファイルを構築しましたが、実際の Uniswap の動作には不十分です。次のセクションでは、別の方法で UniswapV3 をデプロイし、テストケースを作成します。テストケースが合格したら、ソースコードを使用して UniswapV3 をデプロイします。
PS:私は mirror がこのような技術記事を書くのには適していないことに気づきましたので、今後は他のプラットフォームに切り替えます。