NFT Collection Pattern и Factory Contracts
NFT на TON: Collection + Item
NFT на TON используют тот же sharded pattern, что и Jetton:
Сравнение: ERC-721 vs TON NFT
| Аспект | ERC-721 (Ethereum) | TON NFT |
|---|---|---|
| Storage | Все tokenID→owner в одном контракте | Каждый Item = отдельный контракт |
| Transfer | Один вызов transferFrom() | 2-3 сообщения (async) |
| Enumeration | tokenOfOwnerByIndex() — on-chain | Off-chain indexer (Tonscan) |
| Royalty | ERC-2981 (необязательно) | Встроено в Collection |
| Scalability | Ограничено одним контрактом | Каждый Item в своём шарде |
Factory Pattern
Factory Contract — контракт, который деплоит другие контракты. Collection — это factory для Items.
Общий Factory Pattern
// Factory Contract
recv_internal(msg) {
if (op == op::create_child) {
// 1. Подготовить initial data для child
let init_data = pack_child_data(msg.params);
// 2. Вычислить state_init (code + data)
let state_init = pack_state_init(child_code, init_data);
// 3. Вычислить адрес child (deterministic!)
let child_address = calc_address(state_init);
// 4. Отправить deploy message
send(child_address, gas, body, state_init);
// 5. Обновить registry (если нужно)
self.child_count += 1;
}
}
Use Cases для Factory Pattern
| Factory | Child | Пример |
|---|---|---|
| Jetton Master | Jetton Wallet | Первое получение токена → deploy wallet |
| NFT Collection | NFT Item | Mint → deploy item |
| DEX Router | Liquidity Pool | Создание пары → deploy pool |
| Lending Market | User Position | Первый deposit → deploy position |
| Multisig Factory | Multisig Wallet | Создание кошелька → deploy multisig |
SBT (Soulbound Token)
SBT — не-передаваемый токен (Soulbound). Та же архитектура Collection + Item, но transfer запрещён:
SBT vs NFT:
├── Deploy: одинаковый (Collection → Item)
├── Ownership: одинаковый (Item.owner)
├── Transfer: [NO] ЗАПРЕЩЁН для SBT
├── Burn: [OK] только owner может burn
└── Use case: сертификаты, репутация, KYC-токены
Design Insight
SBT — пример, как один паттерн (Collection + Item) адаптируется для разных use cases просто изменением transfer policy. Код item-контракта одинаковый, но transfer handler в SBT возвращает ошибку.
Batch Minting: массовый deploy
Минтинг 10,000 NFT за одну транзакцию невозможен (~255 messages limit). Используйте chain of batches:
Batch Minting Pattern:
Tx 1: Collection deploys Items #0-254 + self-msg("continue from 255")
Tx 2: Collection deploys Items #255-509 + self-msg("continue from 510")
...
Tx 40: Collection deploys Items #9745-9999
Total: ~40 транзакций для 10,000 NFT
Gas: ~40 × 255 × deploy_cost ≈ 100+ TON
Batch mint = дорого
10,000 NFT mint = ~100+ TON в gas. Альтернатива: lazy minting — Item деплоится только при первом claim/purchase, не при создании коллекции. Экономит gas creator-у, переносит cost на buyer-а.