史上最全的智能合约--扣税,分红,加池子,回流,黑白名单,防机器人,增发,丢权限之分红,加池子

这篇具有很好参考价值的文章主要介绍了史上最全的智能合约--扣税,分红,加池子,回流,黑白名单,防机器人,增发,丢权限之分红,加池子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前面一章分享了智能合约扣税的原理,以及用什么方法实现扣税的,下面这篇文章,分享一下自动分红以为加池子的方法和注意事项。
废话不多说,先上代码。

//feihongpool这个变量是指预留在合约中的预分红的币的数量。_maxfeihong这个变量是指预留在合约的币达到什么样的数量之后分红。
if(fenhongpool>=_maxfenhong ){
  //这个例子是对所有的lp分红,那么,在fenhongpool变量之后,为什么要多乘以一个10的18次方呢,这里要特别说明一下,如果lp总的有1万个,fenhongpool是200个,那么,如果除了之后,就变成一个小于1的值了,在solidity中,不支持小数点,所以,如果不乘以一个比较大的参数,会导致分红失败,这个本人失败过几次,得出来的经验。
  uint256 tmp=fenhongpool.mul(10**18).div(ERC20(pooladdress).totalSupply());
  //分了之后,将分红池置空。然后在fenhongdetail内push当次分红的具体数量。这里特别说明一下,因为除了数据之后,肯定会有精度的问题,这个要自己心里弄清楚。fenhongdetail是一个初始化为0的数组。当每次分红之后,将每个lp分红的数额记录在这里。
  fenhongpool=0;
  fenhongdetail.push(tmp);
}

//当用户发生转帐或者加撤池子的时候,首先取出来该钱包地址,拥有的lp数量大于0,并且没有被初始化,这里用的是isinclude[sender]==false来判断的,如果是第一次,那么初始化用户开始分红的时间节点,就是将feihongdetail的长度赋值给userfeihong[sender]
if(lpvalue>0 && isinclude[sender]==false){
 //    includelp.push(sender);
      isinclude[sender]=true;
      userfeihong[sender]=feihongdetail.length-1;
  }
//当触发发分发条件,那么从用户未分红的lp开始,将用户该分的币值计算出来,并分给用户,然后userfenhong[sender]=fenhongdetail.length-1,修改用户的分红时间节点。达到合约内自动分红的目的。
if(userfenhong[sender]<feihongdetail.length-1){
   for(uint256 i=userfenhong[sender]+1;i<fenhongdetail.length;i++){
           tmp=fenhongdetail[i]*lpvalue;
    }
    _balances[sender]=_balances[sender].add(tmp);
    userfenhong[sender]=fenhongdetail.length-1;
 }

分红这块只是用了简单的数据技巧,比较容易理解,不像网上很多土狗合约,用了很多高数的方法,相信很多同学未必能理解和领会。甚至在别人开源合约的基础上修改,都有可能会出现很多错误。
下面来改一下加池子的问题(这里坑比较多,如果实在不明白,可以网站私信,或者加V:54516204交流)。
加池子的代码比较多,但相对比较简单。

