Solidity
router.WETH() 導致“錯誤:事務在沒有原因字元串的情況下恢復”
address routerAddress = 0x7a250d5630b4cf539739df2c5dacb4c659f2488d; address _WETH = address(0); function setWETHOnChain(address routerAddress) external { IUniswapV2Router02 router = IUniswapV2Router02(routerAddress); _WETH = router.WETH(); }
令我驚訝的是,這行程式碼無論如何都會在執行時恢復。Remix 調試器說
_WETH = router.WETH();
是revert 之前最後執行的語句。我也有問題
@uniswap/v2-periphery/contracts/libraries/UniswapV2Library.sol
,特別是getReserve()
。function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); }
我總是會回到這條線上。
(uint reserve0, uint reserve1,) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves();
, 成功後直接pairFor()
返回。我在 Solidity 0.6.12、0.7.6 和 0.8.7 上嘗試了第一個程式碼,但沒有任何成功。
最奇怪的是,使用區塊瀏覽器或使用 Ethers.js 的 EOA 查詢這些值都可以正常工作。
對於第一個,我認為這是因為我的本地安全帽網路由於配置錯誤而無法正確分叉主網,將網路塊放在 module.exports 之外,將合約留在自己的區塊鏈中而沒有任何其他合約。一旦我通過警告說如果你分叉一個最近的塊,Hardhat Network 的性能將會下降,確認它正在分叉主網,router.WETH() 再次工作。
對於第二個,Hardhat 實際上告訴我它正在呼叫一個沒有合約字節碼數據的不存在的帳戶。pairFor() 在不查找 Uniswap V2 工廠合約的情況下計算配對地址,最終在 Binance Smart Chain Testnet 上使用 PancakeSwap 配對生成無效配對地址。我通過將 pairFor() 替換為
import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol'; IUniswapV2Factory factory = IUniswapV2Factory(factoryAddress); factory.getPair(tokenA, tokenB);