Разработка внутриигрового маркетплейса NFT под ключ

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

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

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

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

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

Игровой NFT-маркетплейс — не просто витрина JPEG. Если не продумать архитектуру смарт-контрактов и индексацию атрибутов, игроки столкнутся с задержками транзакций, неожиданными комиссиями и невозможностью торговать предметами с уникальными характеристиками. В отличие от готовых решений, кастомная разработка позволяет интегрировать внутриигровую валюту, аренду предметов и сложные аукционы. Это снижает операционные издержки и удерживает экономику внутри игры. Мы — Web3-разработчики с 5+ летним опытом — строим маркетплейсы, которые выдерживают нагрузку сотен тысяч предметов с глубиной атрибутов (уровень, модификаторы, совместимость по классам). Получите консультацию, чтобы обсудить ваш проект.

Какие проблемы решает кастомный NFT-маркетплейс?

Готовые решения вроде Seaport (OpenSea protocol) покрывают базовые сценарии, но не учитывают игровую специфику. Типичные проблемы, которые мы решаем:

  • Gas-оптимизация. В игре могут совершаться сотни микротранзакций в день. Кастомный контракт позволяет использовать пакетные трансферы ERC-1155 и агрегировать роялти в одну операцию. Мы используем batchTransferFrom и multiCall для снижения газа на 40-60%. Такая экономия составляет от $0.01 до $0.05 за операцию, что при массовом использовании даёт значительный выигрыш.
  • Reentrancy. Игровой маркетплейс — частая мишень для атак повторного входа. Мы блокируем их с помощью ReentrancyGuard от OpenZeppelin и проверяем с помощью Echidna-фаззинга.
  • Сложная логика торгов. Bundle-продажи (персонаж + инвентарь), аукционы с несколькими валютами, листинги с условиями (минимальный уровень, классы). Seaport не поддерживает такое без переписывания.

Как выбрать стандарт токена и модель торгов?

Начинаем с выбора стандарта токена. Для игр лучше всего подходит ERC-1155 — один контракт на все типы предметов, ERC-721 — для уникальных персонажей. Между ними стоит выбирать исходя из ожидаемого количества типов предметов и частоты торговли. Также для аренды NFT используем ERC-4907.

Стандарт Использование Преимущества
ERC-721 Уникальные предметы (персонажи, легендарное оружие) Каждый токен уникален, легко отслеживать историю
ERC-1155 Множество типов (сундуки, расходники) Экономия газа, пакетные операции
ERC-4907 Аренда предметов Разделение владения и права использования

Затем определяем модель торговли:

  • In-game currency vs ETH/USDC: Лучший вариант — гибрид. Листинги в игровом токене, но кнопка «Купить за USDC» автоматически делает swap через DEX. Это удерживает экономику в игре и привлекает внешнюю ликвидность.
  • Роялти: распределение между разработчиками, создателями и стейкхолдерами. Реализуем через раздельный процент или стандарт ERC-2981.
  • Аренда NFT: для дорогих предметов используем ERC-4907, где ownership и right to use разделены.

Если вы хотите обсудить архитектуру вашего игрового маркетплейса, свяжитесь с нами — мы поможем выбрать оптимальный стек.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract GameNFTMarketplace {
    IERC20 public gameToken;
    IERC1155 public gameItems;
    
    uint256 public marketFeePercent = 250; // 2.5%
    uint256 public royaltyPercent = 500;   // 5% к создателям
    address public treasury;
    address public developersWallet;
    
    struct Listing {
        address seller;
        uint256 itemTypeId;
        uint256 amount;
        uint256 pricePerUnit;       // в gameToken
        uint256 minimumPurchase;    // минимальная покупка
        bool acceptsBundle;         // принимает ли bundle оферты
        uint256 expiresAt;
        ListingType listingType;
    }
    
    enum ListingType { FIXED_PRICE, ENGLISH_AUCTION, DUTCH_AUCTION }
    
    struct Auction {
        address seller;
        uint256 itemTypeId;
        uint256 tokenId;
        uint256 startPrice;
        uint256 currentBid;
        address currentBidder;
        uint256 endTime;
        uint256 minBidIncrement;
    }
    
    mapping(uint256 => Listing) public listings;
    mapping(uint256 => Auction) public auctions;
    
    // Fixed price purchase
    function buyItem(uint256 listingId, uint256 amount) external {
        Listing storage listing = listings[listingId];
        require(listing.seller != address(0), "Listing not found");
        require(block.timestamp <= listing.expiresAt, "Listing expired");
        require(amount >= listing.minimumPurchase, "Below minimum purchase");
        
        uint256 totalPrice = listing.pricePerUnit * amount;
        uint256 fee = (totalPrice * marketFeePercent) / 10000;
        uint256 royalty = (totalPrice * royaltyPercent) / 10000;
        uint256 sellerProceeds = totalPrice - fee - royalty;
        
        // Платежи
        gameToken.transferFrom(msg.sender, listing.seller, sellerProceeds);
        gameToken.transferFrom(msg.sender, treasury, fee);
        gameToken.transferFrom(msg.sender, developersWallet, royalty);
        
        // Передача предметов
        listing.amount -= amount;
        if (listing.amount == 0) delete listings[listingId];
        
        gameItems.safeTransferFrom(listing.seller, msg.sender, listing.itemTypeId, amount, "");
        
        emit ItemSold(listingId, msg.sender, amount, totalPrice);
    }
    
    // English auction
    function placeBid(uint256 auctionId, uint256 bidAmount) external {
        Auction storage auction = auctions[auctionId];
        require(block.timestamp < auction.endTime, "Auction ended");
        require(bidAmount >= auction.currentBid + auction.minBidIncrement, "Bid too low");
        
        // Возврат предыдущему bidder
        if (auction.currentBidder != address(0)) {
            gameToken.transfer(auction.currentBidder, auction.currentBid);
        }
        
        // Новый bid в escrow
        gameToken.transferFrom(msg.sender, address(this), bidAmount);
        auction.currentBid = bidAmount;
        auction.currentBidder = msg.sender;
        
        // Anti-snipe: если bid < 5 минут до конца — продлеваем
        if (auction.endTime - block.timestamp < 5 minutes) {
            auction.endTime += 5 minutes;
        }
        
        emit BidPlaced(auctionId, msg.sender, bidAmount);
    }
    
    // Dutch auction: цена снижается со временем
    function getDutchPrice(uint256 listingId) public view returns (uint256) {
        Listing storage listing = listings[listingId];
        // ... linearly interpolate price from startPrice to endPrice over duration
    }
}

Как организовать поиск по атрибутам?

Игровой маркетплейс требует богатого контекста: уровень предмета, модификаторы, совместимость с классом, история боёв. Мы строим интерфейс, где каждый NFT показывается не как JPEG, а как полноценная карточка с характеристиками.

interface GameItemListing {
  tokenId: number;
  itemType: {
    id: number;
    name: string;
    rarity: "common" | "rare" | "epic" | "legendary";
    category: "weapon" | "armor" | "consumable" | "companion";
    imageUrl: string;
  };
  attributes: {
    level: number;
    damage?: number;
    defense?: number;
    speed?: number;
    durability: number;
    upgradeCount: number;
    enchantments: string[];
  };
  gameContext: {
    compatibleClasses: string[];
    compatibleGames: string[];
    requiredLevel: number;
    lastUsedInBattle?: Date;
    totalBattlesUsed: number;
  };
  listing: {
    price: bigint;
    currency: "GGD" | "USDC";
    seller: string;
    listedAt: Date;
    expiresAt: Date;
  };
  priceHistory: Array<{ price: bigint; date: Date }>;
  floorPrice: bigint;
  pricePower: number;
}

Для фильтрации по атрибутам используем PostgreSQL с GIN-индексами на JSONB или Elasticsearch. Это позволяет искать предметы с конкретными зачарованиями, уровнем или классом за миллисекунды.

interface MarketplaceFilters {
  itemCategory?: string[];
  rarities?: string[];
  minPrice?: bigint;
  maxPrice?: bigint;
  minLevel?: number;
  maxLevel?: number;
  compatibleClass?: string;
  hasEnchantment?: string;
  currency?: "GGD" | "USDC";
  sortBy?: "price_asc" | "price_desc" | "recently_listed" | "ending_soon" | "price_power";
}

async function searchListings(filters: MarketplaceFilters, page: number) {
  const query = db("listings")
    .where("status", "active")
    .where("expires_at", ">", new Date());
  
  if (filters.itemCategory?.length) {
    query.whereIn("item_category", filters.itemCategory);
  }
  
  if (filters.minLevel) {
    query.where("attributes->>'level'", ">=", filters.minLevel.toString());
  }
  
  if (filters.hasEnchantment) {
    query.whereRaw("attributes->'enchantments' @> ?", [JSON.stringify([filters.hasEnchantment])]);
  }
  
  return query
    .orderBy(getSortColumn(filters.sortBy))
    .limit(PAGE_SIZE)
    .offset(page * PAGE_SIZE);
}

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

  1. Аналитика: разбираем экономику игры, поток предметов, ожидаемые сценарии торговли.
  2. Проектирование: выбор L2 (Polygon, Arbitrum) для дешёвых транзакций, определение структуры контрактов.
  3. Реализация: пишем смарт-контракты с Foundry, фронтенд — Next.js + wagmi.
  4. Тестирование: unit-тесты, интеграционные тесты, fuzzing в Echidna, тесты на gas consumption.
  5. Security-аудит: внутренний Slither + внешний аудит по желанию.
  6. Деплой: настройка мониторинга Tenderly, индексация событий.

