スワップルーティングエンジン。複数DEXプールを横断するアービトラージ経路の探索・最適化を担う。
- 目的: 単一DEXプール内のコインペア管理。ネストされたHashMapによりO(1)での双方向検索を提供
CoinPairPool: 単一DEXの全コインペアを双方向インデックスで保持UpdatePairType: プール更新の分類XIncreaseYDecrease/XDecreaseYIncrease: 典型的なスワップXIncreaseYIncrease/XDecreaseYDecrease: 流動性追加/除去NewPair/Other: 新規ペア追加等
- 目的: 指定コインを入力としたスワップルートをイテレータで返す
- ロジック: 内部HashMap構造
coin_id → HashMap<other_coin_id, pair_index>からO(1)でルックアップ
- 目的: 全DEXプールの統合管理とクロスDEXルーティング
SwapRouterPool: 全DEXプールを統合SwapRoute: 完全なスワップ経路(複数ステップ)SwapPairIndex: メモリ最小化のためu8(スワップ)+ u16(ペア)で表現
- 目的: ブロックチェーンDBから全DEXプールをロード
- ロジック:
SwapResource::load_resource()で全対応DEXのリソースを取得し、CoinPairPoolに変換
- 目的: ユーザートランザクションのスワップリソース変更をプールに反映
- 戻り値:
Vec<(SwapContract, UpdatePairType)>— 影響を受けたスワップペアの一覧
- 目的: 指定コインからの全ルートをイテレータで返す
- ロジック: 全DEXプールの
get_routes_by_input_x/yを順次走査
- 目的: ルート探索アルゴリズム。非同期再帰による深さ優先探索で全アービトラージ経路を発見する
-
目的: ルート探索のメインエントリーポイント
-
パラメータ:
input_amounts: テストする入力額リストtimeout: 探索タイムアウト(デフォルト15ms)max_depth: 最大深度(デフォルト3ステップ)swap_filters: 各ステップのDEXフィルタ(SwapContract, SwapContract, SwapContract)coin_filters: 各ステップのコインフィルタexclude_swap: 除外DEX
-
アルゴリズム:
各input_amountに対して: 各開始DEXプールインデックスに対して: 非同期タスクを起動: traverse()を第1ステップのルートで呼び出し traverse()は再帰的に: 1. 全可能な次ルートを走査 2. 各ルート: 出力額を計算 3. 宛先到達: チャネルで結果送信 4. 最大深度未到達: さらに深く再帰 メインタスク: タイムアウト内で最良利益のルートを選択
- 目的: 深さ優先でルートを再帰的に探索
- ロジック:
visited_routesによるサイクル検出- 各候補ルートに対して
calc_amount_out()で出力額計算 - 出力 > 0 かつ入力コインに到達した場合、完全ルートとして送信
- 深度制限内の場合、再帰で次ステップを探索
- 並行探索の全結果からタイムアウト内で最大利益のルートを選択
- 目的: 固定ルートに対する入力額の最適化。三分探索で最大利益の入力額を発見する
-
目的: ローン手数料を考慮した最適入力額の探索
-
パラメータ:
linear_step: ステップ幅(例: 0.3 APT)max_steps: 最大ステップ数(例: 500)loan_fee_fn: ローン手数料計算関数
-
アルゴリズム:
フェーズ1: 二分探索(3テストポイント)
middle = 初期入力額 smaller = middle / 2 greater = middle × 2 ループ: 3点で利益計算 最良点が: smaller → 探索範囲を左に縮小 greater → 探索範囲を右に拡大 middle → 収束(フェーズ2へ)フェーズ2: 線形微調整
収束点からlinear_stepずつ増減しながら: 利益が増加する方向にステップ 利益が減少したら停止
- 目的: ルート全体のスワップ出力をシミュレーション
- ロジック: 各ステップの
calc_amount_out()を順次適用し、最終出力からローン手数料を減算