发行数字藏品的运营三板斧:空投、盲盒、合成兑换。
由于区块链的随机数不好获取的原因,通常我们不会把盲盒功能写在合约中,而是会把空投、合成兑换功能扩展在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合约写在一起的好处了。无序用户对兑换合约进行二次授权了。