Add Boundless-DVN to the enforced verification path in one tx.
This page covers the LayerZero implementation surface available today. Exact values depend on your OApp, route, and current DVN set. LayerZero calls this an optional DVN in config. With optionalDVNThreshold = 1, Boundless-DVN becomes part of the enforced verification path while your existing DVNs stay in place. We walk it together on a 20-minute call and hand you a ready-to-sign Forge script.
1. Grab the current destination-side addresses.
Boundless-DVN contracts are deployed per destination chain for the current LayerZero path. We publish the live testnet addresses so you don't have to deploy anything yourself.
2. Update your ULN config.
LayerZero V2 stores a DVN config per (OApp, library, remote EID). You update the receiveLib config on each destination chain your OApp uses.
// --- Solidity (Foundry/Forge script) ---
import { ILayerZeroEndpointV2 } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/ILayerZeroEndpointV2.sol";
import { SetConfigParam } from "@layerzerolabs/lz-evm-protocol-v2/contracts/interfaces/IMessageLibManager.sol";
struct UlnConfig {
uint64 confirmations;
uint8 requiredDVNCount;
uint8 optionalDVNCount;
uint8 optionalDVNThreshold;
address[] requiredDVNs;
address[] optionalDVNs;
}
address constant BOUNDLESS_DVN = 0x0000_0000_0000_0000_0000_0000_0000_9AF2;
address constant LZ_LABS_DVN = 0x589D_1E4B_5ECB_C0B8_5BE8_1234_5678_5BE8; // your current required DVN
address[] memory reqs = new address[](1); reqs[0] = LZ_LABS_DVN;
address[] memory opts = new address[](1); opts[0] = BOUNDLESS_DVN;
UlnConfig memory cfg = UlnConfig({
confirmations: 15,
requiredDVNCount: 1,
optionalDVNCount: 1,
optionalDVNThreshold: 1, // 1-of-1 optional DVNs must verify
requiredDVNs: reqs,
optionalDVNs: opts
});
SetConfigParam[] memory params = new SetConfigParam[](1);
params[0] = SetConfigParam({
eid: BASE_EID,
configType: 2, // 2 = ULN config
config: abi.encode(cfg)
});
ILayerZeroEndpointV2(ENDPOINT_V2).setConfig(
oapp,
receiveLib302, // ReceiveUln302 on this chain
params
);optionalDVNThreshold = 1 means a message cannot commit without the Boundless-DVN attestation. It does not remove or modify your current DVNs — all existing security continues to apply.3. Verify on testnet first.
Run the same setConfig on Ethereum Sepolia → Base Sepolia. Send a test OFT transfer, watch Boundless-DVN attest, and confirm the packet delivers. Addresses and a reference script live in our sample repo.
# Clone the reference scripts git clone git@github.com:boundless-xyz/dvn-integration-example.git cd dvn-integration-example # Fill in your OApp + destination endpoint cp .env.example .env # Run the config update (testnet) forge script script/SetConfig.s.sol \ --rpc-url $BASE_SEPOLIA_RPC_URL \ --broadcast # Send a test OFT message end-to-end bun run scripts/send-test-oft.ts
Pricing.
Support.
Integration support, dedicated Slack/Telegram channels, and SLA-backed on-call aren't described in detail here because they depend on your route mix and go-live timeline. If you're interested, book a 20-minute calland we'll walk through the terms alongside a testnet alpha wired to a copy of your OApp.