npx skills add ...
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging
LayerZero V2 messaging on Hedera. Use when building OFT / OApp bridges between Hedera and EVM chains, configuring Endpoint V2 peers and ULN/DVN/executor wiring, sending with quoteSend + send, implementing HTS-backed OFT connectors (mint/burn via 0x167), or relaying educational lzReceive flows on testnet.
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging
OFT pattern: deploy paired Omnichain Fungible Tokens — a standard OFT on the EVM side and an HTS connector OFT on Hedera — then setPeer both ways and send with LayerZero V2 fees.
This skill focuses on LayerZero V2 OApp/OFT + Hedera HTS. Educational templates may use simple workers and a manual/UI lzReceive relay — not the same as production LayerZero Labs verification.
| Concept | Rule |
|---|---|
| Endpoint | ILayerZeroEndpointV2 per chain |
| Peer | setPeer(remoteEid, bytes32(uint256(uint160(remoteOApp)))) on both sides |
| Send | quoteSend(SendParam, payInLzToken) → send{value: nativeFee}(SendParam, fee, refund) |
| Receiver | to in SendParam is bytes32 (padded address) |
| Hedera OFT | HTS-backed connector — create HTS token, burn on send, mint on receive |
| HTS fee | Deploy connector with native value to pay createFungibleToken |
| Approval | User must approve(connector, amount) on the HTS token before Hedera → EVM send |
| IDs | Use LayerZero EIDs in peers/dstEid — not EVM chain IDs |
See references/hedera-endpoints.md for where to source Endpoint/ULN/DVN addresses. See references/examples.md for wire and send sketches.
Incomplete peer config bricks the pathway. For each local OApp:
setPeer(remoteEid, remoteOAppAsBytes32)setSendLibrary / setReceiveLibrary (ULN302)setConfig — ExecutorConfig (type 1) on send lib; UlnConfig (type 2) on send + receive libssetEnforcedOptions — e.g. lzReceive gas for msgType 1 (token send)Verify with peers(remoteEid) on both chains before sending.
On Hedera, do not use a plain ERC-20 OFT as the primary path. Use an HTS-backed connector:
0x167 (supply key = connector)_debit: transfer HTS in → burn_credit: mint → transfer HTS outint64 for HTS mint/burn/transferHedera → EVM note: forge fee simulation can disagree with Hedera JSON-RPC wei/tinybar scaling — often quote via cast + scaled native fee for that direction.
OFT (optional premint)setPeer + libraries + config + enforced options)htsTokenAddress()Some templates use simple DVN/executor mocks and an explicit lzReceive relay step. Treat that as a learning aid — production apps rely on LayerZero’s verification network, not a custom relayer key in the app server.
quoteSend native fee attached to sendbytes32SendParam memory sendParam = SendParam({
dstEid: remoteEid,
to: bytes32(uint256(uint160(receiver))),
amountLD: amountLD,
minAmountLD: (amountLD * 9) / 10,
extraOptions: OptionsBuilder.newOptions().addExecutorLzReceiveOption(lzReceiveGas, 0),
composeMsg: "",
oftCmd: ""
});
MessagingFee memory fee = IOFT(localOFT).quoteSend(sendParam, false);
IOFT(localOFT).send{ value: fee.nativeFee }(sendParam, fee, payable(refundTo));