Skip to main content
Version: Endpoint V2

Frequently Asked Questions (FAQ)

General

What is LayerZero and how does LayerZero Work?

LayerZero is an omnichain messaging protocol — a permissionless, open framework designed to securely move information between blockchains. It empowers any application to bring its own security, execution, and cross-chain interaction, providing a predictable and adaptable foundation for decentralized applications living on multiple networks.

For details on how it works, see the Protocol Overview.


Where can I find LayerZero contract examples?

The devtools repository contains contract examples across all supported VMs. It acts as the central hub for the LayerZero developer experience, including application contract standards, CLI examples, packages, scripting tools, and more.


What is the estimated delivery time for a LayerZero message?

The delivery time of a LayerZero message can be broken down into a series of processing stages. Every message goes through the following high-level steps:

  • Source Block Confirmations: The message waits for the source chain to finalize a specified number of block confirmations. To view the default configuration for a given pathway, refer to the default configs checker.

  • DVN/Verification: Each Decentralized Verifier Network (DVN) submits one transaction to verify the message.

  • Committer/Commit Verification: One additional transaction is required to commit the verified message.

  • Executor/Message Execution: A final transaction is submitted to execute the message on the destination chain.

Estimated Total Delivery Time You can estimate the total message delivery time with the following formula:

Total Time ≈ (sourceBlockTime × number of block confirmations) + (destinationBlockTime × (2 blocks + number of DVNs))

Note: This formula offers a rough estimate for a message that does not implement lzCompose. It assumes that each transaction is included in the next block without delay and does not factor in network latency, or other real-world conditions that may affect transaction processing time.


What's the difference between Delegate and Owner?

Delegate manages LayerZero protocol configurations via the LayerZero Endpoint contract.

Owner manages an OApp’s peers, ownership(transfer & revoke) and who the delegate is. Owner is defined on the OApp contract itself using OpenZeppelin's Ownable.

⚠️ Important Configuration Note for Using Devtools

The owner and delegate addresses should typically be the same. Assigning different accounts to these roles may result in an LZ_Unauthorized() error.

This is because the delegate can call most wire functions (like setPeer()), but only the owner can call setEnforcedOptions(). If the accounts differ and you attempt to call setEnforcedOptions() through the delegate, the call will fail.

Unless there's a specific need to separate permissions, it's recommended to use the same address for both owner and delegate to avoid unintended access issues.


Can I use the OFT standard if I already have tokens deployed across multiple chains?

While it is possible to integrate existing tokens deployed across multiple chains with the OFT standard, this requires additional setup.

Specifically, MintBurnOFTAdapter — a variant of OFTAdapter.sol enables OFT functionality by calling the mint and burn methods of the innerToken on each chain.

However, for this integration to work:

  • Each innerToken contract must expose externally callable mint and burn functions.
  • The innerToken must grant the MintBurnOFTAdapter the necessary permissions (MINTER_ROLE and BURNER_ROLE) to invoke these functions.

What is sharedDecimals? Can I override default sharedDecimals in an OFT contract?

The sharedDecimals is the "lowest common denominator" of decimal precision across all chains in the OFT system. It limits how many decimal places can be reliably represented when moving tokens cross‑chain.

By default, sharedDecimals is set to 6, which is sufficient for most use cases across different VMs. However, OApps can override this default if the OApp’s total token supply exceeds (2⁶⁴–1) / 10⁶.

⚠️ CAUTION:

If you override the vanilla sharedDecimals amount or have an existing token supply exceeding 18,446,744,073,709.551615 tokens, extra caution should be applied to ensure amountSD and amountLD do not overflow.

See more explanations here.


Why is my transaction expensive?

If you are using Sepolia as the destination chain, transaction costs can spike due to high and volatile gas prices on Sepolia. To avoid high fees during testing, it is recommended to use alternative testnets as the destination chain.

LayerZero's transaction pricing model is designed to fairly distribute costs across the various components that enable secure, reliable cross-chain messaging. Understanding this model helps developers and users make informed decisions about gas allocation and fee optimization.

Learn more: Transaction Pricing Model


Can I cancel verification of an in-flight message?

Yes. An OApp's delegate can call the skip() method on the endpoint to stop delivery. The skip function should be used only in instances where either message verification fails or must be stopped, not message execution. LayerZero provides separate handling for retrying or removing messages that have successfully been verified, but fail to execute.

Learn more: Skip Message Guide


What is “LZ Dead DVN”?

LZ Dead DVN Represents a Dead Decentralized Verifier Network (DVN). These contracts are placeholders used when the default LayerZero config is inactive and will require the OApp owner to manually configure the contract's config to use the pathway.

LayerZero allows anyone to permissionlessly run DVNs, but default providers (e.g. Google Cloud, Polyhedra) may not cover every chain immediately. If a pathway lacks default DVN support, OApps must explicitly configure supported DVNs on both the source and destination chains.

Error & Troubleshooting

How do I resolve the “Please set your OApp’s DVNs and/or Executor” error?

This error indicates that your OApp configuration is missing the required DVN and/or Executor settings.

On Mainnet, default DVNs are not guaranteed to be available for every pathway. OApps must explicitly configure supported DVNs on both the source and destination chains.

DVN Addresses can be found here.

To simplify setup, use simple config generator , which provides CLI commands for setting DVNs. Be sure to also consult the VM-specific configuration sections to complete your configurations properly.


What are the common causes for _quote() function failures?

Failures in _quote() often stem from:

  • Incomplete Network Pathway: Not all pathways are fully wired, especially on testnets. Contact LayerZero if you require support for a specific pathway.
  • Missing enforcedOptions or extraOptions: At least one must be set for a successful quote.
  • LZ Dead DVN: If your configuration includes LZ Dead DVN for a particular pathway, the quote will fail. OApps must configure DVNs explicitly on Mainnet.

What does "NotInitializable" mean on LayerZero Scan?

This status typically indicates that the destination OApp is either missing trusted peer settings or the pathway has not been properly initialized.

Common causes:

  • Incorrect peer configuration: Ensure that setPeer() is correctly called on both the source and destination chains during deployment. Double-check that the address format and EID (endpoint ID) are accurate.

  • Pathway not initialized correctly: Confirm that allowInitializePath() is properly implemented in your OApp contract. Learn more: Integration Checklist

On Solana, if you have a custom writing implementation, ensure that endpoint.initOAppNonce was called with the correct parameters.


Why is my message marked as “Blocked”?

A “Blocked” message usually points to configuration issues:

  • NotInitializable: Ensure peers are set correctly on both ends or pathway is initialized correctly as explained above.
  • DVN mismatch: All DVN providers must be the same on source and destination.
  • Block confirmations mismatch: Outbound confirmations must be ≥ inbound confirmations.

How do I prevent out-of-gas errors on the destination chain?

To avoid out-of-gas errors when executing lzReceive() on the destination:

  • Use enforcedOptions (set at the OApp/OFT contract level) to define a default gas value for all sends.
  • Use extraOptions (specified in the send function call) for transaction-specific overrides.

Both values must sum to at least the gas required by lzReceive() on the destination. It is also common to simply use enforcedOptions and set extraOptions to 0x.

If the destination message fails due to insufficient gas, you can retry it manually:

Ecosystem

Which projects are part of the LayerZero ecosystem?

You can explore the current list of projects on the Ecosystem page. This list is not exhaustive—projects can submit a request to be listed.


How can my project be listed on the ecosystem page?

Submit your application via the Ecosystem Listing Form if your dApp uses LayerZero for omnichain messaging.


Are there grants available for builders on LayerZero?

LayerZero does not have a traditional grant program. However, the LayerZero Foundation runs lzCatalyst, a program connecting top builders with leading VCs in the space.

More info: lzCatalyst Program