x402 USDT USDC stablecoins ERC-3009

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.

PayIn Team | | 8 min read

Why x402 Doesn't Support USDT

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:

  1. Call approve to authorize a spender (one on-chain transaction)
  2. 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

FeatureUSDTUSDC
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:

  1. User signs a message (off-chain, no gas needed)
  2. Facilitator verifies the signature
  3. 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:

  1. Contract upgrades are risky: USDT holds billions in value. Any upgrade carries risk.
  2. No public plans: Tether hasn’t announced any intention to add this functionality.
  3. 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:

  1. User pre-approves the Facilitator to spend their USDT
  2. Facilitator calls transferFrom on 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

FeatureUSDT (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.

References


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.