layerzero-messaging — скилл для Claude Code: мосты OFT между Hedera
Скилл для сборки мостов LayerZero V2 между Hedera и EVM-сетями: OFT/OApp, настройка Endpoint V2, ULN, DVN и отправка через quoteSend.
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a claude-codeЧто делает layerzero-messaging
Скилл описывает паттерн OFT: на стороне EVM разворачивается стандартный OFT, на Hedera — коннектор с поддержкой HTS. Затем обе стороны связываются через setPeer, а перевод идёт с комиссией LayerZero V2. Внутри — справочные материалы по адресам Endpoint, ULN и DVN, а также примеры кода для проводки и отправки.
Ключевой момент — проводка в обе стороны. Для каждого OApp нужно вызвать setPeer(remoteEid, remoteOAppAsBytes32), настроить setSendLibrary и setReceiveLibrary (ULN302), применить setConfig для ExecutorConfig и UlnConfig, задать setEnforcedOptions. Неполная конфигурация ломает путь целиком, поэтому перед отправкой стоит проверить peers(remoteEid) на обеих сетях.
На Hedera обычный ERC-20 OFT основным путём не будет. Нужен коннектор на базе HTS: конструктор создаёт fungible-токен через прекомпиляцию 0x167, при отправке токены сжигаются, при получении — минтится новая порция. Суммы должны укладываться в int64. Получателя на Hedera нужно заранее ассоциировать с HTS-токеном, иначе входящий перевод не пройдёт. Ещё нюанс: симуляция комиссии через forge может расходиться с масштабированием wei/tinybar в Hedera JSON-RPC — для направления Hedera → EVM часто советуют считать quote через cast и масштабировать native fee вручную.
Какие задачи решает
- Развернуть пару OFT-токенов между Hedera и EVM-сетью
- Связать OApp через setPeer в обе стороны
- Настроить ULN, DVN и executor для отправки сообщений
- Реализовать HTS-коннектор с минтом и сжиганием через 0x167
- Отправить перевод с расчётом комиссии через quoteSend
Примеры запросов агенту
- Помоги развернуть OFT на EVM и HTS-коннектор на Hedera, затем свяжи их через setPeer
- Настрой send и receive библиотеки с ULN302 и ExecutorConfig для моего OApp
- Посчитай quoteSend для перевода на remoteEid и отправь с native fee
Как установить layerzero-messaging
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a claude-code2Вручную: положить файлы
~/.claude/skills/layerzero-messaging/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/layerzero-messaging/
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a codex2Вручную: положить файлы
.agents/skills/layerzero-messaging/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a cursor2Вручную: положить файлы
.cursor/skills/layerzero-messaging/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install hedera-dev/hedera-skills layerzero-messaging2Вручную: положить файлы
.github/skills/layerzero-messaging/SKILL.md1Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a gemini-cli2Командой платформы
gemini skills install https://github.com/hedera-dev/hedera-skills --path plugins/cross-chain/skills/layerzero-messagingВручную: положить файлы
.devin/skills/layerzero-messaging/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о layerzero-messaging
Как установить layerzero-messaging в Claude?
Выполните npx skills add hedera-dev/hedera-skills --skill layerzero-messaging -a claude-code. После этого файл скилла появится в ~/.claude/skills/layerzero-messaging/SKILL.md.
Что делает layerzero-messaging?
Помогает собирать мосты LayerZero V2 между Hedera и EVM: разворачивать OFT и HTS-коннекторы, настраивать Endpoint V2, ULN, DVN и executor, отправлять переводы с расчётом комиссии.
Почему на Hedera нельзя использовать обычный ERC-20 OFT?
Основной путь на Hedera — коннектор на базе HTS: конструктор создаёт токен через прекомпиляцию 0x167, при отправке токены сжигаются, при получении минтится новая порция. Суммы при этом должны укладываться в int64.
Исходный текст
SKILL.md · Apache-2.0
---
name: layerzero-messaging
description: >
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.
---
# LayerZero Messaging (Hedera)
**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.
```text
OFT (EVM) ←setPeer→ HTSConnectorOFT (Hedera)
│ send / quoteSend │ _debit burn / _credit mint (HTS 0x167)
└──────── Endpoint V2 + ULN + DVN + Executor ────────┘
```
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.
## Quick Reference
| 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](references/hedera-endpoints.md) for where to source Endpoint/ULN/DVN addresses. See [references/examples.md](references/examples.md) for wire and send sketches.
## Critical: Wire Both Directions
Incomplete peer config bricks the pathway. For each local OApp:
1. `setPeer(remoteEid, remoteOAppAsBytes32)`
2. `setSendLibrary` / `setReceiveLibrary` (ULN302)
3. `setConfig` — ExecutorConfig (type `1`) on send lib; UlnConfig (type `2`) on send + receive libs
4. `setEnforcedOptions` — e.g. `lzReceive` gas for msgType `1` (token send)
Verify with `peers(remoteEid)` on both chains before sending.
## Critical: Hedera HTS Connector Semantics
On Hedera, do **not** use a plain ERC-20 OFT as the primary path. Use an HTS-backed connector:
- Constructor creates fungible HTS via precompile `0x167` (supply key = connector)
- `_debit`: transfer HTS in → **burn**
- `_credit`: **mint** → transfer HTS out
- Amounts must fit `int64` for HTS mint/burn/transfer
- Associate the receiver account with the HTS token before EVM → Hedera receives
```solidity
// Deploy with value so createFungibleToken fee is paid
new HTSConnectorOFT{ value: htsCreateValue }(name, symbol, lzEndpoint, owner);
```
## Send Flow
```solidity
SendParam 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));
```
**Hedera → EVM note:** forge fee simulation can disagree with Hedera JSON-RPC wei/tinybar scaling — often `quote` via `cast` + scaled native fee for that direction.
## Deploy Checklist (generic)
1. Deploy EVM `OFT` (optional premint)
2. Deploy Hedera HTS connector OFT with HTS create value
3. Deploy workers (Labs DVN/executor **or** educational simple workers)
4. Wire both OApps (`setPeer` + libraries + config + enforced options)
5. Associate Hedera account with `htsTokenAddress()`
6. Sync frontend config if applicable; fund relay key if using UI auto-relay
7. Send small amount; track on LayerZero Scan (testnet/mainnet as appropriate)
## Educational Relay
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.
## Checklist
- [ ] Peers set both ways with correct EIDs (not EVM chain IDs)
- [ ] Send/receive libraries + ULN/executor config applied
- [ ] Hedera side is HTS connector; create fee paid; supply key is connector
- [ ] Receiver associated with HTS token before inbound transfers
- [ ] `quoteSend` native fee attached to `send`
- [ ] Receiver address encoded as `bytes32`
- [ ] Educational disclaimer: not audited / not for mainnet funds
## References
- [references/examples.md](references/examples.md) — OFT, HTS connector, wire, send
- [references/hedera-endpoints.md](references/hedera-endpoints.md) — EIDs vs chain IDs, where to source addresses
- [LayerZero V2 docs](https://docs.layerzero.network/v2)
- [LayerZero deployments metadata](https://metadata.layerzero-api.com/v1/metadata/deployments)
© hedera-dev · Apache-2.0 · hedera-dev/hedera-skills