前端web3入门脚本三:一键完成与dex的交互,羊毛党必备

news2024/11/27 22:35:00

前言

该脚本用途:一键可以完成与dex的所有交互,包括2次swap,添加/移除流动性,以及farm和提取LP。一次运行可以有6条交易记录。 无论是个人单刷还是羊毛党批量地址刷交互都完美适配。当然反女巫方案不在这次文章的讨论范围内。

一、运行脚本前期准备

  • 设置期望交互的数量: const amount = '0.1'
  • 这里 0.1 意味着 swap 两次 0.1 KCS (base token in kcc),以及组价值0.2USDT的LP。
  • 所以如果按 初始设置 amount 为 0.1,则为了脚本正常运行
  • 建议账户里余额: KCS > 0.15, USDT > 0.1

二、脚本讲解

  • 步骤一,首先检查余额是否满足脚本运行要求。
  • 步骤二,如果满足则首先进行approve,注意这里我为了方便approve设的值都是max,如果你觉得max授权不安全,你可以approve成你本次想要交互的值即可。
  • 步骤三,进行2次swap
  • 步骤四,添加流动性
  • 步骤五,进行LP质押和移除
  • 步骤六,拆除LP。到这里我们手上没有LP,只有初始的两个Token,你可以将二者余额进行差值运算,得出本轮交互你的gas fee损耗。
  • 完成代码请移步: 我的github仓库
const main = async () => {

  const kcsBalance = await wallet.getBalance()
  const usdtBalance = await usdtContract.balanceOf(wallet.address)

  // // swap twice times
  if (Number(ethers.utils.formatEther(kcsBalance)) > Number(amount) * 1.5 && Number(ethers.utils.formatEther(usdtBalance)) > Number(amount)) { // amount times 150% in order to confirm that the balance is sufficient, no exact value, just > 100%
   	await approveLP2Router();
    await swapKCS2USDT();
    await swapUSDT2KCS();
  } else {
    console.log(chalk.red(`KCS or USDT balance is not enough, please check your wallet`));
  }

  // add liquidity
  await addLiquidity(tokens["kcc-testnet"].USDT, '0.0001', '0.1');

  // deposit LP token & withdraw
  await depositLP2MasterChef();
  await withdrawLP2MasterChef();

  // remove liquidity
  await removeLPFromRouter();

  console.log('Done: 2 swap, 1 add liquidity, 1 deposit, 1 withdraw, 1 remove liquidity')

};

运行结果:
在这里插入图片描述

三、知识扩展

 有朋友可能在数值的设定上有疑惑。这里扩展讲解一下 uniswapV2 的 addLiquidityETH 这个方法
  • 开头给链接,官方文档地址 uniswap-v2 docs
  • 结构体如下:
function addLiquidityETH(
  address token,
  uint amountTokenDesired,
  uint amountTokenMin,
  uint amountETHMin,
  address to,
  uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);

参数解释

  • 从上面定义我们可以看到,对于 addLiquidityETH 来说,amountTokenMin 和 amountETHMin 都必须 小与等于 他们对应的 AmountDesired。
  • 那代码里 添加流动性方法中 我设置的 0.0001 和 0.1 是怎么确认的呢?
  • 这里我用了一个取巧的方法,去目标Dex添加流动性页面,输入你想要添加流动性的数量,这里我设 KCS 为 0.0001,那么前端会自动计算出来对应需要添加的USDT数量。
  • 添加流动性截图
    合约源码
  • 再看到合约源码里对应的 addLiquidity 方法,对于我们这个例子,也就是 amountBOptimal 计算出来为页面上 0.0521012, 此时我们只需要保证传入的 amountBDesired 大于这个值即可。所以脚本里我设置了 0.1,是满足这个要求的,可以通过合约校验
  • 为什么我取巧? 因为如果要计算出具体的值,需要调用很多其他相关的库,为了简化脚本的依赖,我选择直接写死一个可以通过合约校验的值。

结尾

