You did not approve USDT to the router address before attempting the swap.
The USDT contract uses assert
instead of revert
or throw
to cancel the transaction because of the lack of approval. Using assert
will consume all the gas left. It's bad practice by Tether to use assert
, but it's probably because their contract is really old.
EDIT: Also, the USDT contract requires you to set the allowance to 0 before making another approve call. Here is the relevant code of the USDT contract:
function approve(address _spender, uint _value) public onlyPayloadSize(2 * 32) {
// To change the approve amount you first have to reduce the addresses`
// allowance to zero by calling `approve(_spender, 0)` if it is not
// already 0 to mitigate the race condition described here:
// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
require(!((_value != 0) && (allowed[msg.sender][_spender] != 0)));
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
}