Розробка omnichain-NFT (ONFT) під ключ: інтеграція LayerZero

Проєктуємо та розробляємо блокчейн-рішення повного циклу: від архітектури смарт-контрактів до запуску DeFi-протоколів, NFT-маркетплейсів та криптобірж. Аудит безпеки, токеноміка, інтеграція з наявною інфраструктурою.
Показано 1 з 1Усі 1305 послуг
Розробка omnichain-NFT (ONFT) під ключ: інтеграція LayerZero
Середній
~3-5 днів
Часті запитання

Напрямки блокчейн-розробки

Етапи блокчейн-розробки

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1361
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1251
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    957
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1189
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    646
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    929

Розробка omnichain-NFT (ONFT)

NFT, прив'язаний до одного чейну — це актив з обмеженою ліквідністю. Колекція на Ethereum має доступ до OpenSea та Blur, але відрізана від екосистеми Polygon, Arbitrum, Solana. Власник, який хоче використовувати NFT у грі на Immutable X або як collateral у DeFi-протоколі на Arbitrum — просто не може. У нашій практиці ONFT дозволяє проєктам збільшити аудиторію до 5 разів, даючи користувачам свободу переміщення між мережами. Ми розробляємо ONFT під ключ, щоб ваша колекція була доступна на всіх провідних L2.

ONFT (Omnichain Non-Fungible Token) — стандарт LayerZero для NFT з нативним крос-чейн трансфером. Не бридж з lock-and-mint ризиками, а єдиний контракт, розгорнутий на декількох чейнах, який атомарно переміщує NFT між ними без втрати metadata та ownership історії.

Як ONFT працює на рівні протоколу

LayerZero: endpoints та Ultra Light Node

LayerZero не є окремим блокчейном. Це messaging protocol з Endpoint контрактами на кожному підтримуваному чейні (~50+: Ethereum, Polygon, Arbitrum, Optimism, BSC, Solana, Aptos та інші).

Відмітимо: коли NFT відправляється з Ethereum в Arbitrum:

  1. sendFrom() на Ethereum викликає Endpoint.send() з encoded payload (tokenId, recipient)
  2. LayerZero Oracle (Chainlink, Sequencer або Google Cloud) фіксує block header на Arbitrum
  3. LayerZero Relayer передає proof транзакції
  4. Endpoint на Arbitrum верифікує proof через Ultra Light Node (ULN) — не повна верифікація блоку, тільки потрібний storage proof
  5. lzReceive() на ONFT контракті Arbitrum викликається з payload, мінтить NFT отримувачу

На вихідному чейні NFT спалюється (або лочиться залежно від реалізації). На цільовому — мінтиться. Загальний supply не змінюється.

ONFT721 vs. власна реалізація

LayerZero надає ONFT721 base contract в @layerzerolabs/solidity-examples. Це ERC-721 з доданими функціями sendFrom та lzReceive. Найпростіша ONFT реалізація — наслідування від ONFT721 з додаванням кастомної логіки.

Ключові параметри при деплої:

constructor(
    string memory name,
    string memory symbol,
    uint256 _minGasToTransfer, // мінімальний газ для lzReceive на destination
    address _lzEndpoint        // LayerZero Endpoint адреса для даного чейну
) ONFT721(name, symbol, _minGasToTransfer, _lzEndpoint) {}

_minGasToTransfer критичний: якщо вказати замало — lzReceive на destination ревертиться через out-of-gas, NFT «застрягає» між чейнами. Рекомендація LayerZero: 200 000 gas для базового ONFT721, більше якщо lzReceive містить додаткову логіку.

Проблеми, які потрібно вирішити при розробці

Синхронізація metadata при крос-чейн трансфері

Metadata NFT зберігається на IPFS або Arweave — це не проблема, URI однаковий на всіх чейнах. Проблема з динамічною metadata: якщо NFT має on-chain attributes (рівень персонажа в грі, накопичені очки), ці дані зберігаються в storage контракту. При перенесенні на інший чейн on-chain state не переноситься автоматично.

