# NFT合约级mint实践

By [r4yyy.eth](https://paragraph.com/@r4yyy) · 2022-04-30

---

简明教程
====

1.  找到对应地址
    
    可以先试用页面触发小狐狸的审批页面，之后找对应的地址。
    
2.  浏览器查看合约交互
    
    nft 项目一般都是 mint 的方法的调用。在交易详情的advance里面看到decode 之后的内容，一般是合约的方法名和参数
    
3.  看合约代码
    
    直接找到 调用的mint 函数的定义内容，检查其逻辑。
    
4.  构造调用参数，进行合约交互
    

实践记录
----

以下面的合约为例子。

[https://polygonscan.com/address/0x3a67c34c7dbd846108044fed38a3154b99a97cb1](https://polygonscan.com/address/0x3a67c34c7dbd846108044fed38a3154b99a97cb1)

看到有大量的Mint 调用，在advence查看调用内容，如下

    Function: mint(uint256 amount, uint256 timeout) ***
    
    MethodID: 0x1b2ef1ca
    [0]:  0000000000000000000000000000000000000000000000000000000000000001
    [1]:  000000000000000000000000000000000000000000000000000000000001c378
    

这里主要是看解码出来的 Functiin name，这里的参数不一定百分百准确，因为是使用 字典来进行解码的。

这里推荐使用 [4byte](https://www.4byte.directory/)来进行方法名解码。有比较强大的 DB

[https://www.4byte.directory/signatures/?bytes4\_signature=0x1b2ef1ca](https://www.4byte.directory/signatures/?bytes4_signature=0x1b2ef1ca)

我们可以看到解码的内容是。

167720mint(uint256,uint256)`0x1b2ef1ca`

在其公布的sol code的 `RaremintsERC721` 里面我们可以找到mint的定义：

        function mint(uint256 num, uint256 metadata) public payable {
            uint256 supply = totalSupply();
            require( !_paused,                              "Sale paused" );
            require( supply + num <= _supply - _reserved,   "Exceeds maximum supply" );
            require( msg.value >= _price * num,             "Ether sent is not correct" );
    
            for(uint256 i; i < num; i++){
                performMint(msg.sender, supply + i, metadata);
            }
        }
    

可以看到 ：

1.  payable
    
2.  num
    
3.  metadata
    

这里第三个request就看出来我们的payable需要达到单价以上。在这里price 设置的是 0.5matic 所以我们这里就保持1:0.5 的数量价格比。另外一个参数是 metadata，这里 `performMint`用到了这个参数，其函数内容如下。

        function performMint(address _to, uint256 _tokenId, uint256 _metadata) private {
            _safeMint(_to, _tokenId);
            emit MintEvent(_to, _tokenId, _metadata);
        }
    

我们可以看到，这里只是在 emit 事件的时候用到了这个 metadata，其他地方没有，所以这里意味着我们可以进行自定义。

综上 构建出参数 ，使用 write Contract 来进行交互。

找到 mint 函数，参数如下

1.  Payable: 1.5 matic
    
2.  Num: 3
    
3.  Metadata: 0000（任意）
    

点击 Write 写合约 ，完成交互过程。简单轻松

后
-

从简单的流程分析来切入智能合约的路子上

---

*Originally published on [r4yyy.eth](https://paragraph.com/@r4yyy/nft-mint)*
