NFT на TON vs ERC-721

Сравнение NFT на TON и ERC-721: коллекция, item-контракты, transfer и метаданные для разработчика.

NFT на TON vs ERC-721 — коротко

ERC-721 — один контракт коллекции с ownerOf / transferFrom. На TON NFT — collection + отдельный item-контракт на каждый токен (TEP-62/64): владелец и transfer живут в item, не в mapping коллекции. Для маркетплейса и кошелька якорь — адрес item, не tokenId внутри одного контракта.


Таблица сравнения

ПараметрNFT на TONERC-721
АрхитектураCollection + NFT item (отдельный контракт)Один контракт на коллекцию
ИдентификаторАдрес item (+ index в collection)tokenId (uint)
TransferСообщение на itemtransferFrom / safeTransferFrom
Метаданныеon-chain / off-chain по TEP-64tokenURI + часто IPFS
ApproveTransfer с нужными флагами / sale-контрактыapprove / setApprovalForAll
МасштабItems шардируютсяВсё в одном storage коллекции

Когда выбирать паттерны TON NFT

  • Минтишь коллекцию через collection, item деплоится на владельца
  • Слушаешь входящие NFT на маркетплейсе: sender = item, проверяешь что item из твоей collection
  • UI показывает item-address; index — для галереи и rarity, не единственный ключ

Когда ERC-721-мышление мешает

  • Ищешь ownerOf(tokenId) на collection как единственный source of truth без get-методов item
  • Делаешь setApprovalForAll «как в OpenSea» без модели sale/transfer на TON
  • Хранишь только tokenId без адреса item — на TON без адреса item не отправишь transfer

Пример: transfer NFT item

typescript
// @ton/core ^0.27 — NFT transfer (TEP-62)
import { Address, beginCell, toNano } from "@ton/core";

const NFT_TRANSFER = 0x5fcc3d14;

function buildNftTransfer(opts: {
  newOwner: Address;
  responseTo: Address;
  forwardTon: bigint;
}) {
  return beginCell()
    .storeUint(NFT_TRANSFER, 32)
    .storeUint(0n, 64) // query_id
    .storeAddress(opts.newOwner)
    .storeAddress(opts.responseTo)
    .storeBit(false) // no custom payload
    .storeCoins(opts.forwardTon)
    .storeBit(false) // no forward_payload
    .endCell();
}

// send на адрес NFT item, не на collection
await nftItem.send(
  sender,
  { value: toNano("0.05") },
  buildNftTransfer({
    newOwner: buyer,
    responseTo: seller,
    forwardTon: toNano("0.01"),
  }),
);

Collection отвечает за mint и связь index → item. Владение и смена владельца — ответственность item-контракта.

Материалы gramdocs.tech носят образовательный характер и не являются финансовой, юридической или инвестиционной рекомендацией. Работа с блокчейном TON и токеном Gram связана с рисками потери средств. Правовая информация