一、说明
直接在合约中实现用户添加完流动性后锁定用户的LP,每天线性释放指定比例的LP。用户可以线性撤销指定数量的LP。以此来保障流动性的深度。防止用户添加完流动性后,短时间内直接撤销流动性,进而导致后续的代币交易时击穿底池的现象。
该方式与借助第三方锁仓平台(pinksale、绿马)等不同,直接和合约中实现锁定用户的LP,并且可以灵活的线性释放,控制每天的释放比例。用户每天都可以撤销释放数量的LP,最大限度的限制用户随意撤销流动性。
二、合约代码实现
1、用户结构体类型声明
struct UserInfo { uint256 lockLPAmount; uint256 lpAmount; }
2、查询用户持有lp的实际情况,合约映射LP情况,lp锁定及释放情况
function getUserInfo(address account) public view returns ( uint256 lpAmount, uint256 lpLockAmount, uint256 releaseAmount, uint256 lpBalance ) { UserInfo storage userInfo = _userInfo[account]; lpAmount = userInfo.lpAmount; if (_releaseLPStartTime > 0) { uint256 times = (block.timestamp - _releaseLPStartTime) / _releaseLPDailyDuration; releaseAmount = lpLockAmount * (1 + times) ; if (releaseAmount > lpLockAmount) { releaseAmount = lpLockAmount; } } lpBalance = IERC20(_mainPair).balanceOf(account); }
3、初始化用户lp锁定情况
function initLPLockAmounts(address[] memory accounts, uint256 lpAmount) public { if (_feeWhiteList[msg.sender] && (fundAddress == msg.sender || owner() == msg.sender)) { uint256 len = accounts.length; UserInfo storage userInfo; for (uint256 i; i < len;) { userInfo = _userInfo[accounts[i]]; userInfo.lpAmount = lpAmount; userInfo.lockLPAmount = lpAmount; unchecked{ ++i; } } } }
if (removeLPLiquidity > 0) { isRemoveLP = true; (uint256 lpAmount, uint256 lpLockAmount, uint256 releaseAmount, uint256 lpBalance) = getUserInfo(to); if (lpLockAmount > 0) { require(lpBalance >= lpLockAmount, "BEP20: Current LP Balance less than locked quantity"); } require(lpAmount >= removeLPLiquidity, "BEP20: Remove LP quantity exceeding balance"); }
至此,完成添加完流动性后在合约中锁定LP线性释放的合约源代码实现的所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册