Brownie

布朗尼有些合約無法在主網分叉上測試

  • October 27, 2020

我正在測試,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()有效,第二次呼叫可能會重新進入同一個合約,這就是它恢復的原因。

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