Pre:
当你在pancakeswap上交易时,它会帮你找到最佳的交易对路径,中间交易代币可能是一个或多个。那它这个最佳交易对路径是如何计算出来的呢?
如何查找最佳交易对路径:
从sdk中可以看到有bestTradeExactIn
方法:
给定一组对、固定数量的输入和输出的代币数量,此方法返回将maxNumResults输入代币数量交换为输出代币的最佳交易,最多maxHops跳数。返回的交易按输出金额降序排列,并且都共享给定的输入金额。
1 | Trade.bestTradeExactIn( |
意思就是哪个交易对路径最后返回的币最多,哪个就是最佳路径。如果要自己简单的实现的话,可以找到对应链的主流币种,例如USDT
,BNB
,BUSD
等。
所有代币都是与这些代币中的一种或多种配对组成流动性池子的。因此,只要用这些代币作为路径组合的中间币种即可,而无需考虑全部代币。
tokenA 兑换 tokenB 可遍历的路径包括:
-
tokenA > tokenB:只有两个代币存在直接配对的流动性池子时,该路径才有效
-
tokenA > tokenC > tokenB:tokenC 就是常用代币中的一种,要求 tokenA-tokenC 和 tokenC-tokenB 分别都存在流动性池子
-
tokenA > tokenC > tokenD > tokenB:tokenC 和 tokenD 是常用代币列表中的两种代币,要求 tokenA-tokenC、tokenC-tokenD、tokenD-tokenB 这三个配对的流动性池子是有效的
然后自己去简单遍历构造交易对路径。调用pancakeswap router
的getAmountsOut
方法
1 | # python web3部分代码 |
最终哪个交易路径最后返回的币最多,哪个就是最佳路径。
简单试验:
1 | ADA-BUSD-BUNNY--32.601445898030065398 |
查询出来是含bnb的交易路径是最佳的,和前端页面显示的也对得上。
至于为什么不同的交易路径会有不同的返回,暂时猜测和池子的深度有关。后续还有看看uniswap
的源码后,才能更加深入的理解