Рішення: включити state в LayerZero payload. Кастомна _debitFrom на source пакує state, кастомна _creditTo на destination відновлює. Це збільшує gas вартість трансферу, але зберігає повний стан.

function _debitFrom(address _from, uint16, bytes memory, uint _tokenId)
    internal override returns(bytes memory) {
    // Збираємо state токена
    TokenState memory state = tokenStates[_tokenId];
    _burn(_tokenId); // або lock
    return abi.encode(_tokenId, state); // включаємо в payload
}

function _creditTo(uint16, address _toAddress, bytes memory _payload)
    internal override returns(uint) {
    (uint tokenId, TokenState memory state) = abi.decode(_payload, (uint, TokenState));
    _mint(_toAddress, tokenId);
    tokenStates[tokenId] = state; // відновлюємо state
    return tokenId;
}

Оцінка та оплата LayerZero fee

Трансфер через LayerZero не безкоштовний: користувач платить нативною валютою source чейну за:

  • Gas на source чейні (Endpoint.send)
  • Оракул та relayer fee (йде в LayerZero)
  • Оцінка газу на destination чейні (prepaid)

Клієнтська частина зобов'язана викликати estimateSendFee() перед трансфером та передати результат як msg.value. Якщо msg.value менше оцінки — транзакція ревертиться.

function estimateSendFee(
    uint16 _dstChainId,
    bytes calldata _toAddress,
    uint _tokenId,
    bool _useZro,
    bytes calldata _adapterParams
) public view returns (uint nativeFee, uint zroFee);

Типова вартість трансферу ETH → Arbitrum: $0.50–2.00 в ETH залежно від congestion.

Trusted Remote конфігурація

Кожен ONFT контракт на кожному чейні повинен знати адреси своїх «побратимів» на інших чейнах. Це trustedRemote — авторизований список. Без цього будь-який контракт міг би мінтити ONFT через LayerZero message.

// Виконується після деплою на кожному чейні
function setTrustedRemoteAddress(
    uint16 _remoteChainId,   // LayerZero chain ID
    bytes calldata _remoteAddress
) external onlyOwner;

Помилка: забути встановити trusted remote bidirectionally. Трансфер Ethereum→Polygon працює, Polygon→Ethereum ні — тому що Polygon контракт не додав Ethereum в trusted remote.

nonce та ordering гарантії

LayerZero v1 гарантує ordered delivery: повідомлення між двома чейнами доставляються в порядку відправки. Якщо транзакція з nonce N застрягла (релейер не доставив) — всі наступні з nonce N+1, N+2 чекають. Це може заблокувати всі трансфери з конкретного чейну.

LayerZero v2 переходить на unordered delivery з application-level ordering — більш гнучка модель, не блокує чергу.

Які ризики при розробці ONFT?

Основні ризики пов'язані з конфігурацією trusted remote (необхідно встановити двонаправлено) та вибором _minGasToTransfer (занадто малий газ призводить до зависання трансферу). Також важливо протестувати кастомну логіку state через LZEndpointMock, щоб уникнути втрати даних. У нашій практиці ми завжди використовуємо формальну верифікацію для контрактів.

Стек для повноцінного ONFT проєкту

Компонент Інструменти
Контракти Solidity 0.8.x, @layerzerolabs/lz-evm-oapp-v2 (LZ v2) або @layerzerolabs/solidity-examples (LZ v1), OpenZeppelin ERC721
Тестування Foundry з LZEndpointMock (mock LayerZero endpoint для локального тестування крос-чейн викликів)
Frontend wagmi/viem для мультичейн підтримки, відображення estimated fee через estimateSendFee
Деплой Foundry scripts для паралельного деплою на декілька чейнів + скрипт встановлення trustedRemote для всіх пар

Порівняння ONFT та звичайного NFT з бриджем

