You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写适配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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 06:12:39