//下面这两个接口,是必须要引入的,至于每个函数有什么用,那就靠自己百度了,我这里就不做过多的讲解了。
 interface IUniswapV2Router01 {
     function factory() external pure returns (address);
     function WETH() external pure returns (address);
 
     function addLiquidity(
         address tokenA,
         address tokenB,
         uint amountADesired,
         uint amountBDesired,
         uint amountAMin,
         uint amountBMin,
         address to,
         uint deadline
     ) external returns (uint amountA, uint amountB, uint liquidity);
     function addLiquidityETH(
         address token,
         uint amountTokenDesired,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline
     ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
     function removeLiquidity(
         address tokenA,
         address tokenB,
         uint liquidity,
         uint amountAMin,
         uint amountBMin,
         address to,
         uint deadline
     ) external returns (uint amountA, uint amountB);
     function removeLiquidityETH(
         address token,
         uint liquidity,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline
     ) external returns (uint amountToken, uint amountETH);
     function removeLiquidityWithPermit(
         address tokenA,
         address tokenB,
         uint liquidity,
         uint amountAMin,
         uint amountBMin,
         address to,
         uint deadline,
         bool approveMax, uint8 v, bytes32 r, bytes32 s
     ) external returns (uint amountA, uint amountB);
     function removeLiquidityETHWithPermit(
         address token,
         uint liquidity,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline,
         bool approveMax, uint8 v, bytes32 r, bytes32 s
     ) external returns (uint amountToken, uint amountETH);
     function swapExactTokensForTokens(
         uint amountIn,
         uint amountOutMin,
         address[] calldata path,
         address to,
         uint deadline
     ) external returns (uint[] memory amounts);
     function swapTokensForExactTokens(
         uint amountOut,
         uint amountInMax,
         address[] calldata path,
         address to,
         uint deadline
     ) external returns (uint[] memory amounts);
     function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
     external
     payable
     returns (uint[] memory amounts);
     function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
     external
     returns (uint[] memory amounts);
     function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
     external
     returns (uint[] memory amounts);
     function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
     external
     payable
     returns (uint[] memory amounts);
 
     function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
     function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
     function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
     function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
     function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
 }
 

 interface IUniswapV2Router02 is IUniswapV2Router01 {
     function removeLiquidityETHSupportingFeeOnTransferTokens(
         address token,
         uint liquidity,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline
     ) external returns (uint amountETH);
     function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
         address token,
         uint liquidity,
         uint amountTokenMin,
         uint amountETHMin,
         address to,
         uint deadline,
         bool approveMax, uint8 v, bytes32 r, bytes32 s
     ) external returns (uint amountETH);
 
     function swapExactTokensForTokensSupportingFeeOnTransferTokens(
         uint amountIn,
         uint amountOutMin,
         address[] calldata path,
         address to,
         uint deadline
     ) external;
     function swapExactETHForTokensSupportingFeeOnTransferTokens(
         uint amountOutMin,
         address[] calldata path,
         address to,
         uint deadline
     ) external payable;
     function swapExactTokensForETHSupportingFeeOnTransferTokens(
         uint amountIn,
         uint amountOutMin,
         address[] calldata path,
         address to,
         uint deadline
     ) external;
 }

下面的才是重点。
//在构造函数中,将下面变量给构造好。
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(0x10ED43C718714eb63d5aA57B78B54704E256024E);
uniswapV2Router = _uniswapV2Router;文章来源地址https://www.toymoban.com/news/detail-521163.html

//变量就不具体讲了,只讲重要的函数。
  function swapAndLiquify(uint256 contractTokenBalance) private lockTheSwap {

        uint256 marketingTokenBalance = contractTokenBalance.div(2);
        uint256 liquidityTokenBalance = contractTokenBalance.sub(marketingTokenBalance);
        uint256 tokenBalanceToLiquifyAsBNB = liquidityTokenBalance.div(2);
        uint256 tokenBalanceToLiquify = liquidityTokenBalance.sub(tokenBalanceToLiquifyAsBNB);

        uint256 initialBalance = address(this).balance;
        uint256 tokensToSwapToBNB = tokenBalanceToLiquifyAsBNB.add(marketingTokenBalance);

        // swap tokens for BNB
        //注释见下面。
        swapTokensForEth(tokensToSwapToBNB);

       
        uint256 bnbSwapped = address(this).balance.sub(initialBalance);
        uint256 bnbToLiquify = bnbSwapped.div(3);

		//注释见下面
        addLiquidity(tokenBalanceToLiquify, bnbToLiquify);

        emit SwapAndLiquify(tokenBalanceToLiquifyAsBNB, bnbToLiquify, tokenBalanceToLiquify);
        uint256 marketingBNBToDonate = bnbSwapped.sub(bnbToLiquify);
        huiliuad.transfer(marketingBNBToDonate);
        emit DonateToMarketing(marketingBNBToDonate);
    }
    function swapTokensForEth(uint256 tokenAmount) private {
        // 初始化交易的币对。
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
		//授权,这个授权,是将本合约或者叫本币的数量,授权给交易接口。
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // 调用接口用币兑换eth.第一个参数是兑换的数量,第二个参数是预期要兑换的数量,如果小于这个数量,则兑换失败,所以这里写0,第三个是交易的币对,第四个是兑换的eth转入的地址,第五个,限定的过期日期。
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }
	//这个是加池子函数。
    function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        // approve token transfer to cover all possible scenarios
        //同样是授权,不多赘述。
        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // 直接加池子。
        uniswapV2Router.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            0, // slippage is unavoidable
            0, // slippage is unavoidable
            huiliuad,
            block.timestamp
        );
    }

