首页 > 其他分享 >ERC721开发NFT--接口

ERC721开发NFT--接口

时间:2022-11-13 21:14:29浏览次数:39  
标签:function interfaceId tokenId -- ERC721 uint256 token NFT address



使用https://docs.openzeppelin.com/contracts/4.x/erc721中的简单案例
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract GameItem is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("GameItem", "ITM") {}

    function awardItem(address player, string memory tokenURI)
        public
        returns (uint256)
    {
        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        _tokenIds.increment();
        return newItemId;
    }
}

 


tokenId:类似于商城商品ID,从0开始

approve函数

// 将token授权给to地址
function approve(address to, uint256 tokenId) external;

 

函数:awardItem()   铸造token,
player:拥有者地址
tokenURI:NFT信息,可以是地址或json,
返回tokenId
function awardItem(address player, string memory tokenURI)
        public
        returns (uint256)
    {
        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        _tokenIds.increment();
        return newItemId;
    }

 

safeTransferFrom函数

// 转移token从from到to地址
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

 

safeTransferFrom函数

// 转移token从from到to地址
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

 

setApprovalForAll函数

// 授权全部token给operate地址
    function setApprovalForAll(address operator, bool _approved) external;

transferFrom函数,//单个NFT转移,与safeTransferFrom()不同之处在于调用者必须自己确认_to地址能正常接收NFT,否则将丢失此NFT

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //检查 合约调用者是否是token的拥有者或者被授权approve
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        // 转移token
        _transfer(from, to, tokenId);
    }

 

balanceOf函数,返回由_owner 持有的NFTs的数量

// 记录
    function balanceOf(address owner) external view returns (uint256 balance);

 

getApproved函数,查询地址授权(单个NFT)

    // 获取token的approve地址
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
    //  检查token是否存在
        _requireMinted(tokenId);
        return _tokenApprovals[tokenId];
    }

 

isApprovedForAll函数,查询地址授权(所有的NFT)

    // 设置 给operator的授权情况
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

 

ownerOf函数

// 获取token的拥有者地址
    function ownerOf(uint256 tokenId) external view returns (address owner);

supportsInterface函数

    // 是否使用了 ERC721接口
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

 

tokenURI函数

    //  获取tokenURI
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    //  检查token是否存在
        _requireMinted(tokenId);
   //  获取baseURI
        string memory baseURI = _baseURI();
   
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

 

 

更多接口解析,请看:https://learnblockchain.cn/article/4507#_mint%E5%87%BD%E6%95%B0

    // 是否使用了 ERC721接口    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {        return            interfaceId == type(IERC721).interfaceId ||            interfaceId == type(IERC721Metadata).interfaceId ||            super.supportsInterface(interfaceId);    }  

标签:function,interfaceId,tokenId,--,ERC721,uint256,token,NFT,address
From: https://www.cnblogs.com/zhangzhijian/p/16886954.html

相关文章

  • sed 实操
    sed-n's/^.*\/data/\/data/p'file删除每行行首到“/data/”的内容-n:输出只有经过sed特殊处理的一行,否则其他行都一并输出sed-n's/^.*\/data/\/data/;s/\:.*$//p'......
  • 833——B题题解
    题目链接题目大意:给一串字符串(只包含0~9),定义一个最优子串的定义:如果该子串同字符种类数大于最最多字符出现数,那么这个子串可以被称为最优子串。解题思路:大眼一看这个数......
  • 解决“fast-forward, aborting”问题
    1.现象对某一个远程仓库gitpull过程中,报错如下:#zl@srv123in~/git/radxa/kernel[14:09:54]$gitpullremote:Enumeratingobjects:5,done.remote:Cou......
  • 单调栈/单调队列
    单调栈/单调队列典型力扣题目239:滑动窗口最大值双端队列,队列存放元素按一定规则有序//双端队列Deque:LinkedList,ArrayDeque,LinkedDeque,LinkedBlockingDequeDequ......
  • 287.寻找重复数
    给定一个包含 n+1 个整数的数组 nums ,其数字都在 [1,n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。假设 nums 只有 一个重复的整数 ,返回 这个重复......
  • OpenFeign
    OpenFeign—服务间的调用一.什么是Feign和OpenFeign?在使用Feign或者OpenFeign前,服务之间的调用路径在函数内部设置:能不能像controller调用service一样,通过注......
  • 进程间通信-信号-pipe-fifo
    1.信号signal1、信号的名字和编号:每个信号都有一个名字和编号,这些名字都以“SIG”开头,例如“SIGIO”、“SIGCHLD”等等。信号定义在signal.h头文件中,信号名都定义为正......
  • .Net SemaphoreSlim
    看Elsa-core源代码中看到的,Elsa-core中所有保存数据的方法似乎使用同一个Save方法。如下图:那么为什么要使用这玩意,我还是头一次见这玩意????好吧,我承认我自己菜。我自个儿也......
  • 整型常量、无符号整型常量、长整型常量
    A.常量:    •定义:固定不变值,例如1,1.9,A,c等    •分类:1.整型常量:一般的整型常量:1234无符号整型常量:1u长整型常量:1l短整型常量:没有特殊......
  • WPF多页面切换的实现方法
    摘要C/S端软件,左侧导航菜单+右侧页面切换的布局很常见。这篇文章介绍下使用ContentControl控件和TabControl控件如何实现基础的页面切换。一、使用ContentControl实现页......