Developer
USD₮0 is an Omnichain Fungible Token (OFT). The OFT standard allows tokens to move seamlessly across multiple blockchains using LayerZero's messaging protocol, ensuring a unified supply across all chains. USD₮0 follows this standard, leveraging LayerZero's infrastructure to enable secure and efficient cross-chain transfers while maintaining compatibility with existing USD₮ functionality.
1. Architecture Overview
The USD₮0 implementation separates token functionality from cross-chain messaging. This split enables independent upgrades of token and messaging components while maintaining consistent token behavior across chains.
Core Components
The implementation consists of three main components:
OAdapterUpgradeable (on Ethereum):
Implements LayerZero OFT functionality for Ethereum
Handles both sending and receiving cross-chain messages
Interfaces directly with the TetherToken contract on Ethereum
Locks/Unlocks USD₮ for cross-chain transfers
OUpgradeable (on other chains):
Implements LayerZero OFT functionality for other chains
Handles both sending and receiving cross-chain messages
Interfaces with the TetherTokenOFTExtensoin
Controls minting/burning for cross-chain transfers
TetherTokenOFTExtension (on other chains):
Offers mint/burn interface for the OFT
Component Interaction Diagram
The graphic illustrates how USD₮ and USD₮0 are transferred across Ethereum, Chain A, and Chain B:

Ethereum → Chain B:
USDT Adapter locks USDT on Ethereum.
A LayerZero message triggers USDT0 OFT on Chain B to mint equivalent USD₮0.
Chain B → Chain A:
USDT0 OFT burns USD₮0 on Chain B.
A message triggers USDT0 OFT on Chain A to mint the equivalent.
Chain A → Ethereum:
USDT0 OFT burns USD₮0 on Chain A.
A message instructs the USDT Adapter to unlock USD₮ on Ethereum.
The flow ensures consistent token supply across chains.
2. Interfaces Reference
Token Interfaces
The USD₮0 token implements the following standard interfaces:
ERC20
ERC20Permit (EIP-2612)
EIP-3009 (Gasless transfers)
Key public functions for integration:
interface IERC20 {
function transfer(address to, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function approve(address spender, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
}
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}
// EIP-3009 functions for gasless transfers
interface IEIP3009 {
function transferWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
bytes memory signature
) external;
function receiveWithAuthorization(
address from,
address to,
uint256 value,
uint256 validAfter,
uint256 validBefore,
bytes32 nonce,
bytes memory signature
) external;
}OFT Interfaces
The OFT implementation provides cross-chain transfer functionality through LayerZero:
interface IOFT {
struct SendParam {
uint32 dstEid; // Destination endpoint ID
bytes32 to; // Recipient address
uint256 amountLD; // Amount to send
uint256 minAmountLD; // Minimum amount to receive
bytes extraOptions; // Additional options
bytes composeMsg; // Optional composed message
bytes oftCmd; // OFT-specific command
}
struct MessagingFee {
uint256 nativeFee; // Fee in native gas
uint256 lzTokenFee; // Fee in LZ token
}
struct OFTReceipt {
uint256 amountSentLD; // Amount sent
uint256 amountReceivedLD; // Amount received
}
// Get expected received amount
function quoteOFT(SendParam calldata sendParam)
external view returns (
OFTLimit memory, // Min/max amounts
OFTFeeDetail[] memory, // Fee breakdown
OFTReceipt memory // Expected amounts
);
// Get messaging fee
function quoteSend(SendParam calldata sendParam, bool payInLzToken)
external view returns (MessagingFee memory);
// Execute the cross-chain transfer
function send(
SendParam calldata sendParam,
MessagingFee calldata fee,
address refundAddress
) external payable;
}The OFT interface is consistent across all chains, whether using OAdapterUpgradeable on Ethereum or OUpgradeable on other chains. The only difference is that on Ethereum, users need to approve the OFT adapter to spend their USD₮ before calling send.
Example
The following example shows how to bridge USD₮ from Ethereum to Arbitrum, including necessary approvals and parameter handling.
import { ethers } from "ethers";
const USDT_ADDRESS = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
const OFT_ADDRESS = "0x6C96dE32CEa08842dcc4058c14d3aaAD7Fa41dee";
const ARB_EID = 30110;
const MAX_UINT256 = ethers.constants.MaxUint256;
const OFT_ABI = [
"function quoteOFT(tuple(uint32,bytes32,uint256,uint256,bytes,bytes,bytes)) view returns (tuple(uint256,uint256), tuple(int256,string)[], tuple(uint256,uint256))",
"function quoteSend(tuple(uint32,bytes32,uint256,uint256,bytes,bytes,bytes), bool) view returns (tuple(uint256,uint256))",
"function send(tuple(uint32,bytes32,uint256,uint256,bytes,bytes,bytes), tuple(uint256,uint256), address) payable returns (tuple(bytes32,uint64,tuple(uint256,uint256)), tuple(uint256,uint256))",
];
async function sendUSDT0ToArbitrum(
signer: ethers.Signer,
amount: string,
recipient: string
) {
const usdt = new ethers.Contract(
USDT_ADDRESS,
["function approve(address,uint256)"],
signer
);
const oft = new ethers.Contract(OFT_ADDRESS, OFT_ABI, signer);
const amountWei = ethers.utils.parseUnits(amount, 6);
// Approve max amount
await usdt.approve(OFT_ADDRESS, MAX_UINT256);
const sendParam = [
ARB_EID,
ethers.utils.hexZeroPad(recipient, 32),
amountWei,
0,
"0x",
"0x",
"0x",
];
const [, , oftReceipt] = await oft.callStatic.quoteOFT(sendParam);
sendParam[3] = oftReceipt[1];
const msgFee = await oft.callStatic.quoteSend(sendParam, false);
const tx = await oft.send(sendParam, msgFee, recipient, { value: msgFee[0] });
return tx;
}3. Security Configuration (DVNs)
USD₮0 utilizes a dual-DVN security configuration requiring verification from:
LayerZero DVN
USDT0 DVN
Both DVNs must verify the payloadHash before a cross-chain message can be committed for execution. This setup ensures enhanced security through independent verification of all cross-chain transfers.
For detailed information about LayerZero DVNs and security stacks, refer to: https://docs.layerzero.network/v2/home/modular-security/security-stack-dvns
4. Legacy Mesh
The Legacy Mesh is a cross-chain liquidity network for USDT that connects legacy deployments on Ethereum, Arbitrum, Celo, Tron, and TON. It enables USDT transfers across chains without minting or burning. Instead, it uses a credit-based system where liquidity is locked and unlocked between smart contract pools on each chain.
At its core is the UsdtOFT contract, which implements LayerZero’s IOFT interface for compatibility with standard OFT tooling. Unlike standard OFT contracts, UsdtOFT does not alter token supply—it moves USDT by crediting and debiting pool balances.
Key Mechanics
Fee-based Transfers: A small fee (in basis points) is deducted from each transfer. The feeBps variable defines the rate.
Interface Support:
quoteOFT(): Returns transfer limits, expected amounts, and fees.quoteSend(): Returns LayerZero messaging fees.send(): Executes the cross-chain transfer and applies fees.
This mechanism enables seamless interoperability across non-upgradeable USDT deployments.
Please note: When an upgrade is processed, the entire Legacy Mesh infrastructure smart contracts are migrated as a whole. If your application integrates Legacy Mesh directly at the smart contract level, we recommend reaching out to [email protected]. This ensures you have a direct communication channel and remain fully updated on the latest changes.
Last updated
Was this helpful?