到了这里,关于史上最全的智能合约--扣税,分红,加池子,回流,黑白名单,防机器人,增发,丢权限之分红,加池子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 史上最全ThreadLocal 详解(二)

    ThreadLocal 内存泄露的原因及处理方式 目录 1、ThreadLocal 使用原理 2、ThreadLocal 内存泄露的原因 3、 为什么不将key设置为强引用 3.1 、key 如果是强引用 3.2、key 如果是强引用 3.3  那么为什么 key 要用弱引用 3.4 如何正确的使用ThreadLocal        前文我们讲过ThreadLocal的主要用途是

    2024年02月02日
    浏览(56)
  • .NET 6 史上最全攻略

    欢迎使用.NET 6。今天的版本是.NET 团队和社区一年多努力的结果。C# 10 和F# 6 提供了语言改进,使您的代码更简单、更好。性能大幅提升,我们已经看到微软降低了托管云服务的成本。.NET 6 是第一个原生支持Apple Silicon (Arm64) 的版本,并且还针对Windows Arm64 进行了改进。我们构

    2024年02月04日
    浏览(58)
  • spring security (史上最全)

    一般意义来说的应用访问安全性,都是围绕认证(Authentication)和授权(Authorization)这两个核心概念来展开的。 即: 首先需要确定用户身份, 再确定这个用户是否有访问指定资源的权限。 认证这块的解决方案很多,主流的有 CAS 、 SAML2 、 OAUTH2 等(不巧这几个都用过-_-),

    2024年02月06日
    浏览(42)
  • 史上最全Oracle语法合集

    查询 排序 集合 并集: 交集 :intersect 差集 :minus 联合查询 : 子查询 : 分页SQL: 创建表空间: 修改表空间: 修改原有数据文件大小: 临时表空间 创建用户: 修改用户: 系统权限: 对象权限: 删除用户: 创建表: 删除表: 约束: 给表添加列 删除表中的一个列 修改一

    2024年02月14日
    浏览(38)
  • 史上最全面的敏感信息收集方案

    介绍一款目录渗透工具: ffuf ffuf Fast web fuzzer written in Go,速度快,自定义性高,非常好用 这里贴出一个我常用的脚本:(这里注意域名或IP后面要加上 /FUZZ ) 语雀( http://yuque.com )是一个企业级协作服务,提供文档、表格、项目管理等协作工具,帮助企业沉淀、整理内部信

    2024年02月05日
    浏览(58)
  • 史上最全midjourney关键词

    最全midjourney,篇幅太长,文章最后有可编辑版本获取链接 增强图片真实感、清晰度 unreal engine 虚幻引擎 ultra realistic 超真实 photography 摄影图片 detailed 细节 4K 4K质 8K 8K画质 octane render OC渲染器 realistic 现实主义的 epic epic游戏质感 3D rendering 3D渲染 35mm 35mm镜头,也可以设置

    2024年02月04日
    浏览(53)
  • 史上最全的子域名收集姿势

    信息泄露 Github 、Gitee等代码仓库中,可能有相关子域名的信息 抓包分析获取,如一些静态资源的请求、一些APP或者小程序接口、邮件服务器等等 很多网站有跨域策略文件 crossdomain.xml 、站点地图 sitemap.xml 和 robots.txt 等,其中也可能存在子域名的信息。 搜索引擎网络资产搜索

    2024年02月07日
    浏览(39)
  • CAN矩阵(入门篇)(史上最全)

    CAN矩阵 ADAS CAN矩阵 JM相机CAN矩阵 CAN消息及信号的含义 CAN消息解析 实际值=(十进制*Factor)+Offset 实车上如何利用该CAN消息 JM相机CAN消息利用分为以下几个部分 车道线点适配 车道线识别状态适配 车道线属性适配 轨迹推定适配 承泰雷达CAN矩阵讲解 承泰雷达的重要输出 ObjectL

    2024年02月01日
    浏览(41)
  • adb 获取日志命令-史上最全

    adb logcat 获取的是日志buffer中从头到尾的日志,并且最新的日志会持续写入。历史日志多少取决于缓冲区大小,并且我们可以通过参数过滤掉无用的日志。可以使用xlog框架将历史日志保存(可以研究下源码)。 日志打印不了 插拔重启 日志缓冲区修改最大 usb驱动查看 adb重启

    2024年02月04日
    浏览(40)
  • Python知识点(史上最全)

    Python期末考试知识点(史上最全) python简介 type()不会认为子类是一种父类类型。 isinstance()会认为子类是一种父类类型 基础语法 运算符: 算术运算符: 多了一个**,代表 幂方 5**5 就是5的5次方 还多了一个 // 整数除法 逻辑运算符: and,or,not 与,或,非 赋值运算符: 没有+

    2024年02月02日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包