is there a reason why most protocols use balance checks instead of a push pull method?
e.g what protocols typically do
uint balanceBefore = IERC20(token).balanceOf(address(this));
caller.executeOperation(..., params);
uint balanceAfter = IERC20(token).balanceOf(address(this));
require(balanceAfter == balanceBefore + fee);
Instead of
IERC20(token).transfer(caller, amount);
caller.executeOperation(..., params);
IERC20(token).transferFrom(caller, address(this), amount+fee);
is there a vulnerability on the 2nd method that i'm missing?