方法名称
可视范围
类型
修饰符
Constructor
Public
🛑
Fallback
External
💵
receive
External
💵
_addLiquidity
Internal 🔒
🛑
addLiquidity
External
🛑
ensure
addLiquidityETH
External
💵
ensure
removeLiquidity
Public
🛑
ensure
removeLiquidityETH
Public
🛑
ensure
removeLiquidityWithPermit
External
🛑
removeLiquidityETHWithPermit
External
🛑
removeLiquidityETHSupportingFeeOnTransferTokens
Public
🛑
ensure
removeLiquidityETHWithPermitSupportingFeeOnTransferTokens
External
🛑
_swap
Internal 🔒
🛑
swapExactTokensForTokens
External
🛑
ensure
swapTokensForExactTokens
External
🛑
ensure
swapExactETHForTokens
External
💵
ensure
swapTokensForExactETH
External
🛑
ensure
swapExactTokensForETH
External
🛑
ensure
swapETHForExactTokens
External
💵
ensure
_swapSupportingFeeOnTransferTokens
Internal 🔒
🛑
swapExactTokensForTokensSupportingFeeOnTransferTokens
External
🛑
ensure
swapExactETHForTokensSupportingFeeOnTransferTokens
External
💵
ensure
swapExactTokensForETHSupportingFeeOnTransferTokens
External
🛑
ensure
pair合约拥有一套erc20代币的所有方法
用户准备TokenA和TokenB两个代币,期望数量AB,最小数量AB四个数值创建流动性
添加流动性方法根据期望AB数量和最小AB数量乘以储备量比例计算最优取出数量AB
流动性方法根据取出数量AB将Token存入pair合约
pair合约为用户创建一个liquidity流动性数值,为存入数量AB的平方根
添加流动性方法分为两种,添加两个token的流动性和添加token和ETH的流动性
添加token和ETH的流动性方法会将ETH兑换成WETH再进行操作,
* @dev 添加流动性的私有方法
* @param tokenA tokenA地址
* @param tokenB tokenB地址
* @param amountADesired 期望数量A
* @param amountBDesired 期望数量B
* @param amountAMin 最小数量A
* @param amountBMin 最小数量B
* @return amountA 数量A
* @return amountB 数量B
如果TokenA,TokenB的配对合约不存在则创建pair
从pair合约
获取 储备量A, 储备量B,储备量AB经过排序
如果储备reserveA, reserveB==0,
则返回值(数量A,数量B)=期望值(期望数量A,期望数量B)
否则
最优数量B = 期望数量A * 储备量B / 储备量A
如果最优数量B <= 期望数量B
则
确认最优数量B >= 最小数量B
(数量A,数量B) = 期望数量A, 最优数量B
否则
最优数量A = 期望数量A * 储备量A / 储备量B
断言最优数量A <= 期望数量A
确认最优数量A >= 最小数量A
(数量A,数量B) = 最优数量A, 期望数量B
* @param token token地址
* @param amountTokenDesired 期望数量
* @param amountTokenMin Token最小数量
* @param amountETHMin ETH最小数量
* @param to to地址
* @param deadline 最后期限
* @return amountToken Token数量
* @return amountETH ETH数量
* @return liquidity 流动性数量
(数量A,数量B) = _addLiquidity(tokenA地址,tokenB地址,期望数量A,期望数量B,最小数量A,最小数量B)
根据TokenA,TokenB地址,获取pair合约
地址
将数量为数量A
的tokenA从msg.sender账户中安全发送到pair合约
地址
将数量为数量B
的tokenB从msg.sender账户中安全发送到pair合约
地址
流动性数量 = pair合约的铸造方法铸造给to地址
的返回值
addLiquidityETH 添加ETH流动性方法
* @dev 添加ETH流动性方法
* @param token token地址
* @param amountTokenDesired Token期望数量
* @param amountTokenMin Token最小数量
* @param amountETHMin ETH最小数量
* @param to to地址
* @param deadline 最后期限
* @return amountToken Token数量
* @return amountETH ETH数量
* @return liquidity 流动性数量
(Token数量,ETH数量) = _addLiquidity(token地址,WETH地址,Token期望数量,收到的主币数量,Token最小数量,ETH最小数量)
根据Token,WETH地址,获取pair合约
地址
将Token数量
的token从msg.sender账户中安全发送到pair合约
地址
向WETH合约
存款ETH数量
的主币
将ETH数量
的WETH
token发送到pair合约
地址
流动性数量 = pair合约的铸造方法铸造给to地址
的返回值
如果收到的主币数量
>ETH数量
则返还收到的主币数量
-ETH数量
将发送账户的流动性数量返还给pair合约
在pair合约中销毁流动性数量,然后根据最小数量AB计算返还给用户的tokenAB
移除流动性方法分两种,移除两个token的流动性,和移除token和ETH的流动性
这两种方法又分别拥有两个前置方法,带签名移除两个token流动性和带签名移除token和ETH流动性
除此之外还有支持收税的移除ETH流动性方法,和带签名支持收税的移除ETH流动性方法
* @dev 移除流动性
* @param tokenA tokenA地址
* @param tokenB tokenB地址
* @param liquidity 流动性数量
* @param amountAMin 最小数量A
* @param amountBMin 最小数量B
* @param to to地址
* @param deadline 最后期限
* @return amountA 数量A
* @return amountB 数量B
计算TokenA,TokenB的CREATE2地址,而无需进行任何外部调用
将流动性数量从用户发送到pair地址(需提前批准)
pair合约销毁流动性数量,并将数值0,1的token发送到to地址
排序tokenA,tokenB
按排序后的token顺序返回数值AB
确保数值AB大于最小值AB
removeLiquidityETH 移除ETH流动性方法
* @dev 移除ETH流动性
* @param token token地址
* @param liquidity 流动性数量
* @param amountTokenMin token最小数量
* @param amountETHMin ETH最小数量
* @param to to地址
* @param deadline 最后期限
* @return amountToken token数量
* @return amountETH ETH数量
(token数量,ETH数量) = 移除流动性(token地址,WETH地址,流动性数量,token最小数量,ETH最小数量,当前合约地址,最后期限)
将token数量的token发送到to地址
从WETH取款ETH数量
将ETH数量的ETH发送到to地址
removeLiquidityWithPermit 带签名移除流动性方法
* @dev 带签名移除流动性
* @param tokenA tokenA地址
* @param tokenB tokenB地址
* @param liquidity 流动性数量
* @param amountAMin 最小数量A
* @param amountBMin 最小数量B
* @param to to地址
* @param deadline 最后期限
* @param approveMax 全部批准
* @param v v
* @param r r
* @param s s
* @return amountA 数量A
* @return amountB 数量B
计算TokenA,TokenB的CREATE2地址,而无需进行任何外部调用
如果全部批准,value值等于最大uint256,否则等于流动性
调用pair合约的许可方法(调用账户,当前合约地址,数值,最后期限,v,r,s)
(数量A,数量B) = 移除流动性(tokenA地址,tokenB地址,流动性数量,最小数量A,最小数量B,to地址,最后期限)
removeLiquidityETHWithPermit 带签名移除ETH流动性方法
* @dev 带签名移除ETH流动性
* @param token token地址
* @param liquidity 流动性数量
* @param amountTokenMin token最小数量
* @param amountETHMin ETH最小数量
* @param to to地址
* @param deadline 最后期限
* @param approveMax 全部批准
* @param v v
* @param r r
* @param s s
* @return amountToken token数量
* @return amountETH ETH数量
计算TokenA,TokenB的CREATE2地址,而无需进行任何外部调用
如果全部批准,value值等于最大uint256,否则等于流动性
调用pair合约的许可方法(调用账户,当前合约地址,数值,最后期限,v,r,s)
(token数量,ETH数量) = 移除ETH流动性(token地址,流动性数量,token最小数量,ETH最小数量,to地址,最后期限)
基础的交换方法有6种
根据精确的token交换尽量多的token
使用尽量少的token交换精确的token
根据精确的ETH交换尽量多的token
使用尽量少的token交换精确的ETH
根据精确的token交换尽量多的ETH
使用尽量少的ETH交换精确的token
交换方法调用时,可以传入两个token的交易对,或者传入多个token的路径地址数组
多个token的路径地址数组中,每前后两个token地址必须是一个已经配对的交易对
交换方法会遍历路径数组,将每两个交易对排序后调用交易对的pair合约的交换方法进行交易
除此之外交换方法还有3种支持收税的交换方法
支持收税的根据精确的token交换尽量多的token
支持收税的根据精确的ETH交换尽量多的token
支持收税的根据精确的token交换尽量多的ETH
* @dev 私有交换
* @param amounts 数额数组
* @param path 路径
* @param _to to地址
遍历路径数组
(输入地址,输出地址) = (当前地址,下一个地址)
token0 = 排序(输入地址,输出地址)
输出数量 = 数额数组下一个数额
(输出数额0,输出数额1) = 输入地址==token0 ? (0,输出数额) : (输出数额,0)
to地址 = i<路径长度-2 ? (输出地址,路径下下个地址)的pair合约地址 : to地址
调用(输入地址,输出地址)的pair合约
地址的交换
方法(输出数额0,输出数额1,to地址,0x00)
swapExactTokensForTokens 根据精确的token交换尽量多的token
* @dev 根据精确的token交换尽量多的token
* @param amountIn 精确输入数额
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
数额数组 ≈ 遍历路径数组((精确输入数额 * 储备量Out) / (储备量In * 1000 + 输入数额))
确认数额数组最后一个元素>=最小最小输出数额
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
私有交换(数额数组,路径数组,to地址)
swapTokensForExactTokens 使用尽量少的token交换精确的token
* @dev 使用尽量少的token交换精确的token
* @param amountOut 精确输出数额
* @param amountInMax 最大输入数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
数额数组 ≈ 遍历路径数组((储备量In * 储备量Out * 1000) / (储备量Out - 输出数额 * 997) + 1)
确认数额数组第一个元素<=最大输入数额
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
私有交换(数额数组,路径数组,to地址)
swapExactETHForTokens 根据精确的ETH交换尽量多的token
* @dev 根据精确的ETH交换尽量多的token
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
确认路径第一个地址为WETH
数额数组 ≈ 遍历路径数组((精确输入数额 * 储备量Out) / (储备量In * 1000 + msg.value))
确认数额数组最后一个元素>=最小输出数额
将数额数组[0]的数额存款ETH到WETH合约
断言将数额数组[0]的数额的WETH发送到路径(0,1)的pair合约地址
私有交换(数额数组,路径数组,to地址)
swapTokensForExactETH 使用尽量少的token交换精确的ETH
* @param amountOut 精确输出数额
* @param amountInMax 最大输入数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
确认路径最后一个地址为WETH
数额数组 ≈ 遍历路径数组((储备量In * 储备量Out * 1000) / (储备量Out - 输出数额 * 997) + 1)
确认数额数组第一个元素<=最大输入数额
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
私有交换(数额数组,路径数组,to地址)
从WETH合约提款数额数组最后一个数值的ETH
将数额数组最后一个数值的ETH发送到to地址
swapExactTokensForETH 根据精确的token交换尽量多的ETH
* @dev 根据精确的token交换尽量多的ETH
* @param amountIn 精确输入数额
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
确认路径最后一个地址为WETH
数额数组 ≈ 遍历路径数组((精确输入数额 * 储备量Out) / (储备量In * 1000 + 输入数额))
确认数额数组最后一个元素>=最小输出数额
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
私有交换(数额数组,路径数组,当前合约地址)
从WETH合约提款数额数组最后一个数值的ETH
将数额数组最后一个数值的ETH发送到to地址
swapETHForExactTokens 使用尽量少的ETH交换精确的token
* @dev 使用尽量少的ETH交换精确的token
* @param amountOut 精确输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
* @return amounts[] 数额数组
确认路径第一个地址为WETH
数额数组 ≈ 遍历路径数组((储备量In * 储备量Out * 1000) / (储备量Out - 输出数额 * 997) + 1)
确认数额数组第一个元素<=msg.value
将数额数组[0]的数额存款ETH到WETH合约
断言将数额数组[0]的数额的WETH发送到路径(0,1)的pair合约地址
私有交换(数额数组,路径数组,to地址)
如果收到的主币数量
>数额数组[0]
则返还收到的主币数量
-数额数组[0]
_swapSupportingFeeOnTransferTokens 支持收税的私有交换
* @dev 支持收税的私有交换
* @notice 要求初始金额已经发送到第一对
* @param path 路径数组
* @param _to to地址
遍历路径数组
(输入地址,输出地址) = (当前地址,下一个地址)
token0 = 排序(输入地址,输出地址)
pair地址 = (输入地址,输出地址)
初始化输入数值,输出数值
获取储备_reserve0,_reserve1
排序(储备量In,储备量Out)
输入数额 = pair地址在token合约的余额 - 储备量In
输出数额 = (输入数额 * 储备量Out) / (储备量In * 1000 + 输入数额)
(输出数额0,输出数额1) = 输入地址 == token0 ? (0,输出数额0) : (输出数额0,0)
to地址 = 当前循环到倒数第二 ? pair地址(输出地址,路径最后一个地址) : _to地址
交换(输出数额0,输出数额1,to地址,0x00)
swapExactTokensForTokensSupportingFeeOnTransferTokens 支持收税的根据精确的token交换尽量多的token
* @dev 支持收税的根据精确的token交换尽量多的token
* @param amountIn 精确输入数额
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
记录to地址在路径数组最后一个token地址的余额
支持收税的私有交换(路径数组,to地址)
确认to地址在路径数组最后一个token地址的当前余额 - 之前的余额 >= 最小输出数额
swapExactETHForTokensSupportingFeeOnTransferTokens 支持收税的根据精确的ETH交换尽量多的token
* @dev 支持收税的根据精确的ETH交换尽量多的token
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
确认路径第一个地址为WETH
输入数额为msg.value
将输入数额存款ETH到WETH合约
断言将输入数额的WETH发送到路径(0,1)的pair合约地址
记录to地址在路径数组最后一个token地址的余额
支持收税的私有交换(路径数组,to地址)
确认to地址在路径数组最后一个token地址的当前余额 - 之前的余额 >= 最小输出数额
swapExactTokensForETHSupportingFeeOnTransferTokens 支持收税的根据精确的token交换尽量多的ETH
* @dev 支持收税的根据精确的token交换尽量多的ETH
* @param amountIn 精确输入数额
* @param amountOutMin 最小输出数额
* @param path 路径数组
* @param to to地址
* @param deadline 最后期限
确认路径最后一个地址为WETH
将数量为数额数组[0]的路径[0]的token从调用者账户发送到路径0,1的pair合约
支持收税的私有交换(路径数组,当前合约地址)
输出数额 = 当前合约地址在WETH的余额
确认输出数额 >= 最小输出数额
从WETH合约提款输出数额
将输出数额的ETH发送到to地址