🦄

[Technical Reference編] UniswapV3のドキュメントを読んでみよう!

2023/09/11に公開

はじめに

初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。

https://cryptogames.co.jp/

代表的なゲームはクリプトスペルズというブロックチェーンゲームです。

https://cryptospells.jp/

今回はUniswap V3の公式ドキュメント内のTechnical Referenceの章を翻訳・補足しながらまとめていきたいと思います。

公式ドキュメントは以下になります。

https://docs.uniswap.org/contracts/v3/reference/overview

概要

Uniswap V3は、多くのライブラリで構成されたバイナリスマートコントラクトシステムで、これらのライブラリはCore(コア)とPeriphery(周辺)を形成しています。

Coreコントラクトは、Uniswapのプール生成のロジック、プール自体、それらのアセットに関与する対話のロジックを定義します。

Peripheryコントラクトは、1つまたは複数のCoreコントラクトと対話しますが、コアの一部ではありません。
コアとやり取りする機能を提供し、クラリティとユーザーの安全性を向上させるために設計されています。

外部の呼び出し時は主にPeripheryインターフェースを呼び出します。
外部から利用可能な関数は、リファレンスドキュメントで確認できます。
一方、内部関数はUniswap V3のGitHubリポジトリで確認できます。

コア

コア(Core)は、単一のファクトリ(Factory)、プールデプロイヤー(Pool Deployer)、およびファクトリが生成する多くのプールで構成されています。

コアコントラクトでは、ガスの最適化を行った結果V2に比べてすべてのプロトコルのやり取りにおけるガスコストが大幅に削減されましたが、コーそが複雑になりました。

ファクトリ

ファクトリ(Factory)は、プールを生成するためのロジックを定義します。

プール

プールは、主にペアとなるアセットの自動マーケットメーカーとして機能します。
さらに、価格オラクルデータを公開し、フラッシュトランザクションのアセットソースとして使用できます。

Periphery

コアとのドメイン固有のやり取りをサポートするために設計された一連のスマートコントラクト。
Uniswapプロトコルはパーミッションレスシステムであるため、以下で説明するコントラクトには特別な権限を持たず、コアと連携して特定の操作を行うために使用さます。

SwapRouter

SwapRouterは、取引を提供するフロントエンドの基本的な要件をすべてサポートしています。
シングル取引(x→y)とマルチホップ取引(x→y→zなど)をネイティブにサポートしています。

Nonfungible Position Manager

ポジション・マネジャーは、ポジションの作成、調整、または終了を含むロジック・ トランザクションを処理します。

Oracle

オラクルは、さまざまなシステム設計に役立つ価格と流動性のデータを提供し、すべてのプールで利用できます。

Periphery Libraries

ライブラリーは、プールアドレスの計算や安全な転送関数など、開発者が必要とする様々なヘルパー関数を提供します。

Core

UniswapV3Factory

Uniswap V3プールをデプロイし、プールプロトコル料金の所有権と管理権を管理します。

createPool

function createPool(
	address tokenA,
	address tokenB,
	uint24 fee
) external returns (address pool)

与えられた2つのトークンと料金のプールを作成する関数。

tokenAtokenBは、token0/token1またはtoken1/token0のいずれかの順序で渡される。
プールが既に存在する場合、料金が無効な場合、またはトークン引数が無効な場合、実行は失敗します。

パラメータ

名前 説明
tokenA address プール内のアセットの1つ。
tokenB address プール内のもう1つのアセット。
fee uint24 プールで望む手数料。

戻り値

名前 説明
pool address 新しく作成されたプールのアドレス。

setOwner

function setOwner(
	address _owner
) external

ファクトリーオーナーを更新する関数。

現在の所有者のみ実行できます。

パラメータ

名前 説明
_owner address 新しいオーナーのアドレス。

enableFeeAmount

function enableFeeAmount(
	uint24 fee,
	int24 tickSpacing
) public

指定されたtickSpacingで手数料を有効にする関数。

手数料は一度有効にすると削除できません。

パラメータ

名前 説明
fee uint24 プールに設定する手数料の金額。bipの百分の一で表されます(つまり、1e-6)。
tickSpacing int24 指定された手数料で作成されたすべてのプールに対して強制される、トック間のスペーシング(間隔)。

UniswapV3Pool

_blockTimestamp

function _blockTimestamp(
) internal view virtual returns (uint32)

ブロック・タイムスタンプを32ビットに切り詰めたもので、mod 2**32を返す関数。

snapshotCumulativesInside

function snapshotCumulativesInside(
	int24 tickLower,
	int24 tickUpper
) external view override noDelegateCall returns (int56 tickCumulativeInside, uint160 secondsPerLiquidityInsideX128, uint32 secondsInside)

ティック累積、流動性ごとの秒数、ティック範囲内の秒数のスナップショットを返す関数。

スナップショットは、ポジションが存在する期間にわたって取得された他のスナップショットとのみ比較できます。
つまり、最初のスナップショットが取得されると、2番目のスナップショットが取得されるまでの期間にポジションが保持されていない場合、スナップショットを比較することはできません。

以下は表形式でパラメータと返り値を示したものです:

パラメータ

名前 説明
tickLower int24 レンジの下限となるtick。
tickUpper int24 レンジの上限となるtick。

戻り値

名前 説明
tickCumulativeInside int56 レンジのtickアキュムレータのスナップショット。
secondsPerLiquidityInsideX128 uint160 レンジの流動性あたりの秒数のスナップショット。
secondsInside uint32 レンジの内部の秒数のスナップショット。

observe

function observe(
	uint32[] secondsAgos
) external view override noDelegateCall returns (int56[] tickCumulatives, uint160[] secondsPerLiquidityCumulativeX128s)

現在のブロックタイムスタンプから指定された秒数前の各タイムスタンプにおける累積tickと流動性を返す関数。

時間加重平均tickまたは範囲内の流動性を取得するには、2つの値を使用して呼び出す必要があります。
1つは期間の開始を表し、もう1つは期間の終了を表します。
例えば、最後の1時間の時間加重平均tickを取得するには、secondsAgos = [3600, 0]として呼び出す必要があります。
時間加重平均tickは、プールの幾何学的な時間加重平均価格を表し、log base sqrt(1.0001)token1 / token0の比率を表します。
TickMathライブラリを使用して、tick値から比率に変換することができます。

パラメータ

名前 説明
secondsAgos uint32[] 各累積tickと流動性値を取得するための経過秒数。

戻り値

名前 説明
tickCumulatives int56[] secondsAgosからの現在のブロックタイムスタンプでの累積tick値。
secondsPerLiquidityCumulativeX128s uint160[] secondsAgosからの現在のブロックタイムスタンプでの累積流動性インレンジの秒数値。

increaseObservationCardinalityNext

function increaseObservationCardinalityNext(
	uint16 observationCardinalityNext
) external override lock noDelegateCall

このプールが保持する価格と流動性の観測値の最大数を増やす関数。

ただし、プールが既に引数のobservationCardinalityNext以上のobservationCardinalityNextを持っている場合、何も実行されません。
既に必要な数以上の観測値を保持している場合には、何も変更されないということです。

パラメータ

名前 説明
observationCardinalityNext uint16 保存するプールに必要な最小観測数。

initialize

function initialize(
	uint160 sqrtPriceX96
) external override

プールの初期価格を設定する関数。
初期化時はロックされていない状態で初期化されます。

パラメータ

名前 説明
sqrtPriceX96 uint160 プールの初期平方根価格

mint

function mint(
	address recipient,
	int24 tickLower,
	int24 tickUpper,
	uint128 amount,
	bytes data
) external override lock returns (uint256 amount0, uint256 amount1)

指定された受取アドレス(recipient)、ポジションの下限(tickLower)、上限(tickUpper)に対して流動性を追加する関数。

パラメータ

名前 説明
recipient address 流動性が作成される受取アドレス。
tickLower int24 流動性を追加するポジションの下限となるtick。
tickUpper int24 流動性を追加するポジションの上限となるtick 。
amount uint128 生成する流動性の量。
data bytes コールバックに渡すべき任意のデータ。

戻り値

名前 説明
amount0 uint256 指定した流動性の生成に使用されたtoken0の量。コールバック内の値と一致します。
amount1 uint256 指定した流動性の生成に使用されたtoken1の量。コールバック内の値と一致します。

collect

function collect(
	address recipient,
	int24 tickLower,
	int24 tickUpper,
	uint128 amount0Requested,
	uint128 amount1Requested
) external override lock returns (uint128 amount0, uint128 amount1)

ポジションに支払われるべきトークンを収集する関数。
ポジションの所有者によってのみ実行されます。

パラメータ

名前 説明
recipient address 収集した料金を受け取るアドレス。
tickLower int24 料金を収集するポジションの下限tick。
tickUpper int24 料金を収集するポジションの上限tick。
amount0Requested uint128 料金からトークン0を引き出す金額(トークン0の料金)。
amount1Requested uint128 料金からトークン1を引き出す金額(トークン1の料金)。

戻り値

名前 説明
amount0 uint128 トークン0で収集された料金の量。
amount1 uint128 トークン1で収集された料金の量。

burn

function burn(
	int24 tickLower,
	int24 tickUpper,
	uint128 amount
) external override lock returns (uint256 amount0, uint256 amount1)

指定された範囲内の流動性を消費して、実行アドレスに送付する関数。

パラメータ

名前 説明
tickLower int24 流動性を消費するポジションの下限tick。
tickUpper int24 流動性を消費するポジションの上限tick。
amount uint128 消費する流動性の量。

戻り値

名前 説明
amount0 uint256 受信者に送信されるトークン0の量。
amount1 uint256 受信者に送信されるトークン1の量。

swap

function swap(
	address recipient,
	bool zeroForOne,
	int256 amountSpecified,
	uint160 sqrtPriceLimitX96,
	bytes data
) external override noDelegateCall returns (int256 amount0, int256 amount1)

トークン0をトークン1に交換するか、トークン1をトークン0に交換する関数。

パラメータ

名前 説明
recipient address 交換の出力を受け取るアドレス。
zeroForOne bool 交換の方向。トークン0からトークン1への場合はtrue、トークン1からトークン0への場合はfalse
amountSpecified int256 交換の量。正の値の場合は入力を正確に指定し、負の値の場合は出力を正確に指定します。
sqrtPriceLimitX96 uint160 Q64.96の平方根価格制限。zeroForOnetrueの場合、交換後の価格はこの値未満にならない。zeroForOnefalseの場合、交換後の価格はこの値を超えない。
data bytes コールバックに渡すべき任意のデータ。

戻り値

名前 説明
amount0 int256 プールのトークン0の残高の変化。負の値の場合、正確。正の値の場合、最小。
amount1 int256 プールのトークン1の残高の変化。負の値の場合、正確。正の値の場合、最小。

flash

function flash(
	address recipient,
	uint256 amount0,
	uint256 amount1,
	bytes data
) external override lock noDelegateCall

トークン0と/またはトークン1を受け取り、コールバック内で手数料を含めて返金する関数。

パラメータ

名前 説明
recipient address トークン0とトークン1の量を受け取るアドレス。
amount0 uint256 送信するトークン0の量。
amount1 uint256 送信するトークン1の量。
data bytes コールバックに渡すべき任意のデータ。

setFeeProtocol

function setFeeProtocol(
	uint8 feeProtocol0,
	uint8 feeProtocol1
) external override lock onlyFactoryOwner

プロトコルが受け取る手数料の割合を設定する関数。

パラメータ

名前 説明
feeProtocol0 uint8 プールのトークン0の新しいプロトコル手数料。
feeProtocol1 uint8 プールのトークン1の新しいプロトコル手数料。

collectProtocol

function collectProtocol(
	address recipient,
	uint128 amount0Requested,
	uint128 amount1Requested
) external override lock onlyFactoryOwner returns (uint128 amount0, uint128 amount1)

プールに蓄積されたプロトコル手数料を収集する関数。

パラメータ

名前 説明
recipient address 収集されたプロトコル手数料を送信するアドレス。
amount0Requested uint128 送信するトークン0の最大額、トークン1のみで手数料を収集する場合は0にできます。
amount1Requested uint128 送信するトークン1の最大額、トークン0のみで手数料を収集する場合は0にできます。

戻り値

名前 説明
amount0 uint128 トークン0で収集されたプロトコル手数料。
amount1 uint128 トークン1で収集されたプロトコル手数料。

UniswapV3PoolDeployer

deploy

function deploy(
	address factory,
	address token0,
	address token1,
	uint24 fee,
	int24 tickSpacing
) internal returns (address pool)

指定されたパラメータでプールをデプロイする関数。
プールのデプロイ後、パラメータのストレージスロットを一時的に設定し、プールのデプロイが完了した後クリアします。

パラメータ:

名前 説明
factory address Uniswap V3ファクトリのコントラクトアドレス。
token0 address アドレス順に並べたときのプールの最初のトークン。
token1 address アドレス順に並べたときのプールの2番目のトークン。
fee uint24 プール内の各スワップで徴収される手数料(bipの1/100)。
tickSpacing int24 使用可能なティック間のスペーシング。

インターフェース

IUniswapV3Factory

owner

function owner() external view returns (address)

現在のファクトリのオーナー(所有者)を返す関数。
オーナーはsetOwnerを通じて変更できます。