那么到此为止,我们掌握了一键和dex交互的方式。希望各位撸羊毛愉快。
欢迎大哥们 follow 我的代码仓库(https://github.com/Bot80926/ethers-scripts) 
完全开源,不留后门。只为Web3布道。希望各位看的开心,用得开心。🎉🎉🎉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/474720.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javascript中find(), filter(), some(), every(), map()等方法介绍

1、find() find() 用于找出第一个符合条件的数组成员。它的参数是一个回调函数,所有数组成员依次执行该回调函数,直到找出第一个返回值为true的成员,然后返回该成员。如果没有符合条件的成员,则返回undefined。 find()方法的回调…

利用Matab进行覆盖计算----战术计算

在 contour函数中添加如下代码 %------- 计算畅通区面积和占比例 --------% Spi*maxrange*maxrange/1e6; S0 nnz(isInRange)*reslons*reslats/1e6;isnn ~isnan(cdata); cdata0 cdata(isnn); S1numel(cdata0)*reslons*reslats/1e6;AS1/S0; % 畅通区所占比例; fprintf("…

CLion开发工具 | 06 - 使用CLion开发STM32(无需Cmake)

专栏介绍 文章目录 专栏介绍一、准备工作1. 工具准备2. 裸机工程准备二、使用CLion打开工程三、基于CLion写代码1. LED blink代码2. printf重定位代码四、编译工程1. 编译配置2. 选择编译目标3. 编译五、烧录1. OpenOCD基础知识(了解)2. 设置CLion路径3. 新建CLion配置文件4.…

面试总结,4年经验

小伙伴你好,我是田哥。 本文内容是一位星球朋友昨天面试遇到的问题,我把核心的问题整理出来了。 1:Java 层面的锁有用过吗?除了分布式锁以外 是的,Java中提供了多种锁机制来保证并发访问数据的安全性和一致性。常见的J…

分析GC日志解读

目录 GC分类 GC日志分类 GC日志结构剖析 透过日志看垃圾收集器 透过日志看GC原因 GC日志分析工具 GC分类 针对HotSpot VM的实现,它里面的GC按照回收区域又分为两大种类型:一种是部分收集(Partial GC),一种是整堆…

VPN 虚拟专用网络隧道

1 什么是VPN VPN(全称:Virtual Private Network)虚拟专用网络,是依靠ISP和其他的NSP,在公共网络中建立专用的数据通信的网络技术,可以为企业之间或者个人与企业之间提供安全的数据传输隧道服务。在VPN中任意两点之间的链接并没有…

从零开始学习Linux运维,成为IT领域翘楚(二)

文章目录 🔥Linux系统目录结构🔥Linux用户和用户组🔥Linux用户管理 🔥Linux系统目录结构 文件系统组织结构 ⭐ /lib 系统开机所需要最基本的动态链接共享库,其作用类似于Windows里的DLL文件。 几乎所有的应用程序都需…

PACS系统源码,大型医院PACS源码集成三维重建

PACS系统为医院提供包括放射、超声、核医学、病理、内窥镜、心电图室在内的所有影像检查数字化的一体化解决方案。 它涵盖了传统PACS和RIS系统的所有功能,以构建全数字化影像科为目标,致力于实现对医院所有影像数据的统一管理、影像检查工作流的自动化&a…

POJ3704 括号匹配问题 递归方法

目录 题目 算法 完整代码 题目 参考 递归: https://blog.csdn.net/qq_45272251/article/details/103257953 利用了递归, 但思路稍复杂了 循环: https://blog.csdn.net/weixin_50340097/article/details/114579805 (看起来是递归其实是循环. 每次递归其实是循环内一次迭…

牛客网Python入门103题练习|【07--循环语句(2)】

⭐NP55 2的次方数 描述 在Python中, * 代表乘法运算, ** 代表次方运算。 请创建一个空列表my_list,使用for循环、range()函数和append()函数令列表my_list包含底数2的 [1, 10] 次方,再使用一个 for 循环将这些次方数都打印出来…

【Linux问题合集001】Linux中如何将用户添加到sudo组中的步骤

看教程的前提我的linux当前用户是zhou,看以下步骤时将zhou看做你的liunx当前用户就行了: 一、 以root用户登录到系统。 在Linux系统中,root用户是具有完全系统管理权限的超级用户。要以root用户身份登录到系统,您可>以使用以下…

继续打脸水货教程:关于可变对象与不可变对象

入门教程、案例源码、学习资料、读者群 请访问: python666.cn 大家好,欢迎来到 Crossin的编程教室 ! 今天这篇我要继续来打脸互联网上各种以讹传讹的水货教程。 前阵子我们聊了下Python中有关函数参数传递以及变量赋值的一些内容:…

LeetCode0014.最长公共前缀 Go语言AC笔记

时间复杂度:O(n) 解题思路 纵向扫描法。先扫描所有字符串的第一个字符,如果都相同就再次扫描所有字符串的第二个字符,直到某一字符串被扫描完或者出现了不相同的字符,此时就返回该字符串该字符的前缀。 为了确定所有字符是否相同…

【flask】三种路由和各自的比较配置文件所有的字母必须大写if __name__的作用核心对象循环引用的几种解决方式--难

三种路由 方法1:装饰器 python C#, java 都可以用这种方式 from flask import Flask app Flask(__name__)app.route(/hello) def hello():return Hello world!app.run(debugTrue)方法2: 注册路由 php python from flask import Flask app Flask(__name__)//app…

Java IO流第一章

Java IO流第一章 (一)简介 本文主要是从最基础的BIO式通信开始介绍到NIO , AIO,读者可以清晰的了解到阻塞、同步、异步的现象、概念和特征以及优缺点。 通信技术整体解决的问题 局域网内的通信要求。多系统间的底层消息传递机制。高并发下…

如何自制云平台,并实现远程访问控制?

除了阿里、腾讯各种云,计算机大神们都想自己搭建IoT云平台。今天小编跟大家分享一种用UbuntuEMQXNode-RED方式自制IoT云平台的方法,并实现无公网IP随时访问远程数据! 第一步 Step1搭建EMQX服务器 1.搭建IoT平台需要一个服务器,这…

windows安装rocketmq

windows安装rocketmq 问题背景操作步骤Lyric: 请再给我 一个理由 问题背景 最近有使用rocketmq,为测试方便,在本地安装rocketmq 注意事项: 默认已安装java1.8,启动mq必须是1.8版本,我之前使用11版本&…

命令行 控制 易微联 wifi通断器

有个设备需要远程控制开关,最简单的方式就是通过一直在线运行的 Pi,进行命令行控制智能开关。 1、材料准备 找个最便宜的智能开关,话说易微联的做的真是便宜,销售量也很大。 这种 网上叫 Wifi通断器,或者智能开关&a…

使用ALLpairs完成正交表测试法练习题

该实验报告需要完成如下三个正交表测试法练习题 1、为了测试一个游戏软件的安装过程,需要考虑如下因素: (1) 操作系统: win2008、win7、win10、RedHat、Linux (2) 杀毒软件:瑞星、卡巴斯基、诺顿、江民、360 杀毒 (3) 数据库: oracle10g、SQLServer200…

五一劳动节前 特辑 ,路上那些车不能碰 你赔不起系列

相信明天大家4月29日都上了高速,都奔赴自己今年第一个想去的地方,那么上了高速,见的车辆就多了,哪些车辆我们要明白,尽量不要去碰,或者看见进行 技术性躲避,因为碰一下,半套房没了&a…