跳转到主要内容
在本指南中,我们将调查交易失败的根本原因并验证修复。 我们将查看一笔 Uniswap 交易。此交易尝试执行 swapExactTokensForTokens
1
在 Tenderly dashboard 搜索中粘贴交易哈希
2
交易哈希:0xbe082dcc8ae59868f5b2330173902bb88c6643b5c2fdf0d8a9f43d03dbca0c36
3
探索错误
4
回滚发生在 swapExactTokensForTokens 中,检查涉及输入参数 amountOutMin 的条件时。它以下列错误消息回滚: 错误消息:UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT
5
从输入部分,我们可以看到 amountOutMin 的值为 1102820622890207119
6
7
探索回滚条件
8
跳到 debugger 视图。注意 require 涉及 amounts[amounts.length - 1]
9
10
评估表达式
11
要获取此表达式的值,您可以使用 Evaluate:
12
  • 确保 debugger 位于回滚行,
  • 粘贴表达式 amounts[amounts.length - 1]
  • 按下 “Evaluate” 按钮。
  • 13
    值是: 值为 1029855063181377015
    14
    15
    从调用信息中获取值
    16
    您还可以通过分析产生该值的函数来提取所讨论表达式的值:
    17
  • 将 debugger 移动到左侧执行跟踪中的 getAmountsOut
  • 在下方窗格中找到 output
  • 由于表达式 amounts[amounts.length - 1] 获取数组的最后一个元素,我们得出结论:所讨论的值是 1029855063181377015
  • 18
    19
    潜在解决方案
    20
    如果 amountOutMin 的值为 1029855063181377015,则此交易将会成功。
    21
    验证解决方案
    22
    要验证解决方案,请点击 “Re-Simulate” 按钮:
    23
  • 将值 1029855063181377015 粘贴到第二个参数
  • 点击 Simulate
  • 24
    模拟已成功,这意味着我们找到了正确的参数值。
    25
    Swap 交易对时间敏感,它们会考虑 block.timestamp 值。 默认情况下,模拟在原始区块和原始时间戳上执行。 只有在需要自定义区块和时间戳值时,才可以使用区块头覆盖来实现此目的。