数字藏品空投、合成的简单代码演示

发行数字藏品的运营三板斧:空投、盲盒、合成兑换。

由于区块链的随机数不好获取的原因,通常我们不会把盲盒功能写在合约中,而是会把空投、合成兑换功能扩展在NFT合约中。

 空投功能

常见空投功能的核心,是允许在一定时间范围内,免费领取token ID在前n位的数字藏品

如果配合上白名单功能,则可以实现空投功能

```

function userGet() external payable _lock_ {
    _tokenIdCounter.increment();
    uint256 tokenId = _tokenIdCounter.current();
    require(tokenId <= 8000, "Insufficient tokenID quota");
    address to = _msgSender();
    if (!_freeWhiteList[to]) {
        payable(_revenueRecipient).transfer(_userPrice);
    }
    _safeMint(to, tokenId);
}
    
```

在此功能上,可以扩展出vipGet等功能来

合成兑换功能

合成兑换功能的需求在于记录合成公式。无论想要用哪几个nft兑换成另外几个nft,都可以用合成公式来记录。

我们这里为了方便理解,不使用struct,仅定义普通mapping变量来演示。

```

    mapping(uint256 => mapping(uint256 => uint256)) public inputNfts;
    mapping(uint256 => mapping(uint256 => uint256)) public outputNfts;

    mapping(uint256 => uint256) public inputLength;
    mapping(uint256 => uint256) public optputLength;

    uint256 fids = 1;

```

然后我们实现记录合成公式的方法

```

function addFormula(
    uint256[] memory inputIds,
    uint256[] memory outputIds
) public onlyOwner {
    inputLength[fids] = inputIds.length;
    optputLength[fids] = outputIds.length;

    for (uint256 i = 1; i <= inputIds.length; i++) {
        inputNfts[fids][i] = inputIds[i - 1];
    }

    for (uint256 i = 1; i <= outputIds.length; i++) {
        outputNfts[fids][i] = outputIds[i - 1];
    }
    
    fids = fids + 1;
}

```

最后我们实现合成兑换功能

```

function swap(uint256 _fid) external {
    address to = _msgSender();

    // burnToken
    for (uint256 i = 1; i <= inputLength[_fid]; i++) {
        burn(to, inputNfts[_fid][i], 1);
    }

    // give nft
    for (uint256 i = 1; i <= optputLength[_fid]; i++) {
        _mint(to, outputNfts[_fid][i], 1, "");
    }
}

```

在这里我们就看出,把合成兑换功能跟NFT合约写在一起的好处了。无序用户对兑换合约进行二次授权了。

猜你喜欢

转载自blog.csdn.net/2301_76642277/article/details/130582327