Skip to main content

USDT0 on mainnet

Get USDT0 into a mainnet account, hold it, and move some of it. Every command on this page spends real money.

Ask your agent​

Check the USDT0 balance of GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q on mainnet,
then tell me what the current XLM to USDT0 rate is.
tip

Read Acquire USDT0 before you buy any. It covers which route to use and how to bound a trade.

Addresses​

USDT0 is a classic Stellar asset with a Stellar Asset Contract. Its supply is unified with USDT on other chains, minted and burned on Stellar by a LayerZero OFT contract. It is live on mainnet only. USDT0 on Stellar is the source of truth for these values.

ThingValue
Classic assetUSDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q
Token contract (SAC)CBSJZEIO5C7KC2SF3MKSNXXJSW5G3VTNBX4ATMKUI3B2MR4JKM4R26YF
OFT contractCBOWOLFSDM5PZXNFIVDMP5NZ7U2GSIHED6H6R446QOHF266XINKUMMF6
LayerZero endpoint ID30600
Decimals on Stellar7

Do not trust a pasted contract address. Derive the SAC from the asset and compare. This is a free read with no source account:

stellar contract id asset --asset USDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q \
--network mainnet

Set up mainnet first​

The built-in mainnet entry has no RPC URL, so mainnet commands fail with Invalid URL Bring Your Own until you add one. Pick an endpoint from Stellar's RPC providers page. Once you pass --rpc-url, you must also pass --network-passphrase:

stellar network add mainnet \
--rpc-url <YOUR_MAINNET_RPC_URL> \
--network-passphrase "Public Global Stellar Network ; September 2015"
stellar network health --network mainnet

network health only proves the endpoint answers. In testing, one endpoint reported healthy and landed classic transactions while every Soroban submission timed out. Validate a new endpoint with one small Soroban write, such as a stellar token approve, before you rely on it.

There is no friendbot on mainnet, so fund a new account from an existing one. An account needs 1 XLM to exist plus 0.5 XLM per trustline, so an account holding only USDT0 needs at least 1.5 XLM plus fees:

stellar tx new create-account --source <FUNDED_IDENTITY> --destination <NEW_ADDRESS> \
--starting-balance 15000000 --network mainnet

Steps​

  1. Read the asset. No key or signing needed:

    stellar token symbol --id USDT0:GATISXX6… --network mainnet
    stellar token decimals --id USDT0:GATISXX6… --network mainnet
  2. Add the trustline. USDT0 cannot arrive without one:

    stellar tx new change-trust --source <IDENTITY> \
    --line USDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q --network mainnet
  3. Confirm it. Any number, even 0, means the trustline exists. Without one this fails with "trustline entry is missing for account":

    stellar token balance --id USDT0:GATISXX6… --account <IDENTITY> --network mainnet
  4. Send it with a classic payment. At 7 decimals, 1 USDT0 is 10000000, and the destination needs its own trustline:

    stellar tx new payment --source <IDENTITY> --destination <DEST> \
    --asset USDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q \
    --amount 10000000 --network mainnet

    Prefer this over stellar token transfer for USDT0. The classic payment costs 100 stroops, while token transfer pays Soroban resource fees of about 14,000 stroops for the same transfer.

Acquire USDT0​

Transfer USDT0 to Stellar from another network at usdt0.to/transfer, or buy it on a venue that supports Stellar, such as Kraken or SushiSwap. USDT0 on Stellar lists the integrated exchanges, ramps, and custodians. A cross-chain transfer costs the source network's gas plus the LayerZero message, and some routes enforce a minimum amount.

To swap from the CLI, use a path payment and always set --dest-min, so a bad rate fails instead of executing. The CLI has no price command, so quote the trade against Horizon's path endpoint first and set the bound below the quote:

stellar tx new path-payment-strict-send --source <IDENTITY> --network mainnet \
--send-asset native --send-amount 50000000 --destination <OWN_ADDRESS> \
--dest-asset USDT0:GATISXX6… --dest-min 8000000

To price a sale of USDT0, quote with strict-receive. A strict-send quote with USDT0 as the source asset returns no paths, even though a route exists.

Give an agent a capped allowance​

The network enforces a capped, expiring allowance over your USDT0, which makes it the strongest control for letting an agent spend it. The owner needs a USDT0 trustline, but no balance, so you can set it up before funding:

LEDGER=$(stellar ledger latest --network mainnet --output json | python3 -c 'import sys,json;print(json.load(sys.stdin)["sequence"])')

stellar token approve --id USDT0:GATISXX6… --from <OWNER> --spender <AGENT> \
--amount 20000000 --expiration-ledger $((LEDGER + 17280)) --network mainnet

stellar token allowance --id USDT0:GATISXX6… --from <OWNER> --spender <AGENT> \
--network mainnet --decimal

That grants 2 USDT0 for about a day (17,280 ledgers at 5 seconds each). Revoke with --amount 0 --expiration-ledger 0. The agent spends it with contract invoke -- transfer_from, since stellar token has no command for that. See Delegate spending.

Revocation and clawback​

The asset sets auth_revocable and auth_clawback_enabled, so a trustline can be revoked or a balance clawed back. auth_required is not set, so anyone can hold it. The admin is a contract, CA3GUWLOS3QKN6WNRAELSUDSKLDTVTWEDJ3KLGAJG3SIWGA5L3KZYWGJ, not a keypair.

To limit how much USDT0 an account will accept, set a trustline limit. This caps it at 1 USDT0:

stellar tx new change-trust --source <IDENTITY> \
--line USDT0:GATISXX6BZ6NC7IKQBY37CJD4SOZL3CYZJWXEDG6JVIY4WBS6KXJHN6Q \
--limit 10000000 --network mainnet

Without --limit, the trustline is effectively uncapped. --limit 0 removes the trustline and returns its 0.5 XLM reserve, but only at a zero balance.

Common pitfalls​

  • No trustline. A payment to an account without one fails with op_no_trust.
  • Smallest units. --amount 1 sends 0.0000001 USDT0.
  • Cross-chain rounding. Bridged transfers use six decimals. Send 1.2345678 and 1.234567 moves; the 0.0000008 remainder is refunded.
  • Parsing a submit. tx send writes its info line to stderr and JSON to stdout, so 2>&1 breaks the parse.
  • Timed-out submits. A transaction submission timeout means the outcome is unknown. Check stellar tx fetch result --hash <HASH> --network mainnet first. Resubmitting the same signed envelope with stellar tx send is safe: it is byte-identical and can land at most once. Rerunning tx new payment or token transfer builds a new transaction with a new sequence number, and if the first one landed you pay twice. Never retry on a timer.
  • Duplicate network entries. Running stellar network add mainnet twice leaves two entries, and only --very-verbose shows which URL is in use.
  • Protocol gap. Testnet upgrades to each new protocol before mainnet, so the two networks can differ for a few weeks. Check both with stellar doctor before assuming a testnet rehearsal covers mainnet.