Skip to content

Commit 5084b16

Browse files
authored
Merge pull request #11 from Uniswap/fix-usdt
fix: USDT transfer success bug
2 parents c0f18d9 + 4c8abe3 commit 5084b16

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

src/FeeOnTransferDetector.sol

+10-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ pragma solidity =0.8.19;
33
pragma abicoder v2;
44

55
import "solmate/tokens/ERC20.sol";
6+
import "solmate/utils/SafeTransferLib.sol";
67
import "v2-core/interfaces/IUniswapV2Pair.sol";
78
import "./lib/UniswapV2Library.sol";
89

@@ -13,6 +14,8 @@ struct TokenFees {
1314

1415
/// @notice Detects the buy and sell fee for a fee-on-transfer token
1516
contract FeeOnTransferDetector {
17+
using SafeTransferLib for ERC20;
18+
1619
error SameToken();
1720
error PairLookupFailed();
1821

@@ -98,7 +101,7 @@ contract FeeOnTransferDetector {
98101
uint256 buyFeeBps = (amountRequestedToBorrow - amountBorrowed) * BPS / amountRequestedToBorrow;
99102
balanceBeforeLoan = tokenBorrowed.balanceOf(address(pair));
100103
uint256 sellFeeBps;
101-
try tokenBorrowed.transfer(address(pair), amountBorrowed) {
104+
try this.callTransfer(tokenBorrowed, address(pair), amountBorrowed) {
102105
uint256 sellFee = amountBorrowed - (tokenBorrowed.balanceOf(address(pair)) - balanceBeforeLoan);
103106
sellFeeBps = sellFee * BPS / amountBorrowed;
104107
} catch (bytes memory) {
@@ -112,4 +115,10 @@ contract FeeOnTransferDetector {
112115
revert(add(32, fees), mload(fees))
113116
}
114117
}
118+
119+
// external wrapper around safeTransfer
120+
// because try/catch does not handle calling libraries
121+
function callTransfer(ERC20 token, address to, uint256 amount) external {
122+
token.safeTransfer(to, amount);
123+
}
115124
}

test/fork/TestFotDetection.t.sol

+10
Original file line numberDiff line numberDiff line change
@@ -73,4 +73,14 @@ contract FotDetectionTest is Test {
7373
assertEq(fees.buyFeeBps, expectedBuyFeeBps);
7474
assertEq(fees.sellFeeBps, expectedSellFeeBps);
7575
}
76+
77+
function testUSDT() public {
78+
address token = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
79+
uint256 expectedBuyFeeBps = 0;
80+
uint256 expectedSellFeeBps = 0;
81+
82+
TokenFees memory fees = detector.validate(token, WETH, 10000);
83+
assertEq(fees.buyFeeBps, expectedBuyFeeBps);
84+
assertEq(fees.sellFeeBps, expectedSellFeeBps);
85+
}
7686
}

0 commit comments

Comments
 (0)