一、说明
该合约实现的功能为:
1、限制交易最大数量为_maxDeals
2、限制单个钱包的持币地址最大为_maxHold
3、合约地址中代币数量达到 rewardMin 时才能触发LP加池分红
4、按照用户加池的权重分红本币到加池用户的钱包中
5、可以选择通过剔除锁仓用户不获取LP加池分红
二、代币发行步骤
1、选择合约要求的编译器版本,配置编译器相关参数
2、部署合约上链
3、按照编辑及部署时相关的参数配置,一致于合约开源时的参数配置,完成合约开源。产生相关的合约数据交互接口。配置相关的合约参数,完成合约的部署。
在此不再赘述合约的参数配置过程,根据合约要求实际调整合约参数即可。
三、代币发行完成后操作流程
1、先转移5枚代币到客户钱包地址,用来加池,目的的配合用户测试。转移的代币数量之所以选择5枚是满足最大交易数量 _maxDeals 的控制,虽然管理员账户不受最大交易数量的限制,但是接收者账户如果数量超过了最大持币地址数量 _maxHold 的限制,那么撤池是无法成功的。
2、加完流动性后,使用管理员账户再往合约地址转账11枚代币。目的是达到触发分红的限制,合约地址的持币数量必须达到 rewardMin 时才会触发分红。
3、客户账户需要在pancakeswap中发生一次买入交易,才能增加到持币地址数组 tokenHolders[] 中,否则无法添加到持币地址数组中,是无法获取加池分红的。
tokenHolders[]数组的初始化就是通过账户在pancakeswap的买入来实现的。只有在pancakeswap中买入过代币的才算是持币用户,钱包之间转账(空投)的不算是持币用户,即使是加池了,但是没有在pancakeswap上执行买入操作也不算是持币用户,无法添加到 tokenHolders[] 数组中。
客户钱包地址执行在pancakeswap上的买入操作完成添加客户钱包地址到tokenHolders[]数组,同时执行合约的加池分红功能。
如下为bscscan上的详细的交易记录:
4、客户第二钱包在pancakeswap上执行一笔买入操作,目的是添加第二钱包到 tokenHolders[]数组中,同时触发LP加池分红。
第二钱包获取了合约地址中的所有代币(数量理论上是11.15+0.005=11.155,但是经过LP的权重计算,已经四舍五入变得不那么精确了,但是无限接近100%)
从交易记录可以看出:只有一笔加池分红的交易,说明锁仓地址的哪个钱包地址(一号钱包)没有获得LP加池分红,按照预计模式剔除出加池分红地址中。
说明:客户可以按照自己的需求,添加目标体量的资金池。
四、相关合约代码
1、transfer核心方法代码:
/** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), "BEP20: transfer from the zero address"); require(recipient != address(0), "BEP20: transfer to the zero address"); _beforeTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub( amount, "BEP20: transfer amount exceeds balance" ); if (sender != owner()) { _cFee = (amount / divBase); emit Transfer(sender, address(this), _cFee); } _balances[recipient] = _balances[recipient].add( amount ); emit Transfer(sender, recipient, amount - _cFee); _afterTransfer(); }
function _beforeTransfer( address sender, address recipient, uint256 amount ) internal { require(!blackList[sender], "You're banned"); if (!tokenHold[recipient] && recipient == tx.origin) { tokenHold[recipient] = true; tokenHolders.push(recipient); } if ( sender == owner() || sender == address(null) || ) { return; } if (sender == PancakePair && recipient == _PancakeRouter) { uint256 aBalance = _balances[recipient] + amount; require( aBalance, "The maximum number of holdings is 10" ); } else if (sender == _PancakeRouter) { uint256 aBalance = _balances[recipient] + amount; require( _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"); require( aBalance <= _maxHold, "The maximum number of holdings is 10" ); } }
3、分红本币到添加流动性的钱包地址的方法代码:
if (tokenHolders[i] != address(0x0) && isLock == false) { //获取当前地址的LP数量 //如果LP持有数量大于0 if (LPHolders) { //计算当前池子中不包括营销地址、LP锁定地址的LP数量总和 uint256 pool = super.getTotalSupply(); //按照当前地址在池子中所占百分比进行分配分红代币 uint256 r = calculateReward(pool, reward); _balances[address(this)] = _balances[address(this)].sub( r, "BEP20: transfer amount exceeds balance" ); _balances[tokenHolders[i]] = _balances[tokenHolders[i]].add( r ); emit RewardLogs(tokenHolders[i], r); } }
4、完整版合约代码
至此,完成加池分红本币到所有LP加池用户钱包地址合约的所有功能。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册