一、说明
合约主要实现用户添加流动性获取lp分红功能,lp分红本币。买卖收取相应的交易税费,区分买入和撤销流动性,卖出和添加流动性的交易手续费比例,钱包之间转账不收取手续费。同时,lp分红不是添加一次就可以永久获取lp分红的,需要用户不断的复投,才能持续性的获取lp分红。
随着资金池中代币数量的减少,用户按照lp权重实际所属的资金池中的本币数量相应的减少。当达到LP分红的阈值时,停止lp分红。需要用户再继续添加流动性,维持资金池中代币属于永远高于LP分红的阈值就会持续性的获取LP分红。因此,该机制可以极大的推动用户添加流动性的积极性。
二、合约具体实现功能
1. 合约功能非常简单即加池分红本币
2. 加池分红本币时要求分红的目标钱包地址持有本币达到最小数量限制,添加到资金池里的本币达到最小数量限制。并且随着代币价格的拉升,资金池里用户所属添加的代币数量在不断减少,低于指定的最小加池本币数量时停止lp分红,如果用户想继续获取lp分红就必须再次加池。因此该模式设置迫使原来lp加池的用户不断的加池以获取lp分红。、
3. 合约提供了判断加池和撤池的新写法,可以单独把加池撤池功能分离出来。不用再继续写到_transfer买入,卖出,转账固定框架中了。
4. 合约提供了精确识别满足条件的加池用户的筛选方法,不是常规的从所有持币用户中盲晒。
5. 合约提供了另外一种枚举类型的SET数组处理方式,包括增删改查等。
6. Ownerable合约中没有提供放弃管理员权限功能,生产环境使用时需要替换新的Ownerable合约文件。
三、功能模块完整代码
- 针对地址类型数组的枚举类型变量的处理类库
library EnumerableSet {
struct Set {
bytes32[] _values;
mapping (bytes32 => uint256) _indexes;
}
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
function _remove(Set storage set, bytes32 value) private returns (bool) {
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
bytes32 lastvalue = set._values[lastIndex];
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
set._values.pop();
delete set._indexes[value];
return true;
} else {
return false;
}
}
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
struct Bytes32Set {
Set _inner;
}
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
struct AddressSet {
Set _inner;
}
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
struct UintSet {
Set _inner;
}
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}
2. lp分红结构体对象的声明
struct Interest{
uint256 index;
uint256 period;
uint256 lastSendTime;
uint minAward;
uint award;
uint sendCount;
IERC20 token;
EnumerableSet.AddressSet tokenHolder;
}
3. 业务主合约构造函数
constructor (
address _route,
address _holder,
address _token) public {
lpAwardCondition = LpAwardCondition(1e8,1e8);
holder = _holder;
_tOwned[holder] = _tTotal;
token = _token;
_isExcludedFromFee[_holder] = true;
_isExcludedFromFee[address(this)] = true;
uniswapV2Router = IUniswapV2Router02(_route);
uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory())
.createPair(address(this), token);
ammPairs[uniswapV2Pair] = true;
_owner = msg.sender;
lpInterest.token = IERC20(uniswapV2Pair);
lpInterest.lastSendTime = block.timestamp;
lpInterest.minAward = 1e3;
lpInterest.period = 3600;
lpInterest.sendCount = 50;
emit Transfer(address(0), _holder, _tTotal);
}
4. LP权重对应资金池中的本币数量检测
function checkLpAwardCondition(address owner)internal view returns(bool){
uint supply = lpInterest.token.totalSupply();
uint lpAmount = lpInterest.token.balanceOf(owner);
(,uint r1,) = IUniswapV2Pair(uniswapV2Pair).getReserves();
address token1 = IUniswapV2Pair(address(uniswapV2Pair)).token1();
if( token1 == address(this) && supply > 0){
return lpAmount / supply >= lpAwardCondition.lpHoldAmount
&& balanceOf(owner) >= lpAwardCondition.balHoldAmount;
}
}
5. LP分红有效地址实时维护
function setEst(address owner) private {
if( lpInterest.tokenHolder.contains(owner) ){
if( !checkLpAwardCondition(owner) ) {
lpInterest.tokenHolder.remove(owner);
}
return;
}
if( checkLpAwardCondition(owner)){
lpInterest.tokenHolder.add(owner);
}
}
6. 遍历所有有效LP分红用户地址,下发分红本币到添加流动性的钱包地址
while (sendedCount < sendCountLimit && iterations < shareholderCount) {
if (index >= shareholderCount) {
index = 0;
}
uint256 amount = nowbanance.mul(lpInterest.token.balanceOf(shareholder));
if (
balanceOf(address(this)) < amount
|| surplusAmount < amount ) break;
if (amount >= 1e4) {
surplusAmount -= amount;
_doTransfer(address(this), amount);
}
iterations++;
index ++;
}
四、完整版合约源代码如下:
源码及合约部署、开源、上线交易所、动态参数配置教程下载地址:
至此,完成添加流动性分红本币,强制复投获取LP分红合约开发部署及配置全流程的所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册