前端web3入门脚本二:初探dex,在dex完成一笔swap
前言
现在市面上大多数去中心化交易所(简称dex)都是fork的uniswap的代码,名气比较大的如eth上的sushi 以及 bsc上的pancake。博主这里说的都是V2,uniswapV3在这里不做讨论。那么知道了他们的代码都是来自同一父亲之后,我们就可以在同样fork他的儿子里任选一个来写测试脚本。下面开始选儿子。
一、测试脚本目标链的选择又称选儿子
-
开头直接给答案:博主选择 kcc 链上的 Mojitoswap 作为例子
-
为什么是 kcc 链? 文章一已经做过陈述
-
为什么是 Mojitoswap?
-
第一,它是 kcc 链上最大的dex,tvl排第一,且传言是kucoin的亲儿子
-
第二,代码有审计报告,安全性有保障。选dex就选龙头,准没错
-
二、开始讲解脚本
- 如果要在一个 dex 上交易,第一步需要确认钱包余额够不够,第二步如果转账token为erc20,则需要先向目标合约授权approve。 第三步才是真正的转账,在dex里转账同样要区分原生代币和erc20代币
- 原生代币swap方法:swapExactTokensForETH / swapExactETHForTokens
- erc20代币swap方法: swapExactTokensForTokens
- 检查余额
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是我前进的动力!撒花~🎉