一、准备
LP加池分红,即添加流动性后,合约交易的手续费其中扣除一部分作为LP加池奖励,分发给添加流动性的用户。可以把本币转换成任何类型的ERC20标准的代币,分发到添加LP的用户钱包地址。本案例是以fistswap上添加流动性获得LP加池分红FIST为例,通过代码实现上述功能。
1、合约交易时扣除部分手续费暂存到中转地址
2、当中转地址代币数量总额达到一定值触发swapandLiquidtiy后,执行LP分红奖励Fist操作
3、也可以通过每笔交易实时的触发lP加池分红fist
4、通过合约自动创建fist交易对作为LP的合约地址,同时为了支持多个交易对全部满足合约模式,又单独指定了mainpair
【附注20221216】
加池分红是指添加流动性分红获得LP后,根据LP的持有权重分红主流币,比如BNB,usdt,fist等,或者分红其他ERC20代币。针对不同的分红币种,合约的部署方式的不同的。以下是针对不同币种分红的注意事项:
a. 分红BNB,不能作为分红ERC20普通代币的方式,否则会出现有交易记录,但是无转账数量的情况。
b. 分红usdt,可以添加usdt的池子,也可以添加bnb的流动性资金池,但是分红usdt时需要指定分红时的不同代币对话资金池
c. 分红其他ERC20代币,需要根据分红其他币种的流动性资金池情况,选择分红的指定交易走向。
加池LP分红时重要的是代币首先要分红到派发器,然后才能通过中转地址分红到所有加池用户钱包地址中。
二、操作流程
1、实时奖励LP加池分红firs合约代码如下
function processReward(uint256 gas) private { if (progressRewardBlock + 200 > block.number) { return; } IERC20 FIST = IERC20(_fist); uint256 balance = FIST.balanceOf(address(this)); if (balance < holderRewardCondition) { return; } address shareHolder; uint256 tokenBalance; uint256 amount; uint256 gasUsed = 0; uint256 iterations = 0; uint256 gasLeft = gasleft(); while (gasUsed < gas && iterations < shareholderCount) { if (currentIndex >= shareholderCount) { currentIndex = 0; } if (tokenBalance > 0 && !excludeHolder[shareHolder]) { amount = balance / holdTokenTotal; if (amount > 0) { FIST.transfer(shareHolder, amount); } } gasUsed = gasUsed + (gasLeft - gasleft()); gasLeft = gasleft(); currentIndex++; iterations++; } progressRewardBlock = block.number; }
function addHolder(address adr) private { uint256 size; assembly {size := extcodesize(adr)} if (size > 0) { return; } if (0 == holderIndex[adr]) { if (0 == holders.length || holders[0] != adr) { holderIndex[adr] = holders.length; holders.push(adr); } } }
3、合约交易时暂存指定比例的代币到中转地址功能代码如下:
function _tokenTransfer( address sender, address recipient, uint256 tAmount, bool takeFee, bool isSell ) private { _balances[sender] = _balances[sender] - tAmount; uint256 feeAmount; if (takeFee) { uint256 swapFee; if (isSell) { swapFee = _sellFundFee + _sellLPDividendFee + _sellLPFee; } else { swapFee = _buyFundFee + _buyLPDividendFee; } uint256 swapAmount = tAmount * swapFee / 10000; if (swapAmount > 0) { feeAmount += swapAmount; _takeTransfer( sender, tempTranAddress, swapAmount ); } } _takeTransfer(sender, recipient, otherAmount); }
4、LP加池分红派发器代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import "./IERC20.sol"; contract TokenDistributor { constructor (address token) { IERC20(token).approve(msg.sender, uint(~uint256(0))); } }
至此,完成fistswap添加流动性后LP加池分红FIST到添加流动性的钱包地址的代码实现。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册