Напишите нам, чтобы получить детальное коммерческое предложение.

Что входит в работу

  • Смарт-контракты с полным покрытием тестами (95%+)
  • Документация (архитектура, функции, события)
  • Код фронтенда с кастомизируемыми карточками
  • Набор скриптов для деплоя и верификации на Etherscan
  • Интеграция с игровым бэкендом (REST или WebSocket)
  • Обучение команды заказчика работе с админкой
  • Поддержка в течение 1 месяца после запуска

Сроки ориентировочно

Этап Длительность Результат
Аналитика 1–2 недели Техническое задание, архитектура
Разработка контрактов 4–6 недель Исходники, тесты, документация
Фронтенд 4–6 недель UI с детальными карточками, фильтрация
Интеграция 2–3 недели API для игры, импорт предметов
Аудит и деплой 3–4 недели Отчёт аудита, контракты в mainnet

Стоимость рассчитывается индивидуально. Оценим ваш проект — пишите.

Мы гарантируем, что маркетплейс пройдёт аудит и выдержит нагрузку до 10 000 одновременных пользователей. Опыт — 5+ лет и 15+ реализованных проектов в DeFi и GameFi. Обращайтесь за консультацией.

Игровая экономика, контракты и on-chain механика

Мы видели этот сценарий не раз. Axie Infinity на пике генерировал $800M в месяц, но через 18 месяцев токен рухнул на 98%, аудитория — на 95%. Причина — отсутствие sink'ов: игроки зарабатывали SLP и выводили, а механизмов сжигания не хватало. Исследование экономики Axie (Collins Dictionary) подтвердило: модель превратилась в схему Понци. Мы предлагаем GameFi разработку под ключ: от токеномики до смарт-контрактов, чтобы ваша экономика не повторила эту ошибку. Оценим ваш проект на meetup или онлайн.

Где ломается Play-to-Earn экономика

Инфляционная токеномика без sink'ов. Игрок получает токены за геймплей. Если sink'ов (механизмов сжигания или потребления) недостаточно — supply растёт быстрее demand. Цена падает. Доход игрока в fiat уменьшается. Игроки уходят. Смертельная спираль.

