What changes for consumers
Stargate on Tempo works the same way as on other chains, with these UX differences:
- Fees are paid in LZD (an ERC-20) instead of via
msg.value
- Additional approvals required: asset token, stablecoin to LZD for wrapping, and LZD to Stargate
- No native drop: you cannot send native tokens to the destination
- Bus mode disabled: all sends are quoted and executed on-chain
Fee payment
On standard chains, send() accepts fees via msg.value. On Tempo, send() requires an LZD approval instead:
// Standard chain: fees via msg.value
MessagingFee memory fee = stargate.quoteSend(sendParam, false);
stargate.send{value: fee.nativeFee}(sendParam, fee, refundAddress);
// Tempo: fees via LZD approval
MessagingFee memory fee = stargate.quoteSend(sendParam, false);
IERC20(lzd).approve(address(stargate), fee.nativeFee); // approve LZD
stargate.send{value: 0}(sendParam, fee, refundAddress); // msg.value = 0
quoteSend() returns both nativeFee and lzTokenFee. _payInLzToken selects the payment token. At the time of writing, _payInLzToken is not enabled on Tempo, so set it to false and use nativeFee (LZD).
Approval flow
Sending through Stargate on Tempo requires approving both the asset token and the LZD fee token:
// 1. Quote the send
MessagingFee memory fee = stargate.quoteSend(sendParam, false);
// 2. Approve the asset token (e.g., USDC.e) for the bridge amount
IERC20(usdce).approve(address(stargate), bridgeAmount);
// 3. Wrap stablecoin into LZD and approve for the fee
IERC20(usdce).approve(address(lzd), fee.nativeFee);
lzd.wrap(usdce, msg.sender, fee.nativeFee);
IERC20(lzd).approve(address(stargate), fee.nativeFee);
// 4. Send with msg.value = 0
stargate.send{value: 0}(sendParam, fee, refundAddress);
The
TempoOFTWrapper
reduces this to a single approval + one sendOFT call by bundling wrap,
approve, and send into an atomic transaction.
Supported tokens
| Source token | Tempo token | Can pay gas on Tempo | Can pay LZ fees |
|---|
| USDC | USDC.e | yes | yes |
| EURC | EURC.e | no | no |
| USDT | USDT0 | TBD | TBD |
The EURC problem
Users who bridge only EURC to Tempo will be stuck. EURC.e cannot pay gas on Tempo and is not whitelisted by LZD for LayerZero fee payment. Without a USD stablecoin balance, the user cannot execute any transaction, not even a transfer or swap.
If your frontend supports EURC bridging to Tempo, display a warning modal
informing users that they must also bridge USDC to cover transaction fees on
Tempo.
Comparison table
| Aspect | Standard Stargate | Stargate on Tempo |
|---|
| Fee payment | msg.value (native token) | LZD approval (ERC-20) |
| Approvals | asset token only | asset token + stablecoin to LZD + LZD to Stargate |
| msg.value | required for fees | must be 0 |
| Native drop | supported | not supported |
| Quote denomination | native token (ETH, etc.) | LZD (USD-denominated) |
| Bus mode | supported | disabled |
Bus mode
Bus mode is disabled on Tempo. Sends are executed as direct on-chain transactions with their own quoted fees.