WDK logoWDK documentation

Bridge Cross-Ecosystem

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

This guide covers prerequisites, how to verify the route, 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. Beta.10 validates recipient strings for their target ecosystem and rejects zero destinations before quoting or executing.

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, the protocol 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)

Beta.10 validates the Solana address and rejects the all-zero public key before quoting or bridging. Keep application validation before the write so the user can correct the recipient earlier.

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)

Beta.10 accepts valid TON recipients on workchain 0. It rejects other workchains, including -1, with UNSUPPORTED_WORKCHAIN, and rejects an all-zero destination.

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)

Beta.10 validates the TRON address and rejects its zero/burn address before quoting or bridging.

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.


Need Help?

On this page