WDK logoWDK documentation

Bridge USD₮0 EVM Configuration

Configuration options and settings for @tetherto/wdk-protocol-bridge-usdt0-evm

Bridge Protocol Configuration

The Usdt0ProtocolEvm accepts a configuration object that defines how the bridge protocol works:

import Usdt0ProtocolEvm from '@tetherto/wdk-protocol-bridge-usdt0-evm'
import { WalletAccountEvm } from '@tetherto/wdk-wallet-evm'

// Create wallet account first
const account = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: 'https://eth.drpc.org'
})

// Create bridge protocol with configuration
const bridgeProtocol = new Usdt0ProtocolEvm(account, {
  bridgeMaxFee: 1000000000000000n // Optional standard-account cap in source native base units
})

Account Configuration

The bridge protocol uses the wallet account's configuration for blockchain access:

import { WalletAccountEvm, WalletAccountReadOnlyEvm } from '@tetherto/wdk-wallet-evm'

// Full access account
const account = new WalletAccountEvm(
  seedPhrase,
  "0'/0/0", // BIP-44 derivation path
  {
    provider: 'https://eth.drpc.org',
    transferMaxFee: 100000000000000
  }
)

// Read-only account
const readOnlyAccount = new WalletAccountReadOnlyEvm(
  '0x...', // Ethereum address
  {
    provider: 'https://eth.drpc.org'
  }
)

// Create bridge protocol
const bridgeProtocol = new Usdt0ProtocolEvm(account, {
  bridgeMaxFee: 1000000000000000n
})

Configuration Options

Bridge Max Fee

The bridgeMaxFee option rejects bridge() when the implementation's fee + bridgeFee value is equal to or greater than the cap.

Type: number | bigint (optional)

For a standard EVM account, both fields use the source chain's native base unit. For example, Ethereum and Arbitrum report the values in wei.

For an ERC-4337 helper flow, bridgeFee is in bridged-token base units. The account's fee uses native base units for native gas, paymaster-token base units for token-paid gas, or zero for sponsored gas. In 1.0.0-beta.7, the protocol numerically adds these values when enforcing bridgeMaxFee. Do not treat that sum as one currency or set a cap until your payment mode uses compatible units.

Examples:

const config = {
  // Standard Ethereum account: reject fee + bridgeFee at or above 0.001 ETH
  bridgeMaxFee: 1000000000000000n,
}

// Usage example
try {
  await account.approve({
    token: '0x...', // USDT contract address
    spender: '0x...', // OFT or bridge spender address
    amount: 1000000n
  })

  const result = await bridgeProtocol.bridge({
    targetChain: 'arbitrum',
    recipient: '0x...', // Recipient address
    token: '0x...', // USDT contract address
    amount: 1000000n,
    oftContractAddress: '0x...' // Same address used as approval spender
  })
} catch (error) {
  if (error.message.includes('Exceeded maximum fee')) {
    console.error('Bridge cancelled: Fee too high')
  }
}

Provider

The provider option comes from the wallet account configuration and specifies how to connect to the blockchain.

Type: string | Eip1193Provider

Examples:

// Option 1: Using RPC URL
const account = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: 'https://eth.drpc.org'
})

// Option 2: Using browser provider (e.g., MetaMask)
const account = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: window.ethereum
})

Pass either an RPC URL string or a genuine EIP-1193 provider. An ethers JsonRpcProvider is not an EIP-1193 provider and is not accepted by this wallet release.

ERC-4337 Configuration

When using ERC-4337 accounts, you can override configuration options during bridge operations:

// Bridge with ERC-4337 account
const result = await bridgeProtocol.bridge({
  targetChain: 'arbitrum',
  recipient: '0x...', // Recipient address
  token: '0x...', // USDT contract address
  amount: 1000000n,
  oftContractAddress: '0x...' // Optional custom OFT contract
}, {
  paymasterToken: { address: '0x...' } // Paymaster token for gasless transactions
})

The protocol builds the token approval and transaction-value-helper call and submits them as one UserOperation. Do not call account.approve() separately for this flow.