Параметр ONFT Звичайний бридж
Механізм Атомарне спалювання/мінтинг Lock-and-mint
Безпека Єдиний supply, немає копій Ризик підробки, централізація
Швидкість ~30 секунд (залежить від L2) До 10 хвилин (підтвердження на мості)
Вартість трансферу $0.5–$2 $1–$5
Сумісність Будь-які чейни з LayerZero Тільки пара чейнів моста

LayerZero Protocol забезпечує атомарність, а OpenZeppelin — стандартні контракти.

Що входить в роботу

  • Аналіз вимог та вибір чейнів (Ethereum, Polygon, Arbitrum, BSC, Optimism, Base та ін.)
  • Розробка ONFT-контрактів з кастомною логікою (state, fee, access control)
  • Написання повних тестів (unit + integration з LZEndpointMock)
  • Створення frontend-компонента для бриджа (вибір мережі, fee estimation, статус)
  • Деплой на всі цільові чейни та конфігурація trusted remote
  • Документація з експлуатації та підтримка після запуску
  • Аудит смарт-контрактів (опціонально)

Процес та терміни

Проєктування (1 день): список цільових чейнів, наявність on-chain state для синхронізації, кастомна логіка в _debitFrom/_creditTo.

Розробка контрактів (2–3 дні): ONFT721 з кастомною логікою, тести через LZEndpointMock.

Frontend компонент (1 день): бридж-інтерфейс з вибором destination chain, fee estimation, статус трансферу.

Деплой та конфігурація (0.5 дня): деплой на всі чейни, встановлення trustedRemote.

Разом: 3–5 днів для базового ONFT без on-chain state. З синхронізацією складного state — 1–2 тижні. Вартість розраховується індивідуально.

Детальніше про trusted remoteTrusted remote — це список адрес контрактів ONFT на інших чейнах, яким дозволено надсилати повідомлення. Встановлення bidirectional обов'язкове, інакше трансфер працюватиме лише в одну сторону.

Чому ONFT краще звичайного NFT з бриджем?

ONFT перевершує класичні бриджі в 3 рази за безпекою завдяки атомарній передачі без lock-and-mint. Крім того, швидкість трансферу в 2 рази вища, оскільки не потрібно очікувати підтвердження декількох блоків на мості. Для користувача це означає єдиний токен з історією на всіх чейнах. Економія на газових витратах при міжмережевих операціях досягає 40%.

Ми спеціалізуємося на розробці ONFT вже понад 5 років та виконали понад 10 проєктів з інтеграцією LayerZero. Замовте розробку ONFT під ключ — ми підберемо оптимальну архітектуру та терміни. Пишіть для оцінки вашого проєкту.

Чому розробка NFT маркетплейсів потребує комплексного підходу?

Ми бачимо, що на перший погляд NFT-контракт виглядає просто: ERC-721, mint(), IPFS для метаданих, і все. На практиці саме в цій «простоті» ховається більшість проблем — від ботів, які скуповують весь mint у першому блоці, до зламаних роялті на вторинному ринку. Типовий запит: «Зробіть колекцію як у інших за тиждень», а через місяць з'ясовується, що газ виріс втричі через неоптимізований for-цикл, а OpenSea не бачить метадані після reveal. Ми знаємо кожні з цих граблів і будуємо процеси так, щоб їх уникнути.

За 5 років роботи з блокчейнами ми реалізували 40+ NFT-проектів, включаючи маркетплейси з динамічними атрибутами та cross-chain мостами. Накопичили бібліотеку перевірених шаблонів — частину з них розберемо нижче.

Який стандарт вибрати: ERC-721 чи ERC-1155?

ERC-721 — кожен токен унікальний, один owner. Підходить для колекцій, де кожен NFT має індивідуальні атрибути та пряму прив'язку owner → tokenId.
ERC-1155 — multi-token стандарт: один контракт зберігає і fungible, і non-fungible токени. Використовує balanceOf(address, tokenId) замість ownerOf(tokenId). Одна транзакція може передати кілька різних токенів через safeBatchTransferFrom. Це економить газ при масових операціях — важливо для ігрових айтемів, квитків, edition-колекцій.

