本文作者:pine[1]

Uniswap v2

什么是 best route

下图中用 matic 去 swap bnb, 红框中的 swap 路径即为 best route

uniswap v2 swap path

如何实现

  1. 可以设置一个主流币列表然后用主流币作为中转去遍历

  2. 使用 uniswap sdk[2] 提供的 api besttradeexactin 来计算

示例代码

以 quickswap sdk 为例,其实和 uniswap 代码都一样只是包名不同

    const {        Fetcher,        WETH,        Route,        Trade,        TokenAmount,        TradeType,        ChainId,      } = require("quickswap-sdk");      const ethers = require("ethers");      // 可以替换为自己的 url      const url = "http://127.0.0.1:8545";      const customHttpProvider = new ethers.providers.JsonRpcProvider(url);      const chainId = 1337;      const usdt_address = "0xc2132D05D31c914a87C6611C10748AEb04B58e8F";      const aave_address = "0xD6DF932A45C0f255f85145f286eA0b292B21C90B";      const weth_address = "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619";      const dai_address = "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063";      const init = async () => {        const usdt = await Fetcher.fetchTokenData(          chainId,          usdt_address,          customHttpProvider        );        const aave = await Fetcher.fetchTokenData(          chainId,          aave_address,          customHttpProvider        );        const weth = await Fetcher.fetchTokenData(          chainId,          weth_address,          customHttpProvider        );        const dai = await Fetcher.fetchTokenData(          chainId,          dai_address,          customHttpProvider        );        // 需要获取 protocol 的所有 token 并组合 pair ,但是这样效率太低 所以准备几个主流币作为中间转换币应该没什么问题        const pairs = await Fetcher.fetchPairData(aave, usdt, customHttpProvider);        const epairs = await Fetcher.fetchPairData(aave, weth, customHttpProvider);        const epairs2 = await Fetcher.fetchPairData(weth, usdt, customHttpProvider);        const epairs3 = await Fetcher.fetchPairData(aave, dai, customHttpProvider);        const epairs4 = await Fetcher.fetchPairData(dai, usdt, customHttpProvider);        const route = new Route([pairs], aave);        // const trade = new Trade(        //   route,        //   new TokenAmount(aave, "1000000000000000000"),        //   TradeType.EXACT_INPUT        // );        // console.log(route.path);        console.log("Mid Price aave --> usdt:", route.midPrice.toSignificant(6));        const amountIn = new TokenAmount(aave, "1000000000000000000");        const best = Trade.bestTradeExactIn(          [pairs, epairs3, epairs4, epairs, epairs2],          amountIn,          usdt          // new TokenAmount(usdt, 1000000)        );        // 打印最佳路径        console.log(best[0].route.path);      };      init();  

Uniswap v3

v3[3] 版本的 swap path 已经是一个中心化服务来提供查询了

Uniswap/routing-api (github.com)")

参考资料

[1]

pine: https://learnblockchain.cn/people/955

[2]

uniswap sdk: https://docs.uniswap.org/sdk/2.0.0/reference/trade#besttradeexactin

[3]

v3: https://learnblockchain.cn/article/2302

uniswap v2 swap path