How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.
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 of msg.value. The message format, pathway configuration, and security model are the same.
Source-chain contracts may need updated enforcedOptions to account for Tempo’s higher gas costs. See what changes on Tempo below.
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:
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 calling send{value: 0}()
Native drop is not supported (addExecutorNativeDropOption reverts)
Gas costs are higher on Tempo for certain operations (state creation, new accounts). Set custom enforcedOptions with higher gas limits for lzReceive when 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
No changes are required to your existing OFT/OApp contracts on the source chain.
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)
// 1. Quote the fee (view call)MessagingFee memory fee = oft.quoteSend(sendParam, false);// 2. Approve the asset token to the OFT (bridge amount)IERC20(usdce).approve(address(oft), sendParam.amountLD);// 3. Approve the fee token to LZD (fee amount)IERC20(usdce).approve(address(lzd), fee.nativeFee);// 4. Wrap stablecoin into LZD (token must be whitelisted by LZD)lzd.wrap(usdce, msg.sender, fee.nativeFee);// 5. Approve LZD to the OFT (fee amount)IERC20(lzd).approve(address(oft), fee.nativeFee);// 6. Send with msg.value = 0oft.send{value: 0}(sendParam, fee, refundAddress);
Wrapper flow (1 view call + 2 transactions)
The TempoOFTWrapper simplifies this by handling wrapping, approvals, and sending in a single transaction:
// 1. Quote the feeMessagingFee memory fee = oft.quoteSend(sendParam, false);// 2. Approve the fee token to the wrapper (bridge amount + messaging fee)IERC20(usdce).approve(address(wrapper), sendParam.amountLD + fee.nativeFee);// 3. Call sendOFT: wrapper handles wrap, approve, and send atomicallywrapper.sendOFT( address(oft), // OFT contract usdce, // fee token (whitelisted stablecoin) sendParam, // standard send parameters fee.nativeFee // max acceptable fee (reverts if re-quote exceeds this));
The wrapper:
Pulls tokens from the caller:
Same token (e.g., USDC.e for both bridging and fees): pulls amountLD + nativeFee in a single transfer
Different tokens (e.g., bridging EURC.e, fees in USDC.e): pulls amountLD and nativeFee separately, requiring two approvals
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
You can preflight with an eth_call to sendOFT to obtain
oftReceipt.amountSentLD before sending the live transaction, and avoid dust.
If the bridged token differs from the fee token (e.g., bridging EURC.e but paying fees in USDC.e), you will need to approve the asset token and fee token to the wrapper separately before calling sendOFT.
With the Value Transfer API (Stargate frontend)
The Stargate frontend builds its transfers with the Value Transfer API, so on Tempo it uses the API’s contracts, LZMultiCall and TransferDelegate. The user first approves TransferDelegate in a separate transaction. In the bridge step, LZMultiCall pulls the tokens through TransferDelegate, makes the LZD wrap and approval calls itself, and calls the OFT. Those approvals let the OFT spend tokens that LZMultiCall holds; they do not replace the user’s approval.
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 feeToken passed to the wrapper must be a 6-decimal stablecoin whitelisted by LZD (pathUSD, USDC.e, or USDT0). Passing LZD itself reverts.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"LayerZero","colors":{"primary":"#c084fc","light":"#c084fc","dark":"#c084fc"},"logo":{"light":"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_Black.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=091b05c7556f6e8e948d613c2abf58cb","dark":"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_White.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=d6e58e0cf42c989a1fed9d1345e2d23a"},"favicon":"https://mintcdn.com/layerzero/qVdya_xVZRutFzkr/favicon.png?fit=max\u0026auto=format\u0026n=qVdya_xVZRutFzkr\u0026q=85\u0026s=c7fc37affda645fb663525dcbfc7a3a4","appearance":{"default":"dark"},"navbar":{"primary":{"type":"button","label":"LayerZero Scan","href":"https://layerzeroscan.com"}},"footer":{"socials":{"github":"https://github.com/LayerZero-Labs/LayerZero-v2","x":"https://x.com/layerzero_core","discord":"https://discord.com/invite/ktbvm8Nkcr","youtube":"https://www.youtube.com/@LayerZeroLabs","website":"https://layerzero.network/blog"}},"seo":{"metatags":{"og:site_name":"LayerZero Documentation","twitter:card":"summary_large_image","twitter:site":"@LayerZero_Labs"}},"fonts":{"heading":{"family":"Roboto"},"body":{"family":"Roboto"}},"contextual":{"options":["copy","cursor","vscode","mcp","view","chatgpt","claude","perplexity"],"display":"header"},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://layerzero.network/blog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/LayerZero-Labs"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"layerzero","hasAudioNarration":false,"actualSubdomain":"layerzero","customDomains":["docs.layerzero.network"],"gitSource":{"type":"github","owner":"layerzero-labs","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"thumbs":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6af38b67852f6902678b4207","clientVersion":"0.0.4142","searchFilterCounts":[{"language":"default","tag":"Contracts \u0026 Deployments","count":191},{"language":"default","tag":"V2 Deployments","count":145},{"language":"default","tag":"Developers","count":132},{"language":"default","tag":"Mainnet Endpoints","count":130},{"language":"default","tag":"Core Concepts","count":39},{"language":"default","tag":"Developer Tools","count":35},{"language":"default","tag":"EVM","count":32},{"language":"default","tag":"Technical Reference","count":26},{"language":"default","tag":"Testnet Endpoints","count":25},{"language":"default","tag":"Contract Standards","count":21}]},"assistantConfig":{"enableStarterQuestions":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":true},"customCss":[{"filePath":"style.css","content":":root{--lz-bg-primary: #fafafa;--lz-bg-secondary: #f5f5f5;--lz-text-primary: #171717;--lz-text-secondary: #5c5c5c;--lz-border-primary: #e5e5e5;--lz-purple-400: #c084fc;--lz-purple-500: #a855f7;--lz-purple-600: #9333ea;--lz-stargate-400: #0fb983;--lz-stargate-500: #10a073}html[class~=\"dark\"]{--lz-bg-primary: #0a0a0a;--lz-bg-secondary: #171717;--lz-text-primary: #f0f0f0;--lz-text-secondary: #a3a3a3;--lz-border-primary: #2b2b2b}html[class~=\"dark\"],html[class~=\"dark\"] body{background-color:#0a0a0a!important}html:not([class~=\"dark\"]),html:not([class~=\"dark\"]) body{background-color:#fafafa!important}:root{--background-light: 250 250 250 !important;--background-dark: 10 10 10 !important}.custom-button{display:inline-flex!important;align-items:center;justify-content:center;padding:0.5rem 1rem;border-radius:0.375rem;font-weight:600;transition:color 100ms, background-color 100ms, border-color 100ms;text-decoration:none!important;cursor:pointer}.custom-button:hover{text-decoration:none!important}.custom-button-primary{background-color:#0a0a0a;color:#f2f2f2!important;border:1px solid transparent}.custom-button-primary:hover{opacity:0.9;color:#f2f2f2!important}.custom-button-secondary{background-color:transparent;color:#0a0a0a!important;border:1px solid #0a0a0a}.custom-button-secondary:hover{background-color:#0a0a0a;color:#f2f2f2!important}html[class~=\"dark\"] .custom-button-primary{background-color:#f2f2f2;color:#0a0a0a!important}html[class~=\"dark\"] .custom-button-primary:hover{color:#0a0a0a!important}html[class~=\"dark\"] .custom-button-secondary{color:#f2f2f2!important;border-color:#f2f2f2}html[class~=\"dark\"] .custom-button-secondary:hover{background-color:#f2f2f2;color:#0a0a0a!important}a[href=\"/v2/developers/solana/overview\"] svg{-webkit-mask-image:url('/images/icons/solana-mask.svg')!important;mask-image:url('/images/icons/solana-mask.svg')!important}a[href=\"/v2/developers/aptos-move/overview\"] svg{-webkit-mask-image:url('/images/icons/aptos-mask.svg')!important;mask-image:url('/images/icons/aptos-mask.svg')!important}a[href=\"/v2/developers/hyperliquid/hyperliquid-concepts\"] svg{-webkit-mask-image:url('/images/icons/hyperliquid-mask.svg')!important;mask-image:url('/images/icons/hyperliquid-mask.svg')!important}a[href=\"/v2/developers/sui/overview\"] svg{-webkit-mask-image:url('/images/icons/sui-mask.svg')!important;mask-image:url('/images/icons/sui-mask.svg')!important}a[href=\"/v2/developers/iota/overview\"] svg{-webkit-mask-image:url('/images/icons/iota-mask.svg')!important;mask-image:url('/images/icons/iota-mask.svg')!important}a[href=\"/chain/index\"] svg,a[href=\"/chain\"] svg{-webkit-mask-image:url('/images/icons/zero-mask.svg')!important;mask-image:url('/images/icons/zero-mask.svg')!important}a[href=\"/v2/developers/evm/overview\"] svg{-webkit-mask-image:url('/images/icons/ethereum-mask.svg')!important;mask-image:url('/images/icons/ethereum-mask.svg')!important}a[href=\"/v2/developers/stellar/overview\"] svg{-webkit-mask-image:url('/images/icons/stellar-mask.svg')!important;mask-image:url('/images/icons/stellar-mask.svg')!important}a[href=\"/v2/developers/canton/overview\"] svg{-webkit-mask-image:url('/images/icons/canton-mask.svg')!important;mask-image:url('/images/icons/canton-mask.svg')!important}a[href=\"/v2/developers/tempo/overview\"] svg,a[href=\"/v2/developers/tempo\"] svg{-webkit-mask-image:url('/images/icons/tempo-mark-white.svg')!important;mask-image:url('/images/icons/tempo-mark-white.svg')!important}.lz-mobile-nav-dialog{touch-action:manipulation;-webkit-tap-highlight-color:transparent;overflow-y:hidden!important}.lz-mobile-nav-dialog .overflow-y-auto{-webkit-overflow-scrolling:touch;overscroll-behavior:contain}.lz-mobile-nav-dialog button,.lz-mobile-nav-dialog a{touch-action:manipulation;-webkit-tap-highlight-color:transparent;min-height:44px;display:flex;align-items:center}#navbar-transition{pointer-events:none}html.lz-ios-scroll-lock{position:fixed;width:100%;height:100%;overflow:hidden}#footer a[href*=\"mintlify.com\"][href*=\"poweredBy\"]{display:none!important}img.nav-logo{width:102px!important;height:28px!important;aspect-ratio:109 / 30}.lz-content-wrapper{position:relative}.lz-content-video-bg{position:absolute;top:0;left:50%;transform:translateX(-50%);width:100vw;max-width:900px;height:280px;overflow:hidden;pointer-events:none;z-index:0;mask-image:linear-gradient(to bottom, black 0%, black 50%, transparent 100%);-webkit-mask-image:linear-gradient(to bottom, black 0%, black 50%, transparent 100%)}.lz-content-video{width:100%;height:100%;object-fit:cover;object-position:center top;opacity:0}html[class~=\"dark\"] .lz-content-video{opacity:0.25}@media (min-width: 900px){.lz-content-video-bg{border-radius:12px}}.lz-mobile-card-header{display:flex!important;flex-direction:row!important;align-items:center!important;gap:12px;margin-bottom:12px;padding-bottom:12px;border-bottom:1px solid #e5e7eb}.lz-mobile-icon-wrapper{display:flex!important;align-items:center!important;justify-content:center!important;flex-shrink:0}.lz-mobile-icon-wrapper [data-rmiz],.lz-mobile-icon-wrapper [data-rmiz-content]{display:block!important;width:100%!important;height:100%!important;line-height:normal!important;margin:0!important;padding:0!important}.lz-mobile-card-title{font-size:18px!important;font-weight:700!important;margin:0!important;line-height:1.2!important;color:#000}html[class~=\"dark\"] .lz-mobile-card-header{border-bottom-color:rgba(255, 255, 255, 0.1)}html[class~=\"dark\"] .lz-mobile-card-title{color:#fff}a[data-accent]>div{background-color:#ffffff!important;border-color:#e5e5e5!important;border-width:2px!important;border-style:solid!important}html[class~=\"dark\"] a[data-accent]>div{background-color:#0a0a0a!important;border-color:#2b2b2b!important}a[data-accent] h3{color:#171717!important;font-weight:600!important}html[class~=\"dark\"] a[data-accent] h3{color:#fafafa!important}a[data-accent] p{color:#525252!important}html[class~=\"dark\"] a[data-accent] p{color:#a1a1a1!important}a[data-accent] svg:last-child{color:#a1a1a1!important}html[class~=\"dark\"] a[data-accent] svg:last-child{color:#525252!important}a[data-accent=\"purple\"]:hover h3{color:#9333ea!important}html[class~=\"dark\"] a[data-accent=\"purple\"]:hover h3{color:#c084fc!important}a[data-accent=\"purple\"]:hover>div{border-color:#9333ea!important}html[class~=\"dark\"] a[data-accent=\"purple\"]:hover>div{border-color:#c084fc!important}a[data-accent=\"purple\"]:hover svg:last-child{color:#9333ea!important}html[class~=\"dark\"] a[data-accent=\"purple\"]:hover svg:last-child{color:#c084fc!important}a[data-accent=\"stargate\"]:hover h3{color:#10a073!important}html[class~=\"dark\"] a[data-accent=\"stargate\"]:hover h3{color:#0fb983!important}a[data-accent=\"stargate\"]:hover>div{border-color:#10a073!important}html[class~=\"dark\"] a[data-accent=\"stargate\"]:hover>div{border-color:#0fb983!important}a[data-accent=\"stargate\"]:hover svg:last-child{color:#10a073!important}html[class~=\"dark\"] a[data-accent=\"stargate\"]:hover svg:last-child{color:#0fb983!important}a[data-accent=\"gray\"]:hover h3{color:#525252!important}html[class~=\"dark\"] a[data-accent=\"gray\"]:hover h3{color:#d4d4d4!important}a[data-accent=\"gray\"]:hover>div{border-color:#a1a1a1!important}html[class~=\"dark\"] a[data-accent=\"gray\"]:hover>div{border-color:#525252!important}a[data-accent=\"gray\"]:hover svg:last-child{color:#525252!important}html[class~=\"dark\"] a[data-accent=\"gray\"]:hover svg:last-child{color:#d4d4d4!important}"}],"page":{"pagePath":"v2/developers/tempo/how-to/support-ofts-and-oapps","slug":"/v2/developers/tempo/how-to/support-ofts-and-oapps","pageMetadata":{"title":"Support OFTs and OApps on Tempo","sidebarTitle":"Support OFTs and OApps","description":"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.","keywords":["LayerZero","Tempo","OFT","OApp","OFTAlt","LZD","integration"],"lastUpdated":"2026-02-23","author":"LayerZero","schema":"HowTo","related":["/v2/developers/tempo/reference/lz-endpoint-dollar","/v2/developers/tempo/reference/oft-vs-oftalt","/v2/developers/tempo/overview"],"href":"/v2/developers/tempo/how-to/support-ofts-and-oapps"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,ul:`ul`,..._provideComponents(),...props.components},{CodeBlock,Heading,Table,Tip,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Tip)_missingMdxReference(`Tip`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`does-my-existing-oft/oapp-work-on-tempo`,children:`Does my existing OFT/OApp work on Tempo?`}),`\n`,_jsxs(_components.p,{children:[`Yes. Source-chain contracts remain unchanged, `,_jsx(_components.strong,{children:`but`}),` the Tempo side requires Alt contract variants and pays fees in LZD instead of `,_jsx(_components.code,{children:`msg.value`}),`. The message format, pathway configuration, and security model are the same.`]}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Source-chain contracts may need updated `,_jsx(_components.code,{children:`enforcedOptions`}),` to account for Tempo’s higher gas costs. See `,_jsx(_components.a,{href:`#what-changes-on-tempo`,children:`what changes on Tempo`}),` below.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`what-changes-on-tempo`,children:`What changes on Tempo`}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`/v2/developers/tempo/overview`,children:`overview`}),` for how each standard LayerZero component maps to its Tempo equivalent. The key changes relevant to OFT/OApp integrations:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`OFT/OApp contracts`}),` are replaced by their Alt variants: `,_jsx(_components.a,{href:`/v2/developers/tempo/reference/oft-vs-oftalt#choosing-the-right-contract`,children:`OFTAlt, OFTAdapterAlt`}),`, `,_jsx(_components.a,{href:`/v2/developers/tempo/reference/tip-20-token-standard#integration-with-oftalt`,children:`OFTBurnSelfMintAlt`}),`, or `,_jsx(_components.a,{href:`/v2/developers/evm/evm-variants/evm-compatible-variants`,children:`OAppAlt`}),` depending on your use case`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Fees`}),` are paid in `,_jsx(_components.a,{href:`/v2/developers/tempo/reference/lz-endpoint-dollar`,children:`LZD`}),` instead of `,_jsx(_components.code,{children:`msg.value`}),` (this is because Tempo has no native gas token). You must wrap a stablecoin into LZD and approve the OFT before calling `,_jsx(_components.code,{children:`send{value: 0}()`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Native drop`}),` is not supported (`,_jsx(_components.code,{children:`addExecutorNativeDropOption`}),` reverts)`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Gas costs are higher`}),` on Tempo for certain operations (state creation, new accounts). Set custom `,_jsx(_components.code,{children:`enforcedOptions`}),` with higher gas limits for `,_jsx(_components.code,{children:`lzReceive`}),` when Tempo is the destination. See `,_jsx(_components.a,{href:`https://docs.tempo.xyz/protocol/tips/tip-1010`,children:`TIP-1010`}),` for the full gas schedule`]}),`\n`]}),`\n`,_jsx(Heading,{level:`2`,id:`sending-from-other-chains-to-tempo`,children:`Sending from other chains to Tempo`}),`\n`,_jsxs(_components.p,{children:[`When sending `,_jsx(_components.strong,{children:`to`}),` Tempo from another chain, the normal fee model applies on the source chain:`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsx(_components.li,{children:`Pay fees in the source chain’s native token (ETH, MATIC, etc.) as usual`}),`\n`,_jsx(_components.li,{children:`No LZD is needed on the source chain`}),`\n`,_jsx(_components.li,{children:`The receiver on Tempo does not pay anything to receive the message`}),`\n`]}),`\n`,_jsx(_components.p,{children:`No changes are required to your existing OFT/OApp contracts on the source chain.`}),`\n`,_jsx(Heading,{level:`2`,id:`sending-from-tempo-to-other-chains`,children:`Sending from Tempo to other chains`}),`\n`,_jsxs(_components.p,{children:[`When sending `,_jsx(_components.strong,{children:`from`}),` Tempo, you pay the LayerZero fee in LZD. There are two approaches:`]}),`\n`,_jsx(Heading,{level:`3`,id:`direct-flow-1-view-call-+-5-transactions`,children:`Direct flow (1 view call + 5 transactions)`}),`\n`,_jsx(CodeBlock,{filename:``,wrap:`true`,numberOfLines:`17`,language:`solidity`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`solidity`,children:_jsxs(_components.code,{language:`solidity`,numberOfLines:`17`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. Quote the fee (view call)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`MessagingFee `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`memory`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fee `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oft.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`quoteSend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(sendParam, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Approve the asset token to the OFT (bridge amount)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`IERC20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(usdce).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`approve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(oft), sendParam.amountLD);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 3. Approve the fee token to LZD (fee amount)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`IERC20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(usdce).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`approve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(lzd), fee.nativeFee);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 4. Wrap stablecoin into LZD (token must be whitelisted by LZD)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`lzd.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`wrap`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(usdce, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`msg.sender`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, fee.nativeFee);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 5. Approve LZD to the OFT (fee amount)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`IERC20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(lzd).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`approve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(oft), fee.nativeFee);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 6. Send with msg.value = 0`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`oft.send{value`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}(sendParam, fee, refundAddress);`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`3`,id:`wrapper-flow-1-view-call-+-2-transactions`,children:`Wrapper flow (1 view call + 2 transactions)`}),`\n`,_jsx(_components.p,{children:`The TempoOFTWrapper simplifies this by handling wrapping, approvals, and sending in a single transaction:`}),`\n`,_jsx(CodeBlock,{filename:``,wrap:`true`,numberOfLines:`13`,language:`solidity`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`solidity`,children:_jsxs(_components.code,{language:`solidity`,numberOfLines:`13`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 1. Quote the fee`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`MessagingFee `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`memory`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fee `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` oft.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`quoteSend`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(sendParam, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`false`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 2. Approve the fee token to the wrapper (bridge amount + messaging fee)`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`IERC20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(usdce).`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`approve`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(wrapper), sendParam.amountLD `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`+`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fee.nativeFee);`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// 3. Call sendOFT: wrapper handles wrap, approve, and send atomically`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`wrapper.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`sendOFT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` address`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(oft), `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// OFT contract`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` usdce, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// fee token (whitelisted stablecoin)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` sendParam, `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// standard send parameters`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fee.nativeFee `}),_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`// max acceptable fee (reverts if re-quote exceeds this)`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`The wrapper:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`Pulls tokens from the caller:`,`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Same token`}),` (e.g., USDC.e for both bridging and fees): pulls `,_jsx(_components.code,{children:`amountLD + nativeFee`}),` in a single transfer`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Different tokens`}),` (e.g., bridging EURC.e, fees in USDC.e): pulls `,_jsx(_components.code,{children:`amountLD`}),` and `,_jsx(_components.code,{children:`nativeFee`}),` separately, requiring two approvals`]}),`\n`]}),`\n`]}),`\n`,_jsx(_components.li,{children:`Wraps the fee portion into LZD`}),`\n`,_jsx(_components.li,{children:`Approves LZD to the OFT`}),`\n`,_jsxs(_components.li,{children:[`Calls `,_jsx(_components.code,{children:`oft.send()`}),` with the correct fee`]}),`\n`,_jsxs(_components.li,{children:[`Reverts the entire transaction if the re-quoted fee exceeds `,_jsx(_components.code,{children:`maxNativeFee`})]}),`\n`]}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`You can preflight with an `,_jsx(_components.code,{children:`eth_call`}),` to `,_jsx(_components.code,{children:`sendOFT`}),` to obtain\n`,_jsx(_components.code,{children:`oftReceipt.amountSentLD`}),` before sending the live transaction, and avoid dust.`]})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`If the bridged token differs from the fee token (e.g., bridging EURC.e but paying fees in USDC.e), you will need to approve the asset token and fee token to the wrapper separately before calling `,_jsx(_components.code,{children:`sendOFT`}),`.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`with-the-value-transfer-api-stargate-frontend`,children:`With the Value Transfer API (Stargate frontend)`}),`\n`,_jsxs(_components.p,{children:[`The Stargate frontend builds its transfers with the `,_jsx(_components.a,{href:`/v2/developers/value-transfer-api/overview`,children:`Value Transfer API`}),`, so on Tempo it uses the API’s contracts, LZMultiCall and TransferDelegate. The user first approves TransferDelegate in a separate transaction. In the bridge step, LZMultiCall pulls the tokens through TransferDelegate, makes the LZD wrap and approval calls itself, and calls the OFT. Those approvals let the OFT spend tokens that LZMultiCall holds; they do not replace the user’s approval.`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Contract`}),_jsx(_components.th,{children:`Address`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`LZMultiCall`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x4683ce822272cd66cea73f5f1f9f5cbcaef4f066`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`TransferDelegate`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x3c18440268a78d651a3847653692fc82c31731c9`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`TempoOFTWrapper`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0xbb95daf376cd63f258d7c37a4efe57c10055e8e0`})})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`LZEndpointDollar`}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`0x0ceb237e109ee22374a567c6b09f373c73fa4cbb`})})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`common-pitfalls`,children:`Common pitfalls`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`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 `,_jsx(_components.code,{children:`LZD.wrap()`}),` to obtain fee tokens.`]}),`\n`,_jsxs(_components.li,{children:[_jsxs(_components.strong,{children:[`Wrapper becomes `,_jsx(_components.code,{children:`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.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Fee token must be a whitelisted stablecoin, not LZD.`}),` The `,_jsx(_components.code,{children:`feeToken`}),` passed to the wrapper must be a 6-decimal stablecoin whitelisted by LZD (pathUSD, USDC.e, or USDT0). Passing LZD itself reverts.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`See the `,_jsx(_components.a,{href:`/v2/developers/tempo/reference/lz-endpoint-dollar#failure-modes`,children:`LZD reference failure modes table`}),` for a complete list of revert reasons.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Support OFTs and OApps on Tempo","sidebarTitle":"Support OFTs and OApps","description":"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.","keywords":["LayerZero","Tempo","OFT","OApp","OFTAlt","LZD","integration"],"lastUpdated":"2026-02-23","author":"LayerZero","schema":"HowTo","related":["/v2/developers/tempo/reference/lz-endpoint-dollar","/v2/developers/tempo/reference/oft-vs-oftalt","/v2/developers/tempo/overview"],"href":"/v2/developers/tempo/how-to/support-ofts-and-oapps"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Does my existing OFT/OApp work on Tempo?","slug":"does-my-existing-oft/oapp-work-on-tempo","depth":2,"children":[]},{"title":"What changes on Tempo","slug":"what-changes-on-tempo","depth":2,"children":[]},{"title":"Sending from other chains to Tempo","slug":"sending-from-other-chains-to-tempo","depth":2,"children":[]},{"title":"Sending from Tempo to other chains","slug":"sending-from-tempo-to-other-chains","depth":2,"children":[{"title":"Direct flow (1 view call + 5 transactions)","slug":"direct-flow-1-view-call-+-5-transactions","depth":3,"children":[]},{"title":"Wrapper flow (1 view call + 2 transactions)","slug":"wrapper-flow-1-view-call-+-2-transactions","depth":3,"children":[]},{"title":"With the Value Transfer API (Stargate frontend)","slug":"with-the-value-transfer-api-stargate-frontend","depth":3,"children":[]}]},{"title":"Common pitfalls","slug":"common-pitfalls","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/_mintlify/custom/layerzero/355391ae19c1d258/accessibility.js","/_mintlify/custom/layerzero/714d41473c4c265e/posthog.js","/_mintlify/custom/layerzero/747cfa09f827dae8/snippets/contractAbis.js","/_mintlify/custom/layerzero/78c1baa1725ddc48/scripts/generate-chain-pages.js","/_mintlify/custom/layerzero/98fbe937cdf12e02/scripts/update-deployments/constants.js","/_mintlify/custom/layerzero/27a2c22e239bd904/scripts/update-deployments/index.js"],"subdomain":"layerzero","siteName":"LayerZero","title":"Support OFTs and OApps on Tempo - LayerZero","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-11-10T21:24:04.189Z","originalFileLocation":"v2/developers/tempo/how-to/support-ofts-and-oapps.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"dark\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\">\u003cmeta data-mint-head name=\"application-name\" content=\"LayerZero\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Support OFTs and OApps on Tempo - LayerZero\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"LayerZero Documentation\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://layerzero.mintlify.site/_mintlify/api/og/v2?division=How-To\u0026amp;title=Support+OFTs+and+OApps+on+Tempo\u0026amp;description=How+to+adapt+OFT+and+OApp+deployments+for+Tempo%3A+fee+payment+with+LZD%2C+OFTAlt+contracts%2C+and+the+TempoOFTWrapper+flow.\u0026amp;theme=4ff8e107cd9daccb3719eb18\u0026amp;signature=d69ca76abbf1a2569d1bb7c5d9fa6e7da9762aa25afe30859fa7b3520a8a01b8\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Support OFTs and OApps on Tempo - LayerZero\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://layerzero.mintlify.site/_mintlify/api/og/v2?division=How-To\u0026amp;title=Support+OFTs+and+OApps+on+Tempo\u0026amp;description=How+to+adapt+OFT+and+OApp+deployments+for+Tempo%3A+fee+payment+with+LZD%2C+OFTAlt+contracts%2C+and+the+TempoOFTWrapper+flow.\u0026amp;theme=4ff8e107cd9daccb3719eb18\u0026amp;signature=d69ca76abbf1a2569d1bb7c5d9fa6e7da9762aa25afe30859fa7b3520a8a01b8\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/layerzero/kyEYRB05_wMqZ8Gi/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"LayerZero\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#c084fc\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/v2/developers/tempo/how-to/support-ofts-and-oapps.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.layerzero.network/#organization\",\"name\":\"LayerZero\",\"url\":\"https://docs.layerzero.network\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/layerzero/MzSiOdXt8xlDlEr4/images/LayerZero_Logo_Black.svg?fit=max\u0026auto=format\u0026n=MzSiOdXt8xlDlEr4\u0026q=85\u0026s=091b05c7556f6e8e948d613c2abf58cb\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.layerzero.network#website\",\"name\":\"LayerZero\",\"url\":\"https://docs.layerzero.network\",\"publisher\":{\"@id\":\"https://docs.layerzero.network/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps#webpage\",\"url\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps\",\"name\":\"Support OFTs and OApps on Tempo\",\"description\":\"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\",\"dateModified\":\"2026-11-10T21:24:04.189Z\",\"isPartOf\":{\"@id\":\"https://docs.layerzero.network#website\"},\"breadcrumb\":{\"@id\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"LayerZero\",\"item\":\"https://docs.layerzero.network\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Support OFTs and OApps on Tempo\",\"item\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps#article\",\"headline\":\"Support OFTs and OApps on Tempo\",\"name\":\"Support OFTs and OApps on Tempo\",\"description\":\"How to adapt OFT and OApp deployments for Tempo: fee payment with LZD, OFTAlt contracts, and the TempoOFTWrapper flow.\",\"url\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps\",\"mainEntityOfPage\":{\"@id\":\"https://docs.layerzero.network/v2/developers/tempo/how-to/support-ofts-and-oapps#webpage\"},\"dateModified\":\"2026-11-10T21:24:04.189Z\",\"keywords\":\"LayerZero, Tempo, OFT, OApp, OFTAlt, LZD, integration\",\"publisher\":{\"@id\":\"https://docs.layerzero.network/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.layerzero.network#website\"}}]}\u003c/script>","agentPointerHref":"/v2/developers/tempo/how-to/support-ofts-and-oapps.md","siteName":"LayerZero","nav":{"global":{"anchors":[{"anchor":"Blog","icon":"newspaper","href":"https://layerzero.network/blog"},{"anchor":"GitHub","icon":"github","href":"https://github.com/LayerZero-Labs"}]},"tabs":[{"tab":"Home","pages":[{"title":"Home","href":""}]},{"tab":"Get Started","pages":[{"title":"Get Started","href":"/v2/get-started/overview"}]},{"tab":"Core Concepts","pages":[{"title":"Core Concepts","href":"/v2/concepts/getting-started/what-is-layerzero"}]},{"tab":"Developers","menu":[{"item":"Zero","icon":"circle","pages":[{"title":"Zero","href":"/chain"}]},{"item":"EVM","icon":"circle","pages":[{"title":"EVM","href":"/v2/developers/evm/overview"}]},{"item":"Solana","icon":"circle","pages":[{"title":"Solana","href":"/v2/developers/solana/overview"}]},{"item":"Starknet","icon":"https://mintlify.s3.us-west-1.amazonaws.com/layerzero/images/icons/starknet.svg","pages":[{"title":"Starknet","href":"/v2/developers/starknet/overview"}]},{"item":"Aptos Move","icon":"code","pages":[{"title":"Aptos Move","href":"/v2/developers/aptos-move/overview"}]},{"item":"Hyperliquid","icon":"droplet","pages":[{"title":"Hyperliquid","href":"/v2/developers/hyperliquid/hyperliquid-concepts"}]},{"item":"Sui","icon":"waves","pages":[{"title":"Sui","href":"/v2/developers/sui/overview"}]},{"item":"Stellar","icon":"star","pages":[{"title":"Stellar","href":"/v2/developers/stellar/overview"}]},{"item":"IOTA L1","icon":"hexagon","pages":[{"title":"IOTA L1","href":"/v2/developers/iota/overview"}]},{"item":"Canton","icon":"circle","pages":[{"title":"Canton","href":"/v2/developers/canton/overview"}]},{"item":"Tempo","icon":"circle","groups":[{"group":"LayerZero for Tempo","pages":[{"title":"LayerZero on Tempo","sidebarTitle":"Overview","description":"Overview of LayerZero on Tempo, an EVM-compatible chain with no native gas token, using LZEndpointDollar for all messaging fees.","href":"/v2/developers/tempo/overview"}]},{"group":"How-To","pages":[{"title":"Support OFTs and OApps on Tempo","sidebarTitle":"Support OFTs and OApps","href":"/v2/developers/tempo/how-to/support-ofts-and-oapps"}]},{"group":"Reference","pages":[{"title":"LZEndpointDollar (LZD)","sidebarTitle":"LZEndpointDollar (LZD)","description":"Reference for LZEndpointDollar, the canonical USD-denominated fee token used by LayerZero on Tempo.","href":"/v2/developers/tempo/reference/lz-endpoint-dollar"},{"title":"OFT and OApp Alt Variants on Tempo","sidebarTitle":"Alt Variants (OFTAlt \u0026 OAppAlt)","href":"/v2/developers/tempo/reference/oft-vs-oftalt"},{"title":"TIP-20 Token Standard","sidebarTitle":"TIP-20 Token Standard","href":"/v2/developers/tempo/reference/tip-20-token-standard"},{"title":"Stargate UX on Tempo","sidebarTitle":"Stargate UX","href":"/v2/developers/tempo/reference/stargate-ux"}]}]},{"item":"Value Transfer API","icon":"arrow-right-arrow-left","pages":[{"title":"Value Transfer API","href":"/v2/developers/value-transfer-api/start"}]}]},{"tab":"Contracts \u0026 Deployments","menu":[{"item":"V2 Deployments","icon":"file-text","pages":[{"title":"V2 Deployments","href":"/v2/deployments/deployed-contracts"}]},{"item":"V1 Deployments","icon":"file-code","pages":[{"title":"V1 Deployments","href":"/v1/deployments/deployed-contracts"}]},{"item":"Developer Tools","icon":"wrench","pages":[{"title":"Developer Tools","href":"/v2/tools/overview"}]},{"item":"DVN \u0026 Executor Reference","icon":"shield-halved","pages":[{"title":"DVN \u0026 Executor Reference","href":"/v2/workers/overview"}]}],"pages":[{"title":"Contracts \u0026 Deployments","href":"/v2/deployments/deployed-contracts"}]}]},"basePath":"","title":"Support OFTs and OApps on Tempo - LayerZero","buildId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","deploymentId":"dpl_G2Qd45vZZ7MkBiGF9yYx8ZsbbKXX","dynamics":[],"chunks":[]}