contract ERC721 {
    // Required methods
    function totalSupply() public view returns (uint256 _totalSupply);
    function balanceOf(address _owner) public view returns (uint256 _balance);
    function ownerOf(uint _tokenId) external view returns (address _owner);
    function approve(address _to, uint _tokenId) external;
    function transferFrom(address _from, address _to, uint _tokenId) external;
    function transfer(address _to, uint _tokenId) external;
    
    // Events
    event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);

    // Optional functions
    // function name() public view returns (string _name);
    // function symbol() public view returns (string _symbol);
    // function tokenOfOwnerByIndex(address _owner, uint _index) external view returns (uint _tokenId);
    // function tokenMetadata(uint _tokenId) public view returns (string _infoUrl);
}
function totalSupply() public view returns (uint256 _totalSupply);

// Required methods