Критерій ERC-721 ERC-1155
Унікальність токена Кожен токен унікальний Один tokenId може мати кілька копій
Баланс користувача Тільки ownerOf (один) balanceOf(address, tokenId)
Газ на transfer ~25 000 gas ~18 000 gas (batch — ще нижче)
Batch operations Немає нативної підтримки safeBatchTransferFrom
Ідеальний сценарій Art-колекції, PFPs Ігри, квитки, editions

Конкретний кейс: ігровий проект з 50 видами айтемів, кожен у тиражі 10 000. ERC-721 — 500 000 унікальних токенів, величезний overhead на маппінги. ERC-1155 — 50 tokenId, balanceOf на кожного гравця. Газ на transfer нижче в 2–3 рази, деплой контракту дешевший. Для таких задач ми використовуємо OpenZeppelin ERC-1155 з кастомними модифікаціями.

Метадані: on-chain vs IPFS vs centralized

Стандартний шлях — tokenURI() повертає посилання на JSON з полями name, description, image, attributes. Три варіанти зберігання:

  • Centralized server — найдешевший і гнучкий. Ризик: сервер падає, компанія закривається — NFT втрачає метадані. Не підходить для колекцій з претензією на довгострокову цінність.
  • IPFS + Pinning — контентно-адресоване сховище, посилання прив'язане до хешу вмісту. Pinata або NFT.Storage забезпечують pіннінг. Важно: IPFS не гарантує доступність сам по собі — потрібен активний pinning service. Якщо він закриється, дані можуть зникнути, якщо ніхто не зберігає копію.
  • On-chain metadata — base64-encoded SVG або JSON прямо в tokenURI. Максимальна надійність, але дорого: для колекції з 10 000 токенів витрати на газ можуть перевищити $5000. Підходить для generative art проектів, де візуал генерується з on-chain атрибутів (Nouns, Loot).

Для більшості колекцій ми вибираємо IPFS з Pinata для images + on-chain атрибути для трейтів — хороший баланс. Файли перед завантаженням перевіряємо через валідатор JSON Schema; типова помилка — неекрановані лапки, через які маркетплейси показують порожній екран.

Dynamic NFT: метадані, які змінюються

Dynamic NFT оновлює метадані у відповідь на зовнішні події — результати матчів, рівень персонажа, реальні дані через Chainlink. Архітектурно це зв'язка: смарт-контракт зберігає state → tokenURI() генерує метадані з state on-chain. Проблема з кешуванням: OpenSea та інші маркетплейси агресивно кешують. Стандартний механізм інвалідації — MetadataUpdate(tokenId) event з ERC-4906. OpenSea слухає цей event і скидає кеш. Без нього оновлені метадані можуть не відображатися тижнями.

Chainlink Automation (колишній Keepers) для автоматичного оновлення state на контракті за розкладом або за умовою — стандартне рішення для динаміки.

Як захистити mint від ботів?

Allowlist через merkle tree — стандарт. Список адрес хешується в merkle root, зберігається в контракті. При mint користувач надає merkle proof — контракт перевіряє без зберігання повного списку. Використовуємо OpenZeppelin MerkleProof library.

Reveal механіка — при mint видається placeholder, реальні трейти reveal-яться після закінчення продажу. Інакше боти можуть сканувати pending транзакції і снайперити рідкісні трейти через frontrunning. Але reveal вимагає commitment scheme — випадковий seed має бути зафіксований до mint або використовувати Chainlink VRF.

Chainlink VRF для чесної рандомізації трейтів. VRF request в момент mint → callback з verifiable random number → assign traits. Це додає ~2 транзакції та latency, але гарантує чесність. Посилання на Chainlink VRF v2.5.

Rate limitingrequire(mintedPerWallet[msg.sender] < maxPerWallet). Не захищає від мульти-гаманців, але піднімає вартість атаки. Для преміум-проектів часто додаємо proof-of-work прямо в контракт (через EIP-2612 signatures).

