0%

Crypto-pancakeswap_最佳交易对路径

Pre:

当你在pancakeswap上交易时,它会帮你找到最佳的交易对路径,中间交易代币可能是一个或多个。那它这个最佳交易对路径是如何计算出来的呢?

20211020104114

20211020104124

如何查找最佳交易对路径:

uniswap sdk

从sdk中可以看到有bestTradeExactIn方法:

给定一组对、固定数量的输入和输出的代币数量,此方法返回将maxNumResults输入代币数量交换为输出代币的最佳交易,最多maxHops跳数。返回的交易按输出金额降序排列,并且都共享给定的输入金额。

1
2
3
4
5
Trade.bestTradeExactIn(
pairs: Pair[],
amountIn: TokenAmount,
tokenOut: Token,
{ maxNumResults = 3, maxHops = 3 }: BestTradeOptions = {}): Trade[]

意思就是哪个交易对路径最后返回的币最多,哪个就是最佳路径。如果要自己简单的实现的话,可以找到对应链的主流币种,例如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 routergetAmountsOut方法

20211105165458

1
2
3
# python web3部分代码
predicted_out = router_contract.functions.getAmountsOut(amount_bnb, [from_token_address, contract_addr,
token_address]).call()[-1]

最终哪个交易路径最后返回的币最多,哪个就是最佳路径。

简单试验:

20211105165844

1
2
3
4
5
ADA-BUSD-BUNNY--32.601445898030065398
ADA-WBNB-BUNNY--57.411093623881308004
ADA-USDT-BUNNY--13.477518281960642732
ADA-USDC-BUNNY--0.000005664178344977
ADA-CAKE-BUNNY--48.583485276034042082

查询出来是含bnb的交易路径是最佳的,和前端页面显示的也对得上。

至于为什么不同的交易路径会有不同的返回,暂时猜测和池子的深度有关。后续还有看看uniswap的源码后,才能更加深入的理解

Refs: