教育目的のみであり、投資助言や投資推奨ではありません。投資は損失につながる可能性があります。
要点
DEX スワップに署名する前に、チェーン、送信先コントラクト、デコードされた関数、トークンアドレス、入力または出力の制限値、経路、受取人、期限を確認します。フロントエンドに表示される「スリッページ」の割合自体は、オンチェーン命令ではありません。通常は、exact-input スワップの amountOutMin または amountOutMinimum、exact-output スワップの amountInMax または amountInMaximum といった制限値を計算するために使われます。
期限は時間のガードであり、価格を保証するものではありません。ルーターが期限を確認し、その後に取引が実行されれば、呼び出しはリバートするはずです。一方、期限前であれば、金額の制限値が許すどの価格でも約定し得ます。期限が長いほど承認された取引が利用可能な時間も長くなり、短すぎるとブロックに取り込まれる前に失効する可能性が高まります。
Calldata は自己記述形式ではありません。選択したチェーン上の正確なコントラクトについて、検証済み ABI を使ってデコードし、ネストされた multicall や Universal Router コマンドもすべて展開します。ウォレットが信頼できるデコード結果を示せない場合、バイト位置や関数名データベースだけから意味を推測してはいけません。
仕組み
実際の呼び出しをデコードする
Solidity ABI では、calldata の先頭 4 bytes が関数セレクターで、符号化された引数は五番目のバイトから始まります。セレクターは衝突したり誤表示されたりする可能性があるため、検証済み送信先コントラクトの ABI と照合します。プロキシ、アグリゲーター、ルーターは、スワップを multicall、execute、その他の関数に包むことがあります。トークンを移動したり最終受取人を変更したりできるネスト済みペイロードをすべてデコードしてください。
exact-input スワップでは入力が固定され、保護フィールドが受け入れ可能な最小出力を定めます。exact-output スワップでは希望する出力が固定され、保護フィールドが入力を上限以内に抑えます。ゼロまたは不自然に緩い制限値は、実質的な価格保護を失わせる場合があります。トークンの小数桁は重要です。各トークンアドレスを正しい小数桁とシンボルに対応付けてから、生の整数金額を比較します。
経路、受取人、value を確認する
経路が支払うトークンから始まり、受け取る予定のトークンで終わることを確認します。中間トークン、プール手数料、残高のラップ、アンラップ、回収、転送を行うコマンドも調べます。受取人は意図したウォレット、または挙動を理解しているコントラクトであるべきです。取引のネイティブ value も確認してください。これは calldata に符号化された ERC-20 金額とは別の場合があります。
期限の場所を特定する
期限の場所はルーターのバージョンによって異なります。Uniswap V2 型のルーター関数には deadline 引数があり、元の Uniswap V3 ISwapRouter 構造体にも含まれます。Universal Router は execute(commands, inputs, deadline) と、期限を持たないオーバーロードの両方を公開しています。したがって、すべてのスワップに期限がある、または同じネスト済みスワップ引数内にあると仮定してはいけません。
期限は通常、実行時に使われるブロックタイムスタンプと比較されます。保留中の取引を取り消すものでも、迅速な取り込みを保証するものでも、金額の制限内にある不利な価格を防ぐものでもありません。取り消すには、そのチェーンとウォレットの取引置換機能を使う必要があり、元の取引が取り込まれた後は置換できる保証はありません。
具体例
ある exact-input スワップの見積もりが 10,000 USDC の受取を示し、利用者が 1% のスリッページを選んだとします。見積もりに含まれる手数料を別として、期待される最小出力は 9,900 USDC です。USDC は 6 decimals なので、この制限値の生の整数は 9900000000 です。
しかし、デコードした呼び出しには amountOutMinimum = 9000000000、つまり 9,000 USDC が入っています。これは見積もりより 1% ではなく最大 10% 少ない結果を許します。受取人も見覚えのないアドレスで、期限は数時間先です。どれか一つでも不一致なら要求を拒否し、信頼できる画面から作り直す十分な理由になります。再構築後は、最近の状態に対して同じ未署名取引をシミュレーションし、署名前にデコード済みペイロードをもう一度確認します。
確認リストとリスク
- 選択したチェーンとルーターまたはプロキシのアドレスを、プロトコル公式のデプロイ記録と照合します。
- 検証済みコントラクト ABI でデコードし、外側の関数だけでなくネスト済み呼び出しとルーターコマンドを展開します。
- トークンアドレス、方向、小数桁、固定金額、保護用の金額制限、経路、手数料階層、受取人、ネイティブ
valueを照合します。 - 期限を絶対時刻に変換し、残り時間が意図どおりか判断します。期限がない場合は、別途確認が必要な設計上の選択として扱います。
- 署名元アドレスから最近の状態に対して同一の取引をシミュレーションします。成功はその状態についての証拠にすぎず、取り込みや最終実行を保証しません。
- 承認や Permit2 権限は別に確認します。適切なスワップ制限があっても、無制限または悪意あるトークン承認は安全になりません。
- 制限が厳しすぎると通常の価格変動でもリバートし、緩すぎると約定価格とサンドイッチ攻撃のリスクが高まります。オンチェーン取引はリバートしても gas を消費する場合があります。
よくある誤解
誤解:表示されたスリッページ率そのものに署名する
通常、署名対象のペイロードにはその設定から算出された金額制限が入ります。実際の整数とトークンの小数桁を確認してください。画面の表示が正しく見えても、calldata が同じ許容幅を使っている証明にはなりません。
誤解:すべてのスワップが amountOutMin と deadline を使う
名称と場所はルーターや関数によって異なります。Exact-output スワップは入力側を保護し、期限を省略する入口や外側の呼び出しに置く入口もあります。
誤解:期限が悪い価格を防ぐ
呼び出されたコードが期限を実際に検査する場合に、実行可能な時間を制限するだけです。価格保護は金額の制限値によるもので、その範囲内の約定はすべて許容されます。
誤解:外側の関数だけデコードすれば十分
アグリゲーターやユニバーサルルーターには、複数の呼び出し、トークン許可、転送、残高整理コマンドが含まれる場合があります。安全性に関わる受取人や金額がネスト済みペイロード内にあることもあります。
関連トピック
出典
- Contract ABI Specification - Solidity Documentation(参照日:2026-08-21)
- IUniswapV2Router01.sol - Uniswap(参照日:2026-08-21)
- ISwapRouter.sol - Uniswap(参照日:2026-08-21)
- Universal Router Commands - Uniswap(参照日:2026-08-21)