Здравствуйте!
Не буду тянуть "резину" и перейду сразу к делу. Рассмотрев несколько разных Смарт-контрактах я был удивлен, что мало кто закладывает burn токенов или вовсе не работает это. "Из коробки" у меня тоже не получилось это сделать. Есть наипростейший Смарт-контракт:
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
contract SFFContract is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("SFF NFT", "SFFNFT") {}
function mint(address recipient, string memory uri) public returns (uint256) {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, uri);
return newItemId;
}
function burn(uint256 tokenId) public virtual {
_burn(tokenId);
}
}
Так вот, транзакция с сжиганием токена не проходит. Она ревертится и имеет следующую ошибку:
Warning! Error encountered during contract execution [stack underflow (1 <=> 8)]
Судя по ошибке, то где-то происходит переполнение, т.е. типа 0 - 1 вываливается на границу. Если бы я сам писал функционал, то другое дело, но я использую базовые функций, которые, по моим представлениям должны работать без всякой магии.
Кто сталкивался с подобным? Какое решение нашли?