Homepage | Docs | Developers
Quickstart | Configuration | Message Execution Options | Endpoint, MessageLib, & Executor Addresses | DVN Addresses
Template project for getting started with LayerZero's OFT
contract standard.
So What is an Omnichain Fungible Token?
The Omnichain Fungible Token (OFT) Standard is an ERC20 token that can be transferred across multiple blockchains without asset wrapping or middlechains.
Some additional points for developers/builders to be aware of when deploying your LZ V2 OFT or working through troubleshooting:
- run
npx hardhat lz:oft:send --contract-a <CONTRACT_A> --recipient-b <RECIPIENT_B> --network-a <NETWORK_A> --network-b <NETWORK_B> --amount <AMOUNT> --private-key <PRIVATE_KEY>
to use the Hardhat task from the index.ts file in the tasks directory - this ensures you are estimating the gas fees properly. This task is more efficient and reliable as it has added handling for gas price and nonce to avoid the "replacement transaction underpriced" error. It also includes private key as a parameter for the task to use the correct wallet for signing transactions.
- start with
npx create-lz-app-oapp@latest
- use pnpm as your package manager
- run
pnpm install
- create your OFT contract to your requirements for your use case.
- run
pnpm compile:hardhat
- run
npx hardhat lz:deploy
- run
pnpm install --save-dev @nomicfoundation/hardhat-verify
- run
npx hardhat verify --network arbitrum
(+ your constructor arguments: which should be the 1. name 2. symbol 3. LZ endpoint 4. delegate address - (complete the above task for each chain you deploy your OFT to.)
- run
npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts
- Make sure you have a Hardhat task created to send tokens cross-chain
- run
npx hardhat lz:oft:send --contract-a <contract-a> --recipient-b <recipient-address-chain-b> --network-a <network> --network-b <network> --amount <amount>
The future is Omnichain!
This standard works by combining the LayerZero OApp Contract Standard with the ERC20 _burn
method, to initiate omnichain send transfers on the source chain, sending a message via the LayerZero protocol, and delivering a function call to the destination contract to _mint
the same number of tokens burned, creating a unified supply across all networks connected.
Read more about what you can do with OFTs by reading the OFT Quickstart in the LayerZero Documentation.
LayerZero Devtools provides several helper hardhat tasks to easily deploy, verify, configure, connect, and send OFTs cross-chain.
npx hardhat lz:deploy
Deploys your contract to any of the available networks in your hardhat.config.ts
when given a deploy tag (by default contract name) and returns a list of available networks to select for the deployment. For specifics around all deployment options, please refer to the Deploying Contracts section of the documentation. LayerZero's lz:deploy
utilizes hardhat-deploy
.
'arbitrum-sepolia': {
eid: EndpointId.ARBSEP_V2_TESTNET,
url: process.env.RPC_URL_ARBSEP_TESTNET,
accounts,
},
'base-sepolia': {
eid: EndpointId.BASESEP_V2_TESTNET,
url: process.env.RPC_URL_BASE_TESTNET,
accounts,
},
npx hardhat lz:oapp:config:init --oapp-config YOUR_OAPP_CONFIG --contract-name CONTRACT_NAME
Initializes a layerzero.config.ts
file for all available pathways between your hardhat networks with the current LayerZero default placeholder settings. This task can be incredibly useful for correctly formatting your config file.
You can run this task by providing the contract-name
you want to set for the config and file-name
you want to generate:
npx hardhat lz:oapp:config:init --contract-name CONTRACT_NAME --oapp-config FILE_NAME
This will create a layerzero.config.ts
in your working directory populated with your contract name and connections for every pathway possible between your hardhat networks:
import { EndpointId } from '@layerzerolabs/lz-definitions'
const arbsepContract = {
eid: EndpointId.ARBSEP_V2_TESTNET,
contractName: 'MyOFT',
}
const sepoliaContract = {
eid: EndpointId.SEPOLIA_V2_TESTNET,
contractName: 'MyOFT',
}
export default {
contracts: [{ contract: arbsepContract }, { contract: sepoliaContract }],
connections: [
{
from: arbsepContract,
to: sepoliaContract,
config: {
sendLibrary: '0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E',
receiveLibraryConfig: { receiveLibrary: '0x75Db67CDab2824970131D5aa9CECfC9F69c69636', gracePeriod: 0 },
sendConfig: {
executorConfig: { maxMessageSize: 10000, executor: '0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897' },
ulnConfig: {
confirmations: 1,
requiredDVNs: ['0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8'],
optionalDVNs: [],
optionalDVNThreshold: 0,
},
},
// receiveConfig: {
// ulnConfig: {
// confirmations: 2,
// requiredDVNs: ['0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8'],
// optionalDVNs: [],
// optionalDVNThreshold: 0,
// },
// },
},
},
{
from: sepoliaContract,
to: arbsepContract,
config: {
sendLibrary: '0xcc1ae8Cf5D3904Cef3360A9532B477529b177cCE',
receiveLibraryConfig: { receiveLibrary: '0xdAf00F5eE2158dD58E0d3857851c432E34A3A851', gracePeriod: 0 },
// sendConfig: {
// executorConfig: { maxMessageSize: 10000, executor: '0x718B92b5CB0a5552039B593faF724D182A881eDA' },
// ulnConfig: {
// confirmations: 2,
// requiredDVNs: ['0x8eebf8b423B73bFCa51a1Db4B7354AA0bFCA9193'],
// optionalDVNs: [],
// optionalDVNThreshold: 0,
// },
// },
receiveConfig: {
ulnConfig: {
confirmations: 1,
requiredDVNs: ['0x8eebf8b423B73bFCa51a1Db4B7354AA0bFCA9193'],
optionalDVNs: [],
optionalDVNThreshold: 0,
},
},
},
},
],
}
npx hardhat lz:oapp:config:wire --oapp-config YOUR_OAPP_CONFIG
Calls the configuration functions between your deployed OApp contracts on every chain based on the provided layerzero.config.ts
.
Running lz:oapp:wire
will make the following function calls per pathway connection for a fully defined config file using your specified settings and your environment variables (Private Keys and RPCs):
To use this task, run:
npx hardhat lz:oapp:wire --oapp-config YOUR_LAYERZERO_CONFIG_FILE
Whenever you make changes to the configuration, run lz:oapp:wire
again. The task will check your current configuration, and only apply NEW changes.
To use a Gnosis Safe multisig as the signer for these transactions, add the following to each network in your hardhat.config.ts
and add the --safe
flag to lz:oapp:wire --safe
:
// hardhat.config.ts
networks: {
// Include configurations for other networks as needed
fuji: {
/* ... */
// Network-specific settings
safeConfig: {
safeUrl: 'http://something', // URL of the Safe API, not the Safe itself
safeAddress: 'address'
}
}
}
npx hardhat lz:oapp:config:get --oapp-config YOUR_OAPP_CONFIG
Returns your current OApp's configuration for each chain and pathway in 3 columns:
-
Custom Configuration: the changes that your
layerzero.config.ts
currently has set -
Default Configuration: the default placeholder configuration that LayerZero provides
-
Active Configuration: the active configuration that applies to the message pathway (Defaults + Custom Values)
If you do NOT explicitly set each configuration parameter, your OApp will fallback to the placeholder parameters in the default config.
ββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β β Custom OApp Config β Default OApp Config β Active OApp Config β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β localNetworkName β arbsep β arbsep β arbsep β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β remoteNetworkName β sepolia β sepolia β sepolia β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β sendLibrary β 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E β 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E β 0x4f7cd4DA19ABB31b0eC98b9066B9e857B1bf9C0E β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β receiveLibrary β 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 β 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 β 0x75Db67CDab2824970131D5aa9CECfC9F69c69636 β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β sendUlnConfig β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β confirmations β 1 β β β confirmations β 1 β β β confirmations β 1 β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β
β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β β β β β β β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β optionalDVNs β β β β optionalDVNs β β β β optionalDVNs β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β optionalDVNThreshold β 0 β β β optionalDVNThreshold β 0 β β β optionalDVNThreshold β 0 β β
β β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β sendExecutorConfig β ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β
β β β executor β 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 β β β executor β 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 β β β executor β 0x5Df3a1cEbBD9c8BA7F8dF51Fd632A9aef8308897 β β
β β ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β maxMessageSize β 10000 β β β maxMessageSize β 10000 β β β maxMessageSize β 10000 β β
β β ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β
β β β β β
ββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββΌββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β receiveUlnConfig β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β confirmations β 2 β β β confirmations β 2 β β β confirmations β 2 β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β β requiredDVNs β βββββ¬βββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β β β β 0 β 0x53f488E93b4f1b60E8E83aa374dBe1780A1EE8a8 β β β
β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β β β βββββ΄βββββββββββββββββββββββββββββββββββββββββββββ β β
β β β β β β β β β β β β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β optionalDVNs β β β β optionalDVNs β β β β optionalDVNs β β β
β β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β ββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β
β β β optionalDVNThreshold β 0 β β β optionalDVNThreshold β 0 β β β optionalDVNThreshold β 0 β β
β β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β ββββββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β β β β
ββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
npx hardhat lz:oapp:config:get:executor --oapp-config YOUR_OAPP_CONFIG
Returns the LayerZero Executor config for each network in your hardhat.config.ts
. You can use this method to see the max destination gas in wei (nativeCap
) you can request in your execution options
.
βββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββ
β localNetworkName β mantle β
βββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€
β remoteNetworkName β polygon β
βββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββ€
β executorDstConfig β ββββββββββββββββββ¬ββββββββββββββββββββββββ β
β β β baseGas β 85000 β β
β β ββββββββββββββββββΌββββββββββββββββββββββββ€ β
β β β multiplierBps β 12000 β β
β β ββββββββββββββββββΌββββββββββββββββββββββββ€ β
β β β floorMarginUSD β 5000000000000000000 β β
β β ββββββββββββββββββΌββββββββββββββββββββββββ€ β
β β β nativeCap β 681000000000000000000 β β
β β ββββββββββββββββββ΄ββββββββββββββββββββββββ β
β β β
βββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββ
We recommend using pnpm
as a package manager (but you can of course use a package manager of your choice):
pnpm install
This project supports both hardhat
and forge
compilation. By default, the compile
command will execute both:
pnpm compile
If you prefer one over the other, you can use the tooling-specific commands:
pnpm compile:forge
pnpm compile:hardhat
Or adjust the package.json
to for example remove forge
build:
- "compile": "$npm_execpath run compile:forge && $npm_execpath run compile:hardhat",
- "compile:forge": "forge build",
- "compile:hardhat": "hardhat compile",
+ "compile": "hardhat compile"
Similarly to the contract compilation, we support both hardhat
and forge
tests. By default, the test
command will execute both:
pnpm test
If you prefer one over the other, you can use the tooling-specific commands:
pnpm test:forge
pnpm test:hardhat
Or adjust the package.json
to for example remove hardhat
tests:
- "test": "$npm_execpath test:forge && $npm_execpath test:hardhat",
- "test:forge": "forge test",
- "test:hardhat": "$npm_execpath hardhat test"
+ "test": "forge test"
Set up deployer wallet/account:
- Rename
.env.example
->.env
- Choose your preferred means of setting up your deployer wallet/account:
MNEMONIC="test test test test test test test test test test test junk"
or...
PRIVATE_KEY="0xabc...def"
- Fund this address with the corresponding chain's native tokens you want to deploy to.
To deploy your contracts to your desired blockchains, run the following command in your project's folder:
npx hardhat lz:deploy
More information about available CLI arguments can be found using the --help
flag:
npx hardhat lz:deploy --help
By following these steps, you can focus more on creating innovative omnichain solutions and less on the complexities of cross-chain communication.
Fill out your layerzero.config.ts
with the contracts you want to connect. You can generate the default config file for your declared hardhat networks by running:
npx hardhat lz:oapp:config:init --contract-name [YOUR_CONTRACT_NAME] --oapp-config [CONFIG_NAME]
Note
You may need to change the contract name if you're deploying multiple OApp contracts on different chains (e.g., OFT and OFT Adapter).
const ethereumContract: OmniPointHardhat = {
eid: EndpointId.ETHEREUM_V2_MAINNET,
contractName: "MyOFTAdapter",
};
const arbitrumContract: OmniPointHardhat = {
eid: EndpointId.ARBITRUM_V2_MAINNET,
contractName: "MyOFT",
};
Then define the pathway you want to create from and to each contract:
connections: [
// ETH <--> ARB PATHWAY: START
{
from: ethereumContract,
to: arbitrumContract,
},
{
from: arbitrumContract,
to: ethereumContract,
},
// ETH <--> ARB PATHWAY: END
];
Finally, define the config settings for each direction of the pathway:
connections: [
// ETH <--> ARB PATHWAY: START
{
from: ethereumContract,
to: arbitrumContract,
config: {
sendLibrary: contractsConfig.ethereum.sendLib302,
receiveLibraryConfig: {
receiveLibrary: contractsConfig.ethereum.receiveLib302,
gracePeriod: BigInt(0),
},
// Optional Receive Library Timeout for when the Old Receive Library Address will no longer be valid
receiveLibraryTimeoutConfig: {
lib: "0x0000000000000000000000000000000000000000",
expiry: BigInt(0),
},
// Optional Send Configuration
// @dev Controls how the `from` chain sends messages to the `to` chain.
sendConfig: {
executorConfig: {
maxMessageSize: 10000,
// The configured Executor address
executor: contractsConfig.ethereum.executor,
},
ulnConfig: {
// The number of block confirmations to wait on BSC before emitting the message from the source chain.
confirmations: BigInt(15),
// The address of the DVNs you will pay to verify a sent message on the source chain ).
// The destination tx will wait until ALL `requiredDVNs` verify the message.
requiredDVNs: [
contractsConfig.ethereum.horizenDVN, // Horizen
contractsConfig.ethereum.polyhedraDVN, // Polyhedra
contractsConfig.ethereum.animocaBlockdaemonDVN, // Animoca-Blockdaemon (only available on ETH <-> Arbitrum One)
contractsConfig.ethereum.lzDVN, // LayerZero Labs
],
// The address of the DVNs you will pay to verify a sent message on the source chain ).
// The destination tx will wait until the configured threshold of `optionalDVNs` verify a message.
optionalDVNs: [],
// The number of `optionalDVNs` that need to successfully verify the message for it to be considered Verified.
optionalDVNThreshold: 0,
},
},
// Optional Receive Configuration
// @dev Controls how the `from` chain receives messages from the `to` chain.
receiveConfig: {
ulnConfig: {
// The number of block confirmations to expect from the `to` chain.
confirmations: BigInt(20),
// The address of the DVNs your `receiveConfig` expects to receive verifications from on the `from` chain ).
// The `from` chain's OApp will wait until the configured threshold of `requiredDVNs` verify the message.
requiredDVNs: [
contractsConfig.ethereum.lzDVN, // LayerZero Labs DVN
contractsConfig.ethereum.animocaBlockdaemonDVN, // Blockdaemon-Animoca
contractsConfig.ethereum.horizenDVN, // Horizen Labs
contractsConfig.ethereum.polyhedraDVN, // Polyhedra
],
// The address of the `optionalDVNs` you expect to receive verifications from on the `from` chain ).
// The destination tx will wait until the configured threshold of `optionalDVNs` verify the message.
optionalDVNs: [],
// The number of `optionalDVNs` that need to successfully verify the message for it to be considered Verified.
optionalDVNThreshold: 0,
},
},
// Optional Enforced Options Configuration
// @dev Controls how much gas to use on the `to` chain, which the user pays for on the source `from` chain.
enforcedOptions: [
{
msgType: 1,
optionType: ExecutorOptionType.LZ_RECEIVE,
gas: 65000,
value: 0,
},
{
msgType: 2,
optionType: ExecutorOptionType.LZ_RECEIVE,
gas: 65000,
value: 0,
},
{
msgType: 2,
optionType: ExecutorOptionType.COMPOSE,
index: 0,
gas: 50000,
value: 0,
},
],
},
},
{
from: arbitrumContract,
to: ethereumContract,
},
// ETH <--> ARB PATHWAY: END
];
To set these config settings, run:
npx hardhat lz:oapp:wire --oapp-config layerzero.config.ts