NFT多币质押LP流动性挖矿系统开发逻辑
流动性挖矿是一种通过质押加密货币,(开发134-1633-5319)来获取更多加密货币的方法。它是去中心化金融(DeFi)中的一种新趋势,能够让加密货币投资者充分发挥其加密资产的作用并获得较高的收益回报,并且任何人都可以参与这个生态系统。简单来说,这意味着锁定加密货币即可获得奖励。
流动性挖矿是如何运行的?
流动性挖矿的运行与流动性提供者(LP)及流动资金池有着密切的关系:流动性提供者为流动资金池提供资金以获得流动性代币(LP token),流动资金池为市场提供动力并产生手续费用,再按照LP token份额占比支付奖励给流动性提供者,如此反复进行。
如何获得流动性挖矿收益?
用户存入资产到池中就能获得奖励代币(流动性代币),池中只要有人交易就会产生费用,并按照制定的奖励规则进行代币分配,这些都是流动性挖矿收益。
Periphery 逻辑
核心逻辑实现在 UniswapV2Router02.sol 中。称为 Router,因为 Periphery 实现了“路由”,支持各个 swap 之间的连接。基本上实现了三个功能:1/add liquidity(增加流动性)2/remove liqudity(抽取流动性)3/swap(交换)。
1.add liqudity
增加流动性,就是同时提供两种代币。因为代币有可能是 ETH,针对不同情况有不同的接口。逻辑类似。
add liqudity 查看之前有没有创建相应的交易对。如果有相应的交易对,确定目前的兑换比例在希望的范围内(期望 amountDesired 和不低于 amountMin)。如果兑换比例 OK,将相应的代币转入对应的交易对池子,并调用其的 mint 函数。
2.remove liqudity
提供流动性的相反的操作就是抽取流动性。也就是说,流动性提供者不再提供相应的流动性
liquidity 是抽取的流动性的量。amountMin 是抽取代币的小的个数。to 是抽取代币的目标地址。deadline 是个有意思的设计:抽取的操作有时效性。超过了一定的 deadline(区块高度),这次抽取操作看成无效。
先收回需要抽取的 Token,并且销毁:
IUniswapV2Pair(pair).transferFrom(msg.sender,pair,liquidity);//send liquidity to pair
(uint amount0,uint amount1)=IUniswapV2Pair(pair).burn(to);
3.swap
swap 是普通用户进行代币交易的操作。普通用户通过 swap 操作实现两种 token 之间的交易。
Uniswap 支持多种代币的交换。具体的含义是,Uniswap 提供了多级交易池的路由功能。举个例子,已有两个交易对 TokenA-TokenB,以及 TokenB-TokenC,通过 swap 接口,可以实现 TokenA-TokenC 的交换,其中经过的 TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn 是路径中的个代币的数量,amountOutMin 是期望的交换后的少的数量。
amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);
require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');
amounts 是每个路径上的交换后的数量。amounts[amounts.length-1]也就是后一条路径的输出数量。注意,UniswapV2Library.getAmountsOut 的实现(在获取每个交易对的 reserve 信息后,调用 getAmountOut 函数)
流动性挖矿是如何运行的?
流动性挖矿的运行与流动性提供者(LP)及流动资金池有着密切的关系:流动性提供者为流动资金池提供资金以获得流动性代币(LP token),流动资金池为市场提供动力并产生手续费用,再按照LP token份额占比支付奖励给流动性提供者,如此反复进行。
如何获得流动性挖矿收益?
用户存入资产到池中就能获得奖励代币(流动性代币),池中只要有人交易就会产生费用,并按照制定的奖励规则进行代币分配,这些都是流动性挖矿收益。
Periphery 逻辑
核心逻辑实现在 UniswapV2Router02.sol 中。称为 Router,因为 Periphery 实现了“路由”,支持各个 swap 之间的连接。基本上实现了三个功能:1/add liquidity(增加流动性)2/remove liqudity(抽取流动性)3/swap(交换)。
1.add liqudity
增加流动性,就是同时提供两种代币。因为代币有可能是 ETH,针对不同情况有不同的接口。逻辑类似。
add liqudity 查看之前有没有创建相应的交易对。如果有相应的交易对,确定目前的兑换比例在希望的范围内(期望 amountDesired 和不低于 amountMin)。如果兑换比例 OK,将相应的代币转入对应的交易对池子,并调用其的 mint 函数。
2.remove liqudity
提供流动性的相反的操作就是抽取流动性。也就是说,流动性提供者不再提供相应的流动性
liquidity 是抽取的流动性的量。amountMin 是抽取代币的小的个数。to 是抽取代币的目标地址。deadline 是个有意思的设计:抽取的操作有时效性。超过了一定的 deadline(区块高度),这次抽取操作看成无效。
先收回需要抽取的 Token,并且销毁:
IUniswapV2Pair(pair).transferFrom(msg.sender,pair,liquidity);//send liquidity to pair
(uint amount0,uint amount1)=IUniswapV2Pair(pair).burn(to);
3.swap
swap 是普通用户进行代币交易的操作。普通用户通过 swap 操作实现两种 token 之间的交易。
Uniswap 支持多种代币的交换。具体的含义是,Uniswap 提供了多级交易池的路由功能。举个例子,已有两个交易对 TokenA-TokenB,以及 TokenB-TokenC,通过 swap 接口,可以实现 TokenA-TokenC 的交换,其中经过的 TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn 是路径中的个代币的数量,amountOutMin 是期望的交换后的少的数量。
amounts=UniswapV2Library.getAmountsOut(factory,amountIn,path);
require(amounts[amounts.length-1]>=amountOutMin,'UniswapV2Router:INSUFFICIENT_OUTPUT_AMOUNT');
amounts 是每个路径上的交换后的数量。amounts[amounts.length-1]也就是后一条路径的输出数量。注意,UniswapV2Library.getAmountsOut 的实现(在获取每个交易对的 reserve 信息后,调用 getAmountOut 函数)