Фракціоналізація NFT: смарт-контракти, buyout та ліквідність
CryptoPunk #5822 продали за 23.7 мільйона доларів. Більшість учасників ринку не можуть дозволити собі один NFT за $23.7M, але хочуть отримати частку в такому активі. Фракціоналізація вирішує цю проблему: токенізація права власності на NFT через смарт-контракти, де один ERC-721 токен розділяється на безліч ERC-20 токенів. Кожен fraction токен представляє пропорційну частку в NFT, торгується на децентралізованих біржах та може використовуватись як застава в DeFi-протоколах. Наша команда розробляє механізми фракціоналізації під ключ: vault контракти, buyout з аукціоном та instant buyout, інтеграцію з ліквідними пулами Uniswap v3 та Balancer. Оцінимо ваш проект та запропонуємо оптимальну архітектуру, враховуючи специфіку колекції, вимоги до governance та ліквідності.
Згідно визначенню фракціоналізації на Wikipedia, це токенізація прав власності на актив.
Як технічно працює фракціоналізація NFT?
Vault контракт та custodial модель
Базова схема: NFT локіюється в vault контракті, контракт мінтить ERC-20 токени в заданій кількості. Власники ERC-20 = співвласники NFT. Vault — custodian, NFT нікуди не йде.
contract NFTVault {
IERC721 public nft;
uint256 public tokenId;
IERC20 public fractionToken; // ERC-20 з fixed supply
function fractionalize(address _nft, uint256 _tokenId, uint256 _supply) external {
IERC721(_nft).transferFrom(msg.sender, address(this), _tokenId);
FractionToken(fractionToken).mint(msg.sender, _supply);
}
}
Після локіювання NFT — vault стає його єдиним власником. Оригінальний depositor отримує всі fraction токени та може продати/розподілити їх як завгодно.
Чому buyout найскладніша частина?
Будь-який власник fraction токенів повинен мати шлях до ліквідації — інакше це просто спекулятивний токен без права на актив. Механізм buyout дозволяє будь-якому учаснику викупити всі fraction токени за встановленою ціною та отримати NFT.
Reserve price та auction buyout (Fractional/Tessera модель): Depositor встановлює reservePrice при фракціоналізації. Будь-хто може ініціювати auction якщо готовий платити ≥ reservePrice. Auction триває N днів. Власники fraction токенів можуть голосувати за оновлення reserve price (зважене голосування за кількістю токенів). Якщо auction завершується — переможець отримує NFT, fraction власники отримують ETH пропорційно частці.
| Buyout модель |
Складність |
Захист від маніпуляцій |
Типова реалізація |
| Аукціон з reserve price |
Висока |
Timelock на зміну reserve, обмеження зміни |
Fractional, Tessera |
| Instant buyout |
Середня |
Вимагає 100% fraction токенів |
EigenLayer, PartyDAO |
Тонкий момент: governance атака на reserve price. Великий holder може проголосувати за зниження reserve price, організувати дешевий buyout та вигнати дрібних holders за заниженою ціною. Захист: обмеження на зміну reserve price — не більше X% за період Y, timelock на застосування змін.
Instant buyout без auction: Альтернативний паттерн — будь-хто може викупити NFT, купивши 100% fraction токенів за поточною ринковою ціною. Контракт перевіряє баланс: if (fractionToken.balanceOf(msg.sender) == fractionToken.totalSupply()) → transferNFT. Це вимагає від покупця зібрати всі токени з open market — неможливо зробити insider buyout.
Ціноутворення та TWAP oracle
Для протоколів, де fraction токени використовуються як collateral (Aave-стиль кредитування під частку в NFT), потрібна ціна floor. Два підходи:
AMM TWAP. Fraction токени торгуються в Uniswap v3 пулі проти ETH або USDC. NFT valuation = fraction_price * total_supply. Це market-driven оцінка. Проблема: низька ліквідність у маленьких пулах → легко маніпулювати → flash loan атака на оракул.
Chainlink NFT floor price feed. Chainlink запустив floor price feeds для топових колекцій (BAYC, CryptoPunks, Azuki). Якщо NFT з підтримуваної колекції — використовуємо Chainlink. Якщо ні — більш складне завдання.
Що таке ERC-721 vs ERC-1155 source токени?
ERC-721 фракціоналізується один до одного: один NFT → N fraction токенів. Vault зберігає один tokenId.
ERC-1155 — складніше. Якщо source токен вже має amount > 1 (semi-fungible), vault може тримати кількість, і fraction токени представляють частку в цій кількості. Приклад: 100 одиниць edition #5 фракціоналізуються в 1000 ERC-20 токенів — кожен токен = 0.1 одиниці edition.
Для фракціоналізації ERC-1155 потрібно додатково трекати: скільки одиниць source токена в vault, і при buyout — скільки одиниць отримує покупець за 100% fraction tokens.
Ліквідність для fraction токенів
Створення ERC-20 токена — лише половина справи. Без ліквідності власник fraction токена не може вийти з позиції. Стандартні підходи:
- Uniswap v3 пул при старті. Depositor надає початкову ліквідність: частина fraction токенів + ETH в пул. Початкова ціна =
reserve_price / total_supply.
- Liquidity bootstrapping pool (Balancer LBP). Продаж fraction токенів через LBP зі спадаючою вагою — аналог dutch auction. Дозволяє провести price discovery без початкової ліквідності.
- Curve стейблкоїн пул. Якщо fraction токени прив'язані до USD-деномінованого активу — Curve пул з USDC дає кращий slippage для великих обсягів.
Процес розробки
- Mechanism design (3-5 днів). Визначаємо: buyout механіку, governance модель, oracle для ціноутворення, liquidity strategy. Пишемо формальну специфікацію інваріантів.
- Контракти (2-3 тижні). Vault + ERC-20 fraction token + buyout auction + governance. Foundry з property-based тестами: «сума fraction tokens завжди дорівнює totalSupply», «NFT покидає vault тільки через buyout з повною оплатою».
- Oracle інтеграція (3-5 днів). Chainlink floor price або Uniswap TWAP з anti-manipulation захистом.
- Frontend (1-2 тижні). Фракціоналізація UI, marketplace fraction токенів, buyout flow, governance голосування.
Механізм buyout fraction токенів Uniswap v3 дешевший за статичний порядок через менше прослизання. Наші рішення пройшли аудит: контракти перевірені на реентрансляцію, flash loan атаки та маніпуляції оракулом.
Що входить в роботу (deliverables)
- Архітектура смарт-контрактів з описом інваріантів
- Реалізація vault, fraction token, buyout та governance контрактів
- Інтеграція Chainlink або Uniswap TWAP oracle
- Фронтенд: дашборд фракціоналізації, маркетплейс токенів, buyout flow
- Розгортання на mainnet (Ethereum, Polygon, Arbitrum, Base)
- Документація контрактів (NatSpec) та керівництво користувача
- 30 днів супроводу після запуску
Орієнтири за термінами
| Компонент |
Терміни |
| Базова фракціоналізація з instant buyout |
1-2 тижні |
| Повний протокол з auction, governance, LP bootstrap та oracle |
4-6 тижнів |
Вартість розраховується після обговорення buyout механіки та вимог до governance. Отримайте консультацію — наші інженери оцінять ваш проект та запропонують оптимальне рішення. Більше 10 років досвіду в блокчейн-розробці, гарантія безпечних контрактів та аудит досвідченими спеціалістами.
Чому розробка 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 limiting — require(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
Процес розробки
-
Проектування mint-механіки — allowlist, public sale, price curve (Dutch auction або фіксована), limits per wallet
-
Контракти — з Foundry fuzz-тестами на mint limits, merkle proof-верифікацію, royalty calculations
-
IPFS деплой — завантаження метаданих та images до reveal, піннінг на мінімум двох сервісах
-
Reveal — якщо використовується Chainlink VRF, тест на testnet обов'язковий: VRF subscription має бути funded LINK токенами
-
Маркетплейс-інтеграція — верифікація колекції на OpenSea, налаштування роялті, тест MetadataUpdate events
-
Деплой та моніторинг — 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-проекту. Отримайте консультацію з архітектури маркетплейсу — залиште заявку, і ми оцінимо проект за три дні.