UniswapV2交易DAPP开发-概述开源
基于UniswapV2开发的Token交易兑换、创建流动池、撤出流动性等从LP创建管理到交易兑换的DAPP。GitHub地址 (opens new window)
# 概述
本专题主要是基于Uniswap开发一套LP(Liquidity pool)流动池创建、添加流动性、撤出流动性、代币交易兑换等覆盖Uniswap所有操作的DAPP,可以用在Token买卖、刷单做市、量化交易、跟单、科学家抢池子等具体的应用上。
UniswapV2交易DAPP开发涉及到的所有代码将在GitHub对外开源,并会覆盖UniswapV3、UniswapV4等后继的版本,开发语言为C#,并利用C#跨平台的特性,同时支持Mac端和Windows端。
本篇首先介绍了Uniswap是什么,相对于中心化交易所,去中心化交易所的优势和特点,Uniswap主要的智能合约构成和相互之间的关系,以及这些智能合约的主要的ABI接口,最后介绍了本DAPP实现的所有功能及基本的流程。
# Uniswap简介
Uniswap是直接部署在区块链上的主流DEX(Decentralized Exchange)去中心化交易所,实现了AMM(Automated Market Maker)自动化做市商。Uniswap是由一系列的智能合约构成,所有操作、买卖直接上链,公开透明。
相较于币安、OK、Coinbase等CEX()中心化交易所,Uniswap是基于区块链或者Web3的原生应用,一经推出就备受关注,并带火了整个DeFi(Decentralized Finance)赛道。
# 特点
- AMM自动做市商
根据特定的算法模型实现买卖价格,算法、价格、流动性公开透明,没有人为的操控。如:CPMM(Constant Product Market Maker)恒定乘积做市定价模型。 - 代码开源
所有功能都由部署在链上的智能合约完成,智能合约完全开源,任何人都可以去链上查看源代码,合约一旦部署不可更改,没有人为的权限操控、后门等风险。 - 自由组合交易对
任何用户都可以根据规则组建一对ERC20代币Token的流动性池子。 - 闪电贷
用户在不提供任何抵押的情况下,借用资金池中的资产,只要在任务完成后归还本金和利息,整个过程必须在同一区块完成。闪电贷的优势在于,它可以让用户利用市场上的套利机会,实现低成本、高收益的操作。 - 操作上链
Dex上的创建池子、添加流动性、撤出流动性、买卖交易等所有操作都记录在链上,公开透明。
# 主要的合约及ABI接口
UniswapV2Factory
Factory工厂合约
createPair 创建合约组合或者创建池子,返回对应的LP池子地址。
getPair 根据合约地址,查询LP池子的地址。
UniswapV2Pair
Pair币对合约
getReserves 获得池子Token0和Token1的数量,在计算价格时候会用到。
UniswapV2ERC20
LP凭证合约
UniswapV2Router02
Router路由合约
getAmountsOut:预估输出数量,根据Token兑换路径和确定要交易的Token数量,计算得到兑换路径中交易对的输出数量。
getAmountsIn:预估输入数量,根据代币兑换路径和确定要得到的Token数量,计算得到兑换路径中交易对的输入数量。
swapExactTokensForTokens:用确定的ERC20数量兑换ERC20,这里用于兑换的Token数量是确定的,得到的Token由于滑点等机制影响,得到的Token数量是不确定的,不过可以通过amountOutMin设置数量的最小值,获得Token的数量小于最小值会兑换失败,以防止滑点过大。
swapTokensForExactTokens:该函数也是用ERC20兑换ERC20,不过这里是指定获得的Token数量是确定的,比如就想用USDT获得1个WETH,这里WETH的数量确定,花费的USDT是由于滑点等因素是根据实际成交的价格确定的。
swapExactETHForTokens:用主链币(比如ETH、BNB、HT等)兑换 ERC20代币,这里主链币的数量是确定的。
swapTokensForExactETH:用ERC20代币兑换成指定数量的主链币,主链币数量确定,Token代币的数量根据实际滑点等实时确认。
swapExactTokensForETH:用指定数量的ERC20代币兑换确定数量的主链币。
swapETHForExactTokens:用主链币兑换指定数量的ERC20代币。
swapExactTokensForTokensSupportingFeeOnTransferTokens:用指定数量的ERC20兑换ERC20,支持买卖扣取交易税费的智能合约,现在很多代币智能合约经济模型比较复杂,如交易手续费、销毁、通胀、通缩等,该接口适用模式比较复杂的代币Token。
swapExactETHForTokensSupportingFeeOnTransferTokens:指定数量的 主链币(ETH、BNB等)兑换ERC20代币,支持买卖扣取交易税费的智能合约。
swapExactTokensForETHSupportingFeeOnTransferTokens:指定数量的 ERC20代币兑换主链币(ETH、BNB等),支持买卖扣取交易税费的智能合约。
# 主要功能
1、池子创建
利用Factory的createPair接口进行池子创建。
2、添加流动性或者添加池子
利用Router智能合约的addLiquidity进行添加流动性。
3、撤出流动性或者撤池子
通过Router智能合约提供的removeLiquidity撤出质押的代币Token。
4、获取池子深度
LP是由Factory创建的UniswapV2Pair单独实例,通过getReserves查看池子深度。
5、计算代币价格
可根据通过getReserves获得的池子深度计算代币Token的价格。
6、Swap买卖交易
调用Router合约,分别通过swapExactTokensForTokens和swapExactTokensForTokensSupportingFeeOnTransferTokens接口进行代币Token的兑换交易。
7、授权
通过Router合约进行代币操作的时候,需要给Router合约提前进行授权,本涉及给LP、两个交易币对的授权。
8、lp余额查询
通过Factory创建的LP合约进行余额查询。
# 参考
Uniswap GitHub地址: https://github.com/Uniswap (opens new window)