如何使用 Uniswap 的 Flash Swap / Debug “Fail” Reversion?
我在 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
這可能意味著什麼,所以我非常堅持:
- 如何調試通用的“失敗”錯誤?
- 為什麼這個電話會
swap
失敗?
它最終成為我契約中的一個錯字。如前所述,有問題的回調需要 4 個參數,但上面的實現需要 5 個參數,這會殺死函式。因此,雖然失敗的原因在鏈上被混淆了,但回調基本上是“uniswapV2Call 有 4 個參數,預期為 5”的錯誤。
從交易跟踪中,Uniswap2Pair (
0x28cee28a7c4b4022ac92685c07d2f33ab1a0e122
) 呼叫合約 (0x5893ec43bbc0bb2e08806e17b181f9191d19e591
)。呼叫的函式有選擇器
0x10d1e85c
,來自它對應的乙太坊簽名數據庫uniswapV2Call(address,uint256,uint256,bytes)
。是您的函式實現中的某些內容導致了恢復。