# 前端web3入门脚本二：初探dex，在dex完成一笔swap

By [Bot80926](https://paragraph.com/@bot80926) · 2023-05-04

---

于 2023-04-27 23:44:53 首次发布

### 前言

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

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

*   开头直接给答案：博主选择 kcc 链上的 Mojitoswap 作为例子
    
*   为什么是 kcc 链？ 文章一已经做过陈述
    
*   为什么是 Mojitoswap？
    
    *   第一，它是 kcc 链上最大的dex，tvl排第一，且传言是kucoin的亲儿子
        
    *   第二，代码有[审计报告](https://docs.mojitoswap.finance/security-and-audit-report)，安全性有保障。选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仓库**](https://github.com/Bot80926/ethers-scripts/blob/main/script-3-swap-on-dex/index.js)

**三、我会了这个，我能干啥？**
-----------------

\*\*  _恭喜你，如果上面的你都能调通了，那么你掌握了进入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](https://coinmarketcap.com/zh/currencies/bnb/) 里搜索对应币名，里面认证了的Token都会有合约地址。
            
        *   接上面bsc上薄饼这个例子，我是怎么找到的呢
            
            *   [官网文档里 pancake routerV2 合约地址](https://docs.pancakeswap.finance/code/smart-contracts/pancakeswap-exchange/v2/router-v2)
                
            *   [pancake network请求里扒下来的token列表](https://tokens.pancakeswap.finance/pancakeswap-extended.json)，直接在里面搜USDT/USDC就能找到对应合约地址。
                

结尾
--

> 通过上面的讲解，你应该掌握了最简单的在swap里交互的方法。
> 
> 从这里我们可以衍生出一键运行脚本，完成swap交互的功能。
> 
> 那么下一节，我们讲讲解如果一键完成与swap的脚本。撸毛必备。你值得学会。
> 
> 欢迎Github里star和fork，你的star是我前进的动力！撒花～🎉

---

*Originally published on [Bot80926](https://paragraph.com/@bot80926/web3-dex-dex-swap)*
