新零售o2o模式就是o2o模式和零售模式的结合,将零售行业的特点跟互联网结合起来,实现线上线下的互通。
The new retail O2O model pays more attention to the combination of online and offline.The online platform increases exposure,leads traffic to offline,completes services online and offline,and gives users a better experience.
library UniswapV2Library{
using SafeMath for uint;
//returns sorted token addresses,used to handle return values from pairs sorted in this order
//给地址排序,从小到大
function sortTokens(address tokenA,address tokenB)internal pure returns(address token0,address token1){
require(tokenA!=tokenB,'UniswapV2Library:IDENTICAL_ADDRESSES');
(token0,token1)=tokenA<tokenB?(tokenA,tokenB):(tokenB,tokenA);
require(token0!=address(0),'UniswapV2Library:ZERO_ADDRESS');
}
//calculates the CREATE2 address for a pair without making any external calls
//在不进行任何外部调用的情况下计算一对的CREATE2地址
function pairFor(address factory,address tokenA,address tokenB)internal pure returns(address pair){
(address token0,address token1)=sortTokens(tokenA,tokenB);
pair=address(uint(keccak256(abi.encodePacked(
hex'ff',
factory,
keccak256(abi.encodePacked(token0,token1)),
hex'96e8ac4277198ff8b6f785478aa9a39f403cb768dd02cbee326c3e7da348845f'//init code hash
))));
}
//fetches and sorts the reserves for a pair
//获取并排序一对的储备
function getReserves(address factory,address tokenA,address tokenB)internal view returns(uint reserveA,uint reserveB){
(address token0,)=sortTokens(tokenA,tokenB);
(uint reserve0,uint reserve1,)=IUniswapV2Pair(pairFor(factory,tokenA,tokenB)).getReserves();
(reserveA,reserveB)=tokenA==token0?(reserve0,reserve1):(reserve1,reserve0);
}
//given some amount of an asset and pair reserves,returns an equivalent amount of the other asset
//给定一定数量的资产和配对准备金,返回等量的其他资产
//BB/AA=B/A-->BB=AA*(B/A)
function quote(uint amountA,uint reserveA,uint reserveB)internal pure returns(uint amountB){
require(amountA>0,'UniswapV2Library:INSUFFICIENT_AMOUNT');
require(reserveA>0&&reserveB>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');
amountB=amountA.mul(reserveB)/reserveA;
}
//给定资产的输入量和对储备,返回另一资产的最大输出量
//考虑手续费
//(x+0.997a)(y-b)=xy
//b=(0.997ay)/(x+0.997a)
//b=(997ay)/(1000x+997a)
function getAmountOut(uint amountIn,uint reserveIn,uint reserveOut)internal pure returns(uint amountOut){
require(amountIn>0,'UniswapV2Library:INSUFFICIENT_INPUT_AMOUNT');
require(reserveIn>0&&reserveOut>0,'UniswapV2Library:INSUFFICIENT_LIQUIDITY');
uint amountInWithFee=amountIn.mul(997);
uint numerator=amountInWithFee.mul(reserveOut);
uint denominator=reserveIn.mul(1000).add(amountInWithFee);
amountOut=numerator/denominator;
}