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).
Sending through Stargate on Tempo requires approving both the asset token and the LZD fee token:
// 1. Quote the sendMessagingFee memory fee = stargate.quoteSend(sendParam, false);// 2. Approve the asset token (e.g., USDC.e) for the bridge amountIERC20(usdce).approve(address(stargate), bridgeAmount);// 3. Wrap stablecoin into LZD and approve for the feeIERC20(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 = 0stargate.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.
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.