Баланс токена ERC-20 внезапно меняется на 0 в блоке try/catch

#ethereum #solidity #truffle

Вопрос:

Я кодирую разделитель платежей, который принимает токены LP и стандартные токены. Если это токен LP, он должен конвертировать их в базовые активы, в противном случае просто разделите платеж. Поскольку у меня есть доступ только к адресу токена, моя идея определить, является ли он LP или нет, состояла в том, чтобы просто вызвать getReserves() блок try/catch и посмотреть, не сработает ли он:

 function receiveTokensAndDistributeEth(uint256 amount, address token) external override {
    require(amount > 0, "Distribution: Amount must be greater than 0");
    
    address WETH = router.WETH();
    IERC20(token).transferFrom(address(msg.sender), address(this), amount);
    IERC20(token).approve(address(router), amount);

    uint balanceBefore = IERC20(token).balanceOf(address(this)); // Truffle debugger says it's 10

    // Check if token is LP
    try IUniswapV2Pair(token).getReserves() {
        // Remove liquidity code
    } catch {
        uint balanceAfter = IERC20(token).balanceOf(address(this)); // Now it's 0 according to truffle?!
    }
}
 

Я вызвал его с помощью токенов LP, и он отлично работает, ликвидность удаляется. Но проблема в том, когда я пытаюсь получить что-то вроде USDT.

Я использовал отладчик трюфелей для отслеживания переменных, и после попытки/улова баланс внезапно становится равным 0. Это причина, по которой он также выходит из строя transferFrom позже в коде функции.

Я нахожу это чрезвычайно странным поведением. Я что-то упускаю? Как это возможно?

Я немного упростил код (внутри try/catch), так как он опущен в соответствии с отладчиком. Дайте мне знать, если я должен опубликовать все это вместо этого.