一、说明
在DEFI智能合约开发中如果合约中涉及到持币分红usdt,LP分红usdt两个分红模型的组合。那么就涉及到交易的gas费用分配问题。
持币分红usdt是根据用户实际持币量的多少同步mint分红派发跟踪tricker,而不是按照用户持币的权重模糊分红。目前部分合约开发中为了简化开发难度,对持币分红usdt采用模糊分红,并不是按照用户实际持币的权重同步派发tricker的方式去分红usdt,而是直接按照用户持币数量的权重占合约中总兑换usdt的数量模糊分红usdt,这种方式存在严重的漏洞,容易被夹子攻击,闪电贷攻击等多种攻击形式拿走所有的usdt分红。正确的持币分红应该是根据用户实际持有的代币数量同步mint 分红派发tricker来实现根据用户从参与项目到触发分红usdt动作所有操作踪迹的usdt分红跟踪,可以有效的防止夹子攻击、闪电贷攻击等。
LP分红是根据用户添加流动性获取LP凭证,剔除平台锁仓LP,永久锁仓LP, 项目方指定LP后,计算当前有效LP数量。然后按照用户实际持有LP的权重去分红usdt。
由于合约中同时包括了持币分红usdt,LP分红usdt两种分红模型,就会出现触发分红动作时的交易gas费用分配和调优问题。
- 同时触发持币分红usdt和LP分红usdt:就需要调整交易总GAS费用不超过50w,按照usdt分红粒度分配到两种分红模型
- 只触发持币分红usdt:单独计算轮询持币分红usdt的gas费用
- 只触发LP分红:单独计算轮询LP分红的gas费用
二、分红模块功能实现
- 持币分usdt功能实现:触发持币分红usdt的动作包括线上买卖,线下钱包之间转账,添加以及撤销流动性都会触发轮询持币分红。同时,msg.sender交易时会触发赎回属于自己的usdt持币分红。持币分红usdt的分红派发tricker核心代码实现:
function process(uint256 gas)
public
returns (
uint256,
uint256,
uint256
)
{
uint256 numberOfTokenHolders = tokenHoldersMap.keys.length;
if (numberOfTokenHolders == 0) {
return (0, 0, lastProcessedIndex);
}
uint256 _lastProcessedIndex = lastProcessedIndex;
uint256 gasUsed = 0;
uint256 gasLeft = gasleft();
uint256 iterations = 0;
uint256 claims = 0;
while (gasUsed < gas && iterations < numberOfTokenHolders) {
_lastProcessedIndex++;
if (_lastProcessedIndex >= tokenHoldersMap.keys.length) {
_lastProcessedIndex = 0;
}
address account = tokenHoldersMap.keys[_lastProcessedIndex];
if (canAutoClaim(lastClaimTimes[account])) {
if (processAccount(payable(account), true)) {
claims++;
}
}
iterations++;
uint256 newGasLeft = gasleft();
if (gasLeft > newGasLeft) {
gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
}
gasLeft = newGasLeft;
}
lastProcessedIndex = _lastProcessedIndex;
return (iterations, claims, lastProcessedIndex);
}
2. LP分红usdt是将本币交易手续费兑换为usdt后,将对应渠道比例的usdt分发到对应地址保存后,剩余的usdt累积到合约地址中,用于添加流动性的LP分红usdt。任何线上交易行为都会触发usdt的LP分红,核心代码如下:
function processLiquidityReward(uint256 gas) private {
if (progressLPRewardBlock.add(progressLPRewardBlockDebt) > block.number) {
return;
}
IERC20 CAKE = IERC20(rewardToken);
uint256 balance = CAKE.balanceOf(address(this));
if (balance < lpRewardCondition) {
return;
}
IERC20 lpToken = IERC20(liquidityMainPair);
uint lpTokenTotal = lpToken.totalSupply() - lpToken.balanceOf(deadWallet) - lpToken.balanceOf(zeroWallet);
address shareHolder;
uint256 tokenBalance;
uint256 amount;
uint256 shareholderCount = holders.length;
uint256 gasUsed = 0;
uint256 iterations = 0;
uint256 gasLeft = gasleft();
while (gasUsed < gas && iterations < shareholderCount) {
if (currentIndex >= shareholderCount) {
currentIndex = 0;
}
shareHolder = holders[currentIndex];
tokenBalance = lpToken.balanceOf(shareHolder);
if (tokenBalance > 0 && !excludeHolder[shareHolder]) {
amount = balance.mul(tokenBalance).div(lpTokenTotal);
if (amount > 0) {
CAKE.transfer(shareHolder, amount);
}
}
gasUsed = gasUsed + (gasLeft - gasleft());
gasLeft = gasleft();
currentIndex++;
iterations++;
}
progressLPRewardBlock = block.number;
}
三、两种分红usdt的模式组合交易手续费GAS分配和调优
通常持币分红usdt轮询每次需要触发10-20笔usdt的子交易,LP分红需要触发5-10笔的usdt子交易,按照上述usdt子交易数量权衡交易gas费的分配,最优化gas费。在保证usdt持币分红和LP分红usdt可以持续性轮询分发的前提下,最小化交易gas费用。通常采用如下分配和调优方式:
if(!swapping) {
uint256 gas = gasForProcessing.mul(60).div(100);
try dividendTracker.process(gas) returns (uint256 iterations, uint256 claims, uint256 lastProcessedIndex) {
emit ProcessedDividendTracker(iterations, claims, lastProcessedIndex, true, gas, tx.origin);
}
catch {
}
}
if (from != address(this)) {
if (isLPHolder) {
addHolder(from);
}
if(!swapping) {
processLiquidityReward(gasForProcessing.mul(40).div(100));
}
}
四、完整版本合约代码
源码及合约部署、开源、上线交易所、动态参数配置教程下载地址:
五、综述
融合持币分红usdt和LP分红usdt的合约开发难度比较大,并且配合其他交易税率滑点限制。需要精确计算两种分红的比例已经需要的消耗的gas费用,保证用户支付最低数量的gas费用,同时,确保交易的成功。另外涉及到代币的通缩模型和跟单分红模型,跟单代币要实时的从资金池通缩到直到地址一加速代币的销毁机制,保证资金池的代币价格稳定。由于持币分红usdt和LP分红usdt两种分红模式的机制不同(持币分红派发tricker,lp加权分红)导致融合两种模式功能开发难度很大。
至此,完成DEFI智能合约开发过程中怎样限制用户添加流动性后不允许转移LP到其他钱包,然后使用该钱包撤销流动性LP所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册