戻り値

説明
address ファクトリのオーナーのアドレス。

feeAmountTickSpacing

function feeAmountTickSpacing(
	uint24 fee
) external view returns (int24)

指定された手数料額に対するティック間隔を返す関数。
手数料が有効に設定されている場合はその値を返し、無効の場合は0を返します。

パラメータ

名前 説明
fee uint24 手数料の額(bipの1/100)。無効な場合は0を返す。

戻り値

説明
int24 ティック間隔。

getPool

function getPool(
	address tokenA,
	address tokenB,
	uint24 fee
) external view returns (address pool)

指定されたトークンペアと手数料に対するプールのアドレスを返す関数。
プールが存在しない場合はアドレス0を返します。

トークンAとトークンBは、token0/token1の順序またはtoken1/token0の順序のどちらでも渡すことができます。

パラメータ

名前 説明
tokenA address トークン0またはトークン1のコントラクトアドレス。
tokenB address もう一方のトークンのコントラクトアドレス。
fee uint24 手数料(bipの1/100)。

戻り値

名前 説明
pool address プールのアドレス。

IUniswapV3PoolDeployer

プールを構築するコントラクトは、プールに引数を渡すために以下の機能を実装する必要があります。
これにより、プールコントラクト内にコンストラクタ引数を持たないようにできます。
その結果、プールのイニシャライザのコードハッシュが一定になり、プールのCREATE2アドレスをコストをかけずにオンチェーンで計算できるようになります。

parameters

function parameters() external view returns (address factory, address token0, address token1, uint24 fee, int24 tickSpacing)

プールの構築に使用されるパラメーターを取得する関数。

戻り値

名前 説明
factory アドレス ファクトリーのアドレス。
token0 アドレス アドレス順にソートされたプールの最初のトークン。
token1 アドレス アドレス順にソートされたプールの2番目のトークン。
fee uint24 プール内の各スワップで徴収される手数料。BIPの百分の一で表されます。
tickSpacing int24 初期化されたティック間の最小ティック数。

IUniswapV3FlashCallback

uniswapV3FlashCallback

function uniswapV3FlashCallback(
	uint256 fee0,
	uint256 fee1,
	bytes data
) external

IUniswapV3Poolflashから受け取ったトークンと計算された手数料を返す関数。
呼び出し元が「UniswapV3Factory」によってデプロイされた「UniswapV3Pool」であることを確認する必要があります。

パラメータ

名前 説明
fee0 uint256 flashの終了時にプールに支払われるトークン0の手数料金額。
fee1 uint256 flashの終了時にプールに支払われるトークン1の手数料金額。
data bytes IUniswapV3PoolActions#flash呼び出し元から渡される任意のデータ。

IUniswapV3MintCallback

uniswapV3MintCallback

function uniswapV3MintCallback(
	uint256 amount0Owed,
	uint256 amount1Owed,
	bytes data
) external

IUniswapV3Poolmint関数を実行してポジションに流動性をミントした後、msg.senderによって呼び出される関数。

mintされた流動性に対してプールに支払うためのトークンを支払う必要があります。
この関数の呼び出し元は、UniswapV3Factoryによって展開されたUniswapV3Poolであることを確認する必要があります。

パラメータ

名前 説明
amount0Owed uint256 mintされた流動性に対してプールに支払うためのトークン0の金額。
amount1Owed uint256 mintされた流動性に対してプールに支払うためのトークン1の金額。
data bytes IUniswapV3PoolActions#mint呼び出し時に呼び出し元から渡されるデータ。

IUniswapV3SwapCallback

uniswapV3SwapCallback

function uniswapV3SwapCallback(
	int256 amount0Delta,
	int256 amount1Delta,
	bytes data
) external

IUniswapV3Poolswap関数を通じてスワップを実行した後に、msg.senderによって呼び出される関数。

スワップによってプールに支払われるトークンを返済する必要があります。
呼び出し元が「UniswapV3Factory」によってデプロイされた「UniswapV3Pool」であることを確認する必要があります。

名前 説明
amount0Delta int256 スワップの終了時にプールによって送信された(負の値)または受け取られる(正の値)トークン0の量。正の値の場合、コールバックはその量のトークン0をプールに送信する必要があります。
amount1Delta int256 スワップの終了時にプールによって送信された(負の値)または受け取られる(正の値)トークン1の量。正の値の場合、コールバックはその量のトークン1をプールに送信する必要があります。
data bytes IUniswapV3PoolActions#swap呼び出し時に呼び出し元によって渡された任意のデータ。

Pool

以下を参考にしてください。

https://zenn.dev/cryptogames/articles/61ee19994743fd#uniswapv3pool

ライブラリ

BitMath

符号なし整数のビットプロパティを計算する機能を提供するライブラリ。

mostSignificantBit

function mostSignificantBit(
	uint256 x
) internal pure returns (uint8 r)

指定された数値の最も有効なビット(最も左の1のビット)のインデックスを返す関数。
最も右のビットのインデックスは0で、最も左のビットのインデックスは255です。

この関数は次の条件を満たします。
x >= 2^mostSignificantBit(x)およびx < 2^(mostSignificantBit(x)+1)

パラメータ

名前 説明
x uint256 最も有意なビットを計算する値、0より大きい必要があります。

戻り値:

名前 説明
r unit8 最も有意なビットのインデックス。

leastSignificantBit

function leastSignificantBit(
	uint256 x
) internal pure returns (uint8 r)

与えられた数値の最も右側(最下位)のビットのインデックスを返す関数。
最も右側のビットはインデックス0にあり、最も左側のビットはインデックス255にあります。

この関数は、与えられた数値xに対して次の性質が満たされることを確認します。

  1. (x & 2^leastSignificantBit(x)) != 0
    xの2進数表現において最も右側のビット(最下位ビット)が1に設定されているかどうかを確認します。
  2. (x & (2^(leastSignificantBit(x)) - 1)) == 0
    最も右側のビット以外のすべてのビットが0に設定されているかどうかを確認します。

この関数はx内の最も右側(最下位)の1ビットの位置を見つけるのに役立ちます。

もちろんです。以下は、指定された関数のパラメータと戻り値を表形式で示したものです。

申し訳ありません、指示に従い修正いたします。

パラメータ

名前 説明
x uint256 最も右側のビットを計算するための値。0より大きい必要があります。

戻り値

名前 説明
r uint8 最も右側(最下位)のビットのインデックス。

FullMath

中間値のオーバーフローが発生しても精度を損なわずに乗算と除算を行うライブラリ。

mulDiv

function mulDiv(
	uint256 a,
	uint256 b,
	uint256 denominator
) internal pure returns (uint256 result)

