﻿---
title: "兌換截止時間、滑價與 calldata：簽名前應核對什麼"
description: "瞭解如何解碼 DEX 兌換呼叫，並在簽名前核對路由器、函式、金額邊界、路徑、收款人與截止時間。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 兌換截止時間、滑價與 calldata：簽名前應核對什麼

> 僅供教育用途；不構成投資建議或投資推薦。投資可能導致損失。

<a id="answer"></a>

## 直接回答

簽署 DEX 兌換前，應核對鏈、目標合約、解碼後的函式、代幣地址、輸入或輸出邊界、路徑、收款人以及任何截止時間。前端顯示的「滑價」百分比本身並不是鏈上指令。它通常用來計算保護邊界，例如 exact-input 兌換的 `amountOutMin` 或 `amountOutMinimum`，以及 exact-output 兌換的 `amountInMax` 或 `amountInMaximum`。

截止時間是時間保護條件，不是價格保證。如果路由器檢查截止時間，而交易在其後執行，呼叫應當回滾。交易仍可在截止時間前按金額邊界允許的任何價格執行。較長的截止時間會讓該授權保持可用更久；過短則增加交易在納入區塊前過期的機率。

Calldata 不會自行描述。應使用所選鏈上確切合約的已驗證 ABI 解碼，並展開任何巢狀 multicall 或 Universal Router 命令。如果錢包無法可信地顯示解碼欄位，不要只憑位元組位置或函式名稱資料庫推測其含義。

<a id="mechanism"></a>

## 運作原理

### 解碼實際呼叫

依照 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)` 和不帶截止時間的多載。因此，不要假設每筆兌換都有截止時間，也不要假設它總位於相同的巢狀兌換參數內。

截止時間通常與執行時使用的區塊時間戳記比較。它不會取消待處理交易、保證迅速納入區塊，或阻止金額邊界以內的不利價格。如需取消，傳送者必須使用對應鏈與錢包的交易替換機制；原交易一旦納入區塊，替換便無法保證成功。

<a id="example"></a>

## 完整範例

某筆 exact-input 兌換的報價預計得到 `10,000 USDC`，使用者選擇 `1%` 滑價。暫不考慮報價中已包含的費用，預期最低輸出為 `9,900 USDC`。USDC 使用 `6 decimals`，因此該邊界的原始整數是 `9900000000`。

解碼後的呼叫卻包含 `amountOutMinimum = 9000000000`，即 `9,000 USDC`。這允許結果比報價少最多 `10%`，而不是 `1%`。收款人還是陌生地址，截止時間也在數小時後。任一處不一致都足以拒絕該請求，並透過可信介面重新建構。重建後，應針對近期狀態模擬完全相同的未簽名交易，並在簽名前再次核對解碼載荷。

<a id="risks"></a>

## 核對清單與風險

- 對照協定官方部署紀錄，核對所選鏈以及路由器或代理地址。
- 使用已驗證合約 ABI 解碼；展開巢狀呼叫與路由命令，而不是只檢查外層函式。
- 核對代幣地址、方向、小數位、固定金額、保護金額邊界、路徑、費率層級、收款人與原生 `value`。
- 將截止時間轉換為絕對時間，確認剩餘視窗是否符合預期。若沒有截止時間，應將其視為需要單獨審查的設計選擇。
- 使用簽名地址，針對近期狀態模擬完全相同的交易。模擬成功只是該狀態下的證據，不保證納入區塊或最終執行。
- 單獨審查授權或 Permit2 權限。良好的兌換邊界並不能讓無限額或惡意的代幣授權變得安全。
- 邊界過緊可能因正常價格變動而回滾；邊界過鬆則增加成交價與三明治攻擊風險。鏈上交易即使回滾也可能消耗 gas。

<a id="misconceptions"></a>

## 常見誤解

### 誤解：簽名內容包含介面顯示的滑價百分比

通常，簽名載荷包含的是依該設定計算的金額邊界。應核對實際整數與代幣小數位；介面標籤看似正確，並不能證明 calldata 使用了相同容忍度。

### 誤解：每筆兌換都使用 `amountOutMin` 與 `deadline`

欄位名稱和位置隨路由器與函式而異。Exact-output 兌換保護輸入端，有些入口則省略截止時間或把它放在外層呼叫中。

### 誤解：截止時間能防止不利價格

只有被呼叫程式碼實際執行檢查時，它才能限制允許執行的時間。價格保護來自金額邊界，而邊界以內的所有成交結果仍然被允許。

### 誤解：解碼外層函式就足夠

聚合器與通用路由器可能包含多次呼叫、代幣許可、轉帳與清理命令。影響安全的收款人或金額可能位於巢狀載荷內。

<a id="related"></a>

## 相關主題

- [解碼錢包 calldata](/zh-tw/crypto/calldata-decoding-wallet/)
- [DEX 滑價與路徑核對清單](/zh-tw/crypto/dex-slippage-route-checklist/)
- [三明治攻擊](/zh-tw/crypto/sandwich-attack/)
- [加密貨幣交易滑價](/zh-tw/crypto/slippage-crypto/)
- [交易模擬](/zh-tw/crypto/transaction-simulation/)

<a id="sources"></a>

## 來源

- [Contract ABI Specification](https://docs.soliditylang.org/en/latest/abi-spec.html) - Solidity Documentation（存取於：2026-08-21）
- [IUniswapV2Router01.sol](https://github.com/Uniswap/v2-periphery/blob/master/contracts/interfaces/IUniswapV2Router01.sol) - Uniswap（存取於：2026-08-21）
- [ISwapRouter.sol](https://github.com/Uniswap/v3-periphery/blob/main/contracts/interfaces/ISwapRouter.sol) - Uniswap（存取於：2026-08-21）
- [Universal Router Commands](https://developers.uniswap.org/docs/protocols/universal-router/concepts/commands) - Uniswap（存取於：2026-08-21）

Source: https://wiki.fcontext.com/zh-tw/crypto/swap-deadline-slippage-calldata/index.mdx
