Solidity

如何使用 Uniswap 的 Flash Swap / Debug “Fail” Reversion?

  • February 9, 2022

我在 Goerli 上並嘗試使用此處描述的 Uniswap 的 .swap()事務

如果我的理解是正確的,如果我將其中一個金額設置為 0,另一個金額設置為非零,並且字節為非零長度,它將觸發呼叫 uniswapV2Call 的貸款。所以作為一個簡單的契約,我只是做了這樣的事情:

   function borrow(
       address token0, address token1, uint256 amount0, uint256 amount1,
       address _factory
   ) external {
       address pairAddress = IUniswapV2Factory(_factory).getPair(
           token0,
           token1
       );
       require(pairAddress != address(0), "This pool does not exist");
       IUniswapV2Pair(pairAddress).swap(
           amount0,
           amount1,
           address(this),
           bytes("asdf")
       );
       require(1 == 0, "asdf");
   }
   function uniswapV2Call(
       address _sender, uint256 _amount0, uint256 _amount1, address _factory,
       bytes calldata _data
   ) external {
        // code is never reached.
       require(1==0,"This is called!");
      
   }
}

問題是從未達到回調 uniswapV2Call 。我只是像這樣得到“失敗” 。IUniswapV2Pair(pairAddress).swap()我已經確定程式碼在我已經確定該程式碼行看到的 amount0、amount1 和 pairAddress的行停止執行0分別是:23771311032997121``0x28CEE28A7C4B4022AC92685C07D2F33AB1A0E122``.swap()

       string memory errMsg = string(
           abi.encodePacked(
               Strings.toString(amount0),
               ",",
               Strings.toString(amount1),
               ",",
               Strings.toString(uint256(uint160(pairAddress)))
           )
       );
       require(1 == 0, errMsg);

這個池子對只是 Goerli 上的 WETH-UNI,所以我想我可以藉 0.1 ETH 的價值來對抗它並至少觸發回調?我非常堅持這一點,因為跟踪 Pair 的合約swap()功能,它們require都有某種UniswapV2標籤來提示故障發生的位置。但它只是說Fail這可能意味著什麼,所以我非常堅持:

  1. 如何調試通用的“失敗”錯誤?
  2. 為什麼這個電話會swap失敗?

它最終成為我契約中的一個錯字。如前所述,有問題的回調需要 4 個參數,但上面的實現需要 5 個參數,這會殺死函式。因此,雖然失敗的原因在鏈上被混淆了,但回調基本上是“uniswapV2Call 有 4 個參數,預期為 5”的錯誤。

交易跟踪中,Uniswap2Pair ( 0x28cee28a7c4b4022ac92685c07d2f33ab1a0e122) 呼叫合約 ( 0x5893ec43bbc0bb2e08806e17b181f9191d19e591)。

呼叫的函式有選擇器0x10d1e85c,來自它對應的乙太坊簽名數據庫uniswapV2Call(address,uint256,uint256,bytes)

是您的函式實現中的某些內容導致了恢復。

在此處輸入圖像描述

引用自:https://ethereum.stackexchange.com/questions/120714