完全な精度でfloor(a×b÷denominator)を計算する関数。
ただし、計算結果がuint256をオーバーフローする場合やdenominator0の場合にはエラーを返します。

与えられたabの値を掛け合わせて、denominatorで割った結果を小数点以下を切り捨てて計算します。

パラメータ

名前 説明
a uint256 乗数となる値。
b uint256 乗数となる値。
denominator uint256 除数となる値。

戻り値

名前 説明
result uint256 256ビットの計算結果。

mulDivRoundingUp

function mulDivRoundingUp(
	uint256 a,
	uint256 b,
	uint256 denominator
) internal pure returns (uint256 result)

完全な精度でceil(a×b÷denominator)を計算する関数。
ただし、計算結果がuint256をオーバーフローする場合やdenominator0の場合にはエラーを返します。

パラメータ

名前 説明
a uint256 乗数。
b uint256 乗数。
denominator uint256 除数。

戻り値

名前 説明
result uint256 256ビットの計算結果。切り捨て。

LiquidityMath

addDelta

function addDelta(
	uint128 x,
	int128 y
) internal pure returns (uint128 z)

署名付き流動性デルタ」を流動性に追加する関数。
オーバーフローまたはアンダーフローが発生した場合は処理を取り消します。

Parameters

名前 説明
x uint128 変更前の流動性。
y int128 流動性を変更するデルタ。

Return Values:

名前 説明
z uint128 流動性のデルタ。

LowGasSafeMath

add