Правильная конструкция — dual-token модель с чётким разделением: governance/value token с ограниченным supply и utility/reward token для внутриигровой экономики. Utility token должен активно потребляться: крафтинг предметов, апгрейды, entry fees, breeding. Примеры: GODS/FLUX в Gods Unchained, AXS/SLP в Axie (хотя sink'ов там оказалось недостаточно).

Какие sink-механизмы реально работают?

  • Breeding / крафтинг — сжигание utility token за создание нового NFT (как в Axie, но с правильным balancing).
  • Апгрейды персонажей — каждая эволюция требует сжигания токена.
  • PvP entry fee — вход в турнир сжигает токены, часть идёт в призовой пул.
  • Дурабилити предметов — после N боёв предмет ломается, токен тратится на ремонт.
  • Финансовые механики — стейкинг с lock-up, что выводит токены из обращения на срок.

On-chain vs Off-chain: где проходит граница

Всю игровую логику on-chain выносить не нужно — каждая транзакция стоит газа и длится 12 секунд. Игровой цикл — миллисекунды. Баланс:

Компонент On-chain Off-chain Примеры
Ownership активов + NFT предметы, land
Передача/торговля + Маркетплейсы
Финансы (стейкинг, rewards) + Staking vaults, DAO
Random generation + (через VRF) Chainlink VRF
Игровой процесс + Боевая система, движение
State игрового мира + Координаты, health points
Матчмейкинг + Серверная логика

Результаты геймплея переносятся на блокчейн через signed message от сервера или ZK-proof. Verifiable off-chain с ZK: игровой сервер генерирует ZK-proof корректности сессии, контракт верифицирует proof и начисляет награду. Реализации: Cartridge (Starknet), zkSync game rollups.

Реализация NFT игровых предметов

Стандарт: ERC-1155 для взаимозаменяемых предметов (ресурсы, consumables) + ERC-721 для уникальных (персонажи, land). ERC-1155 даёт до 60% экономии на газе при batch transfer.

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

Характеристики предмета меняются в процессе игры (experience, durability, upgrades). Два подхода:

  • Fully on-chain: атрибуты хранятся в mapping контракта, tokenURI генерируется из атрибутов через SVG/JSON encoding. Дорого по газу при частом обновлении. Используется для land и ключевых активов.
  • Hybrid: атрибуты хранятся off-chain, в tokenURI — hash состояния. Обновление подписывается сервером, верифицируется on-chain при transfer или продаже. Дешевле, но требует доверия к серверу или ZK.

Breeding и crafting. Контракт: два родительских NFT → оплата utility token (burn) → минт нового NFT с атрибутами, зависящими от родителей + Chainlink VRF для случайности. Без VRF майнеры могут манипулировать рандомом через выбор блока.

// Simplified breeding with Chainlink VRF
function breed(uint256 parent1Id, uint256 parent2Id) external {
    require(ownerOf(parent1Id) == msg.sender);
    require(ownerOf(parent2Id) == msg.sender);
    require(breedingToken.burnFrom(msg.sender, BREEDING_COST));

    uint256 requestId = vrfCoordinator.requestRandomWords(...);
    pendingBreeds[requestId] = BreedRequest(parent1Id, parent2Id, msg.sender);
}

function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal override {
    BreedRequest memory req = pendingBreeds[requestId];
    uint256 childAttributes = deriveAttributes(req.parent1Id, req.parent2Id, randomWords[0]);
    _mintWithAttributes(req.requester, childAttributes);
}

Маркетплейс и роялти

Встроенный маркетплейс даёт контроль над fee структурой и кастомной логикой (запрет торговли предметами до определённого уровня). Роялти по EIP-2981 — стандарт, но не enforceable: Blur и другие маркетплейсы игнорируют on-chain роялти. Для enforcement — whitelist-only transfer (только через контракты, платящие роялти). Жертвуем composability ради защиты прав.

Staking и rewards distribution

Staking NFT — механика для удержания игроков. Проблема: начисление rewards при тысячах стейкеров требует постоянных транзакций (дорого). Решение — reward-per-share паттерн (как в MasterChef от SushiSwap): глобальный accRewardPerShare, при claim или change state пересчитывается задолженность по формуле pendingReward = stakedAmount * (accRewardPerShare - userRewardDebt). O(1) сложность независимо от числа стейкеров. Экономия газа — до 70% по сравнению с поэлементным начислением.

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

Начинаем с game economics документа: token flows, mint/burn механики, projected supply schedule, sink analysis. До написания кода экономика моделируется (Cadence, Python simulation).

Как мы строим GameFi: 5 этапов

  1. Экономическое моделирование — 1-2 недели. Разрабатываем dual-token модель, рассчитываем sink'ы, прописываем стимулы для long-term holding.
  2. Разработка токен-контрактов — 2-3 недели. ERC-20 для governance, ERC-20 для utility, с настраиваемой политикой mint/burn.
  3. Смарт-контракты NFT — 3-5 недель. ERC-721 / ERC-1155 с dynamic metadata, breeding/crafting, Chainlink VRF.
  4. Staking + rewards — 2-3 недели. Контракт на базе reward-per-share, интерфейсы для frontend.
  5. Маркетплейс (опционально) — 2-4 недели. Кастомный маркетплейс с enforced royalty.

Что входит в работу

  • Исходный код всех смарт-контрактов с тестами (Foundry/Hardhat)
  • Документация архитектуры и экономики
  • Интеграция с Chainlink, Tenderly для мониторинга
  • Аудит кода и формальная верификация (Slither, Mythril, Echidna)
  • Обучение команды работе с контрактами
  • Поддержка после деплоя (3 месяца)

Базовый GameFi стек (токены + NFT + staking + маркетплейс) — от 8 до 16 недель. Полная игра с on-chain рандомом, breeding, dynamic NFT — 4-8 месяцев. ZK-based verifiable gameplay — отдельный проект от 6 месяцев.

Свяжитесь с нами для аудита вашей токеномики — оценим риски и доработаем sink-механизмы. Закажите разработку GameFi проекта — получите готовый продукт с проверенной экономикой. Гарантируем стабильность контрактов и прозрачность кода. Наш опыт — десятки реализованных проектов в Web3, включая аудит 15+ P2E игр.