ERC-4337 helper bridging is configured for these source chains:

Source chainChain ID
Ethereum1
Arbitrum42161
Plasma9745
Polygon137

Other supported EVM source chains require a standard EVM account.

Paymaster Token

The paymasterToken option specifies which token to use for paying gas fees in ERC-4337 accounts.

Type: { address: string } (optional) Format: Object with token contract address

Example:

const result = await bridgeProtocol.bridge({
  targetChain: 'arbitrum',
  recipient: '0x...', // Recipient address
  token: '0x...', // USDT contract address
  amount: 1000000n,
  oftContractAddress: '0x...' // Optional custom OFT contract
}, {
  paymasterToken: {
    address: '0x...' // Paymaster token address
  }
})

Network Support

The bridge protocol uses EVM wallet providers as source chains and supports both EVM and non-EVM destinations. Change the provider URL in the wallet account configuration:

// Ethereum Mainnet
const ethereumAccount = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: 'https://eth.drpc.org'
})

// Arbitrum
const arbitrumAccount = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: 'https://arb1.arbitrum.io/rpc'
})

// Polygon
const polygonAccount = new WalletAccountEvm(seedPhrase, "0'/0/0", {
  provider: 'https://polygon-rpc.com'
})

Bridge Options

When calling the bridge method, you need to provide bridge options. The following allowance step applies to a standard EVM account:

const bridgeOptions = {
  targetChain: 'arbitrum', // Destination chain name
  recipient: '0x...', // Recipient address
  token: '0x...', // USDT contract address
  amount: 1000000n, // Amount to bridge in base units
  oftContractAddress: '0x...', // Optional custom OFT contract address
  dstEid: 30110 // Optional LayerZero destination endpoint ID override
}

await account.approve({
  token: bridgeOptions.token,
  spender: bridgeOptions.oftContractAddress,
  amount: bridgeOptions.amount
})

const result = await bridgeProtocol.bridge(bridgeOptions)

Target Chain

The targetChain option specifies which blockchain to bridge tokens to.

Type: string Supported values: 'ethereum', 'arbitrum', 'optimism', 'polygon', 'berachain', 'ink', 'plasma', 'conflux', 'corn', 'avalanche', 'celo', 'flare', 'hyperevm', 'mantle', 'megaeth', 'monad', 'morph', 'rootstock', 'sei', 'stable', 'unichain', 'xlayer', 'solana', 'ton', 'tron'

Recipient

The recipient option specifies the address that will receive the bridged tokens.

Type: string Format: Valid address for the target chain

Token

The token option specifies which token contract to bridge.

Type: string Format: Token contract address on the source chain

Amount

The amount option specifies how many tokens to bridge.

Type: number | bigint Unit: Base units of the token (e.g., for USD₮: 1 USD₮ = 1000000n)

OFT Contract Address

The optional oftContractAddress option lets you override auto-discovery and force a specific OFT contract.

Type: string (optional) Format: Valid EVM contract address on the source chain

Destination EID Override

The optional dstEid option lets you override the default LayerZero destination endpoint ID for the selected target chain.

Type: number (optional)

Error Handling

The bridge protocol will throw errors for invalid configurations. This example uses a standard EVM account, so it approves the bridge spender first:

try {
  await account.approve({
    token: '0x...', // USDT contract address
    spender: '0x...', // OFT or bridge spender address
    amount: 1000000n
  })

  const result = await bridgeProtocol.bridge({
    targetChain: 'invalid-chain',
    recipient: '0x...', // Recipient address
    token: '0x...', // USDT contract address
    amount: 1000000n,
    oftContractAddress: '0x...' // Same address used as approval spender
  })
} catch (error) {
  if (error.message.includes('not supported')) {
    console.error('Chain or token not supported')
  }
  if (error.message.includes('Exceeded maximum fee')) {
    console.error('Bridge fee too high')
  }
  if (error.message.includes('must be connected to a provider')) {
    console.error('Wallet not connected to blockchain')
  }
}

Need Help?

On this page