- A+
一、需求说明
目前将NFT铭文与代币进行融合联动是比较常见的defi应用场景。首先代币可以上线去中心化dex,给代币锚定到usdt的实际价值。然后实现nft铭文和代币的联动环节。通过前端dapp页面由用户完成铭文的mint或者claim领取,同时需要支付要求数量的WETH用于nft铭文铸造上链的gas费用和推广邀请返佣。用户支付的WETH暂时保存到资金池,定期归集到项目方指定钱包地址,用于后期的链游,swap,质押系统的生态发展。
- 用户通过支付usdt或者WETH可以铸造一张NFT铭文作品进入拍卖市场
- 随着nft铭文作品的拍卖次数增加,nft铭文的价值呈现指数性的递增,每成功拍卖一次nft铭文的价值上涨3%
- 如果nft铭文流拍,则对当前nft铭文的价格进行折扣处理
- nft铭文可以通过销毁的方式按照当前拍卖后的实际价值兑换等价值的代币,然后将代币卖出到资金池进行变现。通过代币作为中间介质实现nft铭文的交易买卖,通过去中心化swap可以实现nft铭文的线上交易
- 用户通过盲盒游戏可以开出不同中奖概率的代币,达到指定数量的代币后可以合成NFT铭文,然后将NFT铭文进行线上拍卖以增加nft铭文的价值。当用户需要兑现nft铭文时再通过销毁nft铭文的方式回归代币,最后在代币资金池进行兑现。
二、解决方案
整个系统合约层面的需求需要拆分为三个部分:代币,NFT铭文,盲合开奖
代币:主要包括代币本身的功能以及外围接口的调用和权限访问控制,代币设置相关的滑点分配包括(回流底池增加底池厚度,LP加权分红,NFT铭文持有分红,代币啊交易通缩)。同时为了保障代币价格随着时间的持续性递增,而不依赖外部资金的流入设置了资金池的单边燃烧机制,每小时燃烧资金池0.5%,24小时燃烧12%。
NFT铭文:nft铭文的铸造,销毁,拍卖,价值变更,通证兑换等功能。铭文NFT可以通过用户借助dapp前端页面支付usdt完成铸造mint,也可以直接往mint合约地址转账指定数量的weth来完成nft铭文的铸造领取。
盲盒:主要是设置公平合理的抽奖算法。盲盒可以有指定概率开出BTC,ETH,NFT铭文碎片等奖励。
三、核心代码实现
- 代币的mint权限访问控制代码:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import "./Ownable.sol";
abstract contract AccessControl is Ownable{
event SetOperator(address indexed add, bool value);
function setOperator(address _operator, bool _v) external onlyOwner {
_operators[_operator] = _v;
emit SetOperator(_operator, _v);
}
function isOperator(address _address) external view returns(bool){
return _operators[_address];
}
modifier onlyOperator() {
require(_operators[msg.sender]);
}
}
2. 代币铸造mint功能部分核心代码
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal {
require(account != address(0), "ERC20: mint to the zero address");
require(amount > 0, "ERC20: Mint amount must be greater than zero");
require(account != _uniswapV2Pair, "ERC20: mint to uniswapV2Pair address");
require(account != _uniswapV2UsdtPair, "ERC20: mint to uniswapV2UsdtPair address");
require(_totalSupply < MAX_SUPPLY, "ERC20: totalSupply greater than or equal MAX_SUPPLY");
if(_totalSupply.add(amount) > MAX_SUPPLY) {
uint256 maxAmount = MAX_SUPPLY.mul(_totalSupply);
amount = maxAmount;
}
_totalSupply = _totalSupply.add(amount);
emit Transfer(address(0), account, amount);
}
3. 代币transfer交易时核心功能前置验证(批量杀区块,批量杀抢开盘软件机器人,限制添加和撤销流动性)代码
if (_swapPairList[sender] || _swapPairList[recipient]) {
if (!_isExcludedFromFee[sender] && !_isExcludedFromFee[recipient]) {
if (_swapPairList[sender]) {
isRemoveLP = _isRemoveLiquidity();
} else {
isAddLP = _isAddLiquidity();
}
if (
(0 == startTradeBlock && startTradeTime == 0) ||
startTradeTime + 30 days > block.timestamp
) {
require(0 < startAddLPBlock && isAddLP && addLiquidityEnabled, "ERC20:operater action is not AddLiquidity or addLiquidity is disabled");
}
if (block.number < startTradeBlock.add(killBlockNumber)) {
_funTransfer(sender, recipient, amount);
return;
}
if (
enableKillBatchBots &&
_swapPairList[sender] &&
block.number < startTradeBlock + killBatchBlockNumber
) {
if (block.number != user2blocks[tx.origin]) {
user2blocks[tx.origin] = block.number;
} else {
batchBots++;
_funTransfer(sender, recipient, amount);
return;
}
}
}
}
4. 用户支付usdt获取铸造NFT铭文权限并铸造NFT铭文的函数接口代码
function nftMintForUsdt(uint256 usdtAmount) public lockMintAndSwap returns (bool) {
require(usdtAmount >= _nftMintForUsdtCondition, "ERC20: subscribe usdt amount less than nftMintForUsdtCondition");
uint256 usdtBalance = USDT.balanceOf(address(this));
INFT nft = INFT(_nftAddress);
uint256 tokenId = nft.autoMint(_nftReceiver);
emit NftMintForUsdt(msg.sender, _nftReceiver, tokenId);
return true;
}
5. 销毁NFT铭文反向铸造mint代币接口函数实现
function nftBurnForMintToken(uint256 tokenId, address account) external onlyOperator returns (bool) {
INFT nft = INFT(_nftAddress);
uint256 nftAuctionStat = _tokenAuctionStat[tokenId];
uint256 tokenCurrentPrice = ITokenTool(_tokenTool).getTokenPrice();
if(nftAuctionStat != 2) {
swapAmount = swapAmount.mul(_nftBurnAuctionPercent).div(_nftBurnAuctionBase);
}
IERC20 Token = IERC20(_Token);
emit NftBurnForMintToken(tokenId, account, swapAmount);
return true;
}
至此,完成NFT铭文与代币进行联动,销毁NFT铭文可以铸造mint代币,支付usdt可以mint铸造NFT铭文所有操作流程。
pdf+视频比特币链ARC20+BRC20+ORC20+SRC20,EVM网络BSC20+ERC20+ARB20+SPL20+POL20铭文deploy部署Mint铸造打新教程下载:
比特币链ARC20+BRC20+ORC20+SRC20,EVM网络BSC20+ERC20+ARB20+SPL20+POL20铭文deploy部署Mint铸造(铭文铭刻deploy部署、铸造mint、转账transfer、upgrade、cancel、挂单unisat、Migration、marketplace、EVM Marketing挂单交易)教程下载:
pdf+视频比特币链ARC20+BRC20+ORC20+SRC20,EVM网络BSC20+ERC20+ARB20+SPL20+POL20铭文deploy部署Mint铸造打新教程下载地址:
本文是全系列中第8 / 18篇:NFT发行
- 币安链BSC上NFT发行教程——NFT单品铸造完成后无法在tp钱包显示图片故障处理及解决方法【pdf+视频BSC链NFT发行教程下载】
- 比特币NFTs: Ordinals NFT 图片怎么从rawTransaction原始交易中解析
- Safe 多签钱包签名消息, 支持签名登录 Opensea
- 币安链BSC上NFT发行教程——NFT合约中的代理人针对所有NFT的授权功能【pdf+视频BSC链NFT发行教程下载】
- NFTScan | 06.12~06.18 NFT 市场热点汇总
- 币安链BSC上NFT发行教程——NFT元数据模板,支持上线opensea并交易【pdf+视频BSC链NFT发行教程下载】
- 币安链BSC上NFT发行教程——NFT根据拍卖次数指数型递增增加价格【pdf+视频BSC链NFT发行教程下载】
- 铭文NFT与代币进行联动,销毁NFT铭文可以铸造mint代币,支付usdt或者WETH可以mint铸造NFT铭文
- 币安链BSC上NFT发行教程——自动创建tokenid的NFT合约源码实现【pdf+视频BSC链NFT发行教程下载】
- 波场链TRX上NFT发行教程——web页面上传NFT头像到IPFS链【pdf+视频TRX链NFT发行教程下载】
- 从PStake解读BTCFI的窘境与未来
- 币安BSC智能链发币教程——扫描所有NFT,根据NFT持有情况分红代币【pdf+视频BSC发币教程下载】
- 币安链BSC上NFT发行教程——BSC链铸造nft并转账(空投)到其他钱包地址【pdf+视频BSC链NFT发行教程下载】
- 币安链BSC上NFT发行教程——两种方式在BSC币安链上铸造NFT及部署NFT合约【pdf+视频BSC链NFT发行教程下载】
- 币安BSC智能链NFT Market搭建教程——搭建基于BSC链的NFT Market合约实现【pdf+视频BSC NFT教程下载】
- 波场链TRX上NFT发行教程——NFT中元数据合约源代码实现【pdf+视频TRX链NFT发行教程下载】
- 波场链TRX上NFT发行教程——部署波场链上的NFT合约【pdf+视频TRX链NFT发行教程下载】
- 波场链TRX上NFT发行教程——使用腾讯云存储代替ipfs存储的实现方式【pdf+视频TRX链NFT发行教程下载】
- 我的微信
- 这是我的微信扫一扫
-
- 我的电报
- 这是我的电报扫一扫
-