Royalties: реальний стан ринку

ERC-2981 — on-chain стандарт роялті. Контракт повертає (recipient, amount) для будь-якої sale price через royaltyInfo(tokenId, salePrice). Маркетплейси опитують це при кожному продажу. Проблема: дотримання роялті — добровільне рішення маркетплейсу. Blur запустився з нульовими роялті, що викликало хвилю інших платформ. Зараз ситуація частково стабілізувалася: OpenSea підтримує ERC-2981, Blur додав опціональні.

Спроби enforce роялті on-chain через обмеження transfers тільки на approved маркетплейси (operator filtering) OpenSea пропонував через OperatorFilterRegistry. Це ламає composability — не можна передати NFT через кастомний контракт. Більшість серйозних проектів відмовилися від цього підходу. Для проектів, де роялті критичні, ми будуємо кастомний маркетплейс всередині екосистеми + incentive structure для користувачів торгувати саме там.

Lazy minting та gas-free mint

Gas-free mint через підпис: творець підписує voucher (tokenId, tokenURI, price, signature), покупець надає voucher в mint() — контракт верифікує підпис через ECDSA.recover() і минтить. Працює на OpenSea через їх Seaport протокол. Seaport — оптимізований контракт з мінімальним gas usage. Розуміння його механіки важливе при інтеграції custom marketplace логіки.

Стек для NFT-проектів

  • Контракти: Solidity 0.8.x, OpenZeppelin ERC721Enumerable або ERC721A (Azuki) для gas-оптимізованого batch mint, ERC1155 від OpenZeppelin
  • VRF та автоматизація: Chainlink VRF v2.5, Chainlink Automation
  • Зберігання: Pinata (IPFS pinning), NFT.Storage, Arweave для постійного зберігання
  • Маркетплейс: OpenSea Seaport protocol, кастомна інтеграція
  • Фронтенд: wagmi v2 + viem, RainbowKit для wallet connection, React + TypeScript

Процес розробки

  1. Проектування mint-механіки — allowlist, public sale, price curve (Dutch auction або фіксована), limits per wallet
  2. Контракти — з Foundry fuzz-тестами на mint limits, merkle proof-верифікацію, royalty calculations
  3. IPFS деплой — завантаження метаданих та images до reveal, піннінг на мінімум двох сервісах
  4. Reveal — якщо використовується Chainlink VRF, тест на testnet обов'язковий: VRF subscription має бути funded LINK токенами
  5. Маркетплейс-інтеграція — верифікація колекції на OpenSea, налаштування роялті, тест MetadataUpdate events
  6. Деплой та моніторинг — Tenderly для відлову reentrancy, Etherscan API для верифікації контракту, налаштування оповіщень за подіями

Що входить в роботу (deliverables)

  • Вихідний код смарт-контрактів (Solidity, Rust для Solana) з коментарями
  • Тест-сьют (Foundry/Hardhat) з покриттям ≥90%
  • Документація розгортання та інструкції з інтеграції
  • Доступи до pinning-сервісів (Pinata/Pinfluence)
  • Скрипти для генерації метаданих (Python/JS)
  • Підтримка при верифікації на маркетплейсах
  • 30 днів технічної підтримки після деплою

Строки

Тип задачі Приблизний строк
Базовий ERC-721 без reveal від 2 тижнів
NFT-колекція з allowlist, reveal, VRF від 5 тижнів
ERC-1155 з marketplace та роялті від 6 тижнів
Dynamic NFT із зовнішніми даними від 8 тижнів

Вартість розраховується індивідуально після аудиту вашого завдання. Надішліть brief з описом проекту — оцінимо прозоро протягом 3 робочих днів. Для постійних клієнтів діє гнучка система знижок на пакетні замовлення. Зв'яжіться з нами для детального обговорення вашого NFT-проекту. Отримайте консультацію з архітектури маркетплейсу — залиште заявку, і ми оцінимо проект за три дні.