KyberSwap
KyberSwap是Kyber Network支持的旗舰产品。KyberSwap建立在以太坊上,是多链去中心化交易平台(DEX),支持12个网络(包括以太坊、Polygon、BNB Chain、Avalanche和Optimism),用户可在其中任何一个网络上开展交易。
KyberSwap还是聚合器,即它不仅会从自己的资金池中获取流动性,而且还会从其支持的各网络超过67个DEX中获取流动性。与其他DEX类似,KyberSwap是去信任化交易平台,即用户对他们的订单和资金具有完全控制权。KyberSwap致力于解决许多DeFi交易者每天都遇到的流动性挑战,同时为流动性供应商(LP)提供充足回报。
获取路由文档网址 可以返回预估的最佳价格
请求和相应参数
"code": 0,
"message": "successfully",
"data": {
"routeSummary": {
"tokenIn": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
"amountIn": "100000000",
"amountInUsd": "25908",
"tokenInMarketPriceAvailable": true,
"tokenOut": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"amountOut": "25809709349",
"amountOutUsd": "25938.757895745",
"tokenOutMarketPriceAvailable": true,
"gas": "493000",
"gasPrice": "18469049423",
"gasUsd": "15.616399466035938",
"extraFee": {
"feeAmount": "0",
"chargeFeeBy": "",
"isInBps": false,
"feeReceiver": ""
},
"route": [
[
{
"pool": "0xd51a44d3fae010294c616388b506acda1bfaae46",
"tokenIn": "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",
"tokenOut": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"limitReturnAmount": "0",
"swapAmount": "100000000",
"amountOut": "25743761623",
"exchange": "curve",
"poolLength": 3,
"poolType": "curve-tricrypto",
"extra": {
"tokenInIndex": 1,
"tokenOutIndex": 0,
"underlying": false
}
},
{
"pool": "0xbebc44782c7db0a1a60cb6fe97d0b483032ff1c7",
"tokenIn": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"tokenOut": "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",
"limitReturnAmount": "0",
"swapAmount": "25743761623",
"amountOut": "25809709349",
"exchange": "curve",
"poolLength": 3,
"poolType": "curve-base",
"extra": {
"tokenInIndex": 2,
"tokenOutIndex": 1,
"underlying": false
}
}
]
]
},
"routerAddress": "0x6131B5fae19EA4f9D964eAc0408E4408b66337b5"
}
}
uniswap
路径选择
在进行两个代币交易时,是首先需要在链下计算出交易的路径,例如使用 ETH -> DAI :
- 可以直接通过
ETH/DAI的交易池完成 - 也可以通过
ETH->USDC->DAI路径,即经过ETH/USDC,USDC/DAI两个交易池完成交易
Uniswap 的前端会帮用户实时计算出最优路径(即交易的收益最高),作为参数传给合约调用。前端中这部分计算的具体实现在这里,具体过程为先用需要交易的输入代币,输出代币,以及一系列可用的中间代币(代码中叫 Base token)生成所有的路径(当然为了降低复杂度,路径中最多包含3个代币),然后遍历每个路径输出的输出代币数量,最后选取最佳路径。
事实上因为 v3 引入了费率的原因,在路径选择的过程中还需要考虑费率的因素。
寻找最优路径
寻找最优路径的第一步,要先找出所有潜在路径。但是,币种那么多,不可能将所有币种都进行路径组合,尤其在合约层面,效率太低了。其实,如果看看 Uniswap 前端页面,选择代币时,可以看到列出了几种常用代币,如下图:
可以看到,这些都是最主流的代币,所有代币都是与这些代币中的一种或多种配对组成流动性池子的。因此,只要用这些代币作为路径组合的中间币种即可,而无需考虑全部代币。
另外,路径也不能太长,最长的就如 tokenA > tokenC > tokenD > tokenB 就够了。
总而言之,tokenA 兑换 tokenB 可遍历的路径包括:
- tokenA > tokenB:只有两个代币存在直接配对的流动性池子时,该路径才有效
- tokenA > tokenC > tokenB:tokenC 就是常用代币中的一种,要求 tokenA-tokenC 和 tokenC-tokenB 分别都存在流动性池子
- tokenA > tokenC > tokenD > tokenB:tokenC 和 tokenD 是常用代币列表中的两种代币,要求 tokenA-tokenC、tokenC-tokenD、tokenD-tokenB 这三个配对的流动性池子是有效的
对每个有效路径读取出最后价格,对比后就知道最优路径是哪个了。
获取价格 v2
获取价格 v3
示例:
const amountOut = await quoterContract.callStatic.quoteExactInputSingle(
'0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
'0x4e3fbd56cd56c3e72c1403e103b45db9da5b9d2b',
100,
1_000_000,
0
);