Skip to main content

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 tokenTempo tokenCan pay gas on TempoCan pay LZ fees
USDCUSDC.eyesyes
EURCEURC.enono
USDTUSDT0TBDTBD

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

AspectStandard StargateStargate on Tempo
Fee paymentmsg.value (native token)LZD approval (ERC-20)
Approvalsasset token onlyasset token + stablecoin to LZD + LZD to Stargate
msg.valuerequired for feesmust be 0
Native dropsupportednot supported
Quote denominationnative token (ETH, etc.)LZD (USD-denominated)
Bus modesupporteddisabled

Bus mode

Bus mode is disabled on Tempo. Sends are executed as direct on-chain transactions with their own quoted fees.