一、说明
目前市面上联动本币和NFT的常见方法主要有两种:
第一种:类似于LP加池分红usdt的原理,uniswap V3版本的LP本身就是NFT,每笔交易扣除指定数量的滑点税费暂时中转到合约地址中。达到触发条件后分红累积的代币到所持NFT的钱包地址中,根据每个nft的tokenid获取均等数量的代币,主要原理是首先遍历所有代币的持有者,然后根据NFT查询所有的tokenid与代币的持有者匹配后均等分发所有分红的代币到NFT持有者钱包地址中。
第二种:通过合约额设置每张NFT的tokenId对应不同数量的代币。也就是给每张NFT设置不同的价值,已经代币赎回比例和手续费。在项目开始交易后的指定时间定期释放代币到NFT的持有者钱包地址,由用户主动claim所属的代币,并支付交易gas费用。针对每张NFT设置单独的代币赎回开关。
本案例主要讲述第二种方法的NFT分红源代码实现。
二、合约代码实现
- 代币赎回相关属性结构体对象声明:
struct ClaimInfo {
uint tokenId;
uint canClaimTotal;
State claimState;
uint claimPercent;
uint claimedQuantity;
uint laveQuantity;
uint lastClaimTime;
uint firstClaimTime;
uint claimNum;
uint abandonedTime;
uint activeTime;
}
2. 钱包地址代币赎回权限验证器
modifier hasClaimRight() {
uint _balance = getNFTBalance(msg.sender);
require(_balance > 0, 'Insufficient balance');
_;
}
3. 每张NFT对应的tokenId价值初始化功能
根据每张NFT的tokenID设置不同的价值,即每个tokenId可以赎回的代币数量的不同的,价值越高可赎回的代币数量就越多
function addInitParames(uint[] memory _infos) public onlyOwner {
require(_inited == false, "can't add parames");
require(_infos.length > 0, "can't init this contract from infos");
uint _tokenId = _infos[0];
uint _canClaimTotal = _infos[1];
addClaimInfo(_tokenId, _canClaimTotal, 1);
}
function addClaimInfo(uint _tokenId, uint _canClaimTotal, uint _claimPercent) internal {
require(_tokenId != uint(0), "Distribute: tokenId null is not allowed");
require(_canClaimTotal != uint(0), "Distribute: canClaimTotal null is not allowed");
require(_claimPercent != uint(0), "Distribute: claimPercent null is not allowed");
nftInfo[nftAddress][_tokenId] = _claimInfo;
nftInfoList.push(_claimInfo);
nftInfoIndex[nftAddress][_tokenId] = nftInfoList.length-1;
emit addClaimInfoEvent(_tokenId, _canClaimTotal, _claimPercent);
}
4. 用户根据持有的NFT情况,手动赎回所属代币的核心代码实现
for(uint i=0;i<_myTokenIds.length; i++) {
uint _tokenId =_myTokenIds[i];
if(_info.claimState == State.Abandoned) {
continue;
}
if(_info.claimNum == _canClaimeNumTotal) {
continue;
}
if(_info.canClaimTotal <= 0) {
continue;
}
if(_info.laveQuantity <=0) {
continue;
}
for (uint k=1;k<=_canClaimeNumTotal;k++) {
if(k <= _info.claimNum) {
continue;
}
uint _modNum = SafeMath.mod(k, 12);
uint _currentPercent = _info.claimPercent;
if (k > 1 && _modNum == 1) {
_info.claimPercent = SafeMath.div(_currentPercent, 2);
}
uint _thisClaim = SafeMath.div(_thisClaimTemp, (10 ** 30));
}
_needSendTotal = SafeMath.add(_needSendTotal, _claimNeedTemp);
emit doClaimInfo(_info);
ClaimLog memory _claimLog = ClaimLog({receiver:msg.sender, nftAddr: nftAddress, tokenId: _tokenId, quantity:_claimNeedTemp,
claimTime: _info.lastClaimTime, claimPercent:_info.claimPercent, claimNum: _info.claimNum});
claimLogIndex[nftAddress][_tokenId] = claimLogList.length-1;
emit doClaimLog(_claimLog);
}
合约部署完成后测试相关的代币claim接口可以正常实现代币的赎回功能,项目开盘90天后允许用户赎回所属代币,每张NFT的tokenID对应的等值代币每月释放一次,每30天允许赎回等值代币的1%,需要100个月才能将所有代币全部赎回完成。
至此,完成持有NFT可以获取等值的代币定期释放赎回到钱包地址合约代码实现所有操作流程。
pdf+视频(BSC币安链+TRX波场链)NFT发行教程及合约源代码下载:
币安智能链BSC+波场链TRX NFT发行(合约部署、开源、参数配置、开发、故障处理、工具使用)教程下载:
pdf+视频(TRX波场链+BSC币安链)NFT发行教程及合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册