Разработка NFT-маркетплейса: Seaport, аукционы, роялти под ключ

Проектируем и разрабатываем блокчейн-решения полного цикла: от архитектуры смарт-контрактов до запуска DeFi-протоколов, NFT-маркетплейсов и криптобирж. Аудит безопасности, токеномика, интеграция с существующей инфраструктурой.
Показано 1 из 1Все 1305 услуг
Разработка NFT-маркетплейса: Seaport, аукционы, роялти под ключ
Сложный
от 2 недель до 3 месяцев
Часто задаваемые вопросы

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

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

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1374
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1256
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    965
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1208
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    667
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    954

Разработка NFT-маркетплейса

OpenSea обрабатывает миллиарды долларов торгов, но большинство кастомных маркетплейсов умирают от одной из трёх проблем: уязвимость в логике листинга (позволяет купить NFT по старой цене после его передачи), отсутствие royalty enforcement или невозможность масштабировать оферты без on-chain транзакции за каждую. Мы решаем эти проблемы технически — применяем проверенные протоколы и современные практики.

Протоколы листинга: не изобретай велосипед

Seaport — стандарт де-факто

OpenSea's Seaport Protocol (v1.5, аудит Spearbit + Trail of Bits) — самая выверенная основа для маркетплейса. Ключевое преимущество: ордера существуют off-chain как подписанные EIP-712 структуры. Листинг не стоит газа. Только исполнение ордера (fulfilment) — on-chain транзакция.

Архитектура Seaport: offerer подписывает Order с offer[] (что предлагаю) и consideration[] (что хочу получить взамен). Это обобщённая swap-примитива: NFT за ETH, NFT за ERC-20, NFT за NFT, batch orders. conduit — авторизованный контракт, который может переводить токены от имени offerer при условии approve. Это убирает необходимость approve к маркетплейсу напрямую — approve выдаётся Conduit Controller, который маркетплейс регистрирует.

Почему важно: если маркетплейс реализует собственный листинг с хранением ордеров on-chain — каждый листинг стоит ~50-80k gas. При 10,000 листингов в день это существенные затраты. Off-chain подписи — единственный масштабируемый подход. Экономия газа на листингах достигает 80% за счёт off-chain подписей.

Как протокол Seaport защищает от replay атак?

Классическая атака на кастомные маркетплейсы: пользователь листит NFT за 1 ETH, затем передаёт его на другой кошелёк. Листинг формально не отменён (нет on-chain cancel). Новый владелец листит за 100 ETH. Атакующий исполняет старый листинг (если подпись валидна) — покупает за 1 ETH, NFT уходит со старого листинга, но владелец уже изменился.

Seaport решает это через offererConduitKey + counter. incrementCounter() — одна транзакция, инвалидирует все ранее подписанные ордера этого адреса. Также каждый ордер может иметь startTime / endTime — автоматическое истечение без отмены.

Royalty enforcement: почему EIP-2981 недостаточен?

EIP-2981 определяет royaltyInfo(uint256 tokenId, uint256 salePrice) — стандарт для хранения информации о роялти в контракте NFT. Но это advisory механизм — маркетплейс может игнорировать его. Именно это и делали большинство агрегаторов несколько лет назад, обходя royalty creator'ов.

Enforced royalty возможно через несколько подходов:

  • Operator Filter Registry (подход OpenSea) — NFT-контракт в setApprovalForAll и transferFrom проверяет, что operator находится в whitelist Operator Filter Registry. Маркетплейсы без royalty enforcement блокируются. Минус: creator должен поддержать, пользователи теряют transferability при отказе маркетплейса.
  • ERC-721C (LimitBreak) — модифицированный transfer с built-in policy engine. Более гибко: разные политики для разных коллекций. Но нестандартный контракт.
  • Soulbound + secondary market через собственный контракт — NFT с ограниченным transfer, все вторичные продажи только через протокол с royalty enforcement. Радикально, но работает для gaming assets.

Для нашего маркетплейса: реализуем EIP-2981 как минимум, предлагаем опциональный Operator Filter для коллекций, которые хотят enforced royalty.

Как внедрить enforced royalty в маркетплейс?

  1. Определите политику роялти — процент и получатель для каждого токена.
  2. Добавьте EIP-2981 в контракт NFT.
  3. Интегрируйте Operator Filter — зарегистрируйте маркетплейс в реестре, если требуется принудительное исполнение.
  4. Настройте контракт маркетплейса — проверяйте royaltyInfo при каждой сделке и переводите комиссию создателю.
  5. Протестируйте на тестнете — убедитесь, что роялти выплачиваются корректно даже при bulk transfers.

Аукционы: технические сложности

Как защититься от bid snipping в English auction?

Классический English auction: каждый bid продлевает аукцион на N минут. Это стандартная защита от bid snipping (последнесекундные ставки). В Solidity: if (block.timestamp > endTime - extensionWindow) endTime += extensionWindow.

Критичный момент: хранить все биды on-chain дорого. Лучше хранить только highestBid и highestBidder. Предыдущий highest bidder получает рефанд автоматически при каждом новом биде через pull payment pattern.

Почему Dutch auction требует осторожности на L2?

Цена стартует высоко и падает каждые N минут/блоков. Математика:

currentPrice = startPrice - (startPrice - endPrice) * elapsed / duration

Опасность: если используешь block.number вместо block.timestamp на L2 (Optimism, Arbitrum) — block time нестабильный, цена падает неравномерно. Всегда block.timestamp для time-based logic на L2. Снижение стоимости деплоя на 40% при использовании Optimism — один из плюсов L2.