function add(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

2つの整数xyを受け取り、それらを足し合わせた結果を返す関数。

パラメータ

名前 説明
x uint256 足される値。
y uint256 加算する値。

戻り値:

名前 説明
z uint256 xyの合計値。

sub

function sub(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

2つの整数xyを受け取り、それらを引いた結果を返す関数。

パラメータ

名前 説明
x uint256 引かれる値。
y uint256 減算する値。

戻り値:

名前 説明
z uint256 xyの差。

mul

function mul(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

2つの整数xyを受け取り、それらをかけわせた結果を返す関数。

パラメータ

名前 説明
x uint256 かけられる値。
y uint256 かける値。

戻り値:

名前 説明
z uint256 xyの積。

add

function add(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

2つの整数xyを受け取り、それらを足し合わせた結果を返す関数。
オーバーフローかアンダーフローした場合はrevertする。

パラメータ

名前 説明
x uint256 足される値。
y uint256 加算する値。

戻り値:

名前 説明
z uint256 xyの合計値。

sub

function sub(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

2つの整数xyを受け取り、それらを引いた結果を返す関数。
オーバーフローかアンダーフローした場合はrevertする。

パラメータ

名前 説明
x uint256 引かれる値。
y uint256 減算する値。

戻り値:

名前 説明
z uint256 xyの差。

Oracle

この機能は、さまざまなシステム設計に役立つ価格と流動性のデータを提供します。

observations(観測値) と呼ばれる、格納されたオラクルデータのインスタンスは、オラクル配列に収集されます。
すべてのプールは、オラクル配列の長さが1で初期化されます。
誰でも、オラクル配列の最大長さを増やすためにSSTORE(ストレージにデータを格納するためのガスコストを伴う操作)を支払うことができます。
オラクル配列が完全に埋められると、新しいスロットが追加されます。
observationsがオラクル配列の最大長さまで埋められると、observationsは上書きされます。
オラクル配列の長さに関係なく、最も最近の観測値は、observe()0を渡すことで取得できます。

initialize

function initialize(
	struct Oracle.Observation[65535] self,
	uint32 time
) internal returns (uint16 cardinality, uint16 cardinalityNext)

オラクル配列を初期化し、最初のスロットにデータを書き込む関数。
この関数は、observations配列のライフサイクル中に1回だけ呼び出されます。

パラメータ

名前 説明
self struct Oracle.Observation[65535] 格納されたオラクル配列。
time uint32 オラクルの初期化時刻。これはblock.timestampuint32に切り詰めたものです。

Return Values:

名前 説明
cardinality uint16 オラクル配列内の要素数。
cardinalityNext uint16 要素数に関係なく、オラクル配列の新しい長さ。

write

function write(
	struct Oracle.Observation[65535] self,
	uint16 index,
	uint32 blockTimestamp,
	int24 tick,
	uint128 liquidity,
	uint16 cardinality,
	uint16 cardinalityNext
) internal returns (uint16 indexUpdated, uint16 cardinalityUpdated)

オラクルの観測結果を配列に書き込む関数。

1ブロックにつき1回だけ書き込みが許可されます。
配列内のインデックスは、最後に書き込まれた要素を表します。
cardinality(要素数)とindex(現在のインデックス位置)は外部でトラッキングする必要があります。
もしindexが許容された配列長(cardinalityに基づく)の最後にあり、次のcardinalityが現在のcardinalityよりも大きい場合、cardinalityを増やすことができます。
この制限は順序を保つために導入されています。

以下は、指定された条件に基づいて整形された日本語のマークダウン表です。

パラメータ

名前 説明
self struct Oracle.Observation[65535] 格納されたオラクル配列。
index uint16 最も最近に更新された観測の位置。
blockTimestamp uint32 新しい観測のタイムスタンプ。
tick int24 新しい観測時のアクティブなタイック。
liquidity uint128 新しい観測時の合計範囲内の流動性。
cardinality uint16 オラクル配列内の要素の数。
cardinalityNext uint16 ポピュレーションに独立したオラクル配列の新しい長さ。

戻り値

名前 説明
indexUpdated uint16 オラクル配列内で最も最近書かれた要素の新しいインデックス。
cardinalityUpdated uint16 オラクル配列の新しいカーディナリティ。

grow

function grow(
	struct Oracle.Observation[65535] self,
	uint16 current,
	uint16 next
) internal returns (uint16)

次のobservationsまでを格納するオラクル配列を準備する関数。

パラメータ

名前 説明
self struct Oracle.Observation[65535] 保存されたオラクル配列。
current uint16 オラクル配列の現在の次のカーディナリティ。
next uint16 オラクル配列にポピュレートされる提案された次のカーディナリティ。

戻り値

名前 説明
next uint16 オラクル配列にポピュレートされる次のカーディナリティ。

observe

function observe(
	struct Oracle.Observation[65535] self,
	uint32 time,
	uint32[] secondsAgos,
	int24 tick,
	uint16 index,
	uint128 liquidity,
	uint16 cardinality
) internal view returns (int56[] tickCumulatives, uint160[] liquidityCumulatives)

与えられた時間から一定の時間(seconds ago)前のアキュムレータの値を、secondsAgosという配列内の指定された時間ごとに返す関数。
最も古い観測時刻を超えるsecondsAgosが指定された場合にエラーを返します。

パラメータ

名前 説明
self struct Oracle.Observation[65535] 保存されたオラクル配列。
time uint32 現在のブロックのタイムスタンプ。
secondsAgos uint32[] 過去の観測を取得するための時間間隔(秒単位)の配列。各要素は、観測を取得する際の遡る時間を示します。
tick int24 現在のタイックの値。
index uint16 オラクル配列内の特定の観測の位置。
liquidity uint128 現在の範囲内プールの流動性。
cardinality uint16 オラクル配列内に格納された要素の数。

戻り値

名前 説明
tickCumulatives int56[] プールが初めて初期化されてからの、各secondsAgoごとのタイム経過に対するタイック * タイムの累積値。
liquidityCumulatives uint160[] プールが初めて初期化されてからの、各secondsAgoごとのタイム経過に対する流動性 * タイムの累積値。

Position

ポジションは所有者のアドレスの、下限と上限のタイック境界間の流動性を表します。

ポジションは、ポジションに支払われるべき手数料を追跡するための追加の状態を保持します。

get

function get(
	mapping(bytes32 => struct Position.Info) self,
	address owner,
	int24 tickLower,
	int24 tickUpper
) internal view returns (struct Position.Info position)

指定された所有者とポジションの境界をもとに、ポジションの情報(Info構造体)を返す関数。

以下は、指定された条件に従って整形されたパラメータと戻り値の表です。

パラメータ

名前 説明
self mapping(bytes32 => struct Position.Info) すべてのユーザーポジションを含むマッピング。
owner address ポジションの所有者のアドレス。
tickLower int24 ポジションの下限タイック境界。
tickUpper int24 ポジションの上限タイック境界。

戻り値

名前 説明
position struct Position.Info 指定された所有者のポジションの情報構造体。

update

function update(
	struct Position.Info self,
	int128 liquidityDelta,
	uint256 feeGrowthInside0X128,
	uint256 feeGrowthInside1X128
) internal

ユーザーのポジションに蓄積された手数料を与える関数。

パラメータ

名前 説明
self struct Position.Info すべてのユーザーポジションを含むマッピング。
liquidityDelta int128 ポジションの更新によるプールの流動性の変化。
feeGrowthInside0X128 uint256 ポジションのタイック境界内でのtoken0の累積手数料成長率(流動性単位あたり)。
feeGrowthInside1X128 uint256 ポジションのタイック境界内でのtoken1の累積手数料成長率(流動性単位あたり)。

SafeCast

型を安全にキャストします。

toUint160

function toUint160(
	uint256 y
) internal pure returns (uint160 z)

uint256uint160にキャストする関数。
オーバーフローが起きるとrevertします。

パラメータ

名前 説明
y uint256 ダウンキャストされるuint256値。

戻り値

名前 説明
z uint160 ダウンキャスト後の整数、型はuint160になります。

toInt128

function toInt128(
	int256 y
) internal pure returns (int128 z)

int256int128にキャストする関数。
オーバーフローまたはアンダーフロー時にはrevertします。

パラメータ

名前 説明
y int256 ダウンキャストされるint256値。

戻り値

名前 説明
z int128 ダウンキャスト後の整数、型はint128になります。

toInt256

function toInt256(
	uint256 y
) internal pure returns (int256 z)

uint256int256にキャストする関数。
オーバーフロー時にrevertします。

パラメータ

名前 説明
y uint256 キャストされるuint256値。

戻り値

名前 説明
z int256 キャスト後の整数、型はint256になります。

SecondsOutside

特定のマッピングに関連する方法について説明しています。
このマッピングは、tick(価格の区間を表す整数)から32ビットのタイムスタンプ値へのマッピングを保持しており、特にtick外での取引時間を追跡するために使用されます。

このマッピングでは、キーとしてint24(24ビットの整数)を使用されていて、1つのワードには8つ(2^3)の値が収められています。
このマッピングは、特定のtick値から、そのtick外での取引時間を記録するのに役立ちます。

重要なポイントとして、「tick外での取引時間」は常に相対的な測定であり、下限tickと上限tickの合計流動性が0より大きい期間に限り一貫して有効です。
流動性が0になると、この測定は無効になる可能性があることに注意する。

initialize

function initialize(
	mapping(int24 => uint256) self,
	int24 tick,
	int24 tickCurrent,
	int24 tickSpacing,
	uint32 time
) internal

tickが初めて使用され、tick外での取引時間を設定する関数。
tickが初期化されていないと仮定します。

パラメータ

名前 説明
self mapping(int24 => uint256) tickからtick外取引時間
の値へのマッピング。
tick int24 初期化されるべきtick
tickCurrent int24 現在のtick
tickSpacing int24 利用可能なtick間の間隔。
time uint32 現在のタイムスタンプ。

clear

function clear(
	mapping(int24 => uint256) self,
	int24 tick,
	int24 tickSpacing
) internal

tickが使用されなくなったときに呼び出され、tick外で取引時間値をクリアする関数。

パラメータ

名前 説明
self mapping(int24 => uint256) tick外での取引時間へのマッピング。
tick int24 クリアするべきtick
tickSpacing int24 利用可能なtick間の間隔。

cross

function cross(
	mapping(int24 => uint256) self,
	int24 tick,
	int24 tickSpacing,
	uint32 time
) internal

初期化されたtickがクロスされたときに呼び出され、そのtick外での取引時間を更新する関数。
初期化されたtickがクロスされるたびに呼び出す必要があります。

パラメータ

名前 説明
self mapping(int24 => uint256) tickからtick外での取引時間へのマッピング。
tick int24 クロスされるべきtick
tickSpacing int24 利用可能なtick間の間隔。
time uint32 現在のブロックのタイムスタンプを32ビットに切り詰めたもの。

get

function get(
	mapping(int24 => uint256) self,
	int24 tick,
	int24 tickSpacing
) internal view returns (uint32)

初期化されたtick外の取引時間を取得する関数。
初期化されたtickのみ取得できます。

パラメータ

名前 説明
self mapping(int24 => uint256) tickからtick外での取引時間の値へのマッピング。
tick int24 取引時間の値を取得したいtick
tickSpacing int24 利用可能なタイック間の間隔。

戻り値

説明
uint32 指定したtick外の取引時間。

secondsInside

function secondsInside(
	mapping(int24 => uint256) self,
	int24 tickLower,
	int24 tickUpper,
	int24 tickCurrent,
	int24 tickSpacing
) internal view returns (uint32)

tickLowertickUpperの両方が初期化されていると仮定して、tick範囲内の取引時間を取得する関数。

パラメータ

名前 説明
self mapping(int24 => uint256) tickからtick外での取引時間値へのマッピング。
tickLower int24 取得したい下限tick。
tickUpper int24 取得したい上限tick。
tickCurrent int24 現在のtick
tickSpacing int24 利用可能なtick間の間隔。

戻り値

名前 説明
a uint32 スナップショットを取り、後のスナップショットと比較するための相対的なtick内での取引時間の値。

SqrtPriceMath

価格の平方根をQ64.96として使用し、流動性を用いてデルタを計算します。

getNextSqrtPriceFromAmount0RoundingUp

function getNextSqrtPriceFromAmount0RoundingUp(
	uint160 sqrtPX96,
	uint128 liquidity,
	uint256 amount,
	bool add
) internal pure returns (uint160)

特定の条件下で「token0」の変化量に基づいて次の平方根価格を取得する方関数。

  • 常に切り上げ
    • この計算では、常に値を切り上げることが行われます。
    • なぜなら、2つのケース、つまり価格が上昇する場合(正確な出力の場合)と価格が下降する場合(正確な入力の場合)の両方で、適切な操作を実行するために常に切り上げが必要だからです。
  • 具体的な計算方法
    • 平方根価格を計算するための最も正確な数式は以下です。
    • ただし、オーバーフローの問題がある場合は、別の方法で計算します。
    • 正確な計算
      • liquidity * sqrtPX96 / (liquidity +- amount * sqrtPX96)
    • オーバーフローの場合
      • liquidity / (liquidity / sqrtPX96 +- amount)

パラメータ

名前 説明
sqrtPX96 uint160 開始価格、つまり「token0」の変化を考慮する前の価格。
liquidity uint128 利用可能な流動性の量。
amount uint256 仮想リザーブから追加または削除する「token0」の量。
add bool amount」を追加するか削除するかを示すブール値。

戻り値

説明
uint160 amount」を追加または削除した後の価格。

getNextSqrtPriceFromAmount1RoundingDown

特定の条件下で「token1」の変化量に基づいて次の平方根価格を取得する方関数。

  • 常に切り捨て
    • この計算では、常に値を切り捨てることが行われます。
    • なぜなら、正確な出力の場合(価格が下降する場合)では、望む出力量を得るために少なくとも価格を指定距離移動する必要があるためです。
    • 正確な入力の場合(価格が上昇する場合)では、過剰な出力を送信しないために価格を少なく移動する必要があるためです。
  • 計算式の正確性
    • この計算の公式は、損失のないバージョンからわずかに(1 wei未満で)外れる可能性があるが、非常に正確な計算であることが強調されています。
    • 計算式は以下の通りです。
      • sqrtPX96 +- amount / liquidity

パラメータ

名前 説明
sqrtPX96 uint160 開始価格、つまり「token1」の変化を考慮する前の価格。
liquidity uint128 利用可能な流動性の量。
amount uint256 仮想リザーブから追加または削除する「token1」の量。
add bool amount」を追加または削除するかを示すブール値。

戻り値

説明
uint160 amount」を追加または削除した後の価格。

getNextSqrtPriceFromInput

function getNextSqrtPriceFromInput(
	uint160 sqrtPX96,
	uint128 liquidity,
	uint256 amountIn,
	bool zeroForOne
) internal pure returns (uint160 sqrtQX96)

token0またはtoken1の入力量を指定して、次のsqrt価格を取得する関数。

価格または流動性が0であるか、次の価格が許容範囲外である場合にエラーを投げます。

パラメータ

名前 説明
sqrtPX96 uint160 開始価格、つまり入力量を考慮する前の価格。
liquidity uint128 利用可能な流動性の量。
amountIn uint256 トークン0またはトークン1の入力量。
zeroForOne bool 入力量がトークン0かトークン1かを示すブール値。

戻り値

名前 説明
sqrtQX96 uint160 入力量をトークン0またはトークン1に追加した後の価格。

getNextSqrtPriceFromOutput

function getNextSqrtPriceFromOutput(
	uint160 sqrtPX96,
	uint128 liquidity,
	uint256 amountOut,
	bool zeroForOne
) internal pure returns (uint160 sqrtQX96)

token0またはtoken1の出力量を指定して、次のsqrt価格を取得する関数。

価格または流動性が0であるか、次の価格が許容範囲外である場合にエラーを投げます。

パラメータ

名前 説明
sqrtPX96 uint160 開始価格、つまり出力量を考慮する前の価格。
liquidity uint128 利用可能な流動性の量。
amountOut uint256 トークン0またはトークン1の出力量。
zeroForOne bool 出力量がトークン0かトークン1かを示すブール値。

戻り値

名前 説明
sqrtQX96 uint160 出力量をトークン0またはトークン1から削除した後の価格。

getAmount0Delta

function getAmount0Delta(
	uint160 sqrtRatioAX96,
	uint160 sqrtRatioBX96,
	uint128 liquidity,
	bool roundUp
) internal pure returns (uint256 amount0)

2つの価格間の金額0デルタを取得する関数。

liquidity / sqrt(lower) - liquidity / sqrt(upper), i.e. liquidity * (sqrt(upper) - sqrt(lower)) / (sqrt(upper) * sqrt(lower))

上記を計算します。

パラメータ

名前 説明
sqrtRatioAX96 uint160 1つ目の平方根価格。
sqrtRatioBX96 uint160 2つ目の平方根価格。
liquidity uint128 利用可能な流動性の量。
roundUp bool 量を切り上げるか切り捨てるかを示すブール値。

戻り値

名前 説明
amount0 uint256 2つの平方根価格の間で指定された流動性サイズをカバーするのに必要なトークン0の量。

getAmount1Delta

function getAmount1Delta(
	uint160 sqrtRatioAX96,
	uint160 sqrtRatioBX96,
	uint128 liquidity,
	bool roundUp
) internal pure returns (uint256 amount1)

2つの価格間の金額1デルタを取得する関数。

liquidity * (sqrt(upper) - sqrt(lower))計算します。

パラメータ

名前 説明
sqrtRatioAX96 uint160 1つ目の平方根価格。
sqrtRatioBX96 uint160 2つ目の平方根価格。
liquidity uint128 利用可能な流動性の量。
roundUp bool 量を切り上げるか切り捨てるかを示すブール値。

戻り値

名前 説明
amount1 uint256 2つの平方根価格の間で指定された流動性サイズをカバーするのに必要なトークン1の量。

getAmount0Delta

function getAmount0Delta(
	uint160 sqrtRatioAX96,
	uint160 sqrtRatioBX96,
	int128 liquidity
) internal pure returns (int256 amount0)

署名されたtoken0のデルタを取得するヘルパー関数。

パラメータ

名前 説明
sqrtRatioAX96 uint160 1つ目の平方根価格。
sqrtRatioBX96 uint160 2つ目の平方根価格。
liquidity int128 計算するための流動性の変化。

戻り値

名前 説明
amount0 int256 指定された2つの平方根価格間の「liquidityDelta」に対応するトークン0の量。

getAmount1Delta

function getAmount1Delta(
	uint160 sqrtRatioAX96,
	uint160 sqrtRatioBX96,
	int128 liquidity
) internal pure returns (int256 amount1)

署名されたtoken1のデルタを取得するヘルパー関数。

パラメータ

名前 説明
sqrtRatioAX96 uint160 1つ目の平方根価格。
sqrtRatioBX96 uint160 2つ目の平方根価格。
liquidity int128 計算するための流動性の変化。

戻り値

名前 説明
amount0 int256 指定された2つの平方根価格間の「liquidityDelta」に対応するトークン0の量。

SwapMath

1tickの価格範囲、すなわち1tick内でのスワップ結果を計算します。

computeSwapStep

function computeSwapStep(
	uint160 sqrtRatioCurrentX96,
	uint160 sqrtRatioTargetX96,
	uint128 liquidity,
	int256 amountRemaining,
	uint24 feePips
) internal pure returns (uint160 sqrtRatioNextX96, uint256 amountIn, uint256 amountOut, uint256 feeAmount)

特定のパラメータに基づいて、スワップ操作における一定のトークン量を入れ替えた結果を計算する関数。

  • スワップ操作のパラメータに基づいて、一定のトークン量を入れ替える結果を計算します。
  • 手数料と入力量の合計は、スワップのamountSpecified(指定された金額)が正の値である場合、残りの量を超えないことが保証されています。
    • スワップ操作が予定通りに行われ、不正確な取引が防がれるためのセキュリティメカニズムです。

以下は、指定された条件に従って整形されたパラメータと戻り値の表です。

パラメータ

名前 説明
sqrtRatioCurrentX96 uint160 プールの現在の平方根価格。
sqrtRatioTargetX96 uint160 超えてはならない価格。スワップの方向を示すために使用されます。
liquidity uint128 利用可能な流動性。
amountRemaining int256 交換する残りの入力または出力量。
feePips uint24 入力量から取られる手数料(百分率)。

戻り値

名前 説明
sqrtRatioNextX96 uint160 入力または出力量をスワップした後の価格。価格ターゲットを超えないように設定されます。
amountIn uint256 スワップインする量(トークン0またはトークン1)を示す値。スワップの方向に基づいて計算されます。
amountOut uint256 受け取る量(トークン0またはトークン1)を示す値。スワップの方向に基づいて計算されます。
feeAmount uint256 手数料として取られる入力量。

Tick

tickSpacingToMaxLiquidityPerTick

function tickSpacingToMaxLiquidityPerTick(
	int24 tickSpacing
) internal pure returns (uint128)

与えられたtickSpacingからtickごとの最大流動性を導き出す関数。

パラメータ

名前 説明
tickSpacing int24 必要なティックの間隔。ティック間隔の倍数で実現されます。例: tickSpacing3の場合、tick3tickごとに初期化される必要があります。-6、-3、0、3、6、...と続きます。

戻り値

説明
uint128 各ティックごとの最大流動性。

getFeeGrowthInside

function getFeeGrowthInside(
	mapping(int24 => struct Tick.Info) self,
	int24 tickLower,
	int24 tickUpper,
	int24 tickCurrent,
	uint256 feeGrowthGlobal0X128,
	uint256 feeGrowthGlobal1X128
) internal view returns (uint256 feeGrowthInside0X128, uint256 feeGrowthInside1X128)

増加した手数料データを取得する関数。

パラメータ

名前 説明
self mapping(int24 => struct Tick.Info) 初期化されたtick情報を含むマッピング。
tickLower int24 ポジションの下限tick境界。
tickUpper int24 ポジションの上限tick境界。
tickCurrent int24 現在のtick
feeGrowthGlobal0X128 uint256 トークン0の全体の手数料成長率、単位流動性あたり。
feeGrowthGlobal1X128 uint256 トークン1の全体の手数料成長率、単位流動性あたり。

戻り値

名前 説明
feeGrowthInside0X128 uint256 ポジションのtick境界内での、単位流動性あたりのトークン0の累積手数料成長率。
feeGrowthInside1X128 uint256 ポジションのtick境界内での、単位流動性あたりのトークン1の累積手数料成長率。

update

function update(
	mapping(int24 => struct Tick.Info) self,
	int24 tick,
	int24 tickCurrent,
	int128 liquidityDelta,
	uint256 feeGrowthGlobal0X128,
	uint256 feeGrowthGlobal1X128,
	bool upper,
	uint128 maxLiquidity
) internal returns (bool flipped)

tickを更新し、tickが初期化から非初期化、またはその逆に反転した場合にtureを返す関数。

パラメータ

名前 説明
self mapping(int24 => struct Tick.Info) 初期化されたtick情報を含むマッピング。
tick int24 更新されるtick
tickCurrent int24 現在のtick
liquidityDelta int128 tickが左から右にまたは右から左にクロスされたときに追加(または減少)される新しい流動性の量。
feeGrowthGlobal0X128 uint256 トークン0の全体の手数料成長率、単位流動性あたり。
feeGrowthGlobal1X128 uint256 トークン1の全体の手数料成長率、単位流動性あたり。
upper bool ポジションの上限tickを更新する場合は true、下限tickを更新する場合は false。
maxLiquidity uint128 単一tickの最大流動性割り当て。

戻り値

名前 説明
flipped bool tickが初期化済みから初期化されていない状態に切り替わったか、またはその逆になった場合は true。

clear

function clear(
	mapping(int24 => struct Tick.Info) self,
	int24 tick
) internal

tickデータを初期化する。

パラメータ

名前 説明
self mapping(int24 => struct Tick.Info) 初期化されたtick情報を含むマッピング。
tick int24 クリアされるtick

cross

function cross(
	mapping(int24 => struct Tick.Info) self,
	int24 tick,
	uint256 feeGrowthGlobal0X128,
	uint256 feeGrowthGlobal1X128
) internal returns (int128 liquidityNet)

価格の動きに応じて次のtickに移行する関数。

パラメータ

名前 説明
self mapping(int24 => struct Tick.Info) 初期化されたtick情報を含むマッピング。
tick int24 遷移の対象となるtick
feeGrowthGlobal0X128 uint256 トークン0の全体の手数料成長率、単位流動性あたり。
feeGrowthGlobal1X128 uint256 トークン1の全体の手数料成長率、単位流動性あたり。

戻り値

名前 説明
liquidityNet int128 tickが左から右にまたは右から左にクロスされたときに追加(または減少)される流動性の量。

TickBitmap

tickのインデックスとその初期化状態のパックされたマッピングを格納します。

tickint24で表現され、1ワードあたり256(2^8)個の値があるため、マッピングではキーにint16を使用する。

flipTick

function flipTick(
	mapping(int16 => uint256) self,
	int24 tick,
	int24 tickSpacing
) internal

指定されたtickの初期化された状態をfalseからtrue、またはその逆にする関数。

パラメータ

名前 説明
self mapping(int16 => uint256) tickを反転させるマッピング。
tick int24 反転するtick
tickSpacing int24 使用可能なtick間の間隔。

nextInitializedTickWithinOneWord

function nextInitializedTickWithinOneWord(
	mapping(int16 => uint256) self,
	int24 tick,
	int24 tickSpacing,
	bool lte
) internal view returns (int24 next, bool initialized)

指定されたtickの左(以下)または右(以上)にあるtickと同じワード(または隣接するワード)に含まれる次の初期化されたtickを返す関数。

パラメータ

名前 説明
self mapping(int16 => uint256) 次に初期化されるtickを計算するためのマッピング。
tick int24 開始tick
tickSpacing int24 使用可能なtick間の間隔。
lte bool 開始tickよりも小さいか等しい次の初期化されたtickを検索するかどうか。

戻り値

名前 説明
next int24 現在のtickから最大256 tick先までの次の初期化または未初期化のtick。
initialized bool 関数は最大256 tick内でのみ検索するため、次のtickが初期化されているかどうか。

TickMath

サイズ1.0001のtick、すなわちsqrt(1.0001^tick)を固定小数点Q64.96数としてsqrt価格を計算します。
2-128から2128までの価格をサポート。

getSqrtRatioAtTick

function getSqrtRatioAtTick(
	int24 tick
) internal pure returns (uint160 sqrtPriceX96)

sqrt(1.0001^tick) * 2^96を計算する関数。

もしtick > 最大tickならエラーを投げます。

getTickAtSqrtRatio

function getTickAtSqrtRatio(
	uint160 sqrtPriceX96
) internal pure returns (int24 tick)

getRatioAtTick(tick) <= ratioとなる最大のtick値を計算する関数。

sqrtPriceX96 < MIN_SQRT_RATIOの場合にエラーを投げます。
MIN_SQRT_RATIOは、getRatioAtTickが返す可能性のある最低値です。

以下は、指定された条件に従って整形されたパラメータと戻り値の表です。

パラメータ

名前 説明
tick int24 上記の数式に使用する入力tick

戻り値

名前 説明
sqrtPriceX96 uint160 2つのアセットの比率(token1/token0)の平方根を表す固定小数点のQ64.96数。

TransferHelper

以下を参考にしてください。

https://zenn.dev/cryptogames/articles/197e0f1ed053ac#transferhelper

UnsafeMath

一般的な数学関数を実行するしますが、オーバーフローやアンダーフローのチェックは行いません。

divRoundingUp

function divRoundingUp(
	uint256 x,
	uint256 y
) internal pure returns (uint256 z)

ceil(x / y)を返す関数。

y0の時エラーを投げます。

パラメータ

名前 説明
x uint256 割られる数(被除数)。
y uint256 割る数(除数)。

戻り値

名前 説明
z uint256 商。ceil(x / y)のように、切り上げで計算されます。

Governance

Uniswapプロトコルでの運営とアップデートはUNIトークンを持つユーザー
によって行われています。
このプロトコルの運営には、UNIトークン、ガバナンスモジュール、およびTimelockという3つの要素が重要です。

  • UNIトークン
    • UNIトークンはUniswapのネットワークで使われるトークンで、プロトコルのガバナンスデーキーとなる役割を果たしています。
    • UNIトークンを持っている人々がプロトコルに変更を提案し、投票する権利を持っています。
  • ガバナンスモジュール
    • Uniswapのガバナンスを管理するためのソフトウェア。
    • UNIトークンを一定数量(2.5百万UNI、総供給の0.25%以上)持つアカウントは、このモジュールを使用してプロトコルの変更提案を行うことができます。
    • 提案は実行可能なコードを含むものです。
  • Timelock
    • Timelockは、提案が実行される前に待機する期間を管理する機能です。
    • 提案が投票で承認された場合、Timelockは最低でも2日間の待機期間を設け、その後に提案を実行します。
    • これにより、コミュニティが提案内容をよく考えるための時間が確保されます。

プロセスは以下のように進行します。

  1. UNIトークンを持つ人が変更提案を作成します。
  2. コミュニティ全体が提案について7日間の投票期間を持ち、賛成票が多ければ提案が承認されます。
  3. 承認された提案はTimelockにキューイングされ、最低2日後に実行されます。

Timelock


引用: https://docs.uniswap.org/contracts/v3/reference/governance/overview

Uniswapプロトコルでは、システムの設定、ルール、およびプログラムを変更するために、タイムロックという仕組みが使われています。
この仕組みは、「タイムディレイド(遅延)で選択的に変更」することを可能にします。

タイムロックコントラクト

Uniswapプロトコル内の重要な変更を管理する特別なスマートコントラクトです。
このコントラクトには、ガバナンスアクション(プロトコルの変更提案)の最小通知期間がハードコードされています。
通常は、提案が行われた瞬間から最低でも2日間の待機期間を設けることが求められます。
これは、コミュニティに変更の内容を知らせ、議論するための時間を確保するためのルールです。

遅延期間の変更

ただし、特に重要な変更(例: リスクシステムの変更など)の場合、最大30日間の遅延期間を設定することもできます。
これにより、大規模な変更に対するより長い議論と審査の期間を確保できます。

ガバナンスモジュールによる制御

タイムロックコントラクトは、Uniswapのガバナンスモジュールによって制御されます。
つまり、ガバナンスアクションの提案や遅延期間の設定など、変更についての権限はUniswapのコミュニティにあります。

監視と透明性**

タイムロックコントラクトには、保留中および完了したガバナンスアクションに関する情報を提供するダッシュボードがあります。
これにより、コミュニティメンバーは変更の進行状況を監視し、透明性を確保できます。

関数・イベント

関数やイベントについては以下の記事を参考にしてください。

https://zenn.dev/cryptogames/articles/ea1fd18d81dc94

最後に

今回の記事では、以下のTechnical Referenceの章を翻訳・補足しながらまとめてきました。

https://docs.uniswap.org/contracts/v3/reference/overview

いかがだったでしょうか?

普段はブログやQiitaでブロックチェーンやAIに関する記事を挙げているので、よければ見ていってください!

https://chaldene.net/

https://qiita.com/cardene

https://mirror.xyz/0xcE77b9fCd390847627c84359fC1Bc02fC78f0e58

DeCipher |"Read me" for All of Contracts

Discussion