Ошибка: NFT — Not owner при попытке трансфера

Причина и решение ошибки «Not owner» при transfer NFT-элемента на TON.

NFT: «Not owner» при попытке трансфера

NFT-item отклонил transfer: sender() не совпадает с текущим owner этого item-контракта.


Причина

  • transfer шлёт не владелец, а collection / сторонний кошелёк;
  • NFT уже переведён, UI показывает старого owner;
  • путаешь адрес collection и адрес item — сообщение ушло не в тот контракт;
  • используешь чужой testnet item на mainnet (или наоборот).

Решение

typescript
// @ton/core ^0.59
import { Address, beginCell, toNano, internal } from "@ton/core";

const nftItem = Address.parse("EQ..."); // адрес конкретного NFT item
const newOwner = Address.parse("EQ...");
const responseTo = walletAddress; // куда вернуть лишний TON

// Убедись on-chain: get_nft_data → owner_address == твой кошелёк
const transfer = beginCell()
  .storeUint(0x5fcc3d14, 32) // op::transfer
  .storeUint(0, 64) // query_id
  .storeAddress(newOwner)
  .storeAddress(responseTo)
  .storeBit(false) // no custom payload
  .storeCoins(toNano("0.01")) // forward_amount
  .storeBit(false)
  .endCell();

const message = internal({
  to: nftItem,
  value: toNano("0.05"),
  body: transfer,
});
tact (fallback highlight)
// Tact 1.6+ — типичная проверка в NFT item
receive(msg: Transfer) {
    require(sender() == self.owner, "Not owner");
    self.owner = msg.newOwner;
    // notify new owner / excesses...
}

Как избежать в будущем

Перед transfer читай get_nft_data и сверяй owner. Подписывай tx тем же кошельком. В тестах сначала mint/transfer на treasury, затем проверяй owner get-методом.

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