- A+
随着defi多模式的日渐成熟,各种模式应运而生。其中变化最大的当属加池分红LP模式。原来的模式的每笔交易都有固定比例的本币回流到LP池,分红给所有添加流动性的用户。但是分红的本币是按照权重分配给所有加池用户的,但是分红的代币不是直接进入加池用户钱包地址,而是分到资金池中。作为用户的加池收益分红,或者撤销流动性时可以从资金池中带走分红的LP代币。
但是这种模式是以牺牲链上的真实快照数据为代价的。并不是说所有加池的用户都可以分红到LP。合约认定加池分红的用户是通过自己定义所有持币用户为参考依据的。所有参与过pancakeswap交易的钱包地址才认为是持币用户。然后根据持币用户找到所有持有LP的用户,然后剔除掉所有的锁仓地址、黑洞地址0x0,剩下的活跃用户分红加池分红的本币到加池钱包。
加池分红LP到加池用户的核心代码如下:
//以下计算公式中抛去了营销地址和合约地址,这意味着所有的分红代币将全部公平公正的分配到每一个普通用户手上
function _tokenReward() internal returns (bool) {
//需要抛出的Pool数量
uint256 cast = 0;
cast = cast.add(super.getLPTotal(_making));
cast = cast.add(super.getLPTotal(address(0x0)));
for (uint256 i = 0; i < _lockAddress.length; i++) {
cast = cast.add(super.getLPTotal(_lockAddress[i]));
}
//获取当前合约可以进行分红的代币数量
uint256 reward = _balances[address(this)];
//进行循环过滤不符合条件的地址
for (uint256 i = 0; i < tokenHolders.length; i++) {
//如果为普通地址
bool isLock = false;
//如果等于锁池子的地址
for (
uint256 lockIndex = 0;
lockIndex < _lockAddress.length;
lockIndex++
) {
if (tokenHolders[i] == _lockAddress[lockIndex]) {
isLock = true;
}
}
//如果不是0地址并且也不是锁定池子地址 则可以分红
if (tokenHolders[i] != address(0x0) && isLock == false) {
//获取当前地址的LP数量
uint256 LPHolders = super.getLPTotal(tokenHolders[i]);
//如果LP持有数量大于0
if (LPHolders > 0) {
//计算当前池子中不包括营销地址、LP锁定地址的LP数量总和
uint256 pool = super.getTotalSupply() - cast;
//按照当前地址在池子中所占百分比进行分配分红代币
uint256 r = calculateReward(pool, reward, LPHolders);
_balances[address(this)] = _balances[address(this)].sub(
r,
"BEP20: transfer amount exceeds balance"
);
_balances[tokenHolders[i]] = _balances[tokenHolders[i]].add(
r
);
emit Transfer(address(this), tokenHolders[i], r);
emit RewardLogs(tokenHolders[i], r);
}
}
}
}
通过如下代码来限制交易数量和钱包持币最大数量
if (sender == PancakePair && recipient == _PancakeRouter) {
uint256 aBalance = _balances[recipient] + amount;
require(
aBalance <= _maxHold,
"The maximum number of holdings is 10"
);
} else if (sender == _PancakeRouter) {
uint256 aBalance = _balances[recipient] + amount;
require(
aBalance <= _maxHold,
"The maximum number of holdings is 10"
);
} else if (recipient == PancakePair) {
require(amount <= _maxDeals, "The maximum number of deals is 5");
} else {
require(amount <= _maxDeals, "The maximum number of deals is 5");
uint256 aBalance = _balances[recipient] + amount;
require(
aBalance <= _maxHold,
"The maximum number of holdings is 10"
);
}
通过LP这种类快照方式来实现加池分红直接转账的加池钱包地址的方式,随时与链上的真实数据有差异,但是却可以最大性能的实现加池分红LP代币的功能。
至此,完成添加流动性分红本币到添加者钱包模式。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
本文是全系列中第38 / 237篇:通证发行
- 我的微信
- 这是我的微信扫一扫
-
- 我的电报
- 这是我的电报扫一扫
-