> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tenderly.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Расследование неудачной транзакции

> Проследите revert-транзакцию до её первопричины с помощью call trace, Debugger и Evaluate, а затем проверьте исправление, повторно симулировав её.

В этом руководстве мы разберёмся в первопричине сбоя транзакции и проверим исправление.

Рассмотрим [транзакцию Uniswap](https://www.tdly.co/tx/1/0xbe082dcc8ae59868f5b2330173902bb88c6643b5c2fdf0d8a9f43d03dbca0c36). Эта транзакция пытается выполнить `swapExactTokensForTokens`.

<Steps>
  ### Вставьте хеш транзакции в поиске Tenderly dashboard

  Хеш транзакции: `0xbe082dcc8ae59868f5b2330173902bb88c6643b5c2fdf0d8a9f43d03dbca0c36`

  ### Изучите ошибку

  Revert произошёл в `swapExactTokensForTokens`, при проверке условия, включающего `amountOutMin` — входной параметр. Она откатилась со следующим сообщением об ошибке:
  Сообщение об ошибке: `UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT`

  Из раздела inputs видно, что `amountOutMin` имел значение `1102820622890207119`.

  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/debugger/failed-tx-1.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=7870862a8fb522c861f797116435d338" alt="" width="3360" height="2100" data-path="images/debugger/failed-tx-1.webp" />

  ### Изучите условие revert

  Перейдите в [представление debugger](https://dashboard.tenderly.co/tx/1/0xbe082dcc8ae59868f5b2330173902bb88c6643b5c2fdf0d8a9f43d03dbca0c36/debugger?trace=0.1). Обратите внимание, что require использует `amounts[amounts.length - 1]`.

  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/debugger/failed-tx-2.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=c8d985b4f74f9a446462dda13ecbc3bb" alt="" width="3360" height="2100" data-path="images/debugger/failed-tx-2.webp" />

  ### Вычислите выражение

  Чтобы получить значение этого выражения, можно использовать Evaluate:

  1. Убедитесь, что debugger находится на строке revert,
  2. Вставьте выражение \`amounts\[amounts.length - 1],
  3. Нажмите кнопку «Evaluate».

  Значение:
  Значение — `1029855063181377015`.

  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/debugger/failed-tx-3.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=29e7a31e020dbf5e3d1abc5e8bd407c2" alt="" width="3360" height="2100" data-path="images/debugger/failed-tx-3.webp" />

  ### Получите значение из информации о вызове

  Значение рассматриваемого выражения также можно извлечь, проанализировав функцию, которая его сформировала:

  1. Переместите debugger на [`getAmountsOut`](https://dashboard.tenderly.co/tx/1/0xbe082dcc8ae59868f5b2330173902bb88c6643b5c2fdf0d8a9f43d03dbca0c36/debugger?trace=0.0) из Execution trace слева
  2. Найдите `output` в нижней панели
  3. Поскольку выражение `amounts[amounts.length - 1]` получает последний элемент массива, заключаем, что искомое значение — `1029855063181377015`.

  <img src="https://mintcdn.com/tenderly/XsEZlaGXYskrtN68/images/debugger/failed-tx-4.webp?fit=max&auto=format&n=XsEZlaGXYskrtN68&q=85&s=32dc026b46ee2100859b2d74caca7792" alt="" width="3360" height="2100" data-path="images/debugger/failed-tx-4.webp" />

  ### Возможное решение

  Эта транзакция была бы успешной, если бы значение `amountOutMin` было `1029855063181377015`.

  ### Проверка решения

  Чтобы проверить решение, нажмите кнопку «Re-Simulate»:

  1. Вставьте значение `1029855063181377015` во второй аргумент
  2. Нажмите **Simulate**.

  Симуляция прошла успешно — значит, мы нашли правильное значение аргумента.

  <Info>
    Swap-транзакции чувствительны ко времени, они учитывают значение `block.timestamp`.
    Симуляции по умолчанию выполняются на исходном блоке и с исходным timestamp.
    Только если вам нужны кастомные значения блока и timestamp, можно использовать для этого переопределения заголовка блока.
  </Info>
</Steps>
