Add Boundless to the enforced verification path in one tx.
This is the shape of the change — exact values (DVN address, current DVN set, destination EIDs) depend on your OApp. LayerZero calls this an optional DVN in config. With optionalDVNThreshold = 1, Boundless becomes part of the enforced verification path for every message. We walk it together on a 20-minute call and hand you a ready-to-sign Forge script.
1. Grab the deployed DVN addresses.
Boundless DVN contracts are deployed per destination chain. We publish the 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 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 the Boundless DVN attest, 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 — they depend on your volume profile and go-live timeline. If you're interested, book a 20-minute calland we'll walk through the terms alongside a testnet demo wired to a copy of your OApp.