Skip to main content

Swap Precompile

ロールアウト状況(2026 年 10 月)。 Swap precompile はメインネットにデプロイ済みですが、一部のルートとトークンペアはまだテスト中です。現在利用可能な方向は、3 つの許可リスト掲載マーケットにおける INJ から USDC、USDT から USDC、USDCnb から USDC へのスワップです。USDC で INJ を購入するなどの他の方向は、テスト期間中は現在 revert されます。
Swap Precompileは、固定アドレス0x0000000000000000000000000000000000000068に存在するシステムスマートコントラクトで、v1.20.4(Meridian)アップグレードで導入されました。 EVM開発者に、exchangeモジュール(x/exchange)を通じてInjectiveのオンチェーンオーダーブックに対するネイティブなスポットスワップを提供します。APIはAMMルーターでおなじみの形式で、見積もりを取得し、最小出力量と期限を設定して、1回の呼び出しでスワップできます。AMMとは異なり、約定はライブのオーダーブック流動性に対して行われ、スワップは指定した制約内で約定するか、revertするかのいずれかです。管理が必要な部分約定の残りは発生しません。 スワップは呼び出し元のデフォルトサブアカウントで実行され、失敗した場合はrevertします。呼び出し元はtokenInの入力量を保有している必要があります。MultiVM Token Standardの下ではERC20残高はbank残高であるため、precompileに対する個別のapproveは不要です。

仕組み

このフローは2つのフェーズで構成されます: 見積もり(ステップ1と2)。 quoteExactInputV1は読み取り専用の呼び出しで、指定したamountInが現在のオーダーブックに対して受け取れるamountOutを返します。オーダーブックの価格はブロックごとに変化するため、呼び出し元は通常、見積もり値にスリッページ許容範囲を適用してminOutを導出します。最新の見積もりなしにminOutを設定すると、厳しすぎる場合は通常の価格変動でrevertし、緩すぎる場合は必要以上に不利な約定を受け入れるリスクがあります。 スワップ(ステップ3〜7)。 swapExactInputV1は実行全体を1つのトランザクションで行います。precompileはマーケットをSwapParamsの許可リストと照合し、呼び出し元のデフォルトサブアカウントで注文を発注し、deadlineまでに少なくともminOutを受取人に入金するか、呼び出し全体をrevertします。中途半端な状態で残るものはありません。出力はbank残高として反映され、MultiVM Token Standardによって即座にERC20残高として読み取れます。

マーケット許可リスト

スワップ可能なマーケットは、exchangeモジュールのパラメータ内にある有効化フラグとマーケット許可リストで構成されるSwapParamsによって管理されます。許可リストに含まれていないマーケットに対してprecompileを呼び出すと、次のエラーでrevertします:
このrevertを受け取った場合でも、稼働中のノード上でprecompileに到達できていることは確認できます。

現在の許可リストの確認

現在の許可リストは、exchangeモジュールのv2パラメータの一部です:
同じクエリの.params.exchange_adminsフィールドには、許可リストの更新が認可されたアドレスが一覧表示されます。

マーケットのリクエスト

swap precompileを使って開発しており、マーケットを許可リストに追加する必要がある場合は、スポットマーケットIDを添えてInjective Discordの#developersチャンネルで連絡するか、Injectiveのパートナー担当者に相談してください。アクティブなスポットマーケットのマーケットIDは/injective/exchange/v1beta1/spot/markets?status=Activeで確認できます。

許可リストの更新(exchange admins)

MsgUpdateSwapParamsは、ガバナンス権限者またはexchange_adminsパラメータに含まれる任意のアドレスが呼び出せます。即座に有効となり、adminが送信した場合はガバナンス投票は不要です。 このメッセージはswapパラメータグループを完全に置き換えます。既存のマーケットを省略すると削除され、フラグを省略するとすべてのスワップが一時停止されるため、許可リストに残すべきすべてのマーケットを必ず含め、enabled: trueを維持してください。
adminキーからinjectived tx signとinjectived tx broadcastを使用して、トランザクションドキュメントに署名しブロードキャストしてください。

Swap Precompileインターフェース

パラメータに関する注意:
  • tokenIn / tokenOutは、MultiVM Token Standardの下でbankモジュールに裏付けられたトークンのERC20アドレスです。bank denomとERC20アドレスの対応は、ERC20モジュールのクエリ/injective/erc20/v1beta1/all_token_pairsで確認できます。
  • marketIdは、0xで始まるスポットマーケットIDの文字列です。アクティブなマーケットは/injective/exchange/v1beta1/spot/markets?status=Activeで一覧表示できます。
  • 数量はトークンのERC20 decimalsを使用します。

見積もりとスワップのパターン

コマンドラインからの呼び出し

Precompileは実際のInjectiveノード上にのみ存在します。Foundryのローカルシミュレーションには0x68が存在しないため、forge scriptやforge testは、これに触れるコードパスでcall to non-contract addressとしてrevertします。これはすべてのInjective precompileに当てはまります。稼働中のRPCに対してcastを使用するか、コントラクトをデプロイしてトランザクションで操作するか、inj-examplesのローカル開発環境を実行してください。これはDocker上で実際のInjectiveノードを起動し、すべてのprecompileをlocalhost:8545で利用可能にします:

開発を始める

見積もり後にスワップするコントラクト、castによる見積もりとスワップ用のMakefileターゲット、テストネットのデフォルト設定を含む完全なFoundryの例が、swap precompileデモで利用可能です。テストネットではv1.20.4-betaから、メインネットではv1.20.4アップグレード以降、このprecompileが稼働しています。 同じ例には localnet-demo.sh も含まれており、新しいローカルチェーン上でライフサイクル全体を 1 つのコマンドで実行できます:マーケットのローンチ、ジェネシスで設定された exchange 管理者による許可リストの更新(ガバナンス提案は不要)、オーダーブックの流動性、そして precompile を通じた実際のスワップです。テストネットに触れることなく、許可リスト設定を含むフロー全体を試す最速の方法です。
最終更新日 2026年10月2日