WDK logoWDK documentation

Bridge Cross-Ecosystem

Send USD₮0 from EVM toward Solana, TON, or TRON recipients.

This guide covers prerequisites and how to bridge to Solana, bridge to TON, and bridge to TRON using bridge(). The same Usdt0ProtocolEvm instance you use for EVM destinations applies; only targetChain and recipient formats change.

Prerequisites

A Usdt0ProtocolEvm backed by a non-read-only EVM account, with enough source tokens and native gas where required. Standard EVM accounts must approve the source-chain bridge spender before calling bridge(). Supported ERC-4337 accounts bundle approval into the bridge UserOperation. Recipient strings must match each network’s address encoding.

The examples below use a standard EVM account. For USDT_BRIDGE_SPENDER_ADDRESS, use a verified source-chain OFT or bridge contract that supports the selected destination. See Bridge Tokens for address sources.

Verify the route

For Solana, TON, and TRON targets, beta.7 does not auto-resolve the source chain's ordinary USD₮0 OFT. Its bundled auto-resolution candidates are:

Source token contract familyEVM source chains with a bundled candidate
USD₮0 legacy meshEthereum, Arbitrum, Celo
XAU₮0 OFTEthereum, Arbitrum, Avalanche, Celo, HyperEVM, Ink, Monad, Plasma, Polygon, Stable

A listed source contract can still lack an on-chain peer for a particular destination. getSupportedChains() and getSupportedTokens() expose static configuration, not a verified route matrix. After any required standard-account approval, call quoteBridge() for the exact source token and destination before calling bridge(). For another verified deployment, pass its route-specific oftContractAddress and, when needed, dstEid.

Bridge to Solana

You can set targetChain to solana and pass a base58 Solana address as recipient when calling bridge():

Bridge toward Solana
const USDT_TOKEN_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7'
const USDT_BRIDGE_SPENDER_ADDRESS = process.env.USDT0_BRIDGE_SPENDER_ADDRESS
const amount = 1000000n

await account.approve({
  token: USDT_TOKEN_ADDRESS,
  spender: USDT_BRIDGE_SPENDER_ADDRESS,
  amount
})

const solanaResult = await bridgeProtocol.bridge({
  targetChain: 'solana',
  recipient: 'HyXJcgYpURfDhgzuyRL7zxP4FhLg7LZQMeDrR4MXZcMN',
  token: USDT_TOKEN_ADDRESS,
  amount,
  oftContractAddress: USDT_BRIDGE_SPENDER_ADDRESS
})

console.log('Solana bridge hash:', solanaResult.hash)
console.log('Bridge fee:', solanaResult.bridgeFee)

Validate Solana addresses (length and base58 alphabet) before bridging. A malformed recipient fails the operation.

Bridge to TON

You can set targetChain to ton and supply a TON user-friendly or raw address string as recipient in bridge():

Bridge toward TON
const USDT_TOKEN_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7'
const USDT_BRIDGE_SPENDER_ADDRESS = process.env.USDT0_BRIDGE_SPENDER_ADDRESS
const amount = 1000000n

await account.approve({
  token: USDT_TOKEN_ADDRESS,
  spender: USDT_BRIDGE_SPENDER_ADDRESS,
  amount
})

const tonResult = await bridgeProtocol.bridge({
  targetChain: 'ton',
  recipient: 'EQAd31gAUhdO0d0NZsNb_cGl_Maa9PSuNhVLE9z8bBSjX6Gq',
  token: USDT_TOKEN_ADDRESS,
  amount,
  oftContractAddress: USDT_BRIDGE_SPENDER_ADDRESS
})

console.log('TON bridge hash:', tonResult.hash)

Bridge to TRON

You can set targetChain to tron and pass a base58Check TRON address (typically starting with T) to bridge():

Bridge toward TRON
const USDT_TOKEN_ADDRESS = '0xdac17f958d2ee523a2206206994597c13d831ec7'
const USDT_BRIDGE_SPENDER_ADDRESS = process.env.USDT0_BRIDGE_SPENDER_ADDRESS
const amount = 1000000n

await account.approve({
  token: USDT_TOKEN_ADDRESS,
  spender: USDT_BRIDGE_SPENDER_ADDRESS,
  amount
})

const tronResult = await bridgeProtocol.bridge({
  targetChain: 'tron',
  recipient: 'TFG4wBaDQ8sHWWP1ACeSGnoNR6RRzevLPt',
  token: USDT_TOKEN_ADDRESS,
  amount,
  oftContractAddress: USDT_BRIDGE_SPENDER_ADDRESS
})

console.log('TRON bridge hash:', tronResult.hash)

LayerZero endpoint IDs for these destinations are listed under Supported chains in the API reference.

Next Steps

Harden integrations with Handle errors, or return to Bridge tokens for EVM-only flows and quotes.

On this page