Why x402 Doesn't Support USDT
A technical explanation of why USDT (Tether) isn't compatible with the x402 protocol, and why USDC is the stablecoin of choice for HTTP-native payments.

If you’ve explored the x402 protocol, you’ve noticed it exclusively supports USDC—not USDT. Given that USDT has the largest market cap among stablecoins, this might seem surprising. The reason is entirely technical: USDT doesn’t implement the smart contract functions that x402 requires.
The Technical Requirement: ERC-3009
x402 payments on EVM chains rely on ERC-3009, a standard that enables gasless, signature-based transfers. The key function is:
function transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external;
This function allows a payer to sign an off-chain message authorizing a transfer, which a Facilitator can then execute on-chain. The payer never needs to submit a transaction themselves—they just sign.
USDT’s Contract: Standard ERC-20 Only
Let’s look at what the USDT contract on Ethereum actually implements:
// USDT (TetherToken) contract functions
function transfer(address _to, uint _value) public returns (bool);
function transferFrom(address _from, address _to, uint _value) public returns (bool);
function approve(address _spender, uint _value) public returns (bool);
function balanceOf(address who) public view returns (uint);
function allowance(address _owner, address _spender) public view returns (uint);
That’s it. Standard ERC-20 functions only. No transferWithAuthorization, no permit, no meta-transaction support of any kind.
What This Means
To use USDT in a payment flow, the payer must:
- Call
approveto authorize a spender (one on-chain transaction) - Then the spender calls
transferFrom(another on-chain transaction)
Or the payer directly calls transfer themselves. Either way:
- The payer must hold ETH for gas
- The payer must submit their own transaction
- No third party can execute on their behalf with just a signature
This fundamentally breaks the x402 model.
USDC’s Contract: ERC-3009 Native
Compare this to Circle’s USDC contract (v2+):
// USDC contract includes ERC-3009 functions
function transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external;
function receiveWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
uint8 v,
bytes32 r,
bytes32 s
) external;
// Plus ERC-2612 permit
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
USDC implements both ERC-3009 and ERC-2612, giving maximum flexibility for meta-transactions.
Side-by-Side Comparison
| Feature | USDT | USDC |
|---|---|---|
| Standard ERC-20 | ✅ | ✅ |
| ERC-3009 (transferWithAuthorization) | ❌ | ✅ |
| ERC-2612 (permit) | ❌ | ✅ |
| Gasless transfers | ❌ | ✅ |
| x402 compatible | ❌ | ✅ |
| AI agent friendly | ❌ | ✅ |
Why This Matters for x402
The x402 payment flow requires:
- User signs a message (off-chain, no gas needed)
- Facilitator verifies the signature
- Facilitator settles by executing the transfer on-chain
User signs → Facilitator verifies → Server responds → Facilitator settles
With USDT, step 3 is impossible without the user’s direct involvement. The Facilitator can’t execute a transfer on behalf of the user because USDT has no mechanism for signature-based authorization.
The UX Impact
With USDC (ERC-3009):
User clicks "Pay" → Signs in wallet → Instant response → Done
With USDT (traditional ERC-20):
User clicks "Pay" → Approves in wallet → Waits for confirmation →
Clicks again → Transfers in wallet → Waits for confirmation → Done
For payments, especially micropayments and AI agent transactions, this UX difference is enormous.
Could USDT Add ERC-3009 Support?
Technically, yes. Tether could upgrade the USDT contract to include ERC-3009 functions. However:
- Contract upgrades are risky: USDT holds billions in value. Any upgrade carries risk.
- No public plans: Tether hasn’t announced any intention to add this functionality.
- Circle’s head start: USDC has had ERC-3009 since 2020 (USDC v2).
The USDT contract uses an upgradeable proxy pattern, so it’s technically possible. But until Tether decides to implement it, USDT remains incompatible with x402.
What About Other Chains?
Tron USDT
On Tron (where a large portion of USDT exists), the situation is similar. The TRC-20 USDT contract doesn’t implement any signature-based transfer authorization.
Solana
On Solana, the story is different. Solana’s architecture enables gasless, sponsor-paid transactions natively. Circle’s USDC on Solana works with x402 because:
- Any account can pay transaction fees
- Transactions are atomic and multi-instruction
- No special contract functions needed
However, there’s no native USDT on Solana from Tether—only wrapped versions via bridges.
Alternatives Considered
Could x402 use approve/transferFrom?
Theoretically, a modified x402 could use the traditional approval pattern:
- User pre-approves the Facilitator to spend their USDT
- Facilitator calls
transferFromon each payment
Problems:
- Requires a one-time on-chain approval (gas cost)
- Creates trust issues (Facilitator could drain entire allowance)
- Breaks the stateless payment model
Could x402 wrap USDT?
Some have suggested wrapping USDT into an ERC-3009-compatible wrapper token:
// Hypothetical wrapper
contract WrappedUSDT is ERC3009 {
function wrap(uint256 amount) external {
USDT.transferFrom(msg.sender, address(this), amount);
_mint(msg.sender, amount);
}
}
Problems:
- Introduces smart contract risk
- Requires users to wrap/unwrap
- Adds complexity and gas costs
- Not truly USDT anymore
The Game Changer: USDT0
In January 2025, Tether launched USDT0—an omnichain version of USDT built on LayerZero’s OFT (Omnichain Fungible Token) standard. This changes everything.
What is USDT0?
USDT0 is a lock-and-mint deployment of USDT:
USDT (Ethereum) → Lock in smart contract → Mint USDT0 on destination chain
The key difference? USDT0 implements ERC-3009 and ERC-2612.
// USDT0 contract includes gasless transfer functions
function transferWithAuthorization(...) external; // ERC-3009 ✅
function receiveWithAuthorization(...) external; // ERC-3009 ✅
function permit(...) external; // ERC-2612 ✅
USDT0 vs Traditional USDT
| Feature | USDT (Original) | USDT0 |
|---|---|---|
| ERC-3009 | ❌ | ✅ |
| ERC-2612 (permit) | ❌ | ✅ |
| Gasless transfers | ❌ | ✅ |
| x402 compatible | ❌ | ✅ (potentially) |
| Cross-chain native | ❌ | ✅ (LayerZero OFT) |
Supported Networks
USDT0 has already processed over $50 billion in transfers across:
- Ethereum, Arbitrum, Ink
- Sei, HyperLiquid
- Bitcoin layers (Corn, Rootstock)
- Conflux, Plasma
- Solana (via LayerZero)
- And more networks being added
What This Means for x402
With USDT0 implementing ERC-3009, the technical barrier is removed. x402 facilitators could theoretically support USDT0 payments with the same seamless UX as USDC:
User signs USDT0 authorization → Facilitator verifies → Content served → Settlement
However, x402 facilitator support for USDT0 is still emerging. Check with your Facilitator provider for current USDT0 support status.
Security Considerations
USDT0’s architecture includes robust security measures:
- Dual DVN Validation: Every cross-chain operation requires approval from both LayerZero’s Decentralized Verifier Network and a dedicated USDT0 verifier
- Immutable Core Logic: The lock-and-mint mechanism maintains strict 1:1 backing
- $6M Bug Bounty: One of the largest in DeFi
- OpenZeppelin Audited: Professional security review
The Bottom Line
x402’s current USDC-only support isn’t an arbitrary choice—it’s a technical necessity based on ERC-3009 requirements. The protocol depends on ERC-3009’s transferWithAuthorization to enable:
- Gasless payments: Users don’t need ETH
- Single-action UX: One signature, done
- Facilitator settlement: Third-party execution
- AI agent compatibility: Autonomous payments
Traditional USDT remains incompatible, but USDT0 opens the door to Tether-based x402 payments.
Looking Forward
The stablecoin landscape is evolving rapidly:
- USDC remains the gold standard for programmable payments with native ERC-3009 support since 2020
- USDT0 brings Tether into the gasless transfer era, potentially expanding x402’s reach to the largest stablecoin by market cap
- More tokens may adopt ERC-3009 as the standard gains traction
For builders, the recommendation is: start with USDC for proven x402 compatibility, and watch for USDT0 facilitator support as the ecosystem matures.
Related Articles
- ERC-3009: The Protocol Behind x402 Payments - Deep dive into the standard
- x402 Facilitators - How settlement infrastructure works
- Solana’s Authorization Mechanism - Non-EVM alternatives
- x402 Developer’s Guide - Build your first paid API
References
- USDT Contract on Etherscan
- USDC Contract on Etherscan
- EIP-3009 Specification
- Circle USDC Documentation
- USDT0 Documentation
- USDT0 OpenZeppelin Audit
The x402 protocol’s USDC focus isn’t about preference—it’s about capability. With USDT0’s ERC-3009 support, the door to Tether-based x402 payments is opening. The future of HTTP-native payments is multi-stablecoin.