当前位置: 首页 > article >正文

前端web3入门脚本二:初探dex,在dex完成一笔swap

前言

现在市面上大多数去中心化交易所(简称dex)都是fork的uniswap的代码,名气比较大的如eth上的sushi 以及 bsc上的pancake。博主这里说的都是V2,uniswapV3在这里不做讨论。那么知道了他们的代码都是来自同一父亲之后,我们就可以在同样fork他的儿子里任选一个来写测试脚本。下面开始选儿子。

一、测试脚本目标链的选择又称选儿子

  •  开头直接给答案:博主选择 kcc 链上的 Mojitoswap 作为例子

  • 为什么是 kcc 链? 文章一已经做过陈述

  • 为什么是 Mojitoswap? 

    • 第一,它是 kcc 链上最大的dex,tvl排第一,且传言是kucoin的亲儿子

    • 第二,代码有审计报告,安全性有保障。选dex就选龙头,准没错

二、开始讲解脚本

  1. 如果要在一个 dex 上交易,第一步需要确认钱包余额够不够,第二步如果转账token为erc20,则需要先向目标合约授权approve。 第三步才是真正的转账,在dex里转账同样要区分原生代币和erc20代币
    1.  原生代币swap方法:swapExactTokensForETH / swapExactETHForTokens
    2.  erc20代币swap方法: swapExactTokensForTokens
  2. 检查余额 
const checkUSDTBalance = async () => {
  const balance = await usdt.balanceOf(wallet.address);
  console.log(chalk.green(`USDT balance: ${ethers.utils.formatEther(balance)}`));
  return balance;
}

const checkKCSBalance = async () => {
  const balance = await wallet.getBalance();
  console.log(chalk.green(`KCS balance: ${ethers.utils.formatEther(balance)}`));
  return balance;
}

        3.  区分是 原生代币(KCS) 还是其他erc20 Token

  // step2: if ksc, just swap or if usdt, approve and swap
  if (Number(ethers.utils.formatEther(kcsBalance)) > 0.1) { // KCS balance need to > 0.1, since we swap 0.1 kcs to usdt and we need to pay gas fee
    await swapKCS2USDT();
  }

  if (Number(ethers.utils.formatEther(usdtBalance)) >= 0.2) { // 0.2 is min amount of usdt, since we swap 0.1 usdt to kcs and 0.1 usdt to usdc
    await approveUSDT();
    await swapUSDT2KCS();
    await swapUSDT2USDC();
  }

  脚本运行结果如下:      

        具体详细代码我放在了Github仓库

三、我会了这个,我能干啥?

        恭喜你,如果上面的你都能调通了,那么你掌握了进入web3的一把黄金钥匙。 上面同样的一套代码,你可以只需要替换合约地址,就可以无痛迁移到 eth 链 / bsc链 / ... 所有热门evm公链。并在他们的swap(需要是uniswap的复制品)上运行这个代码。

  •  如果你接着问,我是小白,我该怎么迁移呢?
    • 举例: 我想去bsc上的pancake运行这个脚本。那很简单,你只需要替换合约地址即可。同时将 kcsAddress 替换成 bnbAddress(不同链不同base Token名称)         
    • // kcc 链上的地址, routerAddress 是 mojitoSwap 的 router 合约
      const kcsAddress = '0x6551358EDC7fee9ADAB1E2E49560E68a12E82d9e'
      const usdtAddress = '0x67f6a7BbE0da067A747C6b2bEdF8aBBF7D6f60dc'
      const usdcAddress = '0xD6c7E27a598714c2226404Eb054e0c074C906Fc9'
      const routerAddress = '0x59a4210Dd69FDdE1457905098fF03E0617A548C5'
      
      
      // bsc 链上的地址,kcsAddress 替换成 bnb的合约地址, routerAddress 替换为 pancakeSwap 的 router 合约即可
      const bnbAddress = '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c'
      const usdtAddress = '0x55d398326f99059fF775485246999027B3197955'
      const usdcAddress = '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d'
      const routerAddress = '0x10ED43C718714eb63d5aA57B78B54704E256024E'
    •   再详细一点,博主你是去哪里找到这些合约信息的呢?
      • 答:我会去看对应swap的docs,里面一般会留下合约地址信息, 其次,还可以去对应链的区块浏览器二次确认是不是我们要的Token, 因为对应的合约一般都会在浏览器里开源 。最后还可以去coinmarketcap 里搜索对应币名,里面认证了的Token都会有合约地址。
      • 接上面bsc上薄饼这个例子,我是怎么找到的呢
        • 官网文档里 pancake routerV2 合约地址
        • pancake network请求里扒下来的token列表,直接在里面搜USDT/USDC就能找到对应合约地址。

结尾

通过上面的讲解,你应该掌握了最简单的在swap里交互的方法。

从这里我们可以衍生出一键运行脚本,完成swap交互的功能。

那么下一节,我们讲讲解如果一键完成与swap的脚本。撸毛必备。你值得学会。

欢迎github里star和fork,你的star是我前进的动力!撒花~🎉


http://www.kler.cn/a/15762.html

相关文章:

  • 2024140读书笔记|《作家榜名著:生如夏花·泰戈尔经典诗选》——你从世界的生命的溪流浮泛而下,终于停泊在我的心头
  • 创建vue+electron项目流程
  • Springboot采用jasypt加密配置
  • 效率工具-tig的使用
  • C++ 的发展
  • [Codesys]常用功能块应用分享-BMOV功能块功能介绍及其使用实例说明
  • 势能回馈系统超级电容储能系统介绍
  • 浅谈文心一言
  • 生成器的创建方式(py编程)
  • 汇编语言(第3版)- 学习笔记 - 第1章-基础知识
  • 【无标题】c++异常机制的一些总结以及思考
  • HTTPS协议
  • 万万没想到在生产环境翻车了,之前以为很熟悉 CountDownLatch
  • 如果ChatGPT写作论文,保姆及教程以及问题答疑
  • Elasticsearch简单搜索以及聚合分析
  • 软件测试:测试一个网站
  • vue2之echarts的封装 折线图,饼图,大图
  • 合并石子(动态规划)
  • DPDK系列之十六虚拟化virtio源码分析之virtio-user
  • JS手撕代码系列【手写实现Promise】
  • 【Redis16】Redis进阶:内存优化
  • wifi芯片行业信息汇总
  • AcWing55. 连续子数组的最大和
  • 【柒志科技】面经 base上海
  • 了解hiberfil.sys文件:计算机休眠模式的背后
  • 【数据治理】数据治理的定义和价值