如何编写适配Crossmint API的NFT合约铸造函数?
适配Crossmint的ERC-721合约Mint函数实现
基础合约结构(基于OpenZeppelin)
下面是符合Crossmint调用要求的ERC-721 NFT合约示例,包含批量铸造、支付验证和权限控制功能:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Counters.sol"; contract MyNFT is ERC721, ERC721URIStorage, Ownable { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; // 单个NFT的价格(单位:wei) uint256 public pricePerNFT; constructor(uint256 initialPrice) ERC721("MyNFT", "MNFT") Ownable(msg.sender) { pricePerNFT = initialPrice; } // 适配Crossmint的核心Mint函数 function mint(address to, uint256 quantity, string memory tokenURI) public payable { // 验证支付金额与总价匹配 require(msg.value == pricePerNFT * quantity, "支付金额不匹配"); // 批量铸造指定数量的NFT for (uint256 i = 0; i < quantity; i++) { uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(to, tokenId); _setTokenURI(tokenId, tokenURI); } } // 提取合约中的ETH(仅合约所有者可调用) function withdraw() public onlyOwner { uint256 balance = address(this).balance; require(balance > 0, "无ETH可提取"); payable(owner()).transfer(balance); } // 重写ERC721URIStorage的必要函数 function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return super.tokenURI(tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721URIStorage) returns (bool) { return super.supportsInterface(interfaceId); } }
关键说明
- 参数对应关系:合约的
mint函数参数to(用户钱包地址)、quantity、tokenURI与你前端mintConfig中的参数一一对应,Crossmint会自动将前端传递的参数转发给合约。 - 支付验证:通过
require(msg.value == pricePerNFT * quantity)确保支付金额与NFT总价一致,和你前端计算的totalPrice保持同步。 - 动态价格配置:如果需要修改NFT价格,可添加以下仅所有者可调用的函数:
function setPrice(uint256 newPrice) public onlyOwner { pricePerNFT = newPrice; }
注意事项
- 合约部署网络需与Crossmint配置的环境一致(
staging对应测试网如Sepolia)。 - 在Crossmint控制台配置合约时,需指定正确的函数签名:
mint(address,uint256,string)。 - 测试阶段使用对应测试网的测试ETH进行支付验证。
内容的提问来源于stack exchange,提问作者Bryan Smith
相关产品推荐
相关产品推荐

