@ring-protocol/smart-order-router 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/build/main/index.js.map +1 -0
  2. package/build/main/providers/cache-node.js.map +1 -0
  3. package/build/main/providers/cache.js.map +1 -0
  4. package/build/main/providers/caching/route/index.js.map +1 -0
  5. package/build/main/providers/caching/route/model/cache-mode.js.map +1 -0
  6. package/build/main/providers/caching/route/model/cached-route.js.map +1 -0
  7. package/build/main/providers/caching/route/model/cached-routes.js.map +1 -0
  8. package/build/main/providers/caching/route/model/index.js.map +1 -0
  9. package/build/main/providers/caching/route/route-caching-provider.js.map +1 -0
  10. package/build/main/providers/caching-gas-provider.js.map +1 -0
  11. package/build/main/providers/caching-subgraph-provider.js.map +1 -0
  12. package/build/main/providers/caching-token-list-provider.js.map +1 -0
  13. package/build/main/providers/caching-token-provider.js.map +1 -0
  14. package/build/main/providers/eip-1559-gas-price-provider.js.map +1 -0
  15. package/build/main/providers/eth-estimate-gas-provider.js.map +1 -0
  16. package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +1 -0
  17. package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +1 -0
  18. package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +1 -0
  19. package/build/main/providers/fewV2/ring-pool-provider.js.map +1 -0
  20. package/build/main/providers/fewV2/ring-quote-provider.js.map +1 -0
  21. package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +1 -0
  22. package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +1 -0
  23. package/build/main/providers/fewV2/ring-subgraph-provider.js.map +1 -0
  24. package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +1 -0
  25. package/build/main/providers/gas-price-provider.js.map +1 -0
  26. package/build/main/providers/index.js.map +1 -0
  27. package/build/main/providers/legacy-gas-price-provider.js.map +1 -0
  28. package/build/main/providers/multicall-provider.js.map +1 -0
  29. package/build/main/providers/multicall-ringswap-provider.js.map +1 -0
  30. package/build/main/providers/multicall-uniswap-provider.js.map +1 -0
  31. package/build/main/providers/on-chain-gas-price-provider.js.map +1 -0
  32. package/build/main/providers/on-chain-quote-provider.d.ts +4 -4
  33. package/build/main/providers/on-chain-quote-provider.js +35 -37
  34. package/build/main/providers/on-chain-quote-provider.js.map +1 -0
  35. package/build/main/providers/pool-provider.js.map +1 -0
  36. package/build/main/providers/portion-provider.js.map +1 -0
  37. package/build/main/providers/provider.js.map +1 -0
  38. package/build/main/providers/simulation-provider.js.map +1 -0
  39. package/build/main/providers/static-gas-price-provider.js.map +1 -0
  40. package/build/main/providers/subgraph-provider-with-fallback.js.map +1 -0
  41. package/build/main/providers/subgraph-provider.js.map +1 -0
  42. package/build/main/providers/swap-router-provider.js.map +1 -0
  43. package/build/main/providers/tenderly-simulation-provider.js.map +1 -0
  44. package/build/main/providers/token-fee-fetcher.js.map +1 -0
  45. package/build/main/providers/token-properties-provider.js.map +1 -0
  46. package/build/main/providers/token-provider.js.map +1 -0
  47. package/build/main/providers/token-validator-provider.js.map +1 -0
  48. package/build/main/providers/uri-subgraph-provider.js.map +1 -0
  49. package/build/main/providers/v2/caching-pool-provider.js.map +1 -0
  50. package/build/main/providers/v2/caching-subgraph-provider.js.map +1 -0
  51. package/build/main/providers/v2/pool-provider.js.map +1 -0
  52. package/build/main/providers/v2/quote-provider.js.map +1 -0
  53. package/build/main/providers/v2/static-subgraph-provider.js.map +1 -0
  54. package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +1 -0
  55. package/build/main/providers/v2/subgraph-provider.js.map +1 -0
  56. package/build/main/providers/v2/uri-subgraph-provider.js.map +1 -0
  57. package/build/main/providers/v3/caching-pool-provider.js.map +1 -0
  58. package/build/main/providers/v3/caching-subgraph-provider.js.map +1 -0
  59. package/build/main/providers/v3/gas-data-provider.js.map +1 -0
  60. package/build/main/providers/v3/pool-provider.js.map +1 -0
  61. package/build/main/providers/v3/static-subgraph-provider.js.map +1 -0
  62. package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +1 -0
  63. package/build/main/providers/v3/subgraph-provider.js.map +1 -0
  64. package/build/main/providers/v3/uri-subgraph-provider.js.map +1 -0
  65. package/build/main/providers/v4/caching-pool-provider.js.map +1 -0
  66. package/build/main/providers/v4/caching-subgraph-provider.js.map +1 -0
  67. package/build/main/providers/v4/pool-provider.js.map +1 -0
  68. package/build/main/providers/v4/static-subgraph-provider.js.map +1 -0
  69. package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +1 -0
  70. package/build/main/providers/v4/subgraph-provider.js.map +1 -0
  71. package/build/main/providers/v4/uri-subgraph-provider.js.map +1 -0
  72. package/build/main/routers/alpha-router/alpha-router.d.ts +9 -0
  73. package/build/main/routers/alpha-router/alpha-router.js +4 -1
  74. package/build/main/routers/alpha-router/alpha-router.js.map +1 -0
  75. package/build/main/routers/alpha-router/config.js.map +1 -0
  76. package/build/main/routers/alpha-router/entities/index.js.map +1 -0
  77. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +1 -0
  78. package/build/main/routers/alpha-router/functions/best-swap-route.js.map +1 -0
  79. package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +1 -0
  80. package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +1 -0
  81. package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +1 -0
  82. package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +1 -0
  83. package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +1 -0
  84. package/build/main/routers/alpha-router/gas-models/gas-model.js.map +1 -0
  85. package/build/main/routers/alpha-router/gas-models/index.js.map +1 -0
  86. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +1 -0
  87. package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +1 -0
  88. package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +1 -0
  89. package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +1 -0
  90. package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +1 -0
  91. package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +1 -0
  92. package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +1 -0
  93. package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +1 -0
  94. package/build/main/routers/alpha-router/index.js.map +1 -0
  95. package/build/main/routers/alpha-router/quoters/base-quoter.js.map +1 -0
  96. package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +1 -0
  97. package/build/main/routers/alpha-router/quoters/index.js.map +1 -0
  98. package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +1 -0
  99. package/build/main/routers/alpha-router/quoters/model/index.js.map +1 -0
  100. package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +1 -0
  101. package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +1 -0
  102. package/build/main/routers/alpha-router/quoters/model/results/index.js.map +1 -0
  103. package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +1 -0
  104. package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +1 -0
  105. package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +1 -0
  106. package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +1 -0
  107. package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +1 -0
  108. package/build/main/routers/index.js.map +1 -0
  109. package/build/main/routers/legacy-router/bases.js.map +1 -0
  110. package/build/main/routers/legacy-router/index.js.map +1 -0
  111. package/build/main/routers/legacy-router/legacy-router.js.map +1 -0
  112. package/build/main/routers/router.js.map +1 -0
  113. package/build/main/tsconfig.tsbuildinfo +1 -1
  114. package/build/main/types/other/commons.js.map +1 -0
  115. package/build/main/types/other/factories/Erc20__factory.js.map +1 -0
  116. package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +1 -0
  117. package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +1 -0
  118. package/build/main/types/other/factories/ITokenValidator__factory.js.map +1 -0
  119. package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +1 -0
  120. package/build/main/types/other/factories/Permit2__factory.js.map +1 -0
  121. package/build/main/types/other/factories/StateView__factory.js.map +1 -0
  122. package/build/main/types/other/factories/SwapRouter02__factory.js.map +1 -0
  123. package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +1 -0
  124. package/build/main/types/other/factories/V4Quoter__factory.js.map +1 -0
  125. package/build/main/types/v2/commons.js.map +1 -0
  126. package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +1 -0
  127. package/build/main/types/v3/commons.js.map +1 -0
  128. package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +1 -0
  129. package/build/main/types/v3/factories/IQuoterV2__factory.js.map +1 -0
  130. package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +1 -0
  131. package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +1 -0
  132. package/build/main/util/addresses.js.map +1 -0
  133. package/build/main/util/amounts.js.map +1 -0
  134. package/build/main/util/callData.js.map +1 -0
  135. package/build/main/util/chains.js.map +1 -0
  136. package/build/main/util/defaultBlocksToLive.js.map +1 -0
  137. package/build/main/util/fewAddress.js.map +1 -0
  138. package/build/main/util/gas-factory-helpers.js.map +1 -0
  139. package/build/main/util/hooksOptions.js.map +1 -0
  140. package/build/main/util/index.js.map +1 -0
  141. package/build/main/util/intent.js.map +1 -0
  142. package/build/main/util/l2FeeChains.js.map +1 -0
  143. package/build/main/util/log.js.map +1 -0
  144. package/build/main/util/methodParameters.js +3 -1
  145. package/build/main/util/methodParameters.js.map +1 -0
  146. package/build/main/util/metric.js.map +1 -0
  147. package/build/main/util/mixedRouteFilterOutV4Pools.js.map +1 -0
  148. package/build/main/util/onchainQuoteProviderConfigs.js.map +1 -0
  149. package/build/main/util/pool.js.map +1 -0
  150. package/build/main/util/protocols.js.map +1 -0
  151. package/build/main/util/routes.js.map +1 -0
  152. package/build/main/util/serializeRouteIds.js.map +1 -0
  153. package/build/main/util/simple-perf-tracker.js.map +1 -0
  154. package/build/main/util/tenderlySimulationErrorBreakDown.js.map +1 -0
  155. package/build/main/util/unsupported-tokens.js.map +1 -0
  156. package/build/module/providers/on-chain-quote-provider.d.ts +4 -4
  157. package/build/module/providers/on-chain-quote-provider.js +35 -37
  158. package/build/module/routers/alpha-router/alpha-router.d.ts +9 -0
  159. package/build/module/routers/alpha-router/alpha-router.js +4 -1
  160. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  161. package/build/module/util/methodParameters.js +3 -1
  162. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alpha-router.js","sourceRoot":"","sources":["../../../../src/routers/alpha-router/alpha-router.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider, JsonRpcProvider } from '@ethersproject/providers';\nimport DEFAULT_TOKEN_LIST from '@uniswap/default-token-list';\nimport { Protocol, SwapRouter, Trade, ZERO } from '@fewprotocol/router-sdk';\nimport {\n ChainId,\n Currency,\n Fraction,\n Token,\n TradeType,\n} from '@fewprotocol/sdk-core';\nimport { TokenList } from '@uniswap/token-lists';\nimport { Pool, Position, SqrtPriceMath, TickMath } from '@fewprotocol/uniswap-v3-sdk';\nimport retry from 'async-retry';\nimport JSBI from 'jsbi';\nimport _ from 'lodash';\nimport NodeCache from 'node-cache';\n\nimport {\n CachedRoutes,\n CacheMode,\n CachingGasStationProvider,\n CachingTokenProviderWithFallback,\n CachingV2PoolProvider,\n // CachingV2SubgraphProvider,\n CachingV3PoolProvider,\n // CachingV3SubgraphProvider,\n // CachingV4SubgraphProvider,\n EIP1559GasPriceProvider,\n ETHGasStationInfoProvider,\n IOnChainQuoteProvider,\n IRingV2PoolProvider,\n IRingV2QuoteProvider,\n IRingV2SubgraphProvider,\n IRouteCachingProvider,\n ISwapRouterProvider,\n ITokenPropertiesProvider,\n IV2QuoteProvider,\n IV2SubgraphProvider,\n IV4SubgraphProvider,\n LegacyGasPriceProvider,\n NodeJSCache,\n OnChainGasPriceProvider,\n OnChainQuoteProvider,\n RingFewCachingV2PoolProvider,\n // RingFewCachingV2SubgraphProvider,\n RingFewStaticV2SubgraphProvider,\n RingFewV2SubgraphProviderWithFallBacks,\n RingswapMulticallProvider,\n RingV2PoolProvider,\n RingV2QuoteProvider,\n SimulationStatus,\n Simulator,\n StaticV2SubgraphProvider,\n StaticV3SubgraphProvider,\n StaticV4SubgraphProvider,\n SwapRouterProvider,\n TokenPropertiesProvider,\n UniswapMulticallProvider,\n // URISubgraphProvider,\n V2QuoteProvider,\n V2SubgraphProviderWithFallBacks,\n V3SubgraphProviderWithFallBacks,\n V4SubgraphProviderWithFallBacks,\n} from '../../providers';\nimport {\n CachingTokenListProvider,\n ITokenListProvider,\n} from '../../providers/caching-token-list-provider';\nimport {\n GasPrice,\n IGasPriceProvider,\n} from '../../providers/gas-price-provider';\nimport {\n IPortionProvider,\n PortionProvider,\n} from '../../providers/portion-provider';\nimport { ProviderConfig } from '../../providers/provider';\nimport { OnChainTokenFeeFetcher } from '../../providers/token-fee-fetcher';\nimport { ITokenProvider, TokenProvider } from '../../providers/token-provider';\nimport {\n ITokenValidatorProvider,\n TokenValidatorProvider,\n} from '../../providers/token-validator-provider';\nimport {\n IV2PoolProvider,\n V2PoolProvider,\n} from '../../providers/v2/pool-provider';\nimport {\n ArbitrumGasData,\n ArbitrumGasDataProvider,\n IL2GasDataProvider,\n} from '../../providers/v3/gas-data-provider';\nimport {\n IV3PoolProvider,\n V3PoolProvider,\n} from '../../providers/v3/pool-provider';\nimport { IV3SubgraphProvider } from '../../providers/v3/subgraph-provider';\nimport { CachingV4PoolProvider } from '../../providers/v4/caching-pool-provider';\nimport {\n IV4PoolProvider,\n V4PoolProvider,\n} from '../../providers/v4/pool-provider';\nimport { Erc20__factory } from '../../types/other/factories/Erc20__factory';\nimport {\n getAddress,\n getAddressLowerCase,\n getApplicableV4FeesTickspacingsHooks,\n HooksOptions,\n MIXED_SUPPORTED,\n shouldWipeoutCachedRoutes,\n SWAP_ROUTER_02_ADDRESSES,\n V4_SUPPORTED,\n WRAPPED_NATIVE_CURRENCY,\n} from '../../util';\nimport { CurrencyAmount } from '../../util/amounts';\nimport {\n FEW_WRAPPED_NATIVE_CURRENCY,\n ID_TO_CHAIN_ID,\n // ID_TO_NETWORK_NAME,\n RING_FEW_V2_SUPPORTED,\n V2_SUPPORTED,\n} from '../../util/chains';\nimport {\n getHighestLiquidityV3FewTokenUSDPool,\n getHighestLiquidityV3NativeFewTokenPool,\n getHighestLiquidityV3NativePool,\n getHighestLiquidityV3USDPool,\n} from '../../util/gas-factory-helpers';\nimport { log } from '../../util/log';\nimport {\n buildSwapMethodParameters,\n buildTrade,\n} from '../../util/methodParameters';\nimport { metric, MetricLoggerUnit } from '../../util/metric';\nimport {\n BATCH_PARAMS,\n BLOCK_NUMBER_CONFIGS,\n DEFAULT_BATCH_PARAMS,\n DEFAULT_BLOCK_NUMBER_CONFIGS,\n DEFAULT_GAS_ERROR_FAILURE_OVERRIDES,\n DEFAULT_RETRY_OPTIONS,\n DEFAULT_SUCCESS_RATE_FAILURE_OVERRIDES,\n GAS_ERROR_FAILURE_OVERRIDES,\n RETRY_OPTIONS,\n SUCCESS_RATE_FAILURE_OVERRIDES,\n} from '../../util/onchainQuoteProviderConfigs';\nimport { UNSUPPORTED_TOKENS } from '../../util/unsupported-tokens';\nimport {\n IRouter,\n ISwapToRatio,\n MethodParameters,\n MixedRoute,\n RingFewV2Route,\n SwapAndAddConfig,\n SwapAndAddOptions,\n SwapAndAddParameters,\n SwapOptions,\n SwapRoute,\n SwapToRatioResponse,\n SwapToRatioStatus,\n SwapType,\n V2Route,\n V3Route,\n V4Route,\n} from '../router';\n\nimport { UniversalRouterVersion } from '@fewprotocol/universal-router-sdk';\nimport { DEFAULT_BLOCKS_TO_LIVE } from '../../util/defaultBlocksToLive';\nimport { INTENT } from '../../util/intent';\nimport { serializeRouteIds } from '../../util/serializeRouteIds';\nimport {\n DEFAULT_ROUTING_CONFIG_BY_CHAIN,\n ETH_GAS_STATION_API_URL,\n} from './config';\nimport {\n MixedRouteWithValidQuote,\n RingFewV2RouteWithValidQuote,\n RouteWithValidQuote,\n UniswapFewV3RouteWithValidQuote,\n UniswapFewV4RouteWithValidQuote,\n V2RouteWithValidQuote,\n V3RouteWithValidQuote,\n V4RouteWithValidQuote,\n} from './entities/route-with-valid-quote';\nimport { BestSwapRoute, getBestSwapRoute } from './functions/best-swap-route';\nimport { calculateRatioAmountIn } from './functions/calculate-ratio-amount-in';\nimport {\n CandidatePoolsBySelectionCriteria,\n getMixedCrossLiquidityCandidatePools,\n getRingFewV2CandidatePools,\n getUniswapFewTokenV2CandidatePools,\n getUniswapFewTokenV3CandidatePools,\n getUniswapV4FewTokenCandidatePools,\n getV2CandidatePools,\n getV3CandidatePools,\n getV4CandidatePools,\n RingFewV2CandidatePools,\n SubgraphPool,\n V2CandidatePools,\n V3CandidatePools,\n V4CandidatePools,\n} from './functions/get-candidate-pools';\nimport { NATIVE_OVERHEAD } from './gas-models/gas-costs';\nimport {\n GasModelProviderConfig,\n GasModelType,\n IGasModel,\n IOnChainGasModelFactory,\n IV2GasModelFactory,\n LiquidityCalculationPools,\n} from './gas-models/gas-model';\nimport { MixedRouteHeuristicGasModelFactory } from './gas-models/mixedRoute/mixed-route-heuristic-gas-model';\nimport { V2HeuristicGasModelFactory } from './gas-models/v2/v2-heuristic-gas-model';\nimport { V3HeuristicGasModelFactory } from './gas-models/v3/v3-heuristic-gas-model';\nimport { UniswapFewV3HeuristicGasModelFactory } from './gas-models/uniswapFewV3/v3-heuristic-gas-model';\nimport { V4HeuristicGasModelFactory } from './gas-models/v4/v4-heuristic-gas-model';\nimport { UniswapFewV4HeuristicGasModelFactory } from './gas-models/uniswapFewV4/v4-heuristic-gas-model';\nimport { GetQuotesResult, MixedQuoter, V2Quoter, V3Quoter } from './quoters';\nimport { V4Quoter } from './quoters/v4-quoter';\nimport { UniswapFewV4Quoter } from './quoters/uniswap-few-v4-quoter';\nimport { UniswapFewV3Quoter } from './quoters/uniswap-few-v3-quoter';\nimport { IRingFewV2GasModelFactory } from './gas-models/ring-gas-model';\nimport { RingFewV2Quoter } from './quoters/few-v2-quoter';\nimport { RingFewV2HeuristicGasModelFactory } from './gas-models/fewV2/v2-heuristic-gas-model';\nimport { getFewTokenFromOriginalToken } from '@fewprotocol/v2-sdk';\nimport { isFewToken } from '../../util/fewAddress';\nimport { startTimer, endTimer, getPerfReport, clearPerfData } from '../../util/simple-perf-tracker';\n\nexport type AlphaRouterParams = {\n /**\n * The chain id for this instance of the Alpha Router.\n */\n chainId: ChainId;\n /**\n * The Web3 provider for getting on-chain data.\n */\n provider: BaseProvider;\n /**\n * The provider to use for making multicalls. Used for getting on-chain data\n * like pools, tokens, quotes in batch.\n */\n multicall2Provider?: UniswapMulticallProvider;\n /**\n * The provider for getting all pools that exist on RingSwap Few V2 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n ringFewV2Multicall2Provider?: RingswapMulticallProvider;\n /**\n * The provider for getting all pools that exist on V4 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n v4SubgraphProvider?: IV4SubgraphProvider;\n /**\n * The provider for getting data about V4 pools.\n */\n v4PoolProvider?: IV4PoolProvider;\n /**\n * The provider for getting all pools that exist on V3 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n v3SubgraphProvider?: IV3SubgraphProvider;\n /**\n * The provider for getting data about V3 pools.\n */\n v3PoolProvider?: IV3PoolProvider;\n /**\n * The provider for getting V3 quotes.\n */\n onChainQuoteProvider?: IOnChainQuoteProvider;\n /**\n * The provider for getting all pools that exist on V2 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n v2SubgraphProvider?: IV2SubgraphProvider;\n /**\n * The provider for getting all pools that exist on RingSwap Few V2 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n ringFewV2SubgraphProvider?: IRingV2SubgraphProvider;\n /**\n * The provider for getting data about V2 pools.\n */\n v2PoolProvider?: IV2PoolProvider;\n /**\n * The provider for getting all pools that exist on RingSwap Few V2 from the Subgraph. The pools\n * from this provider are filtered during the algorithm to a set of candidate pools.\n */\n ringFewV2PoolProvider?: IRingV2PoolProvider;\n /**\n * The provider for getting V3 quotes.\n */\n v2QuoteProvider?: IV2QuoteProvider;\n /**\n * The provider for getting data about RingSwap Few V2 pools.\n */\n ringFewV2QuoteProvider?: IRingV2QuoteProvider;\n /**\n * The provider for getting data about Tokens.\n */\n tokenProvider?: ITokenProvider;\n /**\n * The provider for getting the current gas price to use when account for gas in the\n * algorithm.\n */\n gasPriceProvider?: IGasPriceProvider;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * V4 routes.\n */\n v4GasModelFactory?: IOnChainGasModelFactory<V4RouteWithValidQuote>;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * Uniswap Few V4 routes.\n */\n uniswapFewV4GasModelFactory?: IOnChainGasModelFactory<UniswapFewV4RouteWithValidQuote>;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * V3 routes.\n */\n v3GasModelFactory?: IOnChainGasModelFactory<V3RouteWithValidQuote>;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * Uniswap Few V3 routes.\n */\n uniswapFewV3GasModelFactory?: IOnChainGasModelFactory<UniswapFewV3RouteWithValidQuote>;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * V2 routes.\n */\n v2GasModelFactory?: IV2GasModelFactory;\n /**\n * The provider for getting RingSwap Few V2 quotes.\n */\n ringFewV2GasModelFactory?: IRingFewV2GasModelFactory;\n /**\n * A factory for generating a gas model that is used when estimating the gas used by\n * V3 routes.\n */\n mixedRouteGasModelFactory?: IOnChainGasModelFactory<MixedRouteWithValidQuote>;\n /**\n * A token list that specifies Token that should be blocked from routing through.\n * Defaults to Uniswap's unsupported token list.\n */\n blockedTokenListProvider?: ITokenListProvider;\n\n /**\n * Calls lens function on SwapRouter02 to determine ERC20 approval types for\n * LP position tokens.\n */\n swapRouterProvider?: ISwapRouterProvider;\n\n /**\n * A token validator for detecting fee-on-transfer tokens or tokens that can't be transferred.\n */\n tokenValidatorProvider?: ITokenValidatorProvider;\n\n /**\n * Calls the arbitrum gas data contract to fetch constants for calculating the l1 fee.\n */\n arbitrumGasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n\n /**\n * Simulates swaps and returns new SwapRoute with updated gas estimates.\n */\n simulator?: Simulator;\n\n /**\n * A provider for caching the best route given an amount, quoteToken, tradeType\n */\n routeCachingProvider?: IRouteCachingProvider;\n\n /**\n * A provider for getting token properties for special tokens like fee-on-transfer tokens.\n */\n tokenPropertiesProvider?: ITokenPropertiesProvider;\n\n /**\n * A provider for computing the portion-related data for routes and quotes.\n */\n portionProvider?: IPortionProvider;\n\n /**\n * All the supported v2 chains configuration\n */\n v2Supported?: ChainId[];\n\n /**\n * All the supported ring swap v2 chains configuration\n */\n ringFewV2Supported?: ChainId[];\n\n /**\n * All the supported v4 chains configuration\n */\n v4Supported?: ChainId[];\n\n /**\n * All the supported mixed chains configuration\n */\n mixedSupported?: ChainId[];\n\n /**\n * The v4 pool params to be used for the v4 pool provider.\n * fee tiers, tickspacings, and hook addresses\n */\n v4PoolParams?: Array<[number, number, string]>;\n\n /**\n * We want to rollout the cached routes cache invalidation carefully.\n * Because a wrong fix might impact prod success rate and/or latency.\n */\n cachedRoutesCacheInvalidationFixRolloutPercentage?: number;\n};\n\nexport class MapWithLowerCaseKey<V> extends Map<string, V> {\n override set(key: string, value: V): this {\n return super.set(key.toLowerCase(), value);\n }\n}\n\nexport class LowerCaseStringArray extends Array<string> {\n constructor(...items: string[]) {\n // Convert all items to lowercase before calling the parent constructor\n super(...items.map((item) => item.toLowerCase()));\n }\n}\n\n/**\n * Determines the pools that the algorithm will consider when finding the optimal swap.\n *\n * All pools on each protocol are filtered based on the heuristics specified here to generate\n * the set of candidate pools. The Top N pools are taken by Total Value Locked (TVL).\n *\n * Higher values here result in more pools to explore which results in higher latency.\n */\nexport type ProtocolPoolSelection = {\n /**\n * The top N pools by TVL out of all pools on the protocol.\n */\n topN: number;\n /**\n * The top N pools by TVL of pools that consist of tokenIn and tokenOut.\n */\n topNDirectSwaps: number;\n /**\n * The top N pools by TVL of pools where one token is tokenIn and the\n * top N pools by TVL of pools where one token is tokenOut tokenOut.\n */\n topNTokenInOut: number;\n /**\n * Given the topNTokenInOut pools, gets the top N pools that involve the other token.\n * E.g. for a WETH -> USDC swap, if topNTokenInOut found WETH -> DAI and WETH -> USDT,\n * a value of 2 would find the top 2 pools that involve DAI and top 2 pools that involve USDT.\n */\n topNSecondHop: number;\n /**\n * Given the topNTokenInOut pools and a token address,\n * gets the top N pools that involve the other token.\n * If token address is not on the list, we default to topNSecondHop.\n * E.g. for a WETH -> USDC swap, if topNTokenInOut found WETH -> DAI and WETH -> USDT,\n * and there's a mapping USDT => 4, but no mapping for DAI\n * it would find the top 4 pools that involve USDT, and find the topNSecondHop pools that involve DAI\n */\n topNSecondHopForTokenAddress?: MapWithLowerCaseKey<number>;\n /**\n * List of token addresses to avoid using as a second hop.\n * There might be multiple reasons why we would like to avoid a specific token,\n * but the specific reason that we are trying to solve is when the pool is not synced properly\n * e.g. when the pool has a rebasing token that isn't syncing the pool on every rebase.\n */\n tokensToAvoidOnSecondHops?: LowerCaseStringArray;\n /**\n * The top N pools for token in and token out that involve a token from a list of\n * hardcoded 'base tokens'. These are standard tokens such as WETH, USDC, DAI, etc.\n * This is similar to how the legacy routing algorithm used by Uniswap would select\n * pools and is intended to make the new pool selection algorithm close to a superset\n * of the old algorithm.\n */\n topNWithEachBaseToken: number;\n /**\n * Given the topNWithEachBaseToken pools, takes the top N pools from the full list.\n * E.g. for a WETH -> USDC swap, if topNWithEachBaseToken found WETH -0.05-> DAI,\n * WETH -0.01-> DAI, WETH -0.05-> USDC, WETH -0.3-> USDC, a value of 2 would reduce\n * this set to the top 2 pools from that full list.\n */\n topNWithBaseToken: number;\n};\n\nexport type AlphaRouterConfig = {\n /**\n * The block number to use for all on-chain data. If not provided, the router will\n * use the latest block returned by the provider.\n */\n blockNumber?: number | Promise<number>;\n /**\n * The protocols to consider when finding the optimal swap. If not provided all protocols\n * will be used.\n */\n protocols?: Protocol[];\n /**\n * The protocols-version pools to be excluded from the mixed routes.\n */\n excludedProtocolsFromMixed?: Protocol[];\n /**\n * Config for selecting which pools to consider routing via on V2.\n */\n v2PoolSelection: ProtocolPoolSelection;\n /**\n * Config for selecting which pools to consider routing via on V3.\n */\n v3PoolSelection: ProtocolPoolSelection;\n /**\n * Config for selecting which pools to consider routing via on V4.\n */\n v4PoolSelection: ProtocolPoolSelection;\n /**\n * For each route, the maximum number of hops to consider. More hops will increase latency of the algorithm.\n */\n maxSwapsPerPath: number;\n /**\n * The maximum number of splits in the returned route. A higher maximum will increase latency of the algorithm.\n */\n maxSplits: number;\n /**\n * The minimum number of splits in the returned route.\n * This parameters should always be set to 1. It is only included for testing purposes.\n */\n minSplits: number;\n /**\n * Forces the returned swap to route across all protocols.\n * This parameter should always be false. It is only included for testing purposes.\n */\n forceCrossProtocol: boolean;\n /**\n * Force the alpha router to choose a mixed route swap.\n * Default will be falsy. It is only included for testing purposes.\n */\n forceMixedRoutes?: boolean;\n /**\n * The minimum percentage of the input token to use for each route in a split route.\n * All routes will have a multiple of this value. For example is distribution percentage is 5,\n * a potential return swap would be:\n *\n * 5% of input => Route 1\n * 55% of input => Route 2\n * 40% of input => Route 3\n */\n distributionPercent: number;\n /**\n * Flag to indicate whether to use the cached routes or not.\n * By default, the cached routes will be used.\n */\n useCachedRoutes?: boolean;\n /**\n * Flag to indicate whether to write to the cached routes or not.\n * By default, the cached routes will be written to.\n */\n writeToCachedRoutes?: boolean;\n /**\n * Flag to indicate whether to use the CachedRoutes in optimistic mode.\n * Optimistic mode means that we will allow blocksToLive greater than 1.\n */\n optimisticCachedRoutes?: boolean;\n /**\n * Debug param that helps to see the short-term latencies improvements without impacting the main path.\n */\n debugRouting?: boolean;\n /**\n * Flag that allow us to override the cache mode.\n */\n overwriteCacheMode?: CacheMode;\n /**\n * Flag for token properties provider to enable fetching fee-on-transfer tokens.\n */\n enableFeeOnTransferFeeFetching?: boolean;\n /**\n * Tenderly natively support save simulation failures if failed,\n * we need this as a pass-through flag to enable/disable this feature.\n */\n saveTenderlySimulationIfFailed?: boolean;\n /**\n * Include an additional response field specifying the swap gas estimation in terms of a specific gas token.\n * This requires a suitable Native/GasToken pool to exist on V3. If one does not exist this field will return null.\n */\n gasToken?: string;\n /**\n * The version of the universal router to use.\n */\n universalRouterVersion?: UniversalRouterVersion;\n /**\n * pass in routing-api intent to align the intent between routing-api and SOR\n */\n intent?: INTENT;\n /**\n * boolean flag to control whether we should enable mixed route that connects ETH <-> WETH\n */\n shouldEnableMixedRouteEthWeth?: boolean;\n /**\n * hashed router ids of the cached route, if the online routing lambda uses the cached route to serve the quote\n */\n cachedRoutesRouteIds?: string;\n /**\n * enable mixed route with UR1_2 version backward compatibility issue\n */\n enableMixedRouteWithUR1_2?: boolean;\n /**\n * enable debug mode for async routing lambda\n */\n enableDebug?: boolean;\n /**\n * pass in hooks options for hooks routing toggles from the frontend\n */\n hooksOptions?: HooksOptions;\n};\n\nexport class AlphaRouter\n implements\n IRouter<AlphaRouterConfig>,\n ISwapToRatio<AlphaRouterConfig, SwapAndAddConfig> {\n protected chainId: ChainId;\n protected provider: BaseProvider;\n protected multicall2Provider: UniswapMulticallProvider;\n protected ringFewV2Multicall2Provider: RingswapMulticallProvider;\n protected v4SubgraphProvider: IV4SubgraphProvider;\n protected v4PoolProvider: IV4PoolProvider;\n protected v3SubgraphProvider: IV3SubgraphProvider;\n protected v3PoolProvider: IV3PoolProvider;\n protected onChainQuoteProvider: IOnChainQuoteProvider;\n protected v2SubgraphProvider: IV2SubgraphProvider;\n protected ringFewV2SubgraphProvider: IRingV2SubgraphProvider;\n protected v2QuoteProvider: IV2QuoteProvider;\n protected ringFewV2QuoteProvider: IRingV2QuoteProvider;\n protected v2PoolProvider: IV2PoolProvider;\n protected ringFewV2PoolProvider: IRingV2PoolProvider;\n protected tokenProvider: ITokenProvider;\n protected gasPriceProvider: IGasPriceProvider;\n protected swapRouterProvider: ISwapRouterProvider;\n protected v4GasModelFactory: IOnChainGasModelFactory<V4RouteWithValidQuote>;\n protected uniswapFewV4GasModelFactory: IOnChainGasModelFactory<UniswapFewV4RouteWithValidQuote>;\n protected v3GasModelFactory: IOnChainGasModelFactory<V3RouteWithValidQuote>;\n protected uniswapFewV3GasModelFactory: IOnChainGasModelFactory<UniswapFewV3RouteWithValidQuote>;\n protected v2GasModelFactory: IV2GasModelFactory;\n protected ringFewV2GasModelFactory: IRingFewV2GasModelFactory;\n protected mixedRouteGasModelFactory: IOnChainGasModelFactory<MixedRouteWithValidQuote>;\n protected tokenValidatorProvider?: ITokenValidatorProvider;\n protected blockedTokenListProvider?: ITokenListProvider;\n protected l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n protected simulator?: Simulator;\n protected v2Quoter: V2Quoter;\n protected ringFewV2Quoter: RingFewV2Quoter;\n protected v3Quoter: V3Quoter;\n protected uniswapFewV3Quoter: UniswapFewV3Quoter;\n protected v4Quoter: V4Quoter;\n protected uniswapFewV4Quoter: UniswapFewV4Quoter;\n protected mixedQuoter: MixedQuoter;\n protected routeCachingProvider?: IRouteCachingProvider;\n protected tokenPropertiesProvider: ITokenPropertiesProvider;\n protected portionProvider: IPortionProvider;\n protected v2Supported?: ChainId[];\n protected ringFewV2Supported?: ChainId[];\n protected v4Supported?: ChainId[];\n protected mixedSupported?: ChainId[];\n protected v4PoolParams?: Array<[number, number, string]>;\n protected cachedRoutesCacheInvalidationFixRolloutPercentage?: number;\n protected shouldEnableMixedRouteEthWeth?: boolean;\n\n constructor({\n chainId,\n provider,\n multicall2Provider,\n ringFewV2Multicall2Provider,\n v4SubgraphProvider,\n v4PoolProvider,\n v3PoolProvider,\n onChainQuoteProvider,\n v2PoolProvider,\n ringFewV2PoolProvider,\n v2QuoteProvider,\n ringFewV2QuoteProvider,\n v2SubgraphProvider,\n ringFewV2SubgraphProvider,\n tokenProvider,\n blockedTokenListProvider,\n v3SubgraphProvider,\n gasPriceProvider,\n v4GasModelFactory,\n uniswapFewV4GasModelFactory,\n v3GasModelFactory,\n uniswapFewV3GasModelFactory,\n v2GasModelFactory,\n ringFewV2GasModelFactory,\n mixedRouteGasModelFactory,\n swapRouterProvider,\n tokenValidatorProvider,\n arbitrumGasDataProvider,\n simulator,\n routeCachingProvider,\n tokenPropertiesProvider,\n portionProvider,\n v2Supported,\n ringFewV2Supported,\n v4Supported,\n mixedSupported,\n v4PoolParams,\n cachedRoutesCacheInvalidationFixRolloutPercentage,\n }: AlphaRouterParams) {\n clearPerfData();\n\n this.chainId = chainId;\n this.provider = provider;\n this.multicall2Provider =\n multicall2Provider ??\n new UniswapMulticallProvider(chainId, provider, 375_000);\n this.ringFewV2Multicall2Provider =\n ringFewV2Multicall2Provider ??\n new RingswapMulticallProvider(chainId, provider, 375_000);\n this.v4PoolProvider =\n v4PoolProvider ??\n new CachingV4PoolProvider(\n this.chainId,\n new V4PoolProvider(ID_TO_CHAIN_ID(chainId), this.multicall2Provider),\n new NodeJSCache(new NodeCache({ stdTTL: 360, useClones: false }))\n );\n this.v3PoolProvider =\n v3PoolProvider ??\n new CachingV3PoolProvider(\n this.chainId,\n new V3PoolProvider(ID_TO_CHAIN_ID(chainId), this.multicall2Provider),\n new NodeJSCache(new NodeCache({ stdTTL: 360, useClones: false }))\n );\n this.simulator = simulator;\n this.routeCachingProvider = routeCachingProvider;\n\n if (onChainQuoteProvider) {\n this.onChainQuoteProvider = onChainQuoteProvider;\n } else {\n switch (chainId) {\n case ChainId.OPTIMISM:\n case ChainId.OPTIMISM_GOERLI:\n case ChainId.OPTIMISM_SEPOLIA:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n (_) => {\n return {\n multicallChunk: 110,\n gasLimitPerCall: 1_200_000,\n quoteMinSuccessRate: 0.1,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 3_000_000,\n multicallChunk: 45,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 3_000_000,\n multicallChunk: 45,\n };\n },\n (_) => {\n return {\n baseBlockOffset: -10,\n rollback: {\n enabled: true,\n attemptsBeforeRollback: 1,\n rollbackBlockOffset: -10,\n },\n };\n }\n );\n break;\n case ChainId.BASE:\n case ChainId.BLAST:\n case ChainId.ZORA:\n case ChainId.WORLDCHAIN:\n case ChainId.UNICHAIN_SEPOLIA:\n case ChainId.MONAD_TESTNET:\n case ChainId.BASE_SEPOLIA:\n case ChainId.UNICHAIN:\n case ChainId.BASE_GOERLI:\n case ChainId.SONEIUM:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n (_) => {\n return {\n multicallChunk: 80,\n gasLimitPerCall: 1_200_000,\n quoteMinSuccessRate: 0.1,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 3_000_000,\n multicallChunk: 45,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 3_000_000,\n multicallChunk: 45,\n };\n },\n (_) => {\n return {\n baseBlockOffset: -10,\n rollback: {\n enabled: true,\n attemptsBeforeRollback: 1,\n rollbackBlockOffset: -10,\n },\n };\n }\n );\n break;\n case ChainId.ZKSYNC:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n (_) => {\n return {\n multicallChunk: 27,\n gasLimitPerCall: 3_000_000,\n quoteMinSuccessRate: 0.1,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 6_000_000,\n multicallChunk: 13,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 6_000_000,\n multicallChunk: 13,\n };\n },\n (_) => {\n return {\n baseBlockOffset: -10,\n rollback: {\n enabled: true,\n attemptsBeforeRollback: 1,\n rollbackBlockOffset: -10,\n },\n };\n }\n );\n break;\n case ChainId.ARBITRUM_ONE:\n case ChainId.ARBITRUM_GOERLI:\n case ChainId.ARBITRUM_SEPOLIA:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n (_) => {\n return {\n multicallChunk: 10,\n gasLimitPerCall: 12_000_000,\n quoteMinSuccessRate: 0.1,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 30_000_000,\n multicallChunk: 6,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 30_000_000,\n multicallChunk: 6,\n };\n }\n );\n break;\n case ChainId.CELO:\n case ChainId.CELO_ALFAJORES:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n },\n (_) => {\n return {\n multicallChunk: 10,\n gasLimitPerCall: 5_000_000,\n quoteMinSuccessRate: 0.1,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 5_000_000,\n multicallChunk: 5,\n };\n },\n (_) => {\n return {\n gasLimitOverride: 6_250_000,\n multicallChunk: 4,\n };\n }\n );\n break;\n case ChainId.POLYGON_MUMBAI:\n case ChainId.SEPOLIA:\n case ChainId.MAINNET:\n case ChainId.POLYGON:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n RETRY_OPTIONS[chainId],\n (_) => BATCH_PARAMS[chainId]!,\n (_) => GAS_ERROR_FAILURE_OVERRIDES[chainId]!,\n (_) => SUCCESS_RATE_FAILURE_OVERRIDES[chainId]!,\n (_) => BLOCK_NUMBER_CONFIGS[chainId]!\n );\n break;\n default:\n this.onChainQuoteProvider = new OnChainQuoteProvider(\n chainId,\n provider,\n this.multicall2Provider,\n this.ringFewV2Multicall2Provider,\n DEFAULT_RETRY_OPTIONS,\n (_) => DEFAULT_BATCH_PARAMS,\n (_) => DEFAULT_GAS_ERROR_FAILURE_OVERRIDES,\n (_) => DEFAULT_SUCCESS_RATE_FAILURE_OVERRIDES,\n (_) => DEFAULT_BLOCK_NUMBER_CONFIGS\n );\n break;\n }\n }\n\n if (tokenValidatorProvider) {\n this.tokenValidatorProvider = tokenValidatorProvider;\n } else if (this.chainId === ChainId.MAINNET) {\n this.tokenValidatorProvider = new TokenValidatorProvider(\n this.chainId,\n this.multicall2Provider,\n new NodeJSCache(new NodeCache({ stdTTL: 30000, useClones: false }))\n );\n }\n if (tokenPropertiesProvider) {\n this.tokenPropertiesProvider = tokenPropertiesProvider;\n } else {\n this.tokenPropertiesProvider = new TokenPropertiesProvider(\n this.chainId,\n new NodeJSCache(new NodeCache({ stdTTL: 86400, useClones: false })),\n new OnChainTokenFeeFetcher(this.chainId, provider)\n );\n }\n this.v2PoolProvider =\n v2PoolProvider ??\n new CachingV2PoolProvider(\n chainId,\n new V2PoolProvider(\n chainId,\n this.multicall2Provider,\n this.tokenPropertiesProvider\n ),\n new NodeJSCache(new NodeCache({ stdTTL: 60, useClones: false }))\n );\n\n this.ringFewV2PoolProvider =\n ringFewV2PoolProvider ??\n new RingFewCachingV2PoolProvider(\n chainId,\n new RingV2PoolProvider(\n chainId,\n this.multicall2Provider,\n this.tokenPropertiesProvider\n ),\n new NodeJSCache(new NodeCache({ stdTTL: 60, useClones: false }))\n );\n\n this.v2QuoteProvider = v2QuoteProvider ?? new V2QuoteProvider();\n this.ringFewV2QuoteProvider = ringFewV2QuoteProvider ?? new RingV2QuoteProvider();\n\n this.blockedTokenListProvider =\n blockedTokenListProvider ??\n new CachingTokenListProvider(\n chainId,\n UNSUPPORTED_TOKENS as TokenList,\n new NodeJSCache(new NodeCache({ stdTTL: 3600, useClones: false }))\n );\n this.tokenProvider =\n tokenProvider ??\n new CachingTokenProviderWithFallback(\n chainId,\n new NodeJSCache(new NodeCache({ stdTTL: 3600, useClones: false })),\n new CachingTokenListProvider(\n chainId,\n DEFAULT_TOKEN_LIST,\n new NodeJSCache(new NodeCache({ stdTTL: 3600, useClones: false }))\n ),\n new TokenProvider(chainId, this.multicall2Provider)\n );\n this.portionProvider = portionProvider ?? new PortionProvider();\n\n // const chainName = ID_TO_NETWORK_NAME(chainId);\n\n // ipfs urls in the following format: `https://cloudflare-ipfs.com/ipns/api.uniswap.org/v1/pools/${protocol}/${chainName}.json`;\n if (v2SubgraphProvider) {\n this.v2SubgraphProvider = v2SubgraphProvider;\n } else {\n this.v2SubgraphProvider = new V2SubgraphProviderWithFallBacks([\n // new CachingV2SubgraphProvider(\n // chainId,\n // new URISubgraphProvider(\n // chainId,\n // `https://cloudflare-ipfs.com/ipns/api.uniswap.org/v1/pools/v2/${chainName}.json`,\n // undefined,\n // 0\n // ),\n // new NodeJSCache(new NodeCache({ stdTTL: 300, useClones: false }))\n // ),\n new StaticV2SubgraphProvider(chainId),\n ]);\n }\n\n if (ringFewV2SubgraphProvider) {\n this.ringFewV2SubgraphProvider = ringFewV2SubgraphProvider;\n } else {\n this.ringFewV2SubgraphProvider = new RingFewV2SubgraphProviderWithFallBacks([\n // new RingFewCachingV2SubgraphProvider(\n // chainId,\n // new URISubgraphProvider(\n // chainId,\n // `https://cloudflare-ipfs.com/ipns/api.uniswap.org/v1/pools/v2/${chainName}.json`,\n // undefined,\n // 0\n // ),\n // new NodeJSCache(new NodeCache({ stdTTL: 300, useClones: false }))\n // ),\n new RingFewStaticV2SubgraphProvider(chainId),\n ]);\n }\n\n if (v3SubgraphProvider) {\n this.v3SubgraphProvider = v3SubgraphProvider;\n } else {\n this.v3SubgraphProvider = new V3SubgraphProviderWithFallBacks([\n // new CachingV3SubgraphProvider(\n // chainId,\n // new URISubgraphProvider(\n // chainId,\n // `https://cloudflare-ipfs.com/ipns/api.uniswap.org/v1/pools/v3/${chainName}.json`,\n // undefined,\n // 0\n // ),\n // new NodeJSCache(new NodeCache({ stdTTL: 300, useClones: false }))\n // ),\n new StaticV3SubgraphProvider(chainId, this.v3PoolProvider),\n ]);\n }\n\n this.v4PoolParams =\n v4PoolParams ?? getApplicableV4FeesTickspacingsHooks(chainId);\n if (v4SubgraphProvider) {\n this.v4SubgraphProvider = v4SubgraphProvider;\n } else {\n this.v4SubgraphProvider = new V4SubgraphProviderWithFallBacks([\n // new CachingV4SubgraphProvider(\n // chainId,\n // new URISubgraphProvider(\n // chainId,\n // `https://cloudflare-ipfs.com/ipns/api.uniswap.org/v1/pools/v4/${chainName}.json`,\n // undefined,\n // 0\n // ),\n // new NodeJSCache(new NodeCache({ stdTTL: 300, useClones: false }))\n // ),\n new StaticV4SubgraphProvider(\n chainId,\n this.v4PoolProvider,\n this.v4PoolParams\n ),\n ]);\n }\n\n let gasPriceProviderInstance: IGasPriceProvider;\n if (JsonRpcProvider.isProvider(this.provider)) {\n gasPriceProviderInstance = new OnChainGasPriceProvider(\n chainId,\n new EIP1559GasPriceProvider(this.provider as JsonRpcProvider),\n new LegacyGasPriceProvider(this.provider as JsonRpcProvider)\n );\n } else {\n gasPriceProviderInstance = new ETHGasStationInfoProvider(\n ETH_GAS_STATION_API_URL\n );\n }\n\n this.gasPriceProvider =\n gasPriceProvider ??\n new CachingGasStationProvider(\n chainId,\n gasPriceProviderInstance,\n new NodeJSCache<GasPrice>(\n new NodeCache({ stdTTL: 7, useClones: false })\n )\n );\n this.v4GasModelFactory =\n v4GasModelFactory ?? new V4HeuristicGasModelFactory(this.provider);\n this.uniswapFewV4GasModelFactory =\n uniswapFewV4GasModelFactory ?? new UniswapFewV4HeuristicGasModelFactory(this.provider);\n this.v3GasModelFactory =\n v3GasModelFactory ?? new V3HeuristicGasModelFactory(this.provider);\n this.uniswapFewV3GasModelFactory =\n uniswapFewV3GasModelFactory ?? new UniswapFewV3HeuristicGasModelFactory(this.provider);\n this.v2GasModelFactory =\n v2GasModelFactory ?? new V2HeuristicGasModelFactory(this.provider);\n this.ringFewV2GasModelFactory =\n ringFewV2GasModelFactory ?? new RingFewV2HeuristicGasModelFactory(this.provider);\n this.mixedRouteGasModelFactory =\n mixedRouteGasModelFactory ?? new MixedRouteHeuristicGasModelFactory();\n\n this.swapRouterProvider =\n swapRouterProvider ??\n new SwapRouterProvider(this.multicall2Provider, this.chainId);\n\n if (\n chainId === ChainId.ARBITRUM_ONE ||\n chainId === ChainId.ARBITRUM_GOERLI\n ) {\n this.l2GasDataProvider =\n arbitrumGasDataProvider ??\n new ArbitrumGasDataProvider(chainId, this.provider);\n }\n\n // Initialize the Quoters.\n // Quoters are an abstraction encapsulating the business logic of fetching routes and quotes.\n this.v2Quoter = new V2Quoter(\n this.v2SubgraphProvider,\n this.v2PoolProvider,\n this.v2QuoteProvider,\n this.v2GasModelFactory,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider,\n this.l2GasDataProvider\n );\n\n this.ringFewV2Quoter = new RingFewV2Quoter(\n this.ringFewV2SubgraphProvider,\n this.ringFewV2PoolProvider,\n this.ringFewV2QuoteProvider,\n this.ringFewV2GasModelFactory,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider,\n this.l2GasDataProvider\n );\n\n this.v3Quoter = new V3Quoter(\n this.v3SubgraphProvider,\n this.v3PoolProvider,\n this.onChainQuoteProvider,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider\n );\n\n this.uniswapFewV3Quoter = new UniswapFewV3Quoter(\n this.v3SubgraphProvider,\n this.v3PoolProvider,\n this.onChainQuoteProvider,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider\n );\n\n this.v4Quoter = new V4Quoter(\n this.v4SubgraphProvider,\n this.v4PoolProvider,\n this.onChainQuoteProvider,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider\n );\n\n this.uniswapFewV4Quoter = new UniswapFewV4Quoter(\n this.v4SubgraphProvider,\n this.v4PoolProvider,\n this.onChainQuoteProvider,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider\n );\n\n this.mixedQuoter = new MixedQuoter(\n this.v4SubgraphProvider,\n this.v4PoolProvider,\n this.v3SubgraphProvider,\n this.v3PoolProvider,\n this.v2SubgraphProvider,\n this.v2PoolProvider,\n this.onChainQuoteProvider,\n this.tokenProvider,\n this.chainId,\n this.blockedTokenListProvider,\n this.tokenValidatorProvider\n );\n\n this.v2Supported = v2Supported ?? V2_SUPPORTED;\n this.ringFewV2Supported = ringFewV2Supported ?? RING_FEW_V2_SUPPORTED;\n this.v4Supported = v4Supported ?? V4_SUPPORTED;\n this.mixedSupported = mixedSupported ?? MIXED_SUPPORTED;\n\n this.cachedRoutesCacheInvalidationFixRolloutPercentage =\n cachedRoutesCacheInvalidationFixRolloutPercentage;\n }\n\n public async routeToRatio(\n token0Balance: CurrencyAmount,\n token1Balance: CurrencyAmount,\n position: Position,\n swapAndAddConfig: SwapAndAddConfig,\n swapAndAddOptions?: SwapAndAddOptions,\n routingConfig: Partial<AlphaRouterConfig> = DEFAULT_ROUTING_CONFIG_BY_CHAIN(\n this.chainId\n )\n ): Promise<SwapToRatioResponse> {\n if (\n token1Balance.currency.wrapped.sortsBefore(token0Balance.currency.wrapped)\n ) {\n [token0Balance, token1Balance] = [token1Balance, token0Balance];\n }\n\n let preSwapOptimalRatio = this.calculateOptimalRatio(\n position,\n position.pool.sqrtRatioX96,\n true\n );\n // set up parameters according to which token will be swapped\n let zeroForOne: boolean;\n if (position.pool.tickCurrent > position.tickUpper) {\n zeroForOne = true;\n } else if (position.pool.tickCurrent < position.tickLower) {\n zeroForOne = false;\n } else {\n zeroForOne = new Fraction(\n token0Balance.quotient,\n token1Balance.quotient\n ).greaterThan(preSwapOptimalRatio);\n if (!zeroForOne) preSwapOptimalRatio = preSwapOptimalRatio.invert();\n }\n\n const [inputBalance, outputBalance] = zeroForOne\n ? [token0Balance, token1Balance]\n : [token1Balance, token0Balance];\n\n let optimalRatio = preSwapOptimalRatio;\n let postSwapTargetPool = position.pool;\n let exchangeRate: Fraction = zeroForOne\n ? position.pool.token0Price\n : position.pool.token1Price;\n let swap: SwapRoute | null = null;\n let ratioAchieved = false;\n let n = 0;\n // iterate until we find a swap with a sufficient ratio or return null\n while (!ratioAchieved) {\n n++;\n if (n > swapAndAddConfig.maxIterations) {\n log.info('max iterations exceeded');\n return {\n status: SwapToRatioStatus.NO_ROUTE_FOUND,\n error: 'max iterations exceeded',\n };\n }\n\n const amountToSwap = calculateRatioAmountIn(\n optimalRatio,\n exchangeRate,\n inputBalance,\n outputBalance\n );\n if (amountToSwap.equalTo(0)) {\n log.info(`no swap needed: amountToSwap = 0`);\n return {\n status: SwapToRatioStatus.NO_SWAP_NEEDED,\n };\n }\n swap = await this.route(\n amountToSwap,\n outputBalance.currency,\n TradeType.EXACT_INPUT,\n undefined,\n {\n ...DEFAULT_ROUTING_CONFIG_BY_CHAIN(this.chainId),\n ...routingConfig,\n /// @dev We do not want to query for mixedRoutes for routeToRatio as they are not supported\n /// [Protocol.V3, Protocol.V2] will make sure we only query for V3 and V2\n protocols: [Protocol.V3, Protocol.V2],\n }\n );\n if (!swap) {\n log.info('no route found from this.route()');\n return {\n status: SwapToRatioStatus.NO_ROUTE_FOUND,\n error: 'no route found',\n };\n }\n\n const inputBalanceUpdated = inputBalance.subtract(\n swap.trade!.inputAmount\n );\n const outputBalanceUpdated = outputBalance.add(swap.trade!.outputAmount);\n const newRatio = inputBalanceUpdated.divide(outputBalanceUpdated);\n\n let targetPoolPriceUpdate;\n swap.route.forEach((route) => {\n if (route.protocol === Protocol.V3) {\n const v3Route = route as V3RouteWithValidQuote;\n v3Route.route.pools.forEach((pool, i) => {\n if (\n pool.token0.equals(position.pool.token0) &&\n pool.token1.equals(position.pool.token1) &&\n pool.fee === position.pool.fee\n ) {\n targetPoolPriceUpdate = JSBI.BigInt(\n v3Route.sqrtPriceX96AfterList[i]!.toString()\n );\n optimalRatio = this.calculateOptimalRatio(\n position,\n JSBI.BigInt(targetPoolPriceUpdate!.toString()),\n zeroForOne\n );\n }\n });\n }\n });\n if (!targetPoolPriceUpdate) {\n optimalRatio = preSwapOptimalRatio;\n }\n ratioAchieved =\n newRatio.equalTo(optimalRatio) ||\n this.absoluteValue(\n newRatio.asFraction.divide(optimalRatio).subtract(1)\n ).lessThan(swapAndAddConfig.ratioErrorTolerance);\n\n if (ratioAchieved && targetPoolPriceUpdate) {\n postSwapTargetPool = new Pool(\n position.pool.token0,\n position.pool.token1,\n position.pool.fee,\n targetPoolPriceUpdate,\n position.pool.liquidity,\n TickMath.getTickAtSqrtRatio(targetPoolPriceUpdate),\n position.pool.tickDataProvider\n );\n }\n exchangeRate = swap.trade!.outputAmount.divide(swap.trade!.inputAmount);\n\n log.info(\n {\n exchangeRate: exchangeRate.asFraction.toFixed(18),\n optimalRatio: optimalRatio.asFraction.toFixed(18),\n newRatio: newRatio.asFraction.toFixed(18),\n inputBalanceUpdated: inputBalanceUpdated.asFraction.toFixed(18),\n outputBalanceUpdated: outputBalanceUpdated.asFraction.toFixed(18),\n ratioErrorTolerance: swapAndAddConfig.ratioErrorTolerance.toFixed(18),\n iterationN: n.toString(),\n },\n 'QuoteToRatio Iteration Parameters'\n );\n\n if (exchangeRate.equalTo(0)) {\n log.info('exchangeRate to 0');\n return {\n status: SwapToRatioStatus.NO_ROUTE_FOUND,\n error: 'insufficient liquidity to swap to optimal ratio',\n };\n }\n }\n\n if (!swap) {\n return {\n status: SwapToRatioStatus.NO_ROUTE_FOUND,\n error: 'no route found',\n };\n }\n let methodParameters: MethodParameters | undefined;\n if (swapAndAddOptions) {\n methodParameters = await this.buildSwapAndAddMethodParameters(\n swap.trade,\n swapAndAddOptions,\n {\n initialBalanceTokenIn: inputBalance,\n initialBalanceTokenOut: outputBalance,\n preLiquidityPosition: position,\n }\n );\n }\n\n return {\n status: SwapToRatioStatus.SUCCESS,\n result: { ...swap, methodParameters, optimalRatio, postSwapTargetPool },\n };\n }\n\n /**\n * @inheritdoc IRouter\n */\n public async route(\n amount: CurrencyAmount,\n quoteCurrency: Currency,\n tradeType: TradeType,\n swapConfig?: SwapOptions,\n partialRoutingConfig: Partial<AlphaRouterConfig> = {}\n ): Promise<SwapRoute | null> {\n const originalAmount = amount;\n\n const fewAmountToken = getFewTokenFromOriginalToken(originalAmount.currency.wrapped, this.chainId)\n let fewAmount = CurrencyAmount.fromRawAmount(fewAmountToken!, originalAmount.quotient) // 在 Blast 网络需要注意 origin token 和 fewtoken 的 decimals 差异\n // const originalFewAmount = fewAmount;\n\n const { currencyIn, currencyOut } =\n this.determineCurrencyInOutFromTradeType(\n tradeType,\n amount,\n quoteCurrency\n );\n\n const fewTokenIn = currencyIn instanceof Token\n ? getFewTokenFromOriginalToken(currencyIn, this.chainId)\n : currencyIn.isNative\n ? getFewTokenFromOriginalToken(currencyIn.wrapped, this.chainId)\n : null;\n\n const fewTokenOut = currencyOut instanceof Token\n ? getFewTokenFromOriginalToken(currencyOut, this.chainId)\n : currencyOut.isNative\n ? getFewTokenFromOriginalToken(currencyOut.wrapped, this.chainId)\n : null;\n\n const fewQuoteToken = quoteCurrency instanceof Token\n ? getFewTokenFromOriginalToken(quoteCurrency, this.chainId)\n : quoteCurrency.isNative\n ? getFewTokenFromOriginalToken(quoteCurrency.wrapped, this.chainId)\n : null;\n\n const tokenOutProperties =\n await this.tokenPropertiesProvider.getTokensProperties(\n [currencyOut],\n partialRoutingConfig\n );\n\n const feeTakenOnTransfer =\n tokenOutProperties[getAddressLowerCase(currencyOut)]?.tokenFeeResult\n ?.feeTakenOnTransfer;\n const externalTransferFailed =\n tokenOutProperties[getAddressLowerCase(currencyOut)]?.tokenFeeResult\n ?.externalTransferFailed;\n\n // We want to log the fee on transfer output tokens that we are taking fee or not\n // Ideally the trade size (normalized in USD) would be ideal to log here, but we don't have spot price of output tokens here.\n // We have to make sure token out is FOT with either buy/sell fee bps > 0\n if (\n tokenOutProperties[\n getAddressLowerCase(currencyOut)\n ]?.tokenFeeResult?.buyFeeBps?.gt(0) ||\n tokenOutProperties[\n getAddressLowerCase(currencyOut)\n ]?.tokenFeeResult?.sellFeeBps?.gt(0)\n ) {\n if (feeTakenOnTransfer || externalTransferFailed) {\n // also to be extra safe, in case of FOT with feeTakenOnTransfer or externalTransferFailed,\n // we nullify the fee and flat fee to avoid any potential issues.\n // although neither web nor wallet should use the calldata returned from routing/SOR\n if (swapConfig?.type === SwapType.UNIVERSAL_ROUTER) {\n swapConfig.fee = undefined;\n swapConfig.flatFee = undefined;\n }\n\n metric.putMetric(\n 'TokenOutFeeOnTransferNotTakingFee',\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(\n 'TokenOutFeeOnTransferTakingFee',\n 1,\n MetricLoggerUnit.Count\n );\n }\n }\n\n if (tradeType === TradeType.EXACT_OUTPUT) {\n const portionAmount = this.portionProvider.getPortionAmount(\n amount,\n tradeType,\n feeTakenOnTransfer,\n externalTransferFailed,\n swapConfig\n );\n if (portionAmount && portionAmount.greaterThan(ZERO)) {\n // In case of exact out swap, before we route, we need to make sure that the\n // token out amount accounts for flat portion, and token in amount after the best swap route contains the token in equivalent of portion.\n // In other words, in case a pool's LP fee bps is lower than the portion bps (0.01%/0.05% for v3), a pool can go insolvency.\n // This is because instead of the swapper being responsible for the portion,\n // the pool instead gets responsible for the portion.\n // The addition below avoids that situation.\n amount = amount.add(portionAmount);\n }\n const portionFewAmount = this.portionProvider.getPortionAmount(\n fewAmount,\n tradeType,\n feeTakenOnTransfer,\n externalTransferFailed,\n swapConfig\n );\n if (portionFewAmount && portionFewAmount.greaterThan(ZERO)) {\n // In case of exact out swap, before we route, we need to make sure that the\n // token out few amount accounts for flat portion, and token in few amount after the best swap route contains the token in equivalent of portion.\n // In other words, in case a pool's LP fee bps is lower than the portion bps (0.01%/0.05% for v3), a pool can go insolvency.\n // This is because instead of the swapper being responsible for the portion,\n // the pool instead gets responsible for the portion.\n // The addition below avoids that situation.\n fewAmount = fewAmount.add(portionFewAmount.wrapped);\n }\n }\n\n metric.setProperty('chainId', this.chainId);\n metric.setProperty('pair', `${currencyIn.symbol}/${currencyOut.symbol}`);\n metric.setProperty('tokenIn', getAddress(currencyIn));\n metric.setProperty('tokenOut', getAddress(currencyOut));\n metric.setProperty(\n 'tradeType',\n tradeType === TradeType.EXACT_INPUT ? 'ExactIn' : 'ExactOut'\n );\n\n metric.putMetric(\n `QuoteRequestedForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n // Get a block number to specify in all our calls. Ensures data we fetch from chain is\n // from the same block.\n const blockNumber =\n partialRoutingConfig.blockNumber ?? this.getBlockNumberPromise();\n\n const routingConfig: AlphaRouterConfig = _.merge(\n {\n // These settings could be changed by the partialRoutingConfig\n useCachedRoutes: true,\n writeToCachedRoutes: true,\n optimisticCachedRoutes: false,\n },\n DEFAULT_ROUTING_CONFIG_BY_CHAIN(this.chainId),\n partialRoutingConfig,\n { blockNumber }\n );\n\n if (routingConfig.debugRouting) {\n log.warn(`Finalized routing config is ${JSON.stringify(routingConfig)}`);\n }\n\n const gasPriceWei = await this.getGasPriceWei(\n await blockNumber,\n await partialRoutingConfig.blockNumber\n );\n\n // const gasTokenAccessor = await this.tokenProvider.getTokens([routingConfig.gasToken!]);\n const gasToken = routingConfig.gasToken\n ? (\n await this.tokenProvider.getTokens([routingConfig.gasToken])\n ).getTokenByAddress(routingConfig.gasToken)\n : undefined;\n\n const providerConfig: GasModelProviderConfig = {\n ...routingConfig,\n blockNumber,\n additionalGasOverhead: NATIVE_OVERHEAD(\n this.chainId,\n amount.currency,\n quoteCurrency\n ),\n gasToken,\n externalTransferFailed,\n feeTakenOnTransfer,\n };\n\n startTimer('alpha-router.route.getGasModels');\n\n const {\n ringFewV2GasModel: ringFewV2GasModel,\n v2GasModel: v2GasModel,\n fewV2GasModel: fewV2GasModel,\n v3GasModel: v3GasModel,\n fewV3GasModel: fewV3GasModel,\n v4GasModel: v4GasModel,\n fewV4GasModel: fewV4GasModel,\n mixedRouteGasModel: mixedRouteGasModel,\n } = await this.getGasModels(\n gasPriceWei,\n amount.currency.wrapped,\n quoteCurrency.wrapped,\n providerConfig\n );\n\n endTimer('alpha-router.route.getGasModels');\n // Create a Set to sanitize the protocols input, a Set of undefined becomes an empty set,\n // Then create an Array from the values of that Set.\n const protocols: Protocol[] = Array.from(\n new Set(routingConfig.protocols).values()\n );\n\n startTimer('alpha-router.route.getCacheMode');\n const cacheMode =\n routingConfig.overwriteCacheMode ??\n (await this.routeCachingProvider?.getCacheMode(\n this.chainId,\n amount,\n quoteCurrency,\n tradeType,\n protocols\n ));\n endTimer('alpha-router.route.getCacheMode');\n\n // const fewCacheMode =\n // routingConfig.overwriteCacheMode ??\n // (await this.routeCachingProvider?.getCacheMode(\n // this.chainId,\n // fewAmount,\n // fewQuoteToken!,\n // tradeType,\n // protocols\n // ));\n\n // Fetch CachedRoutes\n let cachedRoutes: CachedRoutes | undefined;\n // Fetch fewCachedRoutes\n let fewCachedRoutes: CachedRoutes | undefined;\n\n // Decide whether to use cached routes or not - If |enabledAndRequestedProtocolsMatch| is true we are good to use cached routes.\n // In order to use cached routes, we need to have all enabled protocols specified in the request.\n // By default, all protocols are enabled but for UniversalRouterVersion.V1_2, V4 is not.\n // - ref: https://github.com/Uniswap/routing-api/blob/663b607d80d9249f85e7ab0925a611ec3701da2a/lib/util/supportedProtocolVersions.ts#L15\n // So we take this into account when deciding whether to use cached routes or not.\n // We only want to use cache if all enabled protocols are specified (V2,V3,V4? + MIXED). In any other case, use onchain path.\n // - Cache is optimized for global search, not for specific protocol(s) search.\n // For legacy systems (SWAP_ROUTER_02) or missing swapConfig, follow UniversalRouterVersion.V1_2 logic.\n const availableProtocolsSet = new Set(Object.values(Protocol));\n const requestedProtocolsSet = new Set(protocols);\n const swapRouter =\n !swapConfig ||\n swapConfig.type === SwapType.SWAP_ROUTER_02 ||\n (swapConfig.type === SwapType.UNIVERSAL_ROUTER &&\n swapConfig.version === UniversalRouterVersion.V1_2);\n if (swapRouter) {\n availableProtocolsSet.delete(Protocol.V4);\n if (requestedProtocolsSet.has(Protocol.V4)) {\n requestedProtocolsSet.delete(Protocol.V4);\n }\n }\n const enabledAndRequestedProtocolsMatch =\n availableProtocolsSet.size === requestedProtocolsSet.size &&\n [...availableProtocolsSet].every((protocol) =>\n requestedProtocolsSet.has(protocol)\n );\n\n // If the requested protocols do not match the enabled protocols, we need to set the hooks options to NO_HOOKS.\n if (!requestedProtocolsSet.has(Protocol.V4)) {\n routingConfig.hooksOptions = HooksOptions.NO_HOOKS;\n }\n\n // If hooksOptions not specified and it's not a swapRouter (i.e. Universal Router it is),\n // we should also set it to HOOKS_INCLUSIVE, as this is default behavior even without hooksOptions.\n if (!routingConfig.hooksOptions) {\n routingConfig.hooksOptions = HooksOptions.HOOKS_INCLUSIVE;\n }\n\n log.debug('UniversalRouterVersion_CacheGate_Check', {\n availableProtocolsSet: Array.from(availableProtocolsSet),\n requestedProtocolsSet: Array.from(requestedProtocolsSet),\n enabledAndRequestedProtocolsMatch,\n swapConfigType: swapConfig?.type,\n swapConfigUniversalRouterVersion:\n swapConfig?.type === SwapType.UNIVERSAL_ROUTER\n ? swapConfig?.version\n : 'N/A',\n });\n\n startTimer('alpha-router.route.isAllowedToEnterCachedRoutes');\n\n const isAllowedToEnterCachedRoutes = AlphaRouter.isAllowedToEnterCachedRoutes(\n routingConfig.intent,\n routingConfig.hooksOptions,\n swapRouter\n )\n\n if (\n routingConfig.useCachedRoutes &&\n cacheMode !== CacheMode.Darkmode &&\n isAllowedToEnterCachedRoutes\n ) {\n if (enabledAndRequestedProtocolsMatch) {\n if (\n protocols.includes(Protocol.V4) &&\n (currencyIn.isNative || currencyOut.isNative)\n ) {\n const [wrappedNativeCachedRoutes, nativeCachedRoutes] =\n await Promise.all([\n this.routeCachingProvider?.getCachedRoute(\n this.chainId,\n CurrencyAmount.fromRawAmount(\n amount.currency.wrapped,\n amount.quotient\n ),\n quoteCurrency.wrapped,\n tradeType,\n protocols,\n await blockNumber,\n routingConfig.optimisticCachedRoutes\n ),\n this.routeCachingProvider?.getCachedRoute(\n this.chainId,\n amount,\n quoteCurrency,\n tradeType,\n [Protocol.V4],\n await blockNumber,\n routingConfig.optimisticCachedRoutes\n ),\n ]);\n\n if (\n (wrappedNativeCachedRoutes &&\n wrappedNativeCachedRoutes?.routes.length > 0) ||\n (nativeCachedRoutes && nativeCachedRoutes?.routes.length > 0)\n ) {\n cachedRoutes = new CachedRoutes({\n routes: [\n ...(nativeCachedRoutes?.routes ?? []),\n ...(wrappedNativeCachedRoutes?.routes ?? []),\n ],\n chainId: this.chainId,\n currencyIn: currencyIn,\n currencyOut: currencyOut,\n protocolsCovered: protocols,\n blockNumber: await blockNumber,\n tradeType: tradeType,\n originalAmount:\n wrappedNativeCachedRoutes?.originalAmount ??\n nativeCachedRoutes?.originalAmount ??\n amount.quotient.toString(),\n blocksToLive:\n wrappedNativeCachedRoutes?.blocksToLive ??\n nativeCachedRoutes?.blocksToLive ??\n DEFAULT_BLOCKS_TO_LIVE[this.chainId],\n });\n }\n } else {\n cachedRoutes = await this.routeCachingProvider?.getCachedRoute(\n this.chainId,\n amount,\n quoteCurrency,\n tradeType,\n protocols,\n await blockNumber,\n routingConfig.optimisticCachedRoutes\n );\n fewCachedRoutes = await this.routeCachingProvider?.getCachedRoute(\n this.chainId,\n fewAmount,\n fewQuoteToken!,\n tradeType,\n protocols,\n await blockNumber,\n routingConfig.optimisticCachedRoutes\n );\n }\n }\n }\n endTimer('alpha-router.route.isAllowedToEnterCachedRoutes');\n\n if (shouldWipeoutCachedRoutes(cachedRoutes, routingConfig)) {\n cachedRoutes = undefined;\n }\n\n if (shouldWipeoutCachedRoutes(fewCachedRoutes, routingConfig)) {\n fewCachedRoutes = undefined;\n }\n\n metric.putMetric(\n routingConfig.useCachedRoutes\n ? 'GetQuoteUsingCachedRoutes'\n : 'GetQuoteNotUsingCachedRoutes',\n 1,\n MetricLoggerUnit.Count\n );\n\n startTimer('alpha-router.route.getCachedRoute');\n if (\n cacheMode &&\n routingConfig.useCachedRoutes &&\n cacheMode !== CacheMode.Darkmode &&\n !cachedRoutes\n ) {\n metric.putMetric(\n `GetCachedRoute_miss_${cacheMode}`,\n 1,\n MetricLoggerUnit.Count\n );\n log.info(\n {\n currencyIn: currencyIn.symbol,\n currencyInAddress: getAddress(currencyIn),\n currencyOut: currencyOut.symbol,\n currencyOutAddress: getAddress(currencyOut),\n cacheMode,\n amount: amount.toExact(),\n chainId: this.chainId,\n tradeType: this.tradeTypeStr(tradeType),\n },\n `GetCachedRoute miss ${cacheMode} for ${this.tokenPairSymbolTradeTypeChainId(\n currencyIn,\n currencyOut,\n tradeType\n )}`\n );\n } else if (cachedRoutes && routingConfig.useCachedRoutes) {\n metric.putMetric(\n `GetCachedRoute_hit_${cacheMode}`,\n 1,\n MetricLoggerUnit.Count\n );\n log.info(\n {\n currencyIn: currencyIn.symbol,\n currencyInAddress: getAddress(currencyIn),\n currencyOut: currencyOut.symbol,\n currencyOutAddress: getAddress(currencyOut),\n cacheMode,\n amount: amount.toExact(),\n chainId: this.chainId,\n tradeType: this.tradeTypeStr(tradeType),\n },\n `GetCachedRoute hit ${cacheMode} for ${this.tokenPairSymbolTradeTypeChainId(\n currencyIn,\n currencyOut,\n tradeType\n )}`\n );\n }\n\n endTimer('alpha-router.route.getCachedRoute');\n\n startTimer('alpha-router.route.getSwapRouteFromCache');\n let swapRouteFromCachePromise: Promise<BestSwapRoute | null> =\n Promise.resolve(null);\n if (cachedRoutes) {\n swapRouteFromCachePromise = this.getSwapRouteFromCache(\n currencyIn,\n currencyOut,\n cachedRoutes,\n await blockNumber,\n amount,\n fewAmount!,\n quoteCurrency,\n fewQuoteToken!,\n tradeType,\n routingConfig,\n v3GasModel,\n v4GasModel,\n mixedRouteGasModel,\n gasPriceWei,\n v2GasModel,\n swapConfig,\n providerConfig\n );\n }\n endTimer('alpha-router.route.getSwapRouteFromCache');\n\n startTimer('alpha-router.route.getUniswapFewTokenSwapRouteFromCache');\n let uniswapFewSwapRouteFromCachePromise: Promise<BestSwapRoute | null> =\n Promise.resolve(null);\n if (fewCachedRoutes) {\n uniswapFewSwapRouteFromCachePromise = this.getUniswapFewTokenSwapRouteFromCache(\n fewTokenIn!,\n fewTokenOut!,\n fewCachedRoutes,\n await blockNumber,\n amount,\n fewAmount!,\n quoteCurrency,\n fewQuoteToken!,\n tradeType,\n routingConfig,\n v3GasModel,\n v4GasModel,\n mixedRouteGasModel,\n gasPriceWei,\n v2GasModel,\n swapConfig,\n providerConfig\n );\n }\n endTimer('alpha-router.route.getUniswapFewTokenSwapRouteFromCache');\n\n startTimer('alpha-router.route.getSwapRouteFromChain');\n let swapRouteFromChainPromise: Promise<RouteWithValidQuote[] | null> =\n Promise.resolve(null);\n if (!cachedRoutes || cacheMode !== CacheMode.Livemode) {\n swapRouteFromChainPromise = this.getSwapRouteFromChain(\n amount,\n fewAmount!,\n currencyIn,\n fewTokenIn!,\n currencyOut,\n fewTokenOut!,\n protocols,\n quoteCurrency,\n fewQuoteToken!,\n tradeType,\n routingConfig,\n v3GasModel,\n v4GasModel,\n mixedRouteGasModel,\n gasPriceWei,\n v2GasModel,\n ringFewV2GasModel,\n swapConfig,\n providerConfig\n );\n }\n endTimer('alpha-router.route.getSwapRouteFromChain');\n\n startTimer('alpha-router.route.getUniswapFewTokenSwapRouteFromChain');\n let uniswapFewSwapRouteFromChainPromise: Promise<RouteWithValidQuote[] | null> =\n Promise.resolve(null);\n if (!cachedRoutes || cacheMode !== CacheMode.Livemode) {\n //cachedRoutes is undefined\n uniswapFewSwapRouteFromChainPromise = this.getUniswapFewTokenSwapRouteFromChain(\n amount,\n fewAmount!,\n currencyIn,\n fewTokenIn!,\n currencyOut,\n fewTokenOut!,\n protocols,\n quoteCurrency,\n fewQuoteToken!,\n tradeType,\n routingConfig,\n // v3GasModel,\n fewV3GasModel,\n // v4GasModel,\n fewV4GasModel,\n mixedRouteGasModel,\n gasPriceWei,\n v2GasModel,\n fewV2GasModel,\n // ringFewV2GasModel,\n providerConfig\n );\n }\n endTimer('alpha-router.route.getUniswapFewTokenSwapRouteFromChain');\n\n // let swapRouteFromRingFewChainPromise: Promise<BestSwapRoute | null> =\n // Promise.resolve(null);\n // if (!fewCachedRoutes || cacheMode !== CacheMode.Livemode) {\n // swapRouteFromRingFewChainPromise = this.getSwapRouteFromChain(\n // fewAmount!,\n // fewTokenIn!,\n // fewTokenOut!,\n // protocols,\n // fewQuoteToken!,\n // tradeType,\n // routingConfig,\n // v3GasModel,\n // v4GasModel,\n // mixedRouteGasModel,\n // gasPriceWei,\n // ringFewV2GasModel,\n // swapConfig,\n // providerConfig\n // );\n // }\n\n startTimer('alpha-router.route.getSwapRouteFromCache_Chain');\n const [\n swapRouteFromCache,\n uniswapFewSwapRouteFromCache,\n ] = await Promise.all([\n swapRouteFromCachePromise,\n uniswapFewSwapRouteFromCachePromise\n ]);\n\n const [\n swapRouteFromChainRaw,\n uniswapFewSwapRouteFromChainRaw,\n ] = await Promise.all([\n swapRouteFromChainPromise,\n uniswapFewSwapRouteFromChainPromise\n ]);\n\n const [percents] = this.getAmountDistribution(amount, routingConfig);\n const allRoutesWithValidQuotes = [...(swapRouteFromChainRaw || []), ...(uniswapFewSwapRouteFromChainRaw || [])];\n const swapRouteFromChain = await getBestSwapRoute(\n amount,\n percents,\n allRoutesWithValidQuotes,\n tradeType,\n this.chainId,\n routingConfig,\n this.portionProvider,\n v2GasModel,\n v3GasModel,\n v4GasModel,\n swapConfig,\n providerConfig\n );\n\n if (swapRouteFromChain) {\n // this.emitPoolSelectionMetrics(\n // swapRouteFromChain,\n // [],\n // currencyIn,\n // currencyOut\n // );\n }\n\n endTimer('alpha-router.route.getSwapRouteFromCache_Chain');\n\n let swapRouteRaw: BestSwapRoute | null;\n let hitsCachedRoute = false;\n if (cacheMode === CacheMode.Livemode && swapRouteFromCache) {\n log.info(\n `CacheMode is ${cacheMode}, and we are using swapRoute from cache`\n );\n hitsCachedRoute = true;\n swapRouteRaw = swapRouteFromCache;\n } else {\n log.info(\n `CacheMode is ${cacheMode}, and we are using materialized swapRoute`\n );\n swapRouteRaw = swapRouteFromChain;\n }\n\n let uniswapFewSwapRouteRaw: BestSwapRoute | null;\n if (cacheMode === CacheMode.Livemode && uniswapFewSwapRouteFromCache) {\n log.info(\n `CacheMode is ${cacheMode}, and we are using swapRoute from cache`\n );\n hitsCachedRoute = true;\n uniswapFewSwapRouteRaw = uniswapFewSwapRouteFromCache;\n } else {\n log.info(\n `CacheMode is ${cacheMode}, and we are using materialized swapRoute`\n );\n uniswapFewSwapRouteRaw = swapRouteFromChain;\n }\n\n // let ringFewSwapRouteRaw: BestSwapRoute | null;\n // let hitsCachedRingFewSRoute = false;\n // if (cacheMode === CacheMode.Livemode && swapRouteFromRingFewCache) {\n // log.info(\n // `CacheMode is ${cacheMode}, and we are using swapRoute from cache`\n // );\n // hitsCachedRingFewSRoute = true;\n // ringFewSwapRouteRaw = swapRouteFromRingFewCache;\n // } else {\n // log.info(\n // `CacheMode is ${cacheMode}, and we are using materialized swapRoute`\n // );\n // ringFewSwapRouteRaw = swapRouteFromRingFewChain;\n // }\n\n startTimer('alpha-router.route.tapcompareCachedRoute');\n if (\n cacheMode === CacheMode.Tapcompare &&\n swapRouteFromCache &&\n swapRouteFromChain\n ) {\n const quoteDiff = swapRouteFromChain.quote.subtract(\n swapRouteFromCache.quote\n );\n const quoteGasAdjustedDiff = swapRouteFromChain.quoteGasAdjusted.subtract(\n swapRouteFromCache.quoteGasAdjusted\n );\n const gasUsedDiff = swapRouteFromChain.estimatedGasUsed.sub(\n swapRouteFromCache.estimatedGasUsed\n );\n\n // Only log if quoteDiff is different from 0, or if quoteGasAdjustedDiff and gasUsedDiff are both different from 0\n if (\n !quoteDiff.equalTo(0) ||\n !(quoteGasAdjustedDiff.equalTo(0) || gasUsedDiff.eq(0))\n ) {\n try {\n // Calculates the percentage of the difference with respect to the quoteFromChain (not from cache)\n const misquotePercent = quoteGasAdjustedDiff\n .divide(swapRouteFromChain.quoteGasAdjusted)\n .multiply(100);\n\n metric.putMetric(\n `TapcompareCachedRoute_quoteGasAdjustedDiffPercent`,\n Number(misquotePercent.toExact()),\n MetricLoggerUnit.Percent\n );\n\n log.warn(\n {\n quoteFromChain: swapRouteFromChain.quote.toExact(),\n quoteFromCache: swapRouteFromCache.quote.toExact(),\n quoteDiff: quoteDiff.toExact(),\n quoteGasAdjustedFromChain:\n swapRouteFromChain.quoteGasAdjusted.toExact(),\n quoteGasAdjustedFromCache:\n swapRouteFromCache.quoteGasAdjusted.toExact(),\n quoteGasAdjustedDiff: quoteGasAdjustedDiff.toExact(),\n gasUsedFromChain: swapRouteFromChain.estimatedGasUsed.toString(),\n gasUsedFromCache: swapRouteFromCache.estimatedGasUsed.toString(),\n gasUsedDiff: gasUsedDiff.toString(),\n routesFromChain: swapRouteFromChain.routes.toString(),\n routesFromCache: swapRouteFromCache.routes.toString(),\n amount: amount.toExact(),\n originalAmount: cachedRoutes?.originalAmount,\n pair: this.tokenPairSymbolTradeTypeChainId(\n currencyIn,\n currencyOut,\n tradeType\n ),\n blockNumber,\n },\n `Comparing quotes between Chain and Cache for ${this.tokenPairSymbolTradeTypeChainId(\n currencyIn,\n currencyOut,\n tradeType\n )}`\n );\n } catch (error) {\n // This is in response to the 'division by zero' error\n // during https://uniswapteam.slack.com/archives/C059TGEC57W/p1723997015399579\n if (\n error instanceof RangeError &&\n error.message.includes('Division by zero')\n ) {\n log.error(\n {\n quoteGasAdjustedDiff: quoteGasAdjustedDiff.toExact(),\n swapRouteFromChainQuoteGasAdjusted:\n swapRouteFromChain.quoteGasAdjusted.toExact(),\n },\n 'Error calculating misquote percent'\n );\n\n metric.putMetric(\n `TapcompareCachedRoute_quoteGasAdjustedDiffPercent_divzero`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n // Log but don't throw here - this is only for logging.\n }\n }\n }\n endTimer('alpha-router.route.tapcompareCachedRoute');\n\n if (!swapRouteRaw && !uniswapFewSwapRouteRaw) {\n return null;\n }\n\n // Use either swapRouteRaw or uniswapFewSwapRouteRaw as the source of route data\n // We already checked above that at least one is non-null, so we can safely assert non-null\n const routeSource = swapRouteRaw as BestSwapRoute;\n\n // Now we can safely destructure since routeSource is guaranteed to be non-null\n const {\n quote,\n quoteGasAdjusted,\n estimatedGasUsed,\n routes: routeAmounts,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedUSD,\n estimatedGasUsedGasToken,\n } = routeSource;\n\n metric.putMetric(\n `QuoteFoundForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n // Build Trade object that represents the optimal swap.\n const trade = buildTrade<typeof tradeType>(\n currencyIn,\n fewTokenIn!,\n currencyOut,\n fewTokenOut!,\n tradeType,\n routeAmounts\n );\n\n let methodParameters: MethodParameters | undefined;\n\n // If user provided recipient, deadline etc. we also generate the calldata required to execute\n // the swap and return it too.\n if (swapConfig) {\n methodParameters = buildSwapMethodParameters(\n trade,\n swapConfig,\n this.chainId\n );\n }\n\n const tokenOutAmount =\n tradeType === TradeType.EXACT_OUTPUT\n ? originalAmount // we need to pass in originalAmount instead of amount, because amount already added portionAmount in case of exact out swap\n : quote;\n const portionAmount = this.portionProvider.getPortionAmount(\n tokenOutAmount,\n tradeType,\n feeTakenOnTransfer,\n externalTransferFailed,\n swapConfig\n );\n const portionQuoteAmount = this.portionProvider.getPortionQuoteAmount(\n tradeType,\n quote,\n amount, // we need to pass in amount instead of originalAmount here, because amount here needs to add the portion for exact out\n portionAmount\n );\n // we need to correct quote and quote gas adjusted for exact output when portion is part of the exact out swap\n const correctedQuote = this.portionProvider.getQuote(\n tradeType,\n quote,\n portionQuoteAmount\n );\n\n const correctedQuoteGasAdjusted = this.portionProvider.getQuoteGasAdjusted(\n tradeType,\n quoteGasAdjusted,\n portionQuoteAmount\n );\n const quoteGasAndPortionAdjusted =\n this.portionProvider.getQuoteGasAndPortionAdjusted(\n tradeType,\n quoteGasAdjusted,\n portionAmount\n );\n\n const swapRoute: SwapRoute = {\n quote: correctedQuote,\n quoteGasAdjusted: correctedQuoteGasAdjusted,\n estimatedGasUsed,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedUSD,\n estimatedGasUsedGasToken,\n gasPriceWei,\n route: routeAmounts,\n trade,\n methodParameters,\n blockNumber: BigNumber.from(await blockNumber),\n hitsCachedRoute: hitsCachedRoute,\n portionAmount: portionAmount,\n quoteGasAndPortionAdjusted: quoteGasAndPortionAdjusted,\n };\n\n if (\n swapConfig &&\n swapConfig.simulate &&\n methodParameters &&\n methodParameters.calldata\n ) {\n if (!this.simulator) {\n throw new Error('Simulator not initialized!');\n }\n\n log.info(\n JSON.stringify(\n { swapConfig, methodParameters, providerConfig },\n null,\n 2\n ),\n `Starting simulation`\n );\n const fromAddress = swapConfig.simulate.fromAddress;\n const beforeSimulate = Date.now();\n const swapRouteWithSimulation = await this.simulator.simulate(\n fromAddress,\n swapConfig,\n swapRoute,\n amount,\n // Quote will be in WETH even if quoteCurrency is ETH\n // So we init a new CurrencyAmount object here\n CurrencyAmount.fromRawAmount(quoteCurrency, quote.quotient.toString()),\n providerConfig\n );\n metric.putMetric(\n 'SimulateTransaction',\n Date.now() - beforeSimulate,\n MetricLoggerUnit.Milliseconds\n );\n\n if (routingConfig.intent === INTENT.CACHING) {\n if (swapRouteWithSimulation.simulationStatus) {\n await this.performCachingIntention(\n currencyIn,\n currencyOut,\n tradeType,\n amount,\n protocols,\n await blockNumber,\n routingConfig,\n swapRouteWithSimulation.simulationStatus!,\n swapRouteWithSimulation.route\n );\n } else {\n log.info('Simulation status is null');\n }\n }\n\n return swapRouteWithSimulation;\n }\n getPerfReport();\n\n return swapRoute;\n }\n\n /**\n * Performs the caching intention for the given simulation status and route.\n *\n * @param currencyIn the currency in\n * @param currencyOut the currency out\n * @param tradeType the trade type\n * @param amount the amount\n * @param protocols the protocols\n * @param blockNumber the block number\n * @param routingConfig the routing config\n * @param simulationStatus the simulation status\n * @param simulationRoute the simulation route\n */\n protected async performCachingIntention(\n currencyIn: Currency,\n currencyOut: Currency,\n tradeType: TradeType,\n amount: CurrencyAmount,\n protocols: Protocol[],\n blockNumber: number,\n routingConfig: AlphaRouterConfig,\n simulationStatus: SimulationStatus,\n simulationRoute: RouteWithValidQuote[]\n ) {\n // due to fire and forget nature, we already take note that we should set new cached routes during the new path\n metric.putMetric(`SetCachedRoute_NewPath`, 1, MetricLoggerUnit.Count);\n\n log.info(simulationStatus, 'Simulation status');\n\n if (this.shouldCacheRoute(simulationStatus)) {\n const routesToCache = CachedRoutes.fromRoutesWithValidQuotes(\n simulationRoute,\n this.chainId,\n currencyIn,\n currencyOut,\n protocols.sort(),\n blockNumber,\n tradeType,\n amount.toExact()\n );\n\n await this.setCachedRoutesAndLog(\n amount,\n currencyIn,\n currencyOut,\n tradeType,\n 'SetCachedRoute_NewPath',\n routesToCache,\n routingConfig.cachedRoutesRouteIds\n );\n }\n }\n\n /**\n * @param simulationStatus the status of the simulation\n * @returns true if the route should be cached, false otherwise\n */\n protected shouldCacheRoute(simulationStatus: SimulationStatus) {\n // Do not cache the route for the following reasons:\n // 1. failed when tenderly sim failed for unknown reason\n // 2. slippage since we know swap is bound to fail\n // 3. transfer from failed since we know swap is bound to fail\n return (\n simulationStatus !== SimulationStatus.Failed &&\n simulationStatus !== SimulationStatus.SlippageTooLow &&\n simulationStatus !== SimulationStatus.TransferFromFailed\n );\n }\n\n private async setCachedRoutesAndLog(\n amount: CurrencyAmount,\n currencyIn: Currency,\n currencyOut: Currency,\n tradeType: TradeType,\n metricsPrefix: string,\n routesToCache?: CachedRoutes,\n cachedRoutesRouteIds?: string\n ): Promise<void> {\n if (routesToCache) {\n const cachedRoutesChanged =\n cachedRoutesRouteIds !== undefined &&\n // it's possible that top cached routes may be split routes,\n // so that we always serialize all the top 8 retrieved cached routes vs the top routes.\n !cachedRoutesRouteIds.startsWith(\n serializeRouteIds(routesToCache.routes.map((r) => r.routeId))\n );\n\n if (cachedRoutesChanged) {\n metric.putMetric('cachedRoutesChanged', 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `cachedRoutesChanged_chainId${currencyIn.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `cachedRoutesChanged_chainId${currencyOut.chainId}_pair${currencyIn.symbol}${currencyOut.symbol}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric('cachedRoutesNotChanged', 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `cachedRoutesNotChanged_chainId${currencyIn.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `cachedRoutesNotChanged_chainId${currencyOut.chainId}_pair${currencyIn.symbol}${currencyOut.symbol}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n await this.routeCachingProvider\n ?.setCachedRoute(routesToCache, amount)\n .then((success) => {\n const status = success ? 'success' : 'rejected';\n metric.putMetric(\n `${metricsPrefix}_${status}`,\n 1,\n MetricLoggerUnit.Count\n );\n })\n .catch((reason) => {\n log.error(\n {\n reason: reason,\n tokenPair: this.tokenPairSymbolTradeTypeChainId(\n currencyIn,\n currencyOut,\n tradeType\n ),\n },\n `SetCachedRoute failure`\n );\n\n metric.putMetric(\n `${metricsPrefix}_failure`,\n 1,\n MetricLoggerUnit.Count\n );\n });\n } else {\n metric.putMetric(\n `${metricsPrefix}_unnecessary`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n }\n\n private async getSwapRouteFromCache(\n currencyIn: Currency,\n currencyOut: Currency,\n cachedRoutes: CachedRoutes,\n blockNumber: number,\n amount: CurrencyAmount,\n fewAmount: CurrencyAmount,\n quoteCurrency: Currency,\n fewQuoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n v3GasModel: IGasModel<V3RouteWithValidQuote>,\n v4GasModel: IGasModel<V4RouteWithValidQuote>,\n mixedRouteGasModel: IGasModel<MixedRouteWithValidQuote>,\n gasPriceWei: BigNumber,\n v2GasModel?: IGasModel<V2RouteWithValidQuote>,\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): Promise<BestSwapRoute | null> {\n const tokenPairProperties =\n await this.tokenPropertiesProvider.getTokensProperties(\n [currencyIn, currencyOut],\n providerConfig\n );\n\n const sellTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyIn)\n ]?.tokenFeeResult?.sellFeeBps?.gt(0);\n const buyTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyOut)\n ]?.tokenFeeResult?.buyFeeBps?.gt(0);\n const fotInDirectSwap = sellTokenIsFot || buyTokenIsFot;\n\n log.info(\n {\n protocols: cachedRoutes.protocolsCovered,\n tradeType: cachedRoutes.tradeType,\n cachedBlockNumber: cachedRoutes.blockNumber,\n quoteBlockNumber: blockNumber,\n },\n 'Routing across CachedRoute'\n );\n const quotePromises: Promise<GetQuotesResult>[] = [];\n\n const v4Routes = cachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V4\n );\n const v3Routes = cachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V3\n );\n const v2Routes = cachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V2\n );\n const ringFewV2Routes = cachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.FEWV2\n );\n const mixedRoutes = cachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.MIXED\n );\n\n let percents: number[];\n let amounts: CurrencyAmount[];\n if (cachedRoutes.routes.length > 1) {\n // If we have more than 1 route, we will quote the different percents for it, following the regular process\n [percents, amounts] = this.getAmountDistribution(amount, routingConfig);\n } else if (cachedRoutes.routes.length == 1) {\n [percents, amounts] = [[100], [amount]];\n } else {\n // In this case this means that there's no route, so we return null\n return Promise.resolve(null);\n }\n\n let fewPercents: number[];\n let fewAmounts: CurrencyAmount[];\n if (cachedRoutes.routes.length > 1) {\n // If we have more than 1 route, we will quote the different percents for it, following the regular process\n [fewPercents, fewAmounts] = this.getAmountDistribution(\n fewAmount,\n routingConfig\n );\n } else if (cachedRoutes.routes.length == 1) {\n [fewPercents, fewAmounts] = [[100], [fewAmount]];\n } else {\n // In this case this means that there's no route, so we return null\n return Promise.resolve(null);\n }\n\n if (v4Routes.length > 0) {\n const v4RoutesFromCache: V4Route[] = v4Routes.map(\n (cachedRoute) => cachedRoute.route as V4Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V4_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v4Quoter\n .getQuotes(\n v4RoutesFromCache,\n amounts,\n percents,\n quoteCurrency,\n tradeType,\n routingConfig,\n undefined,\n v4GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V4_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (!fotInDirectSwap) {\n if (v3Routes.length > 0) {\n const v3RoutesFromCache: V3Route[] = v3Routes.map(\n (cachedRoute) => cachedRoute.route as V3Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V3_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v3Quoter\n .getQuotes(\n v3RoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n undefined,\n v3GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V3_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n }\n\n if (v2Routes.length > 0) {\n const v2RoutesFromCache: V2Route[] = v2Routes.map(\n (cachedRoute) => cachedRoute.route as V2Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V2_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v2Quoter\n .refreshRoutesThenGetQuotes(\n cachedRoutes.currencyIn.wrapped,\n cachedRoutes.currencyOut.wrapped,\n v2RoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V2_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (ringFewV2Routes.length > 0) {\n const ringFewV2RoutesFromCache: RingFewV2Route[] = ringFewV2Routes.map(\n (cachedRoute) => cachedRoute.route as RingFewV2Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_RingFewV2_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.ringFewV2Quoter\n .refreshRoutesThenGetQuotes(\n cachedRoutes.currencyIn.wrapped,\n cachedRoutes.currencyOut.wrapped,\n ringFewV2RoutesFromCache,\n fewAmounts,\n fewPercents,\n fewQuoteToken.wrapped,\n tradeType,\n routingConfig,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_RingFewV2_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (!fotInDirectSwap) {\n if (mixedRoutes.length > 0) {\n const mixedRoutesFromCache: MixedRoute[] = mixedRoutes.map(\n (cachedRoute) => cachedRoute.route as MixedRoute\n );\n metric.putMetric(\n 'SwapRouteFromCache_Mixed_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.mixedQuoter\n .getQuotes(\n mixedRoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n undefined,\n mixedRouteGasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_Mixed_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n }\n\n const getQuotesResults = await Promise.all(quotePromises);\n const allRoutesWithValidQuotes = _.flatMap(\n getQuotesResults,\n (quoteResult) => quoteResult.routesWithValidQuotes\n );\n\n return getBestSwapRoute(\n amount,\n percents,\n allRoutesWithValidQuotes,\n tradeType,\n this.chainId,\n routingConfig,\n this.portionProvider,\n v2GasModel,\n v3GasModel,\n v4GasModel,\n swapConfig,\n providerConfig\n );\n }\n\n private async getUniswapFewTokenSwapRouteFromCache(\n fewTokenIn: Token,\n fewTokenOut: Token,\n fewCachedRoutes: CachedRoutes,\n blockNumber: number,\n amount: CurrencyAmount,\n fewAmount: CurrencyAmount,\n quoteCurrency: Currency,\n fewQuoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n v3GasModel: IGasModel<V3RouteWithValidQuote>,\n v4GasModel: IGasModel<V4RouteWithValidQuote>,\n mixedRouteGasModel: IGasModel<MixedRouteWithValidQuote>,\n gasPriceWei: BigNumber,\n v2GasModel?: IGasModel<V2RouteWithValidQuote>,\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): Promise<BestSwapRoute | null> {\n const tokenPairProperties =\n await this.tokenPropertiesProvider.getTokensProperties(\n [fewTokenIn, fewTokenOut],\n providerConfig\n );\n\n const sellTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(fewTokenIn)\n ]?.tokenFeeResult?.sellFeeBps?.gt(0);\n const buyTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(fewTokenOut)\n ]?.tokenFeeResult?.buyFeeBps?.gt(0);\n const fotInDirectSwap = sellTokenIsFot || buyTokenIsFot;\n\n log.info(\n {\n protocols: fewCachedRoutes.protocolsCovered,\n tradeType: fewCachedRoutes.tradeType,\n cachedBlockNumber: fewCachedRoutes.blockNumber,\n quoteBlockNumber: blockNumber,\n },\n 'Routing across CachedRoute'\n );\n const quotePromises: Promise<GetQuotesResult>[] = [];\n\n const v4Routes = fewCachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V4\n );\n const v3Routes = fewCachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V3\n );\n const v2Routes = fewCachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.V2\n );\n const ringFewV2Routes = fewCachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.FEWV2\n );\n const mixedRoutes = fewCachedRoutes.routes.filter(\n (route) => route.protocol === Protocol.MIXED\n );\n\n let percents: number[];\n let amounts: CurrencyAmount[];\n if (fewCachedRoutes.routes.length > 1) {\n // If we have more than 1 route, we will quote the different percents for it, following the regular process\n [percents, amounts] = this.getAmountDistribution(amount, routingConfig);\n } else if (fewCachedRoutes.routes.length == 1) {\n [percents, amounts] = [[100], [amount]];\n } else {\n // In this case this means that there's no route, so we return null\n return Promise.resolve(null);\n }\n\n let fewPercents: number[];\n let fewAmounts: CurrencyAmount[];\n if (fewCachedRoutes.routes.length > 1) {\n // If we have more than 1 route, we will quote the different percents for it, following the regular process\n [fewPercents, fewAmounts] = this.getAmountDistribution(\n fewAmount,\n routingConfig\n );\n } else if (fewCachedRoutes.routes.length == 1) {\n [fewPercents, fewAmounts] = [[100], [fewAmount]];\n } else {\n // In this case this means that there's no route, so we return null\n return Promise.resolve(null);\n }\n\n if (v4Routes.length > 0) {\n const v4RoutesFromCache: V4Route[] = v4Routes.map(\n (cachedRoute) => cachedRoute.route as V4Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V4_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v4Quoter\n .getQuotes(\n v4RoutesFromCache,\n amounts,\n percents,\n quoteCurrency,\n tradeType,\n routingConfig,\n undefined,\n v4GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V4_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (!fotInDirectSwap) {\n if (v3Routes.length > 0) {\n const v3RoutesFromCache: V3Route[] = v3Routes.map(\n (cachedRoute) => cachedRoute.route as V3Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V3_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v3Quoter\n .getQuotes(\n v3RoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n undefined,\n v3GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V3_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n }\n\n if (v2Routes.length > 0) {\n const v2RoutesFromCache: V2Route[] = v2Routes.map(\n (cachedRoute) => cachedRoute.route as V2Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_V2_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.v2Quoter\n .refreshRoutesThenGetQuotes(\n fewCachedRoutes.currencyIn.wrapped,\n fewCachedRoutes.currencyOut.wrapped,\n v2RoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_V2_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (ringFewV2Routes.length > 0) {\n const ringFewV2RoutesFromCache: RingFewV2Route[] = ringFewV2Routes.map(\n (cachedRoute) => cachedRoute.route as RingFewV2Route\n );\n metric.putMetric(\n 'SwapRouteFromCache_RingFewV2_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.ringFewV2Quoter\n .refreshRoutesThenGetQuotes(\n fewCachedRoutes.currencyIn.wrapped,\n fewCachedRoutes.currencyOut.wrapped,\n ringFewV2RoutesFromCache,\n fewAmounts,\n fewPercents,\n fewQuoteToken.wrapped,\n tradeType,\n routingConfig,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_RingFewV2_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n\n if (!fotInDirectSwap) {\n if (mixedRoutes.length > 0) {\n const mixedRoutesFromCache: MixedRoute[] = mixedRoutes.map(\n (cachedRoute) => cachedRoute.route as MixedRoute\n );\n metric.putMetric(\n 'SwapRouteFromCache_Mixed_GetQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n\n const beforeGetQuotes = Date.now();\n\n quotePromises.push(\n this.mixedQuoter\n .getQuotes(\n mixedRoutesFromCache,\n amounts,\n percents,\n quoteCurrency.wrapped,\n tradeType,\n routingConfig,\n undefined,\n mixedRouteGasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromCache_Mixed_GetQuotes_Load`,\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n );\n }\n }\n\n const getQuotesResults = await Promise.all(quotePromises);\n const allRoutesWithValidQuotes = _.flatMap(\n getQuotesResults,\n (quoteResult) => quoteResult.routesWithValidQuotes\n );\n\n return getBestSwapRoute(\n amount,\n percents,\n allRoutesWithValidQuotes,\n tradeType,\n this.chainId,\n routingConfig,\n this.portionProvider,\n v2GasModel,\n v3GasModel,\n v4GasModel,\n swapConfig,\n providerConfig\n );\n }\n\n private async getSwapRouteFromChain(\n amount: CurrencyAmount,\n fewAmount: CurrencyAmount,\n currencyIn: Currency,\n fewTokenIn: Token,\n currencyOut: Currency,\n fewTokenOut: Token,\n protocols: Protocol[],\n quoteCurrency: Currency,\n fewQuoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n v3GasModel: IGasModel<V3RouteWithValidQuote>,\n v4GasModel: IGasModel<V4RouteWithValidQuote>,\n mixedRouteGasModel: IGasModel<MixedRouteWithValidQuote>,\n gasPriceWei: BigNumber,\n v2GasModel?: IGasModel<V2RouteWithValidQuote>,\n ringFewV2GasModel?: IGasModel<RingFewV2RouteWithValidQuote>,\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): Promise<RouteWithValidQuote[] | null> {\n const tokenPairProperties =\n await this.tokenPropertiesProvider.getTokensProperties(\n [currencyIn, currencyOut],\n providerConfig\n );\n\n if (!swapConfig) {\n //\n }\n\n // const fewTokenPairProperties =\n // await this.tokenPropertiesProvider.getTokensProperties(\n // [fewTokenIn, fewTokenOut],\n // providerConfig\n // );\n\n const sellTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyIn)\n ]?.tokenFeeResult?.sellFeeBps?.gt(0);\n const buyTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyOut)\n ]?.tokenFeeResult?.buyFeeBps?.gt(0);\n const fotInDirectSwap = sellTokenIsFot || buyTokenIsFot;\n\n // const sellTokenIsFewFot =\n // fewTokenPairProperties[\n // getAddressLowerCase(fewTokenIn)\n // ]?.tokenFeeResult?.sellFeeBps?.gt(0);\n // const buyTokenIsFewFot =\n // fewTokenPairProperties[\n // getAddressLowerCase(fewTokenOut)\n // ]?.tokenFeeResult?.buyFeeBps?.gt(0);\n // const fewFotInDirectSwap = sellTokenIsFewFot || buyTokenIsFewFot;\n\n // Generate our distribution of amounts, i.e. fractions of the input amount.\n // We will get quotes for fractions of the input amount for different routes, then\n // combine to generate split routes.\n const [percents, amounts] = this.getAmountDistribution(\n amount,\n routingConfig\n );\n\n const [fewPercents, fewAmounts] = this.getAmountDistribution(\n fewAmount,\n routingConfig\n );\n\n const noProtocolsSpecified = protocols.length === 0;\n const v4ProtocolSpecified = protocols.includes(Protocol.V4);\n const v3ProtocolSpecified = protocols.includes(Protocol.V3);\n const v2ProtocolSpecified = protocols.includes(Protocol.V2);\n const ringFewV2ProtocolSpecified = protocols.includes(Protocol.FEWV2);\n const v2SupportedInChain = this.v2Supported?.includes(this.chainId);\n const ringFewV2SupportedInChain = this.ringFewV2Supported?.includes(this.chainId);\n const v4SupportedInChain = this.v4Supported?.includes(this.chainId);\n const shouldQueryMixedProtocol =\n protocols.includes(Protocol.MIXED) ||\n (noProtocolsSpecified && v2SupportedInChain && ringFewV2SupportedInChain && v4SupportedInChain);\n // const shouldQueryRingFewV2Protocol =\n // protocols.includes(Protocol.FEWV2) ||\n // (noProtocolsSpecified && ringFewV2SupportedInChain);\n const mixedProtocolAllowed =\n this.mixedSupported?.includes(this.chainId) &&\n tradeType === TradeType.EXACT_INPUT;\n\n const beforeGetCandidates = Date.now();\n\n let v4CandidatePoolsPromise: Promise<V4CandidatePools | undefined> =\n Promise.resolve(undefined);\n\n // we are explicitly requiring people to specify v4 for now\n if (v4SupportedInChain && (v4ProtocolSpecified || noProtocolsSpecified)) {\n // if (v4ProtocolSpecified || noProtocolsSpecified) {\n v4CandidatePoolsPromise = getV4CandidatePools({\n currencyIn: currencyIn,\n currencyOut: currencyOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v4PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v4SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n v4PoolParams: this.v4PoolParams,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetV4CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n\n let v3CandidatePoolsPromise: Promise<V3CandidatePools | undefined> =\n Promise.resolve(undefined);\n if (!fotInDirectSwap) {\n if (v3ProtocolSpecified || noProtocolsSpecified) {\n const tokenIn = currencyIn.wrapped;\n const tokenOut = currencyOut.wrapped;\n\n v3CandidatePoolsPromise = getV3CandidatePools({\n tokenIn,\n tokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v3PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v3SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetV3CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n }\n\n let v2CandidatePoolsPromise: Promise<V2CandidatePools | undefined> =\n Promise.resolve(undefined);\n if (v2SupportedInChain && (v2ProtocolSpecified || noProtocolsSpecified)) {\n const tokenIn = currencyIn.wrapped;\n const tokenOut = currencyOut.wrapped;\n\n // Fetch all the pools that we will consider routing via. There are thousands\n // of pools, so we filter them to a set of candidate pools that we expect will\n // result in good prices.\n v2CandidatePoolsPromise = getV2CandidatePools({\n tokenIn,\n tokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v2PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v2SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetV2CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n\n let ringFewV2CandidatePoolsPromise: Promise<RingFewV2CandidatePools | undefined> =\n Promise.resolve(undefined);\n if (ringFewV2SupportedInChain && (ringFewV2ProtocolSpecified || noProtocolsSpecified)) {\n const tokenIn = fewTokenIn;\n const tokenOut = fewTokenOut;\n\n ringFewV2CandidatePoolsPromise = getRingFewV2CandidatePools({\n tokenIn,\n tokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.ringFewV2PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.ringFewV2SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetRingFewV2CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n\n const quotePromises: Promise<GetQuotesResult>[] = [];\n\n // for v4, for now we explicitly require people to specify\n if (v4SupportedInChain && v4ProtocolSpecified) {\n log.info({ protocols, tradeType }, 'Routing across V4');\n\n metric.putMetric(\n 'SwapRouteFromChain_V4_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n\n quotePromises.push(\n v4CandidatePoolsPromise.then((v4CandidatePools) =>\n this.v4Quoter\n .getRoutesThenQuotes(\n currencyIn,\n currencyOut,\n amount,\n amounts,\n percents,\n quoteCurrency,\n v4CandidatePools!,\n tradeType,\n routingConfig,\n v4GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V4_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n\n if (!fotInDirectSwap) {\n // Maybe Quote V3 - if V3 is specified, or no protocol is specified\n if (v3ProtocolSpecified || noProtocolsSpecified) {\n log.info({ protocols, tradeType }, 'Routing across V3');\n\n metric.putMetric(\n 'SwapRouteFromChain_V3_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n const tokenIn = currencyIn.wrapped;\n const tokenOut = currencyOut.wrapped;\n\n quotePromises.push(\n v3CandidatePoolsPromise.then((v3CandidatePools) =>\n this.v3Quoter\n .getRoutesThenQuotes(\n tokenIn,\n tokenOut,\n amount,\n amounts,\n percents,\n quoteCurrency.wrapped,\n v3CandidatePools!,\n tradeType,\n routingConfig,\n v3GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V3_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n }\n\n // Maybe Quote V2 - if V2 is specified, or no protocol is specified AND v2 is supported in this chain\n if (v2SupportedInChain && (v2ProtocolSpecified || noProtocolsSpecified)) {\n log.info({ protocols, tradeType }, 'Routing across V2');\n\n metric.putMetric(\n 'SwapRouteFromChain_V2_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n const tokenIn = currencyIn.wrapped;\n const tokenOut = currencyOut.wrapped;\n\n quotePromises.push(\n v2CandidatePoolsPromise.then((v2CandidatePools) =>\n this.v2Quoter\n .getRoutesThenQuotes(\n tokenIn,\n tokenOut,\n amount,\n amounts,\n percents,\n quoteCurrency.wrapped,\n v2CandidatePools!,\n tradeType,\n routingConfig,\n v2GasModel,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V2_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n\n // Maybe Quote RingFewV2 - if RingFewV2 is specified, or no protocol is specified AND ringFewV2 is supported in this chain\n if (ringFewV2SupportedInChain && (ringFewV2ProtocolSpecified || noProtocolsSpecified)) {\n log.info({ protocols, tradeType }, 'Routing across RingFewV2');\n\n metric.putMetric(\n 'SwapRouteFromChain_RingFewV2_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n const tokenIn = fewTokenIn;\n const tokenOut = fewTokenOut;\n\n quotePromises.push(\n ringFewV2CandidatePoolsPromise.then((ringFewV2CandidatePools) =>\n this.ringFewV2Quoter\n .getRoutesThenQuotes(\n tokenIn,\n tokenOut,\n fewAmount,\n fewAmounts,\n fewPercents,\n fewQuoteToken.wrapped,\n ringFewV2CandidatePools!,\n tradeType,\n routingConfig,\n ringFewV2GasModel,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_RingFewV2_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n\n if (!fotInDirectSwap) {\n // Maybe Quote mixed routes\n // if MixedProtocol is specified or no protocol is specified and v2 is supported AND tradeType is ExactIn\n // AND is Mainnet or Gorli\n // Also make sure there are at least 2 protocols provided besides MIXED, before entering mixed quoter\n if (\n shouldQueryMixedProtocol &&\n mixedProtocolAllowed &&\n protocols.filter((protocol) => protocol !== Protocol.MIXED).length >= 2\n ) {\n log.info({ protocols, tradeType }, 'Routing across MixedRoutes');\n\n metric.putMetric(\n 'SwapRouteFromChain_Mixed_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n\n quotePromises.push(\n Promise.all([\n v4CandidatePoolsPromise,\n v3CandidatePoolsPromise,\n v2CandidatePoolsPromise,\n ringFewV2CandidatePoolsPromise,\n ]).then(\n async ([v4CandidatePools, v3CandidatePools, v2CandidatePools, ringFewV2CandidatePools]) => {\n const tokenIn = currencyIn.wrapped;\n const tokenOut = currencyOut.wrapped;\n\n const crossLiquidityPools =\n await getMixedCrossLiquidityCandidatePools({\n tokenIn,\n tokenOut,\n blockNumber: routingConfig.blockNumber,\n v2SubgraphProvider: this.v2SubgraphProvider,\n v3SubgraphProvider: this.v3SubgraphProvider,\n v2Candidates: v2CandidatePools,\n v3Candidates: v3CandidatePools,\n v4Candidates: v4CandidatePools,\n });\n\n return this.mixedQuoter\n .getRoutesThenQuotes(\n tokenIn,\n tokenOut,\n amount,\n amounts,\n percents,\n quoteCurrency.wrapped,\n [\n v4CandidatePools,\n v3CandidatePools,\n v2CandidatePools,\n ringFewV2CandidatePools,\n crossLiquidityPools,\n ],\n tradeType,\n routingConfig,\n mixedRouteGasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_Mixed_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n });\n }\n )\n );\n }\n }\n\n const getQuotesResults = await Promise.all(quotePromises);\n\n const allRoutesWithValidQuotes: RouteWithValidQuote[] = [];\n const allCandidatePools: CandidatePoolsBySelectionCriteria[] = [];\n getQuotesResults.forEach((getQuoteResult) => {\n allRoutesWithValidQuotes.push(...getQuoteResult.routesWithValidQuotes);\n if (getQuoteResult.candidatePools) {\n allCandidatePools.push(getQuoteResult.candidatePools);\n }\n });\n\n if (allRoutesWithValidQuotes.length === 0) {\n log.info({ allRoutesWithValidQuotes }, 'Received no valid quotes');\n return null;\n }\n\n return allRoutesWithValidQuotes;\n\n /*\n // Given all the quotes for all the amounts for all the routes, find the best combination.\n const bestSwapRoute = await getBestSwapRoute(\n amount,\n percents,\n allRoutesWithValidQuotes,\n tradeType,\n this.chainId,\n routingConfig,\n this.portionProvider,\n v2GasModel,\n v3GasModel,\n v4GasModel,\n swapConfig,\n providerConfig\n );\n\n if (bestSwapRoute) {\n this.emitPoolSelectionMetrics(\n bestSwapRoute,\n allCandidatePools,\n currencyIn,\n currencyOut\n );\n }\n\n return bestSwapRoute;\n */\n }\n\n // for uniswap fewToken\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private async getUniswapFewTokenSwapRouteFromChain(\n amount: CurrencyAmount,\n fewAmount: CurrencyAmount,\n currencyIn: Currency,\n fewTokenIn: Token,\n currencyOut: Currency,\n fewTokenOut: Token,\n protocols: Protocol[],\n _quoteCurrency: Currency,\n fewQuoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n // v3GasModel: IGasModel<V3RouteWithValidQuote>,\n fewV3GasModel: IGasModel<UniswapFewV3RouteWithValidQuote>,\n // v4GasModel: IGasModel<V4RouteWithValidQuote>,\n fewV4GasModel: IGasModel<UniswapFewV4RouteWithValidQuote>,\n _mixedRouteGasModel: IGasModel<MixedRouteWithValidQuote>,\n gasPriceWei: BigNumber,\n _v2GasModel?: IGasModel<V2RouteWithValidQuote>,\n fewV2GasModel?: IGasModel<V2RouteWithValidQuote>,\n // ringFewV2GasModel?: IGasModel<RingFewV2RouteWithValidQuote>,\n providerConfig?: ProviderConfig\n ): Promise<RouteWithValidQuote[] | null> {\n const tokenPairProperties =\n await this.tokenPropertiesProvider.getTokensProperties(\n [currencyIn, currencyOut],\n providerConfig\n );\n\n const sellTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyIn)\n ]?.tokenFeeResult?.sellFeeBps?.gt(0);\n const buyTokenIsFot =\n tokenPairProperties[\n getAddressLowerCase(currencyOut)\n ]?.tokenFeeResult?.buyFeeBps?.gt(0);\n const fotInDirectSwap = sellTokenIsFot || buyTokenIsFot;\n\n // Generate our distribution of amounts, i.e. fractions of the input amount.\n // We will get quotes for fractions of the input amount for different routes, then\n // combine to generate split routes.\n const [_amounts] = this.getAmountDistribution(\n amount,\n routingConfig\n );\n\n const [fewPercents, fewAmounts] = this.getAmountDistribution(\n fewAmount,\n routingConfig\n );\n\n // const tokenIn = fewTokenIn;\n // const tokenOut = fewTokenOut;\n\n const noProtocolsSpecified = protocols.length === 0;\n const v4ProtocolSpecified = protocols.includes(Protocol.V4);\n const v3ProtocolSpecified = protocols.includes(Protocol.V3);\n const v2ProtocolSpecified = protocols.includes(Protocol.V2);\n //@ts-ignore \n const _ringFewV2ProtocolSpecified = protocols.includes(Protocol.FEWV2);\n const v2SupportedInChain = this.v2Supported?.includes(this.chainId);\n const ringFewV2SupportedInChain = this.ringFewV2Supported?.includes(this.chainId);\n const v4SupportedInChain = this.v4Supported?.includes(this.chainId);\n //@ts-ignore \n const _shouldQueryMixedProtocol =\n protocols.includes(Protocol.MIXED) ||\n (noProtocolsSpecified && v2SupportedInChain && ringFewV2SupportedInChain && v4SupportedInChain);\n //@ts-ignore \n const _mixedProtocolAllowed =\n this.mixedSupported?.includes(this.chainId) &&\n tradeType === TradeType.EXACT_INPUT;\n\n const beforeGetCandidates = Date.now();\n\n let v4CandidatePoolsPromise: Promise<V4CandidatePools | undefined> =\n Promise.resolve(undefined);\n\n // we are explicitly requiring people to specify v4 for now\n if (v4SupportedInChain && (v4ProtocolSpecified || noProtocolsSpecified)) {\n // if (v4ProtocolSpecified || noProtocolsSpecified) {\n v4CandidatePoolsPromise = getUniswapV4FewTokenCandidatePools({\n currencyIn: fewTokenIn,\n currencyOut: fewTokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v4PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v4SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n v4PoolParams: this.v4PoolParams,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetV4CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n\n let v3CandidatePoolsPromise: Promise<V3CandidatePools | undefined> =\n Promise.resolve(undefined);\n if (!fotInDirectSwap) {\n if (v3ProtocolSpecified || noProtocolsSpecified) {\n\n v3CandidatePoolsPromise = getUniswapFewTokenV3CandidatePools({\n tokenIn: fewTokenIn,\n tokenOut: fewTokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v3PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v3SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n }).then((candidatePools) => {\n metric.putMetric(\n 'GetV3CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n }\n\n let v2CandidatePoolsPromise: Promise<V2CandidatePools | undefined> =\n Promise.resolve(undefined);\n if (v2SupportedInChain && (v2ProtocolSpecified || noProtocolsSpecified)) {\n // Fetch all the pools that we will consider routing via. There are thousands\n // of pools, so we filter them to a set of candidate pools that we expect will\n // result in good prices.\n v2CandidatePoolsPromise = getUniswapFewTokenV2CandidatePools({\n tokenIn: fewTokenIn,\n tokenOut: fewTokenOut,\n tokenProvider: this.tokenProvider,\n blockedTokenListProvider: this.blockedTokenListProvider,\n poolProvider: this.v2PoolProvider,\n routeType: tradeType,\n subgraphProvider: this.v2SubgraphProvider,\n routingConfig,\n chainId: this.chainId,\n }).then((candidatePools) => {\n metric.putMetric(\n 'getUniswapFewTokenV2CandidatePools',\n Date.now() - beforeGetCandidates,\n MetricLoggerUnit.Milliseconds\n );\n return candidatePools;\n });\n }\n\n // FEWV2 这里查询的是 origin token 的 pool\n // let ringFewV2CandidatePoolsPromise: Promise<RingFewV2CandidatePools | undefined> =\n // Promise.resolve(undefined);\n // if (ringFewV2SupportedInChain && (ringFewV2ProtocolSpecified || noProtocolsSpecified)) {\n // const tokenIn = currencyIn.wrapped;\n // const tokenOut = currencyOut.wrapped;\n\n // ringFewV2CandidatePoolsPromise = getRingFewV2CandidatePools({\n // tokenIn,\n // tokenOut,\n // tokenProvider: this.tokenProvider,\n // blockedTokenListProvider: this.blockedTokenListProvider,\n // poolProvider: this.ringFewV2PoolProvider,\n // routeType: tradeType,\n // subgraphProvider: this.ringFewV2SubgraphProvider,\n // routingConfig,\n // chainId: this.chainId,\n // }).then((candidatePools) => {\n // metric.putMetric(\n // 'GetRingFewV2CandidatePools',\n // Date.now() - beforeGetCandidates,\n // MetricLoggerUnit.Milliseconds\n // );\n // return candidatePools;\n // });\n // }\n\n const quotePromises: Promise<GetQuotesResult>[] = [];\n\n // for v4, for now we explicitly require people to specify\n if (v4SupportedInChain && v4ProtocolSpecified) {\n log.info({ protocols, tradeType }, 'Routing across V4');\n\n metric.putMetric(\n 'SwapRouteFromChain_V4_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n\n quotePromises.push(\n v4CandidatePoolsPromise.then((v4CandidatePools) =>\n this.uniswapFewV4Quoter\n .getRoutesThenQuotes(\n fewTokenIn,\n fewTokenOut,\n fewAmount,\n fewAmounts,\n fewPercents,\n fewQuoteToken,\n v4CandidatePools!,\n tradeType,\n routingConfig,\n fewV4GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V4_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n\n if (!fotInDirectSwap) {\n // Maybe Quote V3 - if V3 is specified, or no protocol is specified\n if (v3ProtocolSpecified || noProtocolsSpecified) {\n log.info({ protocols, tradeType }, 'Routing across V3');\n\n metric.putMetric(\n 'SwapRouteFromChain_V3_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n\n quotePromises.push(\n v3CandidatePoolsPromise.then((v3CandidatePools) =>\n this.uniswapFewV3Quoter\n .getRoutesThenQuotes(\n fewTokenIn,\n fewTokenOut,\n fewAmount,\n fewAmounts,\n fewPercents,\n fewQuoteToken,\n v3CandidatePools!,\n tradeType,\n routingConfig,\n fewV3GasModel\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V3_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n }\n\n // Maybe Quote V2 - if V2 is specified, or no protocol is specified AND v2 is supported in this chain\n if (v2SupportedInChain && (v2ProtocolSpecified || noProtocolsSpecified)) {\n log.info({ protocols, tradeType }, 'Routing across V2');\n\n metric.putMetric(\n 'SwapRouteFromChain_V2_GetRoutesThenQuotes_Request',\n 1,\n MetricLoggerUnit.Count\n );\n const beforeGetRoutesThenQuotes = Date.now();\n\n quotePromises.push(\n v2CandidatePoolsPromise.then((v2CandidatePools) =>\n this.v2Quoter\n .getRoutesThenQuotes(\n fewTokenIn,\n fewTokenOut,\n fewAmount,\n fewAmounts,\n fewPercents,\n fewQuoteToken,\n v2CandidatePools!,\n tradeType,\n routingConfig,\n fewV2GasModel,\n gasPriceWei\n )\n .then((result) => {\n metric.putMetric(\n `SwapRouteFromChain_V2_GetRoutesThenQuotes_Load`,\n Date.now() - beforeGetRoutesThenQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return result;\n })\n )\n );\n }\n\n // Maybe Quote RingFewV2 - if RingFewV2 is specified, or no protocol is specified AND ringFewV2 is supported in this chain\n // if (ringFewV2SupportedInChain && (ringFewV2ProtocolSpecified || noProtocolsSpecified)) {\n // log.info({ protocols, tradeType }, 'Routing across RingFewV2');\n\n // metric.putMetric(\n // 'SwapRouteFromChain_RingFewV2_GetRoutesThenQuotes_Request',\n // 1,\n // MetricLoggerUnit.Count\n // );\n // const beforeGetRoutesThenQuotes = Date.now();\n // const tokenIn = currencyIn.wrapped;\n // const tokenOut = currencyOut.wrapped;\n\n // quotePromises.push(\n // ringFewV2CandidatePoolsPromise.then((ringFewV2CandidatePools) =>\n // this.ringFewV2Quoter\n // .getRoutesThenQuotes(\n // tokenIn,\n // tokenOut,\n // amount,\n // amounts,\n // percents,\n // quoteCurrency.wrapped,\n // ringFewV2CandidatePools!,\n // tradeType,\n // routingConfig,\n // v2GasModel,\n // gasPriceWei\n // )\n // .then((result) => {\n // metric.putMetric(\n // `SwapRouteFromChain_RingFewV2_GetRoutesThenQuotes_Load`,\n // Date.now() - beforeGetRoutesThenQuotes,\n // MetricLoggerUnit.Milliseconds\n // );\n\n // return result;\n // })\n // )\n // );\n // }\n\n // if (!fotInDirectSwap) {\n // // Maybe Quote mixed routes\n // // if MixedProtocol is specified or no protocol is specified and v2 is supported AND tradeType is ExactIn\n // // AND is Mainnet or Gorli\n // // Also make sure there are at least 2 protocols provided besides MIXED, before entering mixed quoter\n // if (\n // shouldQueryMixedProtocol &&\n // mixedProtocolAllowed &&\n // protocols.filter((protocol) => protocol !== Protocol.MIXED).length >= 2\n // ) {\n // log.info({ protocols, tradeType }, 'Routing across MixedRoutes');\n\n // metric.putMetric(\n // 'SwapRouteFromChain_Mixed_GetRoutesThenQuotes_Request',\n // 1,\n // MetricLoggerUnit.Count\n // );\n // const beforeGetRoutesThenQuotes = Date.now();\n\n // quotePromises.push(\n // Promise.all([\n // v4CandidatePoolsPromise,\n // v3CandidatePoolsPromise,\n // v2CandidatePoolsPromise,\n // ringFewV2CandidatePoolsPromise,\n // ]).then(\n // async ([v4CandidatePools, v3CandidatePools, v2CandidatePools, ringFewV2CandidatePools]) => {\n // const tokenIn = currencyIn.wrapped;\n // const tokenOut = currencyOut.wrapped;\n\n // const crossLiquidityPools =\n // await getMixedCrossLiquidityCandidatePools({\n // tokenIn,\n // tokenOut,\n // blockNumber: routingConfig.blockNumber,\n // v2SubgraphProvider: this.v2SubgraphProvider,\n // v3SubgraphProvider: this.v3SubgraphProvider,\n // v2Candidates: v2CandidatePools,\n // v3Candidates: v3CandidatePools,\n // v4Candidates: v4CandidatePools,\n // });\n\n // return this.mixedQuoter\n // .getRoutesThenQuotes(\n // tokenIn,\n // tokenOut,\n // amount,\n // amounts,\n // percents,\n // quoteCurrency.wrapped,\n // [\n // v4CandidatePools,\n // v3CandidatePools,\n // v2CandidatePools,\n // ringFewV2CandidatePools,\n // crossLiquidityPools,\n // ],\n // tradeType,\n // routingConfig,\n // mixedRouteGasModel\n // )\n // .then((result) => {\n // metric.putMetric(\n // `SwapRouteFromChain_Mixed_GetRoutesThenQuotes_Load`,\n // Date.now() - beforeGetRoutesThenQuotes,\n // MetricLoggerUnit.Milliseconds\n // );\n\n // return result;\n // });\n // }\n // )\n // );\n // }\n // }\n\n const getQuotesResults = await Promise.all(quotePromises);\n\n const allRoutesWithValidQuotes: RouteWithValidQuote[] = [];\n const allCandidatePools: CandidatePoolsBySelectionCriteria[] = [];\n getQuotesResults.forEach((getQuoteResult) => {\n allRoutesWithValidQuotes.push(...getQuoteResult.routesWithValidQuotes);\n if (getQuoteResult.candidatePools) {\n allCandidatePools.push(getQuoteResult.candidatePools);\n }\n });\n\n if (allRoutesWithValidQuotes.length === 0) {\n log.info({ allRoutesWithValidQuotes }, 'Received no valid fewtokens quotes');\n return null;\n }\n\n return allRoutesWithValidQuotes;\n\n /*\n // Given all the quotes for all the amounts for all the routes, find the best combination.\n const bestSwapRoute = await getBestSwapRoute(\n amount,\n percents,\n allRoutesWithValidQuotes,\n tradeType,\n this.chainId,\n routingConfig,\n this.portionProvider,\n fewV2GasModel,\n fewV3GasModel,\n fewV4GasModel,\n swapConfig,\n providerConfig\n );\n \n if (bestSwapRoute) {\n this.emitPoolSelectionMetrics(\n bestSwapRoute,\n allCandidatePools,\n currencyIn,\n currencyOut\n );\n }\n \n return bestSwapRoute;\n */\n }\n\n private tradeTypeStr(tradeType: TradeType): string {\n return tradeType === TradeType.EXACT_INPUT ? 'ExactIn' : 'ExactOut';\n }\n\n private tokenPairSymbolTradeTypeChainId(\n currencyIn: Currency,\n currencyOut: Currency,\n tradeType: TradeType\n ) {\n return `${currencyIn.symbol}/${currencyOut.symbol}/${this.tradeTypeStr(\n tradeType\n )}/${this.chainId}`;\n }\n\n private determineCurrencyInOutFromTradeType(\n tradeType: TradeType,\n amount: CurrencyAmount,\n quoteCurrency: Currency\n ) {\n if (tradeType === TradeType.EXACT_INPUT) {\n return {\n currencyIn: amount.currency,\n currencyOut: quoteCurrency,\n };\n } else {\n return {\n currencyIn: quoteCurrency,\n currencyOut: amount.currency,\n };\n }\n }\n\n private async getGasPriceWei(\n latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<BigNumber> {\n // Track how long it takes to resolve this async call.\n const beforeGasTimestamp = Date.now();\n\n // Get an estimate of the gas price to use when estimating gas cost of different routes.\n const { gasPriceWei } = await this.gasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n\n metric.putMetric(\n 'GasPriceLoad',\n Date.now() - beforeGasTimestamp,\n MetricLoggerUnit.Milliseconds\n );\n\n return gasPriceWei;\n }\n\n private async getGasModels(\n gasPriceWei: BigNumber,\n amountToken: Token,\n quoteToken: Token,\n providerConfig?: GasModelProviderConfig\n ): Promise<GasModelType> {\n const beforeGasModel = Date.now();\n\n const fewQuoteToken = isFewToken(quoteToken)\n ? quoteToken\n : getFewTokenFromOriginalToken(quoteToken, this.chainId);\n const fewAmountToken = isFewToken(amountToken)\n ? amountToken\n : getFewTokenFromOriginalToken(amountToken, this.chainId);\n\n const usdPoolPromise = getHighestLiquidityV3USDPool(\n this.chainId,\n this.v3PoolProvider,\n providerConfig\n );\n const fewUsdPoolPromise = getHighestLiquidityV3FewTokenUSDPool(\n this.chainId,\n this.v3PoolProvider,\n providerConfig\n );\n const nativeCurrency = WRAPPED_NATIVE_CURRENCY[this.chainId];\n const fewNativeCurrency = FEW_WRAPPED_NATIVE_CURRENCY[this.chainId];\n const nativeAndQuoteTokenV3PoolPromise = !quoteToken.equals(nativeCurrency)\n ? getHighestLiquidityV3NativePool(\n quoteToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n const nativeAndAmountTokenV3PoolPromise = !amountToken.equals(nativeCurrency)\n ? getHighestLiquidityV3NativePool(\n amountToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n const fewNativeAndQuoteTokenV3PoolPromise = !fewQuoteToken.equals(fewNativeCurrency!)\n ? getHighestLiquidityV3NativeFewTokenPool(\n fewQuoteToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n const fewNativeAndAmountTokenV3PoolPromise = !fewAmountToken.equals(fewNativeCurrency!)\n ? getHighestLiquidityV3NativeFewTokenPool(\n fewAmountToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n // If a specific gas token is specified in the provider config\n // fetch the highest liq V3 pool with it and the native currency\n const nativeAndSpecifiedGasTokenV3PoolPromise =\n providerConfig?.gasToken &&\n !providerConfig?.gasToken.equals(nativeCurrency)\n ? getHighestLiquidityV3NativePool(\n providerConfig?.gasToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n // If a specific gas token is specified in the provider config\n // fetch the highest liq V3 pool with it and the native currency\n const fewNativeAndSpecifiedGasTokenV3PoolPromise =\n providerConfig?.gasToken &&\n !providerConfig?.gasToken.equals(fewNativeCurrency!)\n ? getHighestLiquidityV3NativeFewTokenPool(\n providerConfig?.gasToken,\n this.v3PoolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n const [\n usdPool,\n fewUsdPool,\n nativeAndQuoteTokenV3Pool,\n fewNativeAndQuoteTokenV3Pool,\n nativeAndAmountTokenV3Pool,\n fewNativeAndAmountTokenV3Pool,\n nativeAndSpecifiedGasTokenV3Pool,\n fewNativeAndSpecifiedGasTokenV3Pool,\n ] = await Promise.all([\n usdPoolPromise,\n fewUsdPoolPromise,\n nativeAndQuoteTokenV3PoolPromise,\n fewNativeAndQuoteTokenV3PoolPromise,\n nativeAndAmountTokenV3PoolPromise,\n fewNativeAndAmountTokenV3PoolPromise,\n nativeAndSpecifiedGasTokenV3PoolPromise,\n fewNativeAndSpecifiedGasTokenV3PoolPromise,\n ]);\n\n const pools: LiquidityCalculationPools = {\n usdPool: usdPool,\n nativeAndQuoteTokenV3Pool: nativeAndQuoteTokenV3Pool,\n nativeAndAmountTokenV3Pool: nativeAndAmountTokenV3Pool,\n nativeAndSpecifiedGasTokenV3Pool: nativeAndSpecifiedGasTokenV3Pool,\n };\n\n const fewPools: LiquidityCalculationPools = {\n usdPool: fewUsdPool,\n nativeAndQuoteTokenV3Pool: fewNativeAndQuoteTokenV3Pool,\n nativeAndAmountTokenV3Pool: fewNativeAndAmountTokenV3Pool,\n nativeAndSpecifiedGasTokenV3Pool: fewNativeAndSpecifiedGasTokenV3Pool,\n };\n\n const v2GasModelPromise = this.v2Supported?.includes(this.chainId)\n ? this.v2GasModelFactory\n .buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n poolProvider: this.v2PoolProvider,\n token: quoteToken,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n })\n .catch((_) => undefined) // If v2 model throws uncaught exception, we return undefined v2 gas model, so there's a chance v3 route can go through\n : Promise.resolve(undefined);\n\n // uniswap fewtoken\n const fewV2GasModelPromise = this.v2Supported?.includes(this.chainId)\n ? this.v2GasModelFactory\n .buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n poolProvider: this.v2PoolProvider,\n token: fewQuoteToken,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n })\n .catch((_) => undefined) // If v2 model throws uncaught exception, we return undefined v2 gas model, so there's a chance v3 route can go through\n : Promise.resolve(undefined);\n\n const ringFewV2GasModelPromise = this.ringFewV2Supported?.includes(this.chainId)\n ? this.ringFewV2GasModelFactory\n .buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n poolProvider: this.ringFewV2PoolProvider,\n token: quoteToken,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n })\n .catch((_) => undefined) // If v2 model throws uncaught exception, we return undefined v2 gas model, so there's a chance v3 route can go through\n : Promise.resolve(undefined);\n\n const v3GasModelPromise = this.v3GasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider: this.v2PoolProvider,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n });\n\n const fewV3GasModelPromise = this.uniswapFewV3GasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n pools: fewPools,\n amountToken: fewAmountToken,\n quoteToken: fewQuoteToken,\n v2poolProvider: this.v2PoolProvider,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n });\n\n const v4GasModelPromise = this.v4GasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider: this.v2PoolProvider,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n });\n\n const fewV4GasModelPromise = this.uniswapFewV4GasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n pools: fewPools,\n amountToken: fewAmountToken,\n quoteToken: fewQuoteToken,\n v2poolProvider: this.v2PoolProvider,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: providerConfig,\n });\n\n const mixedRouteGasModelPromise =\n this.mixedRouteGasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider: this.v2PoolProvider,\n providerConfig: providerConfig,\n });\n\n const [ringFewV2GasModel, v2GasModel, fewV2GasModel, v3GasModel, fewV3GasModel, v4GasModel, fewV4GasModel, mixedRouteGasModel] =\n await Promise.all([\n ringFewV2GasModelPromise,\n v2GasModelPromise,\n fewV2GasModelPromise,\n v3GasModelPromise,\n fewV3GasModelPromise,\n v4GasModelPromise,\n fewV4GasModelPromise,\n mixedRouteGasModelPromise,\n ]);\n\n metric.putMetric(\n 'GasModelCreation',\n Date.now() - beforeGasModel,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n ringFewV2GasModel: ringFewV2GasModel,\n v2GasModel: v2GasModel,\n fewV2GasModel: fewV2GasModel,\n v3GasModel: v3GasModel,\n fewV3GasModel: fewV3GasModel,\n v4GasModel: v4GasModel,\n fewV4GasModel: fewV4GasModel,\n mixedRouteGasModel: mixedRouteGasModel,\n } as GasModelType;\n }\n\n // Note multiplications here can result in a loss of precision in the amounts (e.g. taking 50% of 101)\n // This is reconcilled at the end of the algorithm by adding any lost precision to one of\n // the splits in the route.\n private getAmountDistribution(\n amount: CurrencyAmount,\n routingConfig: AlphaRouterConfig\n ): [number[], CurrencyAmount[]] {\n const { distributionPercent } = routingConfig;\n const percents = [];\n const amounts = [];\n\n for (let i = 1; i <= 100 / distributionPercent; i++) {\n percents.push(i * distributionPercent);\n amounts.push(amount.multiply(new Fraction(i * distributionPercent, 100)));\n }\n\n return [percents, amounts];\n }\n\n private async buildSwapAndAddMethodParameters(\n trade: Trade<Currency, Currency, TradeType>,\n swapAndAddOptions: SwapAndAddOptions,\n swapAndAddParameters: SwapAndAddParameters\n ): Promise<MethodParameters> {\n const {\n swapOptions: { recipient, slippageTolerance, deadline, inputTokenPermit },\n addLiquidityOptions: addLiquidityConfig,\n } = swapAndAddOptions;\n\n const preLiquidityPosition = swapAndAddParameters.preLiquidityPosition;\n const finalBalanceTokenIn =\n swapAndAddParameters.initialBalanceTokenIn.subtract(trade.inputAmount);\n const finalBalanceTokenOut =\n swapAndAddParameters.initialBalanceTokenOut.add(trade.outputAmount);\n const approvalTypes = await this.swapRouterProvider.getApprovalType(\n finalBalanceTokenIn,\n finalBalanceTokenOut\n );\n const zeroForOne = finalBalanceTokenIn.currency.wrapped.sortsBefore(\n finalBalanceTokenOut.currency.wrapped\n );\n return {\n ...SwapRouter.swapAndAddCallParameters(\n trade,\n {\n recipient,\n slippageTolerance,\n deadlineOrPreviousBlockhash: deadline,\n inputTokenPermit,\n },\n Position.fromAmounts({\n pool: preLiquidityPosition.pool,\n tickLower: preLiquidityPosition.tickLower,\n tickUpper: preLiquidityPosition.tickUpper,\n amount0: zeroForOne\n ? finalBalanceTokenIn.quotient.toString()\n : finalBalanceTokenOut.quotient.toString(),\n amount1: zeroForOne\n ? finalBalanceTokenOut.quotient.toString()\n : finalBalanceTokenIn.quotient.toString(),\n useFullPrecision: false,\n }),\n addLiquidityConfig,\n approvalTypes.approvalTokenIn,\n approvalTypes.approvalTokenOut\n ),\n to: SWAP_ROUTER_02_ADDRESSES(this.chainId),\n };\n }\n\n // @ts-ignore\n private emitPoolSelectionMetrics(\n swapRouteRaw: {\n quote: CurrencyAmount;\n quoteGasAdjusted: CurrencyAmount;\n routes: RouteWithValidQuote[];\n estimatedGasUsed: BigNumber;\n },\n allPoolsBySelection: CandidatePoolsBySelectionCriteria[],\n currencyIn: Currency,\n currencyOut: Currency\n ) {\n const poolAddressesUsed = new Set<string>();\n const { routes: routeAmounts } = swapRouteRaw;\n _(routeAmounts)\n .flatMap((routeAmount) => {\n const { poolIdentifiers: poolAddresses } = routeAmount;\n return poolAddresses;\n })\n .forEach((address: string) => {\n poolAddressesUsed.add(address.toLowerCase());\n });\n\n for (const poolsBySelection of allPoolsBySelection) {\n const { protocol } = poolsBySelection;\n _.forIn(\n poolsBySelection.selections,\n (pools: SubgraphPool[], topNSelection: string) => {\n const topNUsed =\n _.findLastIndex(pools, (pool) =>\n poolAddressesUsed.has(pool.id.toLowerCase())\n ) + 1;\n metric.putMetric(\n _.capitalize(`${protocol}${topNSelection}`),\n topNUsed,\n MetricLoggerUnit.Count\n );\n }\n );\n }\n\n let hasV4Route = false;\n let hasV3Route = false;\n let hasV2Route = false;\n let hasMixedRoute = false;\n for (const routeAmount of routeAmounts) {\n if (routeAmount.protocol === Protocol.V4) {\n hasV4Route = true;\n }\n if (routeAmount.protocol === Protocol.V3) {\n hasV3Route = true;\n }\n if (routeAmount.protocol === Protocol.V2) {\n hasV2Route = true;\n }\n if (routeAmount.protocol === Protocol.MIXED) {\n hasMixedRoute = true;\n }\n }\n\n if (hasMixedRoute && (hasV4Route || hasV3Route || hasV2Route)) {\n let metricsPrefix = 'Mixed';\n\n if (hasV4Route) {\n metricsPrefix += 'AndV4';\n }\n\n if (hasV3Route) {\n metricsPrefix += 'AndV3';\n }\n\n if (hasV2Route) {\n metricsPrefix += 'AndV2';\n }\n\n metric.putMetric(`${metricsPrefix}SplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `${metricsPrefix}SplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n if (hasV4Route && (currencyIn.isNative || currencyOut.isNative)) {\n // Keep track of this edge case https://linear.app/uniswap/issue/ROUTE-303/tech-debt-split-route-can-have-different-ethweth-input-or-output#comment-bba53758\n metric.putMetric(\n `${metricsPrefix}SplitRouteWithNativeToken`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `${metricsPrefix}SplitRouteWithNativeTokenForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n } else if (hasV4Route && hasV3Route && hasV2Route) {\n metric.putMetric(`V4AndV3AndV2SplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V4AndV3AndV2SplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n if (currencyIn.isNative || currencyOut.isNative) {\n // Keep track of this edge case https://linear.app/uniswap/issue/ROUTE-303/tech-debt-split-route-can-have-different-ethweth-input-or-output#comment-bba53758\n metric.putMetric(\n `V4AndV3AndV2SplitRouteWithNativeToken`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `V4AndV3AndV2SplitRouteWithNativeTokenForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n } else if (hasMixedRoute) {\n if (routeAmounts.length > 1) {\n metric.putMetric(`MixedSplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `MixedSplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(`MixedRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `MixedRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n } else if (hasV4Route) {\n if (routeAmounts.length > 1) {\n metric.putMetric(`V4SplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V4SplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n } else if (hasV3Route) {\n if (routeAmounts.length > 1) {\n metric.putMetric(`V3SplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V3SplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(`V3Route`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V3RouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n } else if (hasV2Route) {\n if (routeAmounts.length > 1) {\n metric.putMetric(`V2SplitRoute`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V2SplitRouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(`V2Route`, 1, MetricLoggerUnit.Count);\n metric.putMetric(\n `V2RouteForChain${this.chainId}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n }\n }\n\n private calculateOptimalRatio(\n position: Position,\n sqrtRatioX96: JSBI,\n zeroForOne: boolean\n ): Fraction {\n const upperSqrtRatioX96 = TickMath.getSqrtRatioAtTick(position.tickUpper);\n const lowerSqrtRatioX96 = TickMath.getSqrtRatioAtTick(position.tickLower);\n\n // returns Fraction(0, 1) for any out of range position regardless of zeroForOne. Implication: function\n // cannot be used to determine the trading direction of out of range positions.\n if (\n JSBI.greaterThan(sqrtRatioX96, upperSqrtRatioX96) ||\n JSBI.lessThan(sqrtRatioX96, lowerSqrtRatioX96)\n ) {\n return new Fraction(0, 1);\n }\n\n const precision = JSBI.BigInt('1' + '0'.repeat(18));\n let optimalRatio = new Fraction(\n SqrtPriceMath.getAmount0Delta(\n sqrtRatioX96,\n upperSqrtRatioX96,\n precision,\n true\n ),\n SqrtPriceMath.getAmount1Delta(\n sqrtRatioX96,\n lowerSqrtRatioX96,\n precision,\n true\n )\n );\n if (!zeroForOne) optimalRatio = optimalRatio.invert();\n return optimalRatio;\n }\n\n public async userHasSufficientBalance(\n fromAddress: string,\n tradeType: TradeType,\n amount: CurrencyAmount,\n quote: CurrencyAmount\n ): Promise<boolean> {\n try {\n const neededBalance =\n tradeType === TradeType.EXACT_INPUT ? amount : quote;\n let balance;\n if (neededBalance.currency.isNative) {\n balance = await this.provider.getBalance(fromAddress);\n } else {\n const tokenContract = Erc20__factory.connect(\n neededBalance.currency.address,\n this.provider\n );\n balance = await tokenContract.balanceOf(fromAddress);\n }\n return balance.gte(BigNumber.from(neededBalance.quotient.toString()));\n } catch (e) {\n log.error(e, 'Error while checking user balance');\n return false;\n }\n }\n\n private absoluteValue(fraction: Fraction): Fraction {\n const numeratorAbs = JSBI.lessThan(fraction.numerator, JSBI.BigInt(0))\n ? JSBI.unaryMinus(fraction.numerator)\n : fraction.numerator;\n const denominatorAbs = JSBI.lessThan(fraction.denominator, JSBI.BigInt(0))\n ? JSBI.unaryMinus(fraction.denominator)\n : fraction.denominator;\n return new Fraction(numeratorAbs, denominatorAbs);\n }\n\n private getBlockNumberPromise(): number | Promise<number> {\n return retry(\n async (_b, attempt) => {\n if (attempt > 1) {\n log.info(`Get block number attempt ${attempt}`);\n }\n return this.provider.getBlockNumber();\n },\n {\n retries: 2,\n minTimeout: 100,\n maxTimeout: 1000,\n }\n );\n }\n\n // If we are requesting URv1.2, we need to keep entering cache\n // We want to skip cached routes access whenever \"intent === INTENT.CACHING\" or \"hooksOption !== HooksOption.HOOKS_INCLUSIVE\"\n // We keep this method as we might want to add more conditions in the future.\n public static isAllowedToEnterCachedRoutes(\n intent?: INTENT,\n hooksOptions?: HooksOptions,\n swapRouter?: boolean\n ): boolean {\n // intent takes highest precedence, as we need to ensure during caching intent, we do not enter cache no matter what\n if (intent !== undefined && intent === INTENT.CACHING) {\n return false;\n }\n\n // in case we have URv1.2 request during QUOTE intent, we assume cached routes correctly returns mixed route w/o v4, if mixed is best\n // or v2/v3 is the best.\n // implicitly it means hooksOptions no longer matters for URv1.2\n // swapRouter has higher precedence than hooksOptions, because in case of URv1.2, we set hooksOptions = NO_HOOKS as default,\n // but swapRouter does not have any v4 pool for routing, so swapRouter should always use caching during QUOTE intent.\n if (swapRouter) {\n return true;\n }\n\n // in case we have URv2.0, and we are in QUOTE intent, we only want to enter cache when hooksOptions is default, HOOKS_INCLUSIVE\n if (\n hooksOptions !== undefined &&\n hooksOptions !== HooksOptions.HOOKS_INCLUSIVE\n ) {\n return false;\n }\n\n return true;\n }\n}\n"]}