前言
该脚本用途:一键可以完成与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布道。希望各位看的开心,用得开心。🎉🎉🎉