Boundless DVN
← Back to overview
What integration would look like

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.

Illustrative walkthrough. Code + addresses below are reference shapes, not a self-service integration. If this fits the problem you're solving, reach outand we'll send a config tailored to your OApp.
1Get the DVN address
2Call setConfig
3Verify on testnet

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.

Ethereum mainnet
eid 30101
0x0000_...9AF2 (to deploy)
Base
eid 30184
0x0000_...9AF2 (to deploy)
Optimism
eid 30111
0x0000_...9AF2 (to deploy)
Arbitrum
eid 30110
0x0000_...9AF2 (to deploy)
Ethereum Sepolia
eid 40161
live testnet
Base Sepolia
eid 40245
live testnet

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
);
Why this is safe. LayerZero's config term here is optional DVN, but 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.

Launch pricing
Marketplace pass-through (measured numbers on the home page)
L2 destination verify()
~$0.01 per proof (on-chain gas)
Ethereum L1 destination verify()
Varies with L1 gas; quoted per integration
Volume pricing / SLA tiers
By conversation — contact the team

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.