Refund mechanism в dutch auction — если пользователь минтил по цене $100, а финальная цена оказалась $60, разница должна быть возвращена. Это settlementPrice refund pattern: записываем каждую транзакцию, после окончания аукциона пользователи claim рефанд.

Что входит в разработку NFT-маркетплейса?

Компонент Детали
Смарт-контракты Seaport-based листинг, ERC-721/1155 с EIP-2981, контракты аукционов
Subgraph Индексация всех событий, GraphQL endpoint для фронтенда
Backend API PostgreSQL + Elasticsearch для поиска и фильтрации
Frontend React + wagmi + viem, кастомизируемый UI
Аудит Внутренний (Slither, Echidna) + внешний (Spearbit/Trail of Bits)
Документация Описание контрактов, процесс деплоя, инструкция для администратора
Поддержка 1 месяц пост-продакшн (исправление ошибок, помощь с деплоем)

Архитектура и стек

Слой Технология Комментарий
Order protocol Seaport v1.5 Off-chain подписи, audited
NFT standard ERC-721 + ERC-2981 Royalty информация
Batch transfers ERC-1155 Для gaming/edition NFT
Metadata IPFS (Pinata/NFT.Storage) Децентрализованное хранение
Indexing The Graph (subgraph) История сделок, листинги
Frontend wagmi + viem WalletConnect v2, MetaMask
Search/filter PostgreSQL + Elasticsearch Off-chain индекс для скорости

Subgraph как основа данных

Маркетплейс без subgraph — это маркетплейс без истории. The Graph индексирует события контрактов: OrderFulfilled, OrderCancelled, Transfer, RoyaltyPaid. Схема entities: Token, Collection, Order, Sale, Account. GraphQL запросы дают history, trending, floor price — всё без on-chain RPC вызовов.

Floor price рассчитывается off-chain по активным листингам, хранится в PostgreSQL, обновляется при каждом новом листинге/отмене через webhook от subgraph.

Пример расчёта цены голландского аукциона:

function getCurrentPrice(uint256 _saleStart, uint256 _saleEnd) public view returns (uint256) {
    uint256 elapsed = block.timestamp - _saleStart;
    uint256 duration = _saleEnd - _saleStart;
    if (elapsed >= duration) return endPrice;
    return startPrice - ((startPrice - endPrice) * elapsed / duration);
}

Процесс работы

Аналитика (3-5 дней). Определяем: типы активов (ERC-721 / ERC-1155 / смешанно), нужен ли primary mint через маркетплейс, требования к royalty enforcement, target chains.

Проектирование (1 неделя). Архитектура контрактов, схема subgraph, database schema, API endpoints.

Разработка (4-8 недель). Smart contracts + subgraph + backend API + frontend. Параллельные треки со стыковкой на этапе интеграции.

Тестирование. Fork-тесты с реальными Seaport ордерами. E2E тесты на Sepolia.

Аудит и деплой. Акцент аудита: replay attacks, royalty bypass, bid manipulation в аукционах. Деплой с multisig owner.

Spearbit Audit Report, 2023

Ориентиры по срокам

MVP маркетплейс с fixed-price листингами на базе Seaport — 3-4 недели. Полноценная платформа с аукционами, offers, royalty enforcement и subgraph — 2-3 месяца.

Стоимость рассчитывается после анализа требований.

С нашей командой, имеющей 5+ лет опыта в блокчейн-разработке и 15+ реализованных проектов, вы получаете гарантию качества и безопасность контрактов. Получите консультацию по вашему проекту — свяжитесь с нами. Закажите разработку — мы оценим ваш проект и предложим оптимальное решение.

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

Мы видим, что на первый взгляд NFT-контракт выглядит просто: ERC-721, mint(), IPFS для метаданных, всё. На практике именно в этой «простоте» прячется большинство проблем — от ботов, скупающих весь mint в первый блок, до сломанных royalties на вторичном рынке. Типовой запрос: «Сделайте коллекцию как у других за неделю», а через месяц выясняется, что газ вырос втрое из-за неоптимизированного 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 обеспечивают pinning. Важно: 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 стандарт royalties. Контракт возвращает (recipient, amount) для любой sale price через royaltyInfo(tokenId, salePrice). Маркетплейсы опрашивают это при каждой продаже. Проблема: соблюдение royalties — добровольное решение маркетплейса. Blur запустился с нулевыми royalties, что вызвало волну других платформ. Сейчас ситуация частично стабилизировалась: OpenSea поддерживает ERC-2981, Blur добавил опциональные.

Попытки enforce royalties on-chain через ограничение transfers только на approved маркетплейсы (operator filtering) OpenSea предлагал через OperatorFilterRegistry. Это ломает composability — нельзя передать NFT через кастомный контракт. Большинство серьёзных проектов отказались от этого подхода. Для проектов, где royalties критичны, мы строим кастомный маркетплейс внутри экосистемы + 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, pinning на минимум двух сервисах
  4. Reveal — если используется Chainlink VRF, тест на testnet обязателен: VRF subscription должен быть funded LINK токенами
  5. Маркетплейс-интеграция — верификация коллекции на OpenSea, настройка royalties, тест 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 и royalties от 6 недель
Dynamic NFT с внешними данными от 8 недель

Стоимость рассчитывается индивидуально после аудита вашей задачи. Пришлите brief с описанием проекта — оценим прозрачно в течение 3 рабочих дней. Для постоянных клиентов действует гибкая система скидок на пакетные заказы. Свяжитесь с нами для детального обсуждения вашего NFT-проекта. Получите консультацию по архитектуре маркетплейса — оставьте заявку, и мы оценим проект за три дня.