Does SUCCESS really matter? Anyways, anyone having more than 2 Mayas is a HUNTER!
Author: Razzor
Network: Goerli
Address: 0xA65d0E85BB136F460d864a8D37EacC1011314623
Note: The intended behaviour can be observed by forking Goerli in hardhat

Contract Pseudo Code

pragma solidity ^0.8.0;

import "./Address.sol";
import "./IERC20.sol";
import "./IERC20Permit.sol";
import "./SafeERC20.sol";
import "./ERC721.sol";
import "./Counters.sol";
contract Maya is ERC721("MAYA", "MAYA"){
    using SafeERC20 for IERC20;
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIdCounter;

    IERC20 public token;
    uint public price;
    address public owner;

    mapping(address => uint[]) public allIds;

    constructor(address _token, uint _price){
        token = IERC20(_token);
        price = _price;
        owner = msg.sender;

    modifier onlyOwner(){
        require(msg.sender == owner, "Not the Owner");

    function buy() external{
        require(token.balanceOf(msg.sender)>=price, "Insufficient balance");
        require(token.allowance(msg.sender, address(this)) >= price, "Insufficient Allowance");
        uint256 tokenId = _tokenIdCounter.current();
        _mint(msg.sender, tokenId);
        token.safeTransferFrom(msg.sender, address(this), price);

    function burnMaya() external {
        require(balanceOf(msg.sender)>0,"No Ids to burn");
        uint length = allIds[msg.sender].length;
        for(uint i=0;i < length;++i){
            uint tokenId = allIds[msg.sender][i];

        delete allIds[msg.sender];

    function setPrice(uint _price) external onlyOwner{
        price = _price;

    function hunter() external view returns(string memory){
        uint balance = balanceOf(msg.sender);
        if (balance > 2){
            return "Seems like you have figured it out? Hunter!";
        else if(balance > 0){
            return "Oh wow! You got Maya!";
        else {
            return "Buy one at least?";

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        revert("Don't cheat the system!");

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public override {
        revert("Don't cheat the system!");


    function tokenURI(uint256) public pure override returns (string memory) {
        return "";

    function transferOwnership(address newOwner) external onlyOwner{
        owner = newOwner;