﻿---
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-cn/crypto/calldata-decoding-wallet/)
- [DEX 滑点与路径核对清单](/zh-cn/crypto/dex-slippage-route-checklist/)
- [三明治攻击](/zh-cn/crypto/sandwich-attack/)
- [加密货币交易滑点](/zh-cn/crypto/slippage-crypto/)
- [交易模拟](/zh-cn/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-cn/crypto/swap-deadline-slippage-calldata/index.mdx
