Brownie
布朗尼有些合約無法在主網分叉上測試
我正在測試,
mainnet-fork
當多次呼叫(Uniswap)等特定合約時,它總是失敗。是否有任何解決方法或者這個問題超出了布朗尼的範圍?謝謝
這是錯誤
FAILED tests/test_uniswap.py::test_uniswap - brownie.exceptions.VirtualMachineError: revert: UniswapV2: LOCKED
這是程式碼。它將 DAI 換成 USDC
contract TestUniswap { address constant private usdc = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); address constant private dai = address(0x6B175474E89094C44Da98b954EedeAC495271d0F); address constant private uniswap = address(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); address constant private weth = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); function swap() external { uint daiBal = IERC20(dai).balanceOf(address(this)); IERC20(dai).approve(uniswap, daiBal); address[] memory path = new address[](3); path[0] = dai; path[1] = weth; path[2] = usdc; Uni(uniswap).swapExactTokensForTokens( daiBal, uint(0), path, address(this), now + 1800 ); } }
這是測試
def test_uniswap(accounts, testUniswap, dai, stable_coin_holder): dai_amount = 10 * 10 ** 18 # check dai balance stable_coin_holder_bal = dai.balanceOf(stable_coin_holder) assert stable_coin_holder_bal >= dai_amount # transfer DAI to testUniswap dai.transfer(testUniswap, dai_amount, {'from': stable_coin_holder}) assert dai.balanceOf(testUniswap) == dai_amount testUniswap.swap() testUniswap.swap()
對於 USDT 和 USDC 池,代幣有 6 位小數,因此您必須將數字調整 10**12。
就“LOCKED”消息而言,對於幾乎所有 Uniswap 失敗,您都會在消息中的某處看到這種措辭,因此您應該忽略它。查看消息的其餘部分以嘗試確定它失敗的原因。
LOCK 似乎是 Uniswap 的重入守衛。如果只有一次呼叫
testUniswap.swap()
有效,第二次呼叫可能會重新進入同一個合約,這就是它恢復的原因。