一、背景
在常见的加池分红合约中,通常分红usdt或者其他主流币种,但是很少见到分红BNB的情况。概况原因主要还是分红BNB的写法与分红其他主流币种是有区别的。很多场景下不能复用,导致分红BNB的合约针对性过高,合约复用的难度比较大。并且在分红BNB的合约中,注意事项比较多,稍不注意会因为功能函数是缺少,导致合约部署失败。
【附注20230124】
分红usdt是采用分红ERC20标准协议的实现方式,BNB不属于ERC20标准,BNB是bsc链上的主流代币不是ERC20标准,对应映射BNB的ERC20标准代币是WBNB。但是在合约中尽量避免使用分红WBNB的方式,采用另外的处理BNB的方法。
二、常见问题
1、加池分红BNB的合约部署完成后,在触发本币兑换指定主流币种时发生交易异常。关闭本币兑换指定币种开关后,交易可以正常执行,说明了兑换相关币种的操作过程中合约有异常,主要原因考虑是分红BNB导致。
2、加池分红BNB分红触发后,发现转账分红的BNB数量为零。通常也是由于分红BNB的原因导致,BNB作为WETH不能同属于IERC20标准。
三、解决方案
1、派发器增加函数receive()来接收WETH即BSC的BNB
contract MultTokenDistributor { constructor (address token1, address token2) { IERC20(token1).approve(msg.sender, uint(~uint256(0))); IERC20(token2).approve(msg.sender, uint(~uint256(0))); } receive() external payable {} }
2、加池分红BNB处理器中增加对BNB的支持
address[] memory path = new address[](3); path[0] = address(this); path[1] = _swapRouter.WETH(); path[2] = _erc20; _approve(address(this), address(_swapRouter), _tTotal); // make the swap _swapRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens( tokenAmount.sub(lpAmount).sub(lprthAmount), 0, // accept any amount of dividend token path, address(_tokenDistributor), block.timestamp ); swapFee = swapFee.sub(lpFee).sub(lprthFee); IERC20 ETC20 = IERC20(_fist); uint256 fundAmount = erc20Balance.mul(_buyFundFee.add(_sellFundFee)).div(swapFee); if(fundAmount > 0) { ETC20.transferFrom(address(_tokenDistributor), fundAddress, fundAmount); } ERC20.transferFrom(address(_tokenDistributor), address(this), erc20Balance.sub(fundAmount));
通过上述方式增加对BNB的支持,就可以实现加池分红BNB的功能机制。
四、完整版合约源代码如下
五、合约部署、开源、上线交易所、动态参数配置教程如下
源码及合约部署、开源、上线交易所、动态参数配置教程下载地址:
至此,完成加池分红BNB导致交易失败、转账的BNB数量为零故障原因分析
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册