类似的错误, 通常在合约构造或参数构造错误,例如使用不错误的合约地址。
你可以在合约里用console.log打印 一些日志, 跟踪到出错的地方。
我想完成将ETH换成WstETH的功能,试图通过在智能合约中调用Balancer Vault Swap来实现。
uint256 amount = msg.value; IBalancerRouter.SingleSwap memory singleSwap = IBalancerRouter.SingleSwap({ poolId: 0x36bf227d6bac96e2ab1ebb5492ecec69c691943f000200000000000000000316, kind: IBalancerRouter.SwapKind.GIVEN_IN, assetIn: IAsset(address(0)), assetOut: IAsset(wstETH), amount: amount, userData: bytes("") }); IBalancerRouter.FundManagement memory funds = IBalancerRouter.FundManagement({ sender: msg.sender, fromInternalBalance: false, recipient: payable(msg.sender), toInternalBalance: false }); uint256 amountOut = amount * _getPrice() / 1e18; uint256 limit = 999 * amountOut / 1000; uint256 deadline = block.timestamp + 5 minutes; console.log(address(this).balance); wstETHAmount = IBalancerRouter(BalancerVault).swap(singleSwap, funds, limit, deadline); }
但是在使用Foundry测试是,它失败了。
测试函数
vm.deal(alice, 10 ether); vm.prank(alice); IBalancerRouter(BalancerVault).setRelayerApproval(alice, address(wstETHSwapper), true); bool approved = IBalancerRouter(BalancerVault).hasApprovedRelayer(alice, address(wstETHSwapper)); console.log(alice.balance); console.log(approved); assertTrue(approved); vm.prank(alice); wstETHSwapper.swap{value: 1 ether}(); uint256 balance = IERC20(WSTETH).balanceOf(alice); emit log_uint(balance); }
报错信息