[Technical Reference編] UniswapV3のドキュメントを読んでみよう!
はじめに
初めまして。
CryptoGamesというブロックチェーンゲーム企業でエンジニアをしている cardene(かるでね) です!
スマートコントラクトを書いたり、フロントエンド・バックエンド・インフラと幅広く触れています。
代表的なゲームはクリプトスペルズというブロックチェーンゲームです。
今回はUniswap V3の公式ドキュメント内のTechnical Referenceの章を翻訳・補足しながらまとめていきたいと思います。
公式ドキュメントは以下になります。
概要
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つのトークンと料金のプールを作成する関数。
tokenA
とtokenB
は、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の平方根価格制限。zeroForOne がtrue の場合、交換後の価格はこの値未満にならない。zeroForOne がfalse の場合、交換後の価格はこの値を超えない。 |
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
IUniswapV3Poolのflash
から受け取ったトークンと計算された手数料を返す関数。
呼び出し元が「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
IUniswapV3Poolのmint
関数を実行してポジションに流動性をミントした後、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
IUniswapV3Poolのswap
関数を通じてスワップを実行した後に、msg.sender
によって呼び出される関数。
スワップによってプールに支払われるトークンを返済する必要があります。
呼び出し元が「UniswapV3Factory」によってデプロイされた「UniswapV3Pool」であることを確認する必要があります。
名前 | 型 | 説明 |
---|---|---|
amount0Delta |
int256 | スワップの終了時にプールによって送信された(負の値)または受け取られる(正の値)トークン0の量。正の値の場合、コールバックはその量のトークン0をプールに送信する必要があります。 |
amount1Delta |
int256 | スワップの終了時にプールによって送信された(負の値)または受け取られる(正の値)トークン1の量。正の値の場合、コールバックはその量のトークン1をプールに送信する必要があります。 |
data |
bytes | IUniswapV3PoolActions#swap呼び出し時に呼び出し元によって渡された任意のデータ。 |
Pool
以下を参考にしてください。
ライブラリ
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
に対して次の性質が満たされることを確認します。
-
(x & 2^leastSignificantBit(x)) != 0
x
の2進数表現において最も右側のビット(最下位ビット)が1
に設定されているかどうかを確認します。 -
(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
をオーバーフローする場合やdenominator
が0
の場合にはエラーを返します。
与えられたa
とb
の値を掛け合わせて、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
をオーバーフローする場合やdenominator
が0
の場合にはエラーを返します。
パラメータ
名前 | 型 | 説明 |
---|---|---|
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つの整数x
とy
を受け取り、それらを足し合わせた結果を返す関数。
パラメータ
名前 | 型 | 説明 |
---|---|---|
x |
uint256 |
足される値。 |
y |
uint256 |
加算する値。 |
戻り値:
名前 | 型 | 説明 |
---|---|---|
z |
uint256 |
x とy の合計値。 |
sub
function sub(
uint256 x,
uint256 y
) internal pure returns (uint256 z)
2つの整数x
とy
を受け取り、それらを引いた結果を返す関数。
パラメータ
名前 | 型 | 説明 |
---|---|---|
x |
uint256 |
引かれる値。 |
y |
uint256 |
減算する値。 |
戻り値:
名前 | 型 | 説明 |
---|---|---|
z |
uint256 |
x とy の差。 |
mul
function mul(
uint256 x,
uint256 y
) internal pure returns (uint256 z)
2つの整数x
とy
を受け取り、それらをかけわせた結果を返す関数。
パラメータ
名前 | 型 | 説明 |
---|---|---|
x |
uint256 |
かけられる値。 |
y |
uint256 |
かける値。 |
戻り値:
名前 | 型 | 説明 |
---|---|---|
z |
uint256 |
x とy の積。 |
add
function add(
uint256 x,
uint256 y
) internal pure returns (uint256 z)
2つの整数x
とy
を受け取り、それらを足し合わせた結果を返す関数。
オーバーフローかアンダーフローした場合はrevert
する。
パラメータ
名前 | 型 | 説明 |
---|---|---|
x |
uint256 |
足される値。 |
y |
uint256 |
加算する値。 |
戻り値:
名前 | 型 | 説明 |
---|---|---|
z |
uint256 |
x とy の合計値。 |
sub
function sub(
uint256 x,
uint256 y
) internal pure returns (uint256 z)
2つの整数x
とy
を受け取り、それらを引いた結果を返す関数。
オーバーフローかアンダーフローした場合はrevert
する。
パラメータ
名前 | 型 | 説明 |
---|---|---|
x |
uint256 |
引かれる値。 |
y |
uint256 |
減算する値。 |
戻り値:
名前 | 型 | 説明 |
---|---|---|
z |
uint256 |
x とy の差。 |
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.timestamp をuint32 に切り詰めたものです。 |
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)
uint256
をuint160
にキャストする関数。
オーバーフローが起きるとrevert
します。
パラメータ
名前 | 型 | 説明 |
---|---|---|
y |
uint256 | ダウンキャストされるuint256 値。 |
戻り値
名前 | 型 | 説明 |
---|---|---|
z |
uint160 | ダウンキャスト後の整数、型はuint160 になります。 |
toInt128
function toInt128(
int256 y
) internal pure returns (int128 z)
int256
をint128
にキャストする関数。
オーバーフローまたはアンダーフロー時にはrevert
します。
パラメータ
名前 | 型 | 説明 |
---|---|---|
y |
int256 | ダウンキャストされるint256 値。 |
戻り値
名前 | 型 | 説明 |
---|---|---|
z |
int128 | ダウンキャスト後の整数、型はint128 になります。 |
toInt256
function toInt256(
uint256 y
) internal pure returns (int256 z)
uint256
をint256
にキャストする関数。
オーバーフロー時に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)
tickLower
とtickUpper
の両方が初期化されていると仮定して、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 | 必要なティックの間隔。ティック間隔の倍数で実現されます。例: tickSpacing が3 の場合、tick は3tick ごとに初期化される必要があります。-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
のインデックスとその初期化状態のパックされたマッピングを格納します。
tick
はint24
で表現され、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
以下を参考にしてください。
UnsafeMath
一般的な数学関数を実行するしますが、オーバーフローやアンダーフローのチェックは行いません。
divRoundingUp
function divRoundingUp(
uint256 x,
uint256 y
) internal pure returns (uint256 z)
ceil(x / y)
を返す関数。
y
が0
の時エラーを投げます。
パラメータ
名前 | 型 | 説明 |
---|---|---|
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日間の待機期間を設け、その後に提案を実行します。
- これにより、コミュニティが提案内容をよく考えるための時間が確保されます。
プロセスは以下のように進行します。
- UNIトークンを持つ人が変更提案を作成します。
- コミュニティ全体が提案について7日間の投票期間を持ち、賛成票が多ければ提案が承認されます。
- 承認された提案はTimelockにキューイングされ、最低2日後に実行されます。
Timelock
引用: https://docs.uniswap.org/contracts/v3/reference/governance/overview
Uniswapプロトコルでは、システムの設定、ルール、およびプログラムを変更するために、タイムロックという仕組みが使われています。
この仕組みは、「タイムディレイド(遅延)で選択的に変更」することを可能にします。
タイムロックコントラクト
Uniswapプロトコル内の重要な変更を管理する特別なスマートコントラクトです。
このコントラクトには、ガバナンスアクション(プロトコルの変更提案)の最小通知期間がハードコードされています。
通常は、提案が行われた瞬間から最低でも2日間の待機期間を設けることが求められます。
これは、コミュニティに変更の内容を知らせ、議論するための時間を確保するためのルールです。
遅延期間の変更
ただし、特に重要な変更(例: リスクシステムの変更など)の場合、最大30日間の遅延期間を設定することもできます。
これにより、大規模な変更に対するより長い議論と審査の期間を確保できます。
ガバナンスモジュールによる制御
タイムロックコントラクトは、Uniswapのガバナンスモジュールによって制御されます。
つまり、ガバナンスアクションの提案や遅延期間の設定など、変更についての権限はUniswapのコミュニティにあります。
監視と透明性**
タイムロックコントラクトには、保留中および完了したガバナンスアクションに関する情報を提供するダッシュボードがあります。
これにより、コミュニティメンバーは変更の進行状況を監視し、透明性を確保できます。
関数・イベント
関数やイベントについては以下の記事を参考にしてください。
最後に
今回の記事では、以下のTechnical Referenceの章を翻訳・補足しながらまとめてきました。
いかがだったでしょうか?
普段はブログやQiitaでブロックチェーンやAIに関する記事を挙げているので、よければ見ていってください!
Discussion