由于路由器是无状态的并且不持有代币余额,因此可以在必要时安全且无需信任地更换它们。如果发现了更有效的智能合约模式,或者需要额外的功能,则可能会发生这种情况。出于这个原因,路由器的版本号从 开始01。这是当前推荐的版本
UniswapV2Router02.sol
UniswapV2Router02部署在0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D以太坊主网上,以及Ropsten、Rinkeby、Görli和Kovan测试网。它是从提交6961711 构建的。
function factory() external pure returns (address);
返回工厂地址
function WETH() external pure returns (address);
返回以太坊主网或Ropsten、Rinkeby、Görli或Kovan测试网上的规范 WETH 地址。
见报价。
请参阅getAmountOut。
请参阅getAmountIn。
function getAmountsOut(uint amountIn, address[] memory path) public view returns (uint[] memory amounts);
请参阅getAmountsOut。
function getAmountsIn(uint amountOut, address[] memory path) public view returns (uint[] memory amounts);
function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity);
为 ERC-20⇄ERC-20 池增加流动性。 1.为了涵盖所有可能的情况,msg.sender应该已经给路由器在 tokenA/tokenB 上至少有 amountADesired/amountBDesired 的余量。
2.始终根据交易执行时的价格以理想的比率添加资产。
3.如果传递的代币池不存在,则会自动创建一个池,并准确添加amountADesired/amountBDesired 代币。
扣群探讨技术:958319786
Name | 类型 | |
---|---|---|
代币A | address |
池令牌。 |
代币B | address |
池令牌。 |
所需数量 | uint |
如果 B/A 价格 <= amountBDesired/amountADesired(A 贬值),则作为流动性添加的代币 A 的数量。 |
所需数量 | uint |
如果 A/B 价格 <= amountADesired/amountBDesired(B 贬值),则作为流动性添加的代币 B 的数量。 |
量Amin | uint |
限制 B/A 价格在交易恢复之前可以上涨的程度。必须 <= amountADesired。 |
数量BMin | uint |
限制在交易恢复之前 A/B 价格可以上涨的程度。必须 <= amountBDesired。 |
到 | address |
流动性代币的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额A | uint |
发送到池中的 tokenA 数量。 |
金额B | uint |
发送到池中的 tokenB 数量。 |
流动性 | uint |
铸造的流动性代币数量。 |
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
使用 ETH 为 ERC-20⇄WETH 池增加流动性。
为了覆盖所有可能的场景,msg.sender 应该已经给路由器一个至少为amountTokenDesired 的令牌。
始终根据交易执行时的价格以理想的比率添加资产。
msg.value被视为数量ETHDesired。
剩余的 ETH(如果有)将返回给msg.sender.
如果传递的代币和 WETH 的池不存在,则会自动创建一个池,并准确msg.value添加 amountTokenDesired/ 代币。
Name | 类型 | |
---|---|---|
令牌 | address |
池令牌。 |
amountTokenDesired | uint |
如果 WETH/代币价格 <= msg.value /amountTokenDesired(代币贬值),则作为流动性添加的代币数量。 |
msg.value (所需金额 ETH) |
uint |
如果代币/WETH 价格 <= amountTokenDesired/ msg.value (WETH 贬值),则作为流动性添加的 ETH 数量。 |
amountTokenMin | uint |
限制在交易恢复之前 WETH/代币价格可以上涨的程度。必须 <= amountTokenDesired。 |
金额ETHMin | uint |
限制在交易恢复之前代币/WETH 价格可以上涨的程度。必须是 <= msg.value 。 |
到 | address |
流动性代币的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
数量代币 | uint |
发送到池中的代币数量。 |
数量ETH | uint |
转换为 WETH 并发送到池中的 ETH 数量。 |
流动性 | uint |
铸造的流动性代币数量。 |
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
从 ERC-20⇄ERC-20 池中移除流动性。
msg.sender应该已经给路由器至少允许池中的流动性。
Name | 类型 | |
---|---|---|
代币A | address |
池令牌。 |
代币B | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
量Amin | uint |
为使交易不恢复而必须接收的最小 tokenA 数量。 |
数量BMin | uint |
为使交易不恢复而必须接收的最小令牌 B 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额A | uint |
收到的 tokenA 数量。 |
金额B | uint |
收到的tokenB数量。 |
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
从 ERC-20⇄WETH 池中移除流动性并接收 ETH。
msg.sender应该已经给路由器至少允许池中的流动性。
Name | 类型 | |
---|---|---|
令牌 | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
amountTokenMin | uint |
为使交易不恢复而必须接收的最小令牌数量。 |
金额ETHMin | uint |
为使交易不恢复而必须接收的最低 ETH 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
数量代币 | uint |
收到的代币数量。 |
数量ETH | uint |
收到的 ETH 数量。 |
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
由于permit,无需预先批准即可从 ERC-20⇄ERC-20 池中移除流动性。
Name | 类型 | |
---|---|---|
代币A | address |
池令牌。 |
代币B | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
量Amin | uint |
为使交易不恢复而必须接收的最小 tokenA 数量。 |
数量BMin | uint |
为使交易不恢复而必须接收的最小令牌 B 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
批准最大 | bool |
签名中的批准金额是流动性还是uint(-1) . |
v | uint8 |
许可签名的 v 分量。 |
r | bytes32 |
许可签名的 r 分量。 |
s | bytes32 |
许可签名的 s 组件。 |
金额A | uint |
收到的 tokenA 数量。 |
金额B | uint |
收到的tokenB数量。 |
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
由于permit,从 ERC-20⇄WETTH 池中移除流动性并在未经预先批准的情况下接收 ETH
Name | 类型 | |
---|---|---|
令牌 | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
amountTokenMin | uint |
为使交易不恢复而必须接收的最小令牌数量。 |
金额ETHMin | uint |
为使交易不恢复而必须接收的最低 ETH 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
批准最大 | bool |
签名中的批准金额是流动性还是uint(-1) . |
v | uint8 |
许可签名的 v 分量。 |
r | bytes32 |
许可签名的 r 分量。 |
s | bytes32 |
许可签名的 s 组件。 |
数量代币 | uint |
收到的代币数量。 |
数量ETH | uint |
收到的 ETH 数量。 |
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
与removeLiquidityETH相同,但对于收取转账费用的代币会成功。
msg.sender应该已经给路由器至少允许池中的流动性
Name | 类型 | |
---|---|---|
令牌 | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
amountTokenMin | uint |
为使交易不恢复而必须接收的最小令牌数量。 |
金额ETHMin | uint |
为使交易不恢复而必须接收的最低 ETH 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
数量ETH | uint |
收到的 ETH 数量。 |
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
与removeLiquidityETHWithPermit相同,但对于收取转账费用的代币会成功。
Name | 类型 | |
---|---|---|
令牌 | address |
池令牌。 |
流动性 | uint |
要移除的流动性代币数量。 |
amountTokenMin | uint |
为使交易不恢复而必须接收的最小令牌数量。 |
金额ETHMin | uint |
为使交易不恢复而必须接收的最低 ETH 数量。 |
到 | address |
标的资产的接收方。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
批准最大 | bool |
签名中的批准金额是流动性还是uint(-1) . |
v | uint8 |
许可签名的 v 分量。 |
r | bytes32 |
许可签名的 r 分量。 |
s | bytes32 |
许可签名的 s 组件。 |
数量ETH | uint |
收到的 ETH 数量 |
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
沿着由路径确定的路线,将精确数量的输入标记交换为尽可能多的输出标记。path 的第一个元素是输入标记,最后一个是输出标记,任何中间元素都表示要交易的中间对(例如,如果不存在直接对)。
msg.sender应该已经在输入令牌上给了路由器至少 amountIn 的余量。
Name | 类型 | |
---|---|---|
金额 | uint |
要发送的输入令牌的数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量。 |
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
沿着由路径确定的路线,为尽可能少的输入令牌接收准确数量的输出令牌。path 的第一个元素是输入令牌,最后一个是输出令牌,任何中间元素都表示要交易的中间令牌(例如,如果不存在直接对)。
msg.sender应该已经在输入令牌上给了路由器至少 amountInMax 的余量。
Name | 类型 | |
---|---|---|
金额 | uint |
要接收的输出令牌数量。 |
最大金额 | uint |
在交易恢复之前可能需要的最大输入令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量 |
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
沿着由路径确定的路线,为尽可能多的输出令牌交换准确数量的 ETH。path 的第一个元素必须是WETH,最后一个是输出令牌,任何中间元素都表示要交易的中间对(例如,如果不存在直接对)。
Name | 类型 | |
---|---|---|
msg.value (金额) |
uint |
要发送的 ETH 数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量。 |
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
沿着由路径确定的路线,以尽可能少的输入令牌接收准确数量的 ETH。path 的第一个元素是输入令牌,最后一个元素必须是WETH,并且任何中间元素都表示要交易的中间对(例如,如果不存在直接对)。
msg.sender应该已经在输入令牌上给了路由器至少 amountInMax 的余量。
如果收件人地址是智能合约,它必须具有接收 ETH 的能力。
Name | 类型 | |
---|---|---|
金额 | uint |
要接收的 ETH 数量。 |
最大金额 | uint |
在交易恢复之前可能需要的最大输入令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
ETH 的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量。 |
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
沿着由路径确定的路线,用尽可能多的 ETH 交换准确数量的代币。path 的第一个元素是输入令牌,最后一个元素必须是WETH,并且任何中间元素都表示要交易的中间对(例如,如果不存在直接对)。
如果收件人地址是智能合约,它必须具有接收 ETH 的能力。
Name | 类型 | |
---|---|---|
金额 | uint |
要发送的输入令牌的数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
ETH 的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量。 |
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
沿着由路径确定的路线,以尽可能少的 ETH 接收准确数量的代币。path 的第一个元素必须是WETH,最后一个是输出令牌,任何中间元素都代表要交易的中间对(例如,如果不存在直接对)。
剩余的 ETH(如果有)将返回给msg.sender.
Name | 类型 | |
---|---|---|
金额 | uint |
要接收的代币数量。 |
msg.value (金额最大) |
uint |
交易恢复之前可能需要的最大 ETH 数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
金额 | uint[] memory |
输入代币数量和所有后续输出代币数量。 |
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
与swapExactTokensForTokens相同,但对于收取转账费用的代币会成功。
msg.sender应该已经在输入令牌上给了路由器至少 amountIn 的余量。
Name | 类型 | |
---|---|---|
金额 | uint |
要发送的输入令牌的数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
与swapExactETHForTokens相同,但对于收取转账费用的代币会成功。
Name | 类型 | |
---|---|---|
msg.value (金额) |
uint |
要发送的 ETH 数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
输出令牌的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
与swapExactTokensForETH相同,但对于收取转账费用的代币会成功。
如果收件人地址是智能合约,它必须具有接收 ETH 的能力
Name | 类型 | |
---|---|---|
金额 | uint |
要发送的输入令牌的数量。 |
最小金额 | uint |
为使交易不恢复而必须接收的最小输出令牌数量。 |
小路 | address[] calldata |
令牌地址数组。path.length 必须 >= 2。每对连续地址的池必须存在并具有流动性。 |
到 | address |
ETH 的接收者。 |
最后期限 | uint |
交易将恢复的 Unix 时间戳。 |
import '@uniswap/v2-periphery/contracts/interfaces/IUniswapV2Router02.sol';
pragma solidity >=0.6.2;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
import IUniswapV2Router02 from "@uniswap/v2-periphery/build/IUniswapV2Router02.json";
欢迎大家加入【技术交流群】:958319786