Documentation Index
Fetch the complete documentation index at: https://docs.layerzero.network/llms.txt
Use this file to discover all available pages before exploring further.
Does my existing OFT/OApp work on Tempo?
Yes. Source-chain contracts remain unchanged, but the Tempo side requires Alt contract variants and pays fees in LZD instead ofmsg.value. The message format, pathway configuration, and security model are the same.
What changes on Tempo
See the overview for how each standard LayerZero component maps to its Tempo equivalent. The key changes relevant to OFT/OApp integrations:- OFT/OApp contracts are replaced by their Alt variants: OFTAlt, OFTAdapterAlt, OFTBurnSelfMintAlt, or OAppAlt depending on your use case
- Fees are paid in LZD instead of
msg.value(this is because Tempo has no native gas token). You must wrap a stablecoin into LZD and approve the OFT before callingsend{value: 0}() - Native drop is not supported (
addExecutorNativeDropOptionreverts) - Gas costs are higher on Tempo for certain operations (state creation, new accounts). Set custom
enforcedOptionswith higher gas limits forlzReceivewhen Tempo is the destination. See TIP-1010 for the full gas schedule
Sending from other chains to Tempo
When sending to Tempo from another chain, the normal fee model applies on the source chain:- Pay fees in the source chain’s native token (ETH, MATIC, etc.) as usual
- No LZD is needed on the source chain
- The receiver on Tempo does not pay anything to receive the message
Sending from Tempo to other chains
When sending from Tempo, you pay the LayerZero fee in LZD. There are two approaches:Direct flow (1 view call + 5 transactions)
Wrapper flow (1 view call + 2 transactions)
The TempoOFTWrapper simplifies this by handling wrapping, approvals, and sending in a single transaction:- Pulls tokens from the caller:
- Same token (e.g., USDC.e for both bridging and fees): pulls
amountLD + nativeFeein a single transfer - Different tokens (e.g., bridging EURC.e, fees in USDC.e): pulls
amountLDandnativeFeeseparately, requiring two approvals
- Same token (e.g., USDC.e for both bridging and fees): pulls
- Wraps the fee portion into LZD
- Approves LZD to the OFT
- Calls
oft.send()with the correct fee - Reverts the entire transaction if the re-quoted fee exceeds
maxNativeFee
With LZMulticall (frontend pattern)
The Stargate frontend uses LZMulticall to bundle wrapping, approvals, and sending into a single transaction. On Tempo, it bundles the LZD wrap and approval steps alongside the OFT send.| Contract | Address |
|---|---|
| LZMulticall | 0x4683ce822272cd66cea73f5f1f9f5cbcaef4f066 |
| TransferDelegate | 0x3c18440268a78d651a3847653692fc82c31731c9 |
| TempoOFTWrapper | 0xbb95daf376cd63f258d7c37a4efe57c10055e8e0 |
| LZEndpointDollar | 0x0ceb237e109ee22374a567c6b09f373c73fa4cbb |
Common pitfalls
- LZD is not available on DEXes. LZD is an ERC-20, not a TIP-20 token, so it cannot be traded on the Tempo DEX. Always use
LZD.wrap()to obtain fee tokens. - Wrapper becomes
msg.sender. When using the TempoOFTWrapper, the wrapper is the sender for the OFT call. Do not use it for compose messages where the composer refunds the original sender. The refund goes to the wrapper, not the user, and the funds will be permanently lost. - Fee token must be a whitelisted stablecoin, not LZD. The
feeTokenpassed to the wrapper must be a 6-decimal stablecoin whitelisted by LZD (pathUSD, USDC.e, or USDT0). Passing LZD itself reverts.