@ring-protocol/smart-order-router 0.5.1 → 0.5.2
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.
- package/build/main/routers/alpha-router/alpha-router.js +1 -4
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/util/methodParameters.js +1 -3
- package/build/module/routers/alpha-router/alpha-router.js +1 -4
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/methodParameters.js +1 -3
- package/package.json +5 -5
- package/build/main/index.js.map +0 -1
- package/build/main/providers/cache-node.js.map +0 -1
- package/build/main/providers/cache.js.map +0 -1
- package/build/main/providers/caching/route/index.js.map +0 -1
- package/build/main/providers/caching/route/model/cache-mode.js.map +0 -1
- package/build/main/providers/caching/route/model/cached-route.js.map +0 -1
- package/build/main/providers/caching/route/model/cached-routes.js.map +0 -1
- package/build/main/providers/caching/route/model/index.js.map +0 -1
- package/build/main/providers/caching/route/route-caching-provider.js.map +0 -1
- package/build/main/providers/caching-gas-provider.js.map +0 -1
- package/build/main/providers/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/caching-token-list-provider.js.map +0 -1
- package/build/main/providers/caching-token-provider.js.map +0 -1
- package/build/main/providers/eip-1559-gas-price-provider.js.map +0 -1
- package/build/main/providers/eth-estimate-gas-provider.js.map +0 -1
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-pool-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-quote-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/fewV2/ring-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/gas-price-provider.js.map +0 -1
- package/build/main/providers/index.js.map +0 -1
- package/build/main/providers/legacy-gas-price-provider.js.map +0 -1
- package/build/main/providers/multicall-provider.js.map +0 -1
- package/build/main/providers/multicall-ringswap-provider.js.map +0 -1
- package/build/main/providers/multicall-uniswap-provider.js.map +0 -1
- package/build/main/providers/on-chain-gas-price-provider.js.map +0 -1
- package/build/main/providers/on-chain-quote-provider.js.map +0 -1
- package/build/main/providers/pool-provider.js.map +0 -1
- package/build/main/providers/portion-provider.js.map +0 -1
- package/build/main/providers/provider.js.map +0 -1
- package/build/main/providers/simulation-provider.js.map +0 -1
- package/build/main/providers/static-gas-price-provider.js.map +0 -1
- package/build/main/providers/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/subgraph-provider.js.map +0 -1
- package/build/main/providers/swap-router-provider.js.map +0 -1
- package/build/main/providers/tenderly-simulation-provider.js.map +0 -1
- package/build/main/providers/token-fee-fetcher.js.map +0 -1
- package/build/main/providers/token-properties-provider.js.map +0 -1
- package/build/main/providers/token-provider.js.map +0 -1
- package/build/main/providers/token-validator-provider.js.map +0 -1
- package/build/main/providers/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v2/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/pool-provider.js.map +0 -1
- package/build/main/providers/v2/quote-provider.js.map +0 -1
- package/build/main/providers/v2/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v2/subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v3/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/gas-data-provider.js.map +0 -1
- package/build/main/providers/v3/pool-provider.js.map +0 -1
- package/build/main/providers/v3/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v3/subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v4/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/pool-provider.js.map +0 -1
- package/build/main/providers/v4/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v4/subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/uri-subgraph-provider.js.map +0 -1
- package/build/main/routers/alpha-router/alpha-router.js.map +0 -1
- package/build/main/routers/alpha-router/config.js.map +0 -1
- package/build/main/routers/alpha-router/entities/index.js.map +0 -1
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +0 -1
- package/build/main/routers/alpha-router/functions/best-swap-route.js.map +0 -1
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +0 -1
- package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +0 -1
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/index.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/base-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +0 -1
- package/build/main/routers/index.js.map +0 -1
- package/build/main/routers/legacy-router/bases.js.map +0 -1
- package/build/main/routers/legacy-router/index.js.map +0 -1
- package/build/main/routers/legacy-router/legacy-router.js.map +0 -1
- package/build/main/routers/router.js.map +0 -1
- package/build/main/types/other/commons.js.map +0 -1
- package/build/main/types/other/factories/Erc20__factory.js.map +0 -1
- package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +0 -1
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +0 -1
- package/build/main/types/other/factories/ITokenValidator__factory.js.map +0 -1
- package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +0 -1
- package/build/main/types/other/factories/Permit2__factory.js.map +0 -1
- package/build/main/types/other/factories/StateView__factory.js.map +0 -1
- package/build/main/types/other/factories/SwapRouter02__factory.js.map +0 -1
- package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +0 -1
- package/build/main/types/other/factories/V4Quoter__factory.js.map +0 -1
- package/build/main/types/v2/commons.js.map +0 -1
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +0 -1
- package/build/main/types/v3/commons.js.map +0 -1
- package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +0 -1
- package/build/main/types/v3/factories/IQuoterV2__factory.js.map +0 -1
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +0 -1
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +0 -1
- package/build/main/util/addresses.js.map +0 -1
- package/build/main/util/amounts.js.map +0 -1
- package/build/main/util/callData.js.map +0 -1
- package/build/main/util/chains.js.map +0 -1
- package/build/main/util/defaultBlocksToLive.js.map +0 -1
- package/build/main/util/fewAddress.js.map +0 -1
- package/build/main/util/gas-factory-helpers.js.map +0 -1
- package/build/main/util/hooksOptions.js.map +0 -1
- package/build/main/util/index.js.map +0 -1
- package/build/main/util/intent.js.map +0 -1
- package/build/main/util/l2FeeChains.js.map +0 -1
- package/build/main/util/log.js.map +0 -1
- package/build/main/util/methodParameters.js.map +0 -1
- package/build/main/util/metric.js.map +0 -1
- package/build/main/util/mixedRouteFilterOutV4Pools.js.map +0 -1
- package/build/main/util/onchainQuoteProviderConfigs.js.map +0 -1
- package/build/main/util/pool.js.map +0 -1
- package/build/main/util/protocols.js.map +0 -1
- package/build/main/util/routes.js.map +0 -1
- package/build/main/util/serializeRouteIds.js.map +0 -1
- package/build/main/util/simple-perf-tracker.js.map +0 -1
- package/build/main/util/tenderlySimulationErrorBreakDown.js.map +0 -1
- package/build/main/util/unsupported-tokens.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-candidate-pools.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/functions/get-candidate-pools.ts"],"names":[],"mappings":"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","sourcesContent":["import { ADDRESS_ZERO, Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token, TradeType } from '@fewprotocol/sdk-core';\nimport { FeeAmount } from '@fewprotocol/uniswap-v3-sdk';\nimport _ from 'lodash';\n\nimport { isNativeCurrency } from '@fewprotocol/universal-router-sdk';\nimport {\n ITokenListProvider,\n IV2SubgraphProvider,\n IV4PoolProvider,\n IV4SubgraphProvider,\n V2SubgraphPool,\n RingV2SubgraphPool,\n V4PoolAccessor,\n V4SubgraphPool,\n IRingV2SubgraphProvider,\n} from '../../../providers';\nimport {\n CELO,\n CELO_ALFAJORES,\n CEUR_CELO,\n CEUR_CELO_ALFAJORES,\n CUSD_CELO,\n CUSD_CELO_ALFAJORES,\n DAI_ARBITRUM,\n DAI_AVAX,\n DAI_BNB,\n DAI_MAINNET,\n DAI_MOONBEAM,\n DAI_OPTIMISM,\n DAI_OPTIMISM_GOERLI,\n DAI_OPTIMISM_SEPOLIA,\n DAI_POLYGON_MUMBAI,\n DAI_SEPOLIA,\n DAI_UNICHAIN,\n FEI_MAINNET,\n FEW_DAI_ARB_SEPOLIA,\n FEW_DAI_MAINNET,\n FEW_DAI_SEPOLIA,\n FEW_RNG_MAINNET,\n FEW_USDB_BLAST,\n FEW_USDC_MAINNET,\n FEW_USDC_SEPOLIA,\n FEW_USDT_MAINNET,\n FEW_WBTC_MAINNET,\n ITokenProvider,\n USDB_BLAST,\n USDC_ARBITRUM,\n USDC_ARBITRUM_GOERLI,\n USDC_ARBITRUM_SEPOLIA,\n USDC_AVAX,\n USDC_BASE,\n USDC_BASE_SEPOLIA,\n USDC_BNB,\n USDC_ETHEREUM_GNOSIS,\n USDC_MAINNET,\n USDC_MOONBEAM,\n USDC_OPTIMISM,\n USDC_OPTIMISM_GOERLI,\n USDC_OPTIMISM_SEPOLIA,\n USDC_POLYGON,\n USDC_SEPOLIA,\n USDC_SONEIUM,\n USDC_UNICHAIN,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n USDT_OPTIMISM_GOERLI,\n USDT_OPTIMISM_SEPOLIA,\n WBTC_ARBITRUM,\n WBTC_GNOSIS,\n WBTC_MAINNET,\n WBTC_MOONBEAM,\n WBTC_OPTIMISM,\n WBTC_OPTIMISM_GOERLI,\n WBTC_OPTIMISM_SEPOLIA,\n WGLMR_MOONBEAM,\n WMATIC_POLYGON,\n WMATIC_POLYGON_MUMBAI,\n WSTETH_MAINNET,\n WXDAI_GNOSIS,\n} from '../../../providers/token-provider';\nimport {\n IV2PoolProvider,\n V2PoolAccessor,\n} from '../../../providers/v2/pool-provider';\nimport {\n IV3PoolProvider,\n V3PoolAccessor,\n} from '../../../providers/v3/pool-provider';\nimport {\n IV3SubgraphProvider,\n V3SubgraphPool,\n} from '../../../providers/v3/subgraph-provider';\nimport {\n IRingV2PoolProvider,\n RingFewV2PoolAccessor,\n} from '../../../providers/fewV2/ring-pool-provider';\nimport {\n FEW_WRAPPED_NATIVE_CURRENCY,\n getAddress,\n getAddressLowerCase,\n getApplicableV3FeeAmounts,\n getApplicableV4FeesTickspacingsHooks,\n HooksOptions,\n nativeOnChain,\n unparseFeeAmount,\n WRAPPED_NATIVE_CURRENCY,\n} from '../../../util';\nimport { parseFeeAmount } from '../../../util/amounts';\nimport { log } from '../../../util/log';\nimport { metric, MetricLoggerUnit } from '../../../util/metric';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { isFewToken } from '../../../util/fewAddress';\n\nexport type SubgraphPool = V2SubgraphPool | V3SubgraphPool | V4SubgraphPool;\nexport type CandidatePoolsBySelectionCriteria = {\n protocol: Protocol;\n selections: CandidatePoolsSelections;\n};\nexport type SupportedCandidatePools =\n | RingFewV2CandidatePools\n | V2CandidatePools\n | V3CandidatePools\n | V4CandidatePools;\n\n/// Utility type for allowing us to use `keyof CandidatePoolsSelections` to map\nexport type CandidatePoolsSelections = {\n topByBaseWithTokenIn: SubgraphPool[];\n topByBaseWithTokenOut: SubgraphPool[];\n topByDirectSwapPool: SubgraphPool[];\n topByEthQuoteTokenPool: SubgraphPool[];\n topByTVL: SubgraphPool[];\n topByTVLUsingTokenIn: SubgraphPool[];\n topByTVLUsingTokenOut: SubgraphPool[];\n topByTVLUsingTokenInSecondHops: SubgraphPool[];\n topByTVLUsingTokenOutSecondHops: SubgraphPool[];\n};\n\nexport type MixedCrossLiquidityCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n v2SubgraphProvider: IV2SubgraphProvider;\n v3SubgraphProvider: IV3SubgraphProvider;\n v2Candidates?: V2CandidatePools;\n v3Candidates?: V3CandidatePools;\n v4Candidates?: V4CandidatePools;\n blockNumber?: number | Promise<number>;\n};\n\nexport type V4GetCandidatePoolsParams = {\n currencyIn: Currency;\n currencyOut: Currency;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV4SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV4PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n v4PoolParams?: Array<[number, number, string]>;\n};\n\nexport type UniswapFewTokenV4GetCandidatePoolsParams = {\n currencyIn: Currency;\n currencyOut: Currency;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV4SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV4PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n v4PoolParams?: Array<[number, number, string]>;\n};\n\nexport type V3GetCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV3SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV3PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nexport type UniswapFewTokenV3GetCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV3SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV3PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nexport type V2GetCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV2SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV2PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nexport type UniswapFewV2GetCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IV2SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IV2PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nexport type RingFewV2GetCandidatePoolsParams = {\n tokenIn: Token;\n tokenOut: Token;\n routeType: TradeType;\n routingConfig: AlphaRouterConfig;\n subgraphProvider: IRingV2SubgraphProvider;\n tokenProvider: ITokenProvider;\n poolProvider: IRingV2PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nexport type MixedRouteGetCandidatePoolsParams = {\n v4CandidatePools: V4CandidatePools | undefined;\n v3CandidatePools: V3CandidatePools | undefined;\n v2CandidatePools: V2CandidatePools | undefined;\n crossLiquidityPools: CrossLiquidityCandidatePools;\n routingConfig: AlphaRouterConfig;\n tokenProvider: ITokenProvider;\n v2poolProvider: IV2PoolProvider;\n v3poolProvider: IV3PoolProvider;\n v4PoolProvider: IV4PoolProvider;\n blockedTokenListProvider?: ITokenListProvider;\n chainId: ChainId;\n};\n\nconst baseTokensByChain: { [chainId in ChainId]?: Token[] } = {\n [ChainId.MAINNET]: [\n USDC_MAINNET,\n USDT_MAINNET,\n WBTC_MAINNET,\n DAI_MAINNET,\n WRAPPED_NATIVE_CURRENCY[1]!,\n FEI_MAINNET,\n WSTETH_MAINNET,\n ],\n [ChainId.OPTIMISM]: [\n DAI_OPTIMISM,\n USDC_OPTIMISM,\n USDT_OPTIMISM,\n WBTC_OPTIMISM,\n ],\n [ChainId.SEPOLIA]: [DAI_SEPOLIA, USDC_SEPOLIA],\n [ChainId.OPTIMISM_GOERLI]: [\n DAI_OPTIMISM_GOERLI,\n USDC_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n WBTC_OPTIMISM_GOERLI,\n ],\n [ChainId.OPTIMISM_SEPOLIA]: [\n DAI_OPTIMISM_SEPOLIA,\n USDC_OPTIMISM_SEPOLIA,\n USDT_OPTIMISM_SEPOLIA,\n WBTC_OPTIMISM_SEPOLIA,\n ],\n [ChainId.ARBITRUM_ONE]: [\n DAI_ARBITRUM,\n USDC_ARBITRUM,\n WBTC_ARBITRUM,\n USDT_ARBITRUM,\n ],\n [ChainId.ARBITRUM_GOERLI]: [USDC_ARBITRUM_GOERLI],\n [ChainId.ARBITRUM_SEPOLIA]: [USDC_ARBITRUM_SEPOLIA],\n [ChainId.POLYGON]: [USDC_POLYGON, WMATIC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [DAI_POLYGON_MUMBAI, WMATIC_POLYGON_MUMBAI],\n [ChainId.CELO]: [CUSD_CELO, CEUR_CELO, CELO],\n [ChainId.CELO_ALFAJORES]: [\n CUSD_CELO_ALFAJORES,\n CEUR_CELO_ALFAJORES,\n CELO_ALFAJORES,\n ],\n [ChainId.GNOSIS]: [WBTC_GNOSIS, WXDAI_GNOSIS, USDC_ETHEREUM_GNOSIS],\n [ChainId.MOONBEAM]: [\n DAI_MOONBEAM,\n USDC_MOONBEAM,\n WBTC_MOONBEAM,\n WGLMR_MOONBEAM,\n ],\n [ChainId.BNB]: [DAI_BNB, USDC_BNB, USDT_BNB],\n [ChainId.AVALANCHE]: [DAI_AVAX, USDC_AVAX],\n [ChainId.BASE]: [USDC_BASE],\n [ChainId.BLAST]: [WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!, USDB_BLAST],\n [ChainId.ZORA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA]!],\n [ChainId.ZKSYNC]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC]!],\n [ChainId.WORLDCHAIN]: [WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!],\n [ChainId.UNICHAIN_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA]!,\n ],\n [ChainId.MONAD_TESTNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MONAD_TESTNET]!,\n USDT_MONAD_TESTNET,\n ],\n [ChainId.BASE_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BASE_SEPOLIA]!,\n USDC_BASE_SEPOLIA,\n ],\n [ChainId.UNICHAIN]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!,\n DAI_UNICHAIN,\n USDC_UNICHAIN,\n ],\n [ChainId.SONEIUM]: [USDC_SONEIUM, WRAPPED_NATIVE_CURRENCY[ChainId.SONEIUM]!],\n};\n\nconst fewBaseTokensByChain: { [chainId in ChainId]?: Token[] } = {\n [ChainId.MAINNET]: [\n FEW_USDC_MAINNET,\n FEW_USDT_MAINNET,\n FEW_WBTC_MAINNET,\n FEW_DAI_MAINNET,\n FEW_RNG_MAINNET,\n FEW_WRAPPED_NATIVE_CURRENCY[1]!,\n ],\n [ChainId.OPTIMISM]: [\n DAI_OPTIMISM,\n USDC_OPTIMISM,\n USDT_OPTIMISM,\n WBTC_OPTIMISM,\n ],\n [ChainId.GOERLI]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.GOERLI]!,\n ],\n [ChainId.BLAST]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!,\n FEW_USDB_BLAST,\n ],\n [ChainId.SEPOLIA]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.SEPOLIA]!, FEW_DAI_SEPOLIA, FEW_USDC_SEPOLIA],\n [ChainId.UNICHAIN]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!],\n [ChainId.UNICHAIN_SEPOLIA]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA]!],\n [ChainId.ARBITRUM_SEPOLIA]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_SEPOLIA]!, FEW_DAI_ARB_SEPOLIA],\n [ChainId.OPTIMISM_GOERLI]: [\n DAI_OPTIMISM_GOERLI,\n USDC_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n WBTC_OPTIMISM_GOERLI,\n ],\n [ChainId.ARBITRUM_ONE]: [\n DAI_ARBITRUM,\n USDC_ARBITRUM,\n WBTC_ARBITRUM,\n USDT_ARBITRUM,\n ],\n [ChainId.ARBITRUM_GOERLI]: [USDC_ARBITRUM_GOERLI],\n [ChainId.POLYGON]: [USDC_POLYGON, WMATIC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [DAI_POLYGON_MUMBAI, WMATIC_POLYGON_MUMBAI],\n [ChainId.CELO]: [CUSD_CELO, CEUR_CELO, CELO],\n [ChainId.CELO_ALFAJORES]: [\n CUSD_CELO_ALFAJORES,\n CEUR_CELO_ALFAJORES,\n CELO_ALFAJORES,\n ],\n [ChainId.GNOSIS]: [WBTC_GNOSIS, WXDAI_GNOSIS, USDC_ETHEREUM_GNOSIS],\n [ChainId.MOONBEAM]: [\n DAI_MOONBEAM,\n USDC_MOONBEAM,\n WBTC_MOONBEAM,\n WGLMR_MOONBEAM,\n ],\n [ChainId.BNB]: [DAI_BNB, USDC_BNB, USDT_BNB],\n [ChainId.AVALANCHE]: [DAI_AVAX, USDC_AVAX],\n [ChainId.BASE]: [USDC_BASE],\n};\n\nclass SubcategorySelectionPools<SubgraphPool> {\n constructor(\n public pools: SubgraphPool[],\n public readonly poolsNeeded: number\n ) { }\n\n public hasEnoughPools(): boolean {\n return this.pools.length >= this.poolsNeeded;\n }\n}\n\nexport type CrossLiquidityCandidatePools = {\n v2Pools: V2SubgraphPool[];\n v3Pools: V3SubgraphPool[];\n};\n\n/**\n * Function that finds any missing pools that were not selected by the heuristic but that would\n * create a route with the topPool by TVL with either tokenIn or tokenOut across protocols.\n *\n * e.g. In V2CandidatePools we found that wstETH/DOG is the most liquid pool,\n * then in V3CandidatePools ETH/wstETH is *not* the most liquid pool, so it is not selected\n * This process will look for that pool in order to complete the route.\n *\n */\nexport async function getMixedCrossLiquidityCandidatePools({\n tokenIn,\n tokenOut,\n blockNumber,\n v2SubgraphProvider,\n v3SubgraphProvider,\n v2Candidates,\n v3Candidates,\n}: MixedCrossLiquidityCandidatePoolsParams): Promise<CrossLiquidityCandidatePools> {\n const v2Pools = (\n await v2SubgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n })\n ).sort((a, b) => b.reserve - a.reserve);\n const v3Pools = (\n await v3SubgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n })\n ).sort((a, b) => b.tvlUSD - a.tvlUSD);\n\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const v2SelectedPools = findCrossProtocolMissingPools(\n tokenInAddress,\n tokenOutAddress,\n v2Pools,\n v2Candidates,\n v3Candidates\n );\n\n const v3SelectedPools = findCrossProtocolMissingPools(\n tokenInAddress,\n tokenOutAddress,\n v3Pools,\n v3Candidates,\n v2Candidates\n );\n\n const selectedV2Pools = [\n v2SelectedPools.forTokenIn,\n v2SelectedPools.forTokenOut,\n ].filter((pool) => pool !== undefined) as V2SubgraphPool[];\n const selectedV3Pools = [\n v3SelectedPools.forTokenIn,\n v3SelectedPools.forTokenOut,\n ].filter((pool) => pool !== undefined) as V3SubgraphPool[];\n\n return {\n v2Pools: selectedV2Pools,\n v3Pools: selectedV3Pools,\n };\n}\n\nfunction findCrossProtocolMissingPools<\n TSubgraphPool extends SubgraphPool,\n CandidatePoolsProtocolToSearch extends V2CandidatePools | V3CandidatePools,\n CandidatePoolsContextualProtocol extends V2CandidatePools | V3CandidatePools\n>(\n tokenInAddress: string,\n tokenOutAddress: string,\n pools: TSubgraphPool[],\n candidatesInProtocolToSearch: CandidatePoolsProtocolToSearch | undefined,\n candidatesInContextProtocol: CandidatePoolsContextualProtocol | undefined\n): {\n forTokenIn?: TSubgraphPool;\n forTokenOut?: TSubgraphPool;\n} {\n const selectedPools: {\n forTokenIn?: TSubgraphPool;\n forTokenOut?: TSubgraphPool;\n } = {};\n const previouslySelectedPools = new Set(\n candidatesInProtocolToSearch?.subgraphPools.map((pool) => pool.id) ?? []\n );\n\n const topPoolByTvlWithTokenOut =\n candidatesInContextProtocol?.candidatePools.selections\n .topByTVLUsingTokenOut[0];\n const crossTokenAgainstTokenOut =\n topPoolByTvlWithTokenOut?.token0.id.toLowerCase() === tokenOutAddress\n ? topPoolByTvlWithTokenOut?.token1.id.toLowerCase()\n : topPoolByTvlWithTokenOut?.token0.id.toLowerCase();\n\n const topPoolByTvlWithTokenIn =\n candidatesInContextProtocol?.candidatePools.selections\n .topByTVLUsingTokenIn[0];\n const crossTokenAgainstTokenIn =\n topPoolByTvlWithTokenIn?.token0.id.toLowerCase() === tokenInAddress\n ? topPoolByTvlWithTokenIn?.token1.id.toLowerCase()\n : topPoolByTvlWithTokenIn?.token0.id.toLowerCase();\n\n for (const pool of pools) {\n // If we already found both pools for tokenIn and tokenOut. break out of this for loop.\n if (\n selectedPools.forTokenIn !== undefined &&\n selectedPools.forTokenOut !== undefined\n ) {\n break;\n }\n\n // If the pool has already been selected. continue to the next pool.\n if (previouslySelectedPools.has(pool.id.toLowerCase())) {\n continue;\n }\n\n const poolToken0Address = pool.token0.id.toLowerCase();\n const poolToken1Address = pool.token1.id.toLowerCase();\n\n // If we haven't selected the pool for tokenIn, and we found a pool matching the tokenOut, and the intermediateToken, select this pool\n if (\n selectedPools.forTokenIn === undefined &&\n ((poolToken0Address === tokenOutAddress &&\n poolToken1Address === crossTokenAgainstTokenIn) ||\n (poolToken1Address === tokenOutAddress &&\n poolToken0Address === crossTokenAgainstTokenIn))\n ) {\n selectedPools.forTokenIn = pool;\n }\n\n // If we haven't selected the pool for tokenOut, and we found a pool matching the tokenIn, and the intermediateToken, select this pool\n if (\n selectedPools.forTokenOut === undefined &&\n ((poolToken0Address === tokenInAddress &&\n poolToken1Address === crossTokenAgainstTokenOut) ||\n (poolToken1Address === tokenInAddress &&\n poolToken0Address === crossTokenAgainstTokenOut))\n ) {\n selectedPools.forTokenOut = pool;\n }\n }\n\n return selectedPools;\n}\n\nexport type UniswapFewTokenV4CandidatePools = {\n poolAccessor: V4PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V4SubgraphPool[];\n};\n\nexport type V4CandidatePools = {\n poolAccessor: V4PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V4SubgraphPool[];\n};\n\n// TODO: ROUTE-241 - refactor getV3CandidatePools against getV4CandidatePools\nexport async function getV4CandidatePools({\n currencyIn,\n currencyOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n v4PoolParams = getApplicableV4FeesTickspacingsHooks(chainId),\n}: V4GetCandidatePoolsParams): Promise<V4CandidatePools> {\n const {\n blockNumber,\n v4PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n topNSecondHopForTokenAddress,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = getAddressLowerCase(currencyIn);\n const tokenOutAddress = getAddressLowerCase(currencyOut);\n\n const beforeSubgraphPools = Date.now();\n\n const allPools = await subgraphProvider.getPools(currencyIn, currencyOut, {\n blockNumber,\n });\n\n log.info(\n { samplePools: allPools.slice(0, 3) },\n 'Got all pools from V4 subgraph provider'\n );\n\n // Although this is less of an optimization than the V2 equivalent,\n // save some time copying objects by mutating the underlying pool directly.\n for (const pool of allPools) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'V4SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Only consider pools where neither tokens are in the blocked token list.\n let filteredPools: V4SubgraphPool[] = allPools;\n if (blockedTokenListProvider) {\n filteredPools = [];\n for (const pool of allPools) {\n const token0InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token0.id);\n const token1InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token1.id);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n\n filteredPools.push(pool);\n }\n }\n\n // Sort by tvlUSD in descending order\n const subgraphPoolsSorted = filteredPools.sort((a, b) => b.tvlUSD - a.tvlUSD);\n\n log.info(\n `V4 After filtering blocked tokens went from ${allPools.length} to ${subgraphPoolsSorted.length}.`\n );\n\n const poolAddressesSoFar = new Set<string>();\n const addToAddressSet = (pools: V4SubgraphPool[]) => {\n _(pools)\n .map((pool) => pool.id)\n .forEach((poolAddress) => poolAddressesSoFar.add(poolAddress));\n };\n\n const baseTokens = baseTokensByChain[chainId] ?? [];\n\n const topByBaseWithTokenIn = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n const topByBaseWithTokenOut = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n let top2DirectSwapPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n ((subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenInAddress &&\n subgraphPool.token0.id == tokenOutAddress))\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNDirectSwaps)\n .value();\n\n if (\n top2DirectSwapPool.length == 0 &&\n topNDirectSwaps > 0 &&\n routingConfig.hooksOptions !== HooksOptions.HOOKS_ONLY\n ) {\n // If we requested direct swap pools but did not find any in the subgraph query.\n // Optimistically add them into the query regardless. Invalid pools ones will be dropped anyway\n // when we query the pool on-chain. Ensures that new pools for new pairs can be swapped on immediately.\n // Also we need to avoid adding hookless pools into the query, when upstream requested hooksOnly\n top2DirectSwapPool = _.map(\n v4PoolParams as Array<[number, number, string]>,\n (poolParams) => {\n const [fee, tickSpacing, hooks] = poolParams;\n\n const { currency0, currency1, poolId } = poolProvider.getPoolId(\n currencyIn,\n currencyOut,\n fee,\n tickSpacing,\n hooks\n );\n return {\n id: poolId,\n feeTier: fee.toString(),\n tickSpacing: tickSpacing.toString(),\n hooks: hooks,\n liquidity: '10000',\n token0: {\n id: getAddress(currency0),\n },\n token1: {\n id: getAddress(currency1),\n },\n tvlETH: 10000,\n tvlUSD: 10000,\n };\n }\n );\n }\n\n addToAddressSet(top2DirectSwapPool);\n\n const wrappedNativeAddress =\n WRAPPED_NATIVE_CURRENCY[chainId]?.address.toLowerCase();\n\n // Main reason we need this is for gas estimates, only needed if token out is not native.\n // We don't check the seen address set because if we've already added pools for getting native quotes\n // theres no need to add more.\n let top2EthQuoteTokenPool: V4SubgraphPool[] = [];\n if (\n (WRAPPED_NATIVE_CURRENCY[chainId]?.symbol ==\n WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]?.symbol &&\n currencyOut.symbol != 'WETH' &&\n currencyOut.symbol != 'WETH9' &&\n currencyOut.symbol != 'ETH') ||\n (WRAPPED_NATIVE_CURRENCY[chainId]?.symbol == WMATIC_POLYGON.symbol &&\n currencyOut.symbol != 'MATIC' &&\n currencyOut.symbol != 'WMATIC')\n ) {\n top2EthQuoteTokenPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n if (routeType == TradeType.EXACT_INPUT) {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n } else {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n }\n })\n .slice(0, 1)\n .value();\n }\n\n addToAddressSet(top2EthQuoteTokenPool);\n\n const topByTVL = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return !poolAddressesSoFar.has(subgraphPool.id);\n })\n .slice(0, topN)\n .value();\n\n addToAddressSet(topByTVL);\n\n const topByTVLUsingTokenIn = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenIn);\n\n const topByTVLUsingTokenOut = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOut);\n\n const topByTVLUsingTokenInSecondHops = _(topByTVLUsingTokenIn)\n .map((subgraphPool) => {\n return tokenInAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenInSecondHops);\n\n const topByTVLUsingTokenOutSecondHops = _(topByTVLUsingTokenOut)\n .map((subgraphPool) => {\n return tokenOutAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOutSecondHops);\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...top2DirectSwapPool,\n ...top2EthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .compact()\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddresses = _(subgraphPools)\n .flatMap((subgraphPool) => [subgraphPool.token0.id, subgraphPool.token1.id])\n .compact()\n .uniq()\n .value();\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V4 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV4SubgraphPool = (s: V4SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }/${s.feeTier}/${s.tickSpacing}/${s.hooks}`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV4SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV4SubgraphPool),\n topByTVL: topByTVL.map(printV4SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV4SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV4SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV4SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV4SubgraphPool),\n top2DirectSwap: top2DirectSwapPool.map(printV4SubgraphPool),\n top2EthQuotePool: top2EthQuoteTokenPool.map(printV4SubgraphPool),\n },\n `V4 Candidate Pools`\n );\n\n const tokenPairsRaw = _.map<\n V4SubgraphPool,\n [Currency, Currency, number, number, string] | undefined\n >(subgraphPools, (subgraphPool) => {\n // native currency is not erc20 token, therefore there's no way to retrieve native currency metadata as the erc20 token.\n const tokenA = isNativeCurrency(subgraphPool.token0.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = isNativeCurrency(subgraphPool.token1.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = Number(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [\n tokenA,\n tokenB,\n fee,\n Number(subgraphPool.tickSpacing),\n subgraphPool.hooks,\n ];\n });\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V4PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n const poolAccessor = await poolProvider.getPools(tokenPairs, {\n blockNumber,\n });\n\n metric.putMetric(\n 'V4PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V4,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool: top2DirectSwapPool,\n topByEthQuoteTokenPool: top2EthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport async function getUniswapV4FewTokenCandidatePools({\n currencyIn,\n currencyOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n v4PoolParams = getApplicableV4FeesTickspacingsHooks(chainId),\n}: UniswapFewTokenV4GetCandidatePoolsParams): Promise<UniswapFewTokenV4CandidatePools> {\n const {\n blockNumber,\n v4PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n topNSecondHopForTokenAddress,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = getAddressLowerCase(currencyIn);\n const tokenOutAddress = getAddressLowerCase(currencyOut);\n\n const beforeSubgraphPools = Date.now();\n\n const allPools = await subgraphProvider.getPools(currencyIn, currencyOut, {\n blockNumber,\n });\n\n log.info(\n { samplePools: allPools.slice(0, 3) },\n 'Got all pools from V4 subgraph provider'\n );\n\n // Although this is less of an optimization than the V2 equivalent,\n // save some time copying objects by mutating the underlying pool directly.\n for (const pool of allPools) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'V4SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Only consider pools where neither tokens are in the blocked token list.\n let filteredPools: V4SubgraphPool[] = allPools;\n if (blockedTokenListProvider) {\n filteredPools = [];\n for (const pool of allPools) {\n const token0InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token0.id);\n const token1InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token1.id);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n\n filteredPools.push(pool);\n }\n }\n\n // Sort by tvlUSD in descending order\n const subgraphPoolsSorted = filteredPools.sort((a, b) => b.tvlUSD - a.tvlUSD);\n\n log.info(\n `Uniswap Few V4 after filtering blocked tokens went from ${allPools.length} to ${subgraphPoolsSorted.length}.`\n );\n\n const poolAddressesSoFar = new Set<string>();\n const addToAddressSet = (pools: V4SubgraphPool[]) => {\n _(pools)\n .map((pool) => pool.id)\n .forEach((poolAddress) => poolAddressesSoFar.add(poolAddress));\n };\n\n const baseTokens = fewBaseTokensByChain[chainId] ?? [];\n\n const topByBaseWithTokenIn = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n const topByBaseWithTokenOut = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n let top2DirectSwapPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n ((subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenInAddress &&\n subgraphPool.token0.id == tokenOutAddress))\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNDirectSwaps)\n .value();\n\n if (\n top2DirectSwapPool.length == 0 &&\n topNDirectSwaps > 0 &&\n routingConfig.hooksOptions !== HooksOptions.HOOKS_ONLY\n ) {\n // If we requested direct swap pools but did not find any in the subgraph query.\n // Optimistically add them into the query regardless. Invalid pools ones will be dropped anyway\n // when we query the pool on-chain. Ensures that new pools for new pairs can be swapped on immediately.\n // Also we need to avoid adding hookless pools into the query, when upstream requested hooksOnly\n top2DirectSwapPool = _.map(\n v4PoolParams as Array<[number, number, string]>,\n (poolParams) => {\n const [fee, tickSpacing, hooks] = poolParams;\n\n const { currency0, currency1, poolId } = poolProvider.getPoolId(\n currencyIn,\n currencyOut,\n fee,\n tickSpacing,\n hooks\n );\n return {\n id: poolId,\n feeTier: fee.toString(),\n tickSpacing: tickSpacing.toString(),\n hooks: hooks,\n liquidity: '10000',\n token0: {\n id: getAddress(currency0),\n },\n token1: {\n id: getAddress(currency1),\n },\n tvlETH: 10000,\n tvlUSD: 10000,\n };\n }\n );\n }\n\n addToAddressSet(top2DirectSwapPool);\n\n const wrappedNativeAddress =\n FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.address.toLowerCase();\n\n // Main reason we need this is for gas estimates, only needed if token out is not native.\n // We don't check the seen address set because if we've already added pools for getting native quotes\n // theres no need to add more.\n let top2EthQuoteTokenPool: V4SubgraphPool[] = [];\n if (\n (FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.symbol ==\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]?.symbol &&\n currencyOut.symbol != 'WETH' &&\n currencyOut.symbol != 'WETH9' &&\n currencyOut.symbol != 'ETH') ||\n (FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.symbol == WMATIC_POLYGON.symbol &&\n currencyOut.symbol != 'MATIC' &&\n currencyOut.symbol != 'WMATIC')\n ) {\n top2EthQuoteTokenPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n if (routeType == TradeType.EXACT_INPUT) {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n } else {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n }\n })\n .slice(0, 1)\n .value();\n }\n\n addToAddressSet(top2EthQuoteTokenPool);\n\n const topByTVL = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return !poolAddressesSoFar.has(subgraphPool.id);\n })\n .slice(0, topN)\n .value();\n\n addToAddressSet(topByTVL);\n\n const topByTVLUsingTokenIn = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenIn);\n\n const topByTVLUsingTokenOut = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOut);\n\n const topByTVLUsingTokenInSecondHops = _(topByTVLUsingTokenIn)\n .map((subgraphPool) => {\n return tokenInAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenInSecondHops);\n\n const topByTVLUsingTokenOutSecondHops = _(topByTVLUsingTokenOut)\n .map((subgraphPool) => {\n return tokenOutAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .filter((subgraphPool) => {\n // in case of hooks only, it means we want to filter out hookless pools\n if (routingConfig.hooksOptions === HooksOptions.HOOKS_ONLY) {\n return subgraphPool.hooks !== ADDRESS_ZERO;\n }\n // in case of no hooks, it means we want to filter out hook pools\n if (routingConfig.hooksOptions === HooksOptions.NO_HOOKS) {\n return subgraphPool.hooks === ADDRESS_ZERO;\n }\n // otherwise it's the default case, so we just return true\n return true;\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOutSecondHops);\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...top2DirectSwapPool,\n ...top2EthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .compact()\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddresses = _(subgraphPools)\n .flatMap((subgraphPool) => [subgraphPool.token0.id, subgraphPool.token1.id])\n .compact()\n .uniq()\n .value();\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V4 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV4SubgraphPool = (s: V4SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }/${s.feeTier}/${s.tickSpacing}/${s.hooks}`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV4SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV4SubgraphPool),\n topByTVL: topByTVL.map(printV4SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV4SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV4SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV4SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV4SubgraphPool),\n top2DirectSwap: top2DirectSwapPool.map(printV4SubgraphPool),\n top2EthQuotePool: top2EthQuoteTokenPool.map(printV4SubgraphPool),\n },\n `V4 Candidate Pools`\n );\n\n const tokenPairsRaw = _.map<\n V4SubgraphPool,\n [Currency, Currency, number, number, string] | undefined\n >(subgraphPools, (subgraphPool) => {\n // native currency is not erc20 token, therefore there's no way to retrieve native currency metadata as the erc20 token.\n const tokenA = isNativeCurrency(subgraphPool.token0.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = isNativeCurrency(subgraphPool.token1.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = Number(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [\n tokenA,\n tokenB,\n fee,\n Number(subgraphPool.tickSpacing),\n subgraphPool.hooks,\n ];\n });\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V4PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n const poolAccessor = await poolProvider.getPools(tokenPairs, {\n blockNumber,\n });\n\n metric.putMetric(\n 'V4PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V4,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool: top2DirectSwapPool,\n topByEthQuoteTokenPool: top2EthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport type V3CandidatePools = {\n poolAccessor: V3PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V3SubgraphPool[];\n};\n\nexport type UniswapFewTokenV3CandidatePools = {\n poolAccessor: V3PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V3SubgraphPool[];\n};\n\nexport async function getV3CandidatePools({\n tokenIn,\n tokenOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n}: V3GetCandidatePoolsParams): Promise<V3CandidatePools> {\n const {\n blockNumber,\n v3PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n topNSecondHopForTokenAddress,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const beforeSubgraphPools = Date.now();\n\n const allPools = await subgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n });\n\n log.info(\n { samplePools: allPools.slice(0, 3) },\n 'Got all pools from V3 subgraph provider'\n );\n\n // Although this is less of an optimization than the V2 equivalent,\n // save some time copying objects by mutating the underlying pool directly.\n for (const pool of allPools) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'V3SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Only consider pools where neither tokens are in the blocked token list.\n let filteredPools: V3SubgraphPool[] = allPools;\n if (blockedTokenListProvider) {\n filteredPools = [];\n for (const pool of allPools) {\n const token0InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token0.id);\n const token1InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token1.id);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n\n filteredPools.push(pool);\n }\n }\n\n // Sort by tvlUSD in descending order\n const subgraphPoolsSorted = filteredPools.sort((a, b) => b.tvlUSD - a.tvlUSD);\n\n log.info(\n `V3 After filtering blocked tokens went from ${allPools.length} to ${subgraphPoolsSorted.length}.`\n );\n\n const poolAddressesSoFar = new Set<string>();\n const addToAddressSet = (pools: V3SubgraphPool[]) => {\n _(pools)\n .map((pool) => pool.id)\n .forEach((poolAddress) => poolAddressesSoFar.add(poolAddress));\n };\n\n const baseTokens = baseTokensByChain[chainId] ?? [];\n\n const topByBaseWithTokenIn = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n const topByBaseWithTokenOut = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n let top2DirectSwapPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n ((subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenInAddress &&\n subgraphPool.token0.id == tokenOutAddress))\n );\n })\n .slice(0, topNDirectSwaps)\n .value();\n\n if (top2DirectSwapPool.length == 0 && topNDirectSwaps > 0) {\n // We don't want to re-add AMPL token pools for V3 in Mainnet.\n // TODO: ROUTE-347, Remove this check once we have a better way to sync filters from subgraph cronjob <> routing path.\n if (\n !(\n chainId == ChainId.MAINNET &&\n (tokenIn.address.toLowerCase() ===\n '0xd46ba6d942050d489dbd938a2c909a5d5039a161' ||\n tokenOut.address.toLowerCase() ===\n '0xd46ba6d942050d489dbd938a2c909a5d5039a161')\n )\n ) {\n // If we requested direct swap pools but did not find any in the subgraph query.\n // Optimistically add them into the query regardless. Invalid pools ones will be dropped anyway\n // when we query the pool on-chain. Ensures that new pools for new pairs can be swapped on immediately.\n top2DirectSwapPool = _.map(\n getApplicableV3FeeAmounts(chainId),\n (feeAmount) => {\n const { token0, token1, poolAddress } = poolProvider.getPoolAddress(\n tokenIn,\n tokenOut,\n feeAmount\n );\n return {\n id: poolAddress,\n feeTier: unparseFeeAmount(feeAmount),\n liquidity: '10000',\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n tvlETH: 10000,\n tvlUSD: 10000,\n };\n }\n );\n }\n }\n\n addToAddressSet(top2DirectSwapPool);\n\n const wrappedNativeAddress =\n WRAPPED_NATIVE_CURRENCY[chainId]?.address.toLowerCase();\n\n // Main reason we need this is for gas estimates, only needed if token out is not native.\n // We don't check the seen address set because if we've already added pools for getting native quotes\n // theres no need to add more.\n let top2EthQuoteTokenPool: V3SubgraphPool[] = [];\n if (\n (WRAPPED_NATIVE_CURRENCY[chainId]?.symbol ==\n WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]?.symbol &&\n tokenOut.symbol != 'WETH' &&\n tokenOut.symbol != 'WETH9' &&\n tokenOut.symbol != 'ETH') ||\n (WRAPPED_NATIVE_CURRENCY[chainId]?.symbol == WMATIC_POLYGON.symbol &&\n tokenOut.symbol != 'MATIC' &&\n tokenOut.symbol != 'WMATIC')\n ) {\n top2EthQuoteTokenPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n if (routeType == TradeType.EXACT_INPUT) {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n } else {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n }\n })\n .slice(0, 1)\n .value();\n }\n\n addToAddressSet(top2EthQuoteTokenPool);\n\n const topByTVL = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return !poolAddressesSoFar.has(subgraphPool.id);\n })\n .slice(0, topN)\n .value();\n\n addToAddressSet(topByTVL);\n\n const topByTVLUsingTokenIn = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n );\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenIn);\n\n const topByTVLUsingTokenOut = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n );\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOut);\n\n const topByTVLUsingTokenInSecondHops = _(topByTVLUsingTokenIn)\n .map((subgraphPool) => {\n return tokenInAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenInSecondHops);\n\n const topByTVLUsingTokenOutSecondHops = _(topByTVLUsingTokenOut)\n .map((subgraphPool) => {\n return tokenOutAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOutSecondHops);\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...top2DirectSwapPool,\n ...top2EthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .compact()\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddresses = _(subgraphPools)\n .flatMap((subgraphPool) => [subgraphPool.token0.id, subgraphPool.token1.id])\n .compact()\n .uniq()\n .value();\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V3 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV3SubgraphPool = (s: V3SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }/${s.feeTier}`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV3SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV3SubgraphPool),\n topByTVL: topByTVL.map(printV3SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV3SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV3SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV3SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV3SubgraphPool),\n top2DirectSwap: top2DirectSwapPool.map(printV3SubgraphPool),\n top2EthQuotePool: top2EthQuoteTokenPool.map(printV3SubgraphPool),\n },\n `V3 Candidate Pools`\n );\n\n const tokenPairsRaw = _.map<\n V3SubgraphPool,\n [Token, Token, FeeAmount] | undefined\n >(subgraphPools, (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = parseFeeAmount(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [tokenA, tokenB, fee];\n });\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V3PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n const poolAccessor = await poolProvider.getPools(tokenPairs, {\n blockNumber,\n });\n\n metric.putMetric(\n 'V3PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V3,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool: top2DirectSwapPool,\n topByEthQuoteTokenPool: top2EthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport async function getUniswapFewTokenV3CandidatePools({\n tokenIn,\n tokenOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n}: UniswapFewTokenV3GetCandidatePoolsParams): Promise<UniswapFewTokenV3CandidatePools> {\n const {\n blockNumber,\n v3PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n topNSecondHopForTokenAddress,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const beforeSubgraphPools = Date.now();\n\n const allPools = await subgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n });\n\n log.info(\n { samplePools: allPools.slice(0, 3) },\n 'Got all pools from V3 subgraph provider'\n );\n\n // Although this is less of an optimization than the V2 equivalent,\n // save some time copying objects by mutating the underlying pool directly.\n for (const pool of allPools) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'V3SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Only consider pools where neither tokens are in the blocked token list.\n let filteredPools: V3SubgraphPool[] = allPools;\n if (blockedTokenListProvider) {\n filteredPools = [];\n for (const pool of allPools) {\n const token0InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token0.id);\n const token1InBlocklist =\n await blockedTokenListProvider.hasTokenByAddress(pool.token1.id);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n\n filteredPools.push(pool);\n }\n }\n\n // Sort by tvlUSD in descending order\n const subgraphPoolsSorted = filteredPools.sort((a, b) => b.tvlUSD - a.tvlUSD);\n\n log.info(\n `Uniswap v3 few after filtering blocked tokens went from ${allPools.length} to ${subgraphPoolsSorted.length}.`\n );\n\n const poolAddressesSoFar = new Set<string>();\n const addToAddressSet = (pools: V3SubgraphPool[]) => {\n _(pools)\n .map((pool) => pool.id)\n .forEach((poolAddress) => poolAddressesSoFar.add(poolAddress));\n };\n\n const baseTokens = fewBaseTokensByChain[chainId] ?? [];\n\n const topByBaseWithTokenIn = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n const topByBaseWithTokenOut = _(baseTokens)\n .flatMap((token: Token) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n const tokenAddress = token.address.toLowerCase();\n return (\n (subgraphPool.token0.id == tokenAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithEachBaseToken)\n .value();\n })\n .sortBy((tokenListPool) => -tokenListPool.tvlUSD)\n .slice(0, topNWithBaseToken)\n .value();\n\n let top2DirectSwapPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n ((subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == tokenInAddress &&\n subgraphPool.token0.id == tokenOutAddress))\n );\n })\n .slice(0, topNDirectSwaps)\n .value();\n\n if (top2DirectSwapPool.length == 0 && topNDirectSwaps > 0) {\n // We don't want to re-add AMPL token pools for V3 in Mainnet.\n // TODO: ROUTE-347, Remove this check once we have a better way to sync filters from subgraph cronjob <> routing path.\n if (\n !(\n chainId == ChainId.MAINNET &&\n (tokenIn.address.toLowerCase() ===\n '0xd46ba6d942050d489dbd938a2c909a5d5039a161' ||\n tokenOut.address.toLowerCase() ===\n '0xd46ba6d942050d489dbd938a2c909a5d5039a161')\n )\n ) {\n // If we requested direct swap pools but did not find any in the subgraph query.\n // Optimistically add them into the query regardless. Invalid pools ones will be dropped anyway\n // when we query the pool on-chain. Ensures that new pools for new pairs can be swapped on immediately.\n top2DirectSwapPool = _.map(\n getApplicableV3FeeAmounts(chainId),\n (feeAmount) => {\n const { token0, token1, poolAddress } = poolProvider.getPoolAddress(\n tokenIn,\n tokenOut,\n feeAmount\n );\n return {\n id: poolAddress,\n feeTier: unparseFeeAmount(feeAmount),\n liquidity: '10000',\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n tvlETH: 10000,\n tvlUSD: 10000,\n };\n }\n );\n }\n }\n\n addToAddressSet(top2DirectSwapPool);\n\n const wrappedNativeAddress =\n FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.address.toLowerCase();\n\n // Main reason we need this is for gas estimates, only needed if token out is not native.\n // We don't check the seen address set because if we've already added pools for getting native quotes\n // theres no need to add more.\n let top2EthQuoteTokenPool: V3SubgraphPool[] = [];\n if (\n (FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.symbol ==\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]?.symbol &&\n tokenOut.symbol != 'WETH' &&\n tokenOut.symbol != 'WETH9' &&\n tokenOut.symbol != 'ETH') ||\n (FEW_WRAPPED_NATIVE_CURRENCY[chainId]?.symbol == WMATIC_POLYGON.symbol &&\n tokenOut.symbol != 'MATIC' &&\n tokenOut.symbol != 'WMATIC')\n ) {\n top2EthQuoteTokenPool = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n if (routeType == TradeType.EXACT_INPUT) {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenOutAddress)\n );\n } else {\n return (\n (subgraphPool.token0.id == wrappedNativeAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wrappedNativeAddress &&\n subgraphPool.token0.id == tokenInAddress)\n );\n }\n })\n .slice(0, 1)\n .value();\n }\n\n addToAddressSet(top2EthQuoteTokenPool);\n\n const topByTVL = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return !poolAddressesSoFar.has(subgraphPool.id);\n })\n .slice(0, topN)\n .value();\n\n addToAddressSet(topByTVL);\n\n const topByTVLUsingTokenIn = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n );\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenIn);\n\n const topByTVLUsingTokenOut = _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n );\n })\n .slice(0, topNTokenInOut)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOut);\n\n const topByTVLUsingTokenInSecondHops = _(topByTVLUsingTokenIn)\n .map((subgraphPool) => {\n return tokenInAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenInSecondHops);\n\n const topByTVLUsingTokenOutSecondHops = _(topByTVLUsingTokenOut)\n .map((subgraphPool) => {\n return tokenOutAddress == subgraphPool.token0.id\n ? subgraphPool.token1.id\n : subgraphPool.token0.id;\n })\n .flatMap((secondHopId: string) => {\n return _(subgraphPoolsSorted)\n .filter((subgraphPool) => {\n return (\n !poolAddressesSoFar.has(subgraphPool.id) &&\n !tokensToAvoidOnSecondHops?.includes(secondHopId.toLowerCase()) &&\n (subgraphPool.token0.id == secondHopId ||\n subgraphPool.token1.id == secondHopId)\n );\n })\n .slice(\n 0,\n topNSecondHopForTokenAddress?.get(secondHopId) ?? topNSecondHop\n )\n .value();\n })\n .uniqBy((pool) => pool.id)\n .value();\n\n addToAddressSet(topByTVLUsingTokenOutSecondHops);\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...top2DirectSwapPool,\n ...top2EthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .compact()\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddresses = _(subgraphPools)\n .flatMap((subgraphPool) => [subgraphPool.token0.id, subgraphPool.token1.id])\n .compact()\n .uniq()\n .value();\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V3 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV3SubgraphPool = (s: V3SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }/${s.feeTier}`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV3SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV3SubgraphPool),\n topByTVL: topByTVL.map(printV3SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV3SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV3SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV3SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV3SubgraphPool),\n top2DirectSwap: top2DirectSwapPool.map(printV3SubgraphPool),\n top2EthQuotePool: top2EthQuoteTokenPool.map(printV3SubgraphPool),\n },\n `V3 Candidate Pools`\n );\n\n const tokenPairsRaw = _.map<\n V3SubgraphPool,\n [Token, Token, FeeAmount] | undefined\n >(subgraphPools, (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = parseFeeAmount(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [tokenA, tokenB, fee];\n });\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V3PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n const poolAccessor = await poolProvider.getPools(tokenPairs, {\n blockNumber,\n });\n\n metric.putMetric(\n 'V3PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V3,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool: top2DirectSwapPool,\n topByEthQuoteTokenPool: top2EthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport type V2CandidatePools = {\n poolAccessor: V2PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V2SubgraphPool[];\n};\n\nexport type UniswapFewV2CandidatePools = {\n poolAccessor: V2PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: V2SubgraphPool[];\n};\n\nexport async function getV2CandidatePools({\n tokenIn,\n tokenOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n}: V2GetCandidatePoolsParams): Promise<V2CandidatePools> {\n const {\n blockNumber,\n v2PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const beforeSubgraphPools = Date.now();\n\n const allPoolsRaw = await subgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n });\n\n // With tens of thousands of V2 pools, operations that copy pools become costly.\n // Mutate the pool directly rather than creating a new pool / token to optimmize for speed.\n for (const pool of allPoolsRaw) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'V2SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Sort by pool reserve in descending order.\n const subgraphPoolsSorted = allPoolsRaw.sort((a, b) => b.reserve - a.reserve);\n\n const poolAddressesSoFar = new Set<string>();\n\n // Always add the direct swap pool into the mix regardless of if it exists in the subgraph pool list.\n // Ensures that new pools can be swapped on immediately, and that if a pool was filtered out of the\n // subgraph query for some reason (e.g. trackedReserveETH was 0), then we still consider it.\n let topByDirectSwapPool: V2SubgraphPool[] = [];\n if (topNDirectSwaps > 0) {\n const { token0, token1, poolAddress } = poolProvider.getPoolAddress(\n tokenIn,\n tokenOut\n );\n\n poolAddressesSoFar.add(poolAddress.toLowerCase());\n\n topByDirectSwapPool = [\n {\n id: poolAddress,\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n supply: 10000, // Not used. Set to arbitrary number.\n reserve: 10000, // Not used. Set to arbitrary number.\n reserveUSD: 10000, // Not used. Set to arbitrary number.\n },\n ];\n }\n\n const wethAddress = WRAPPED_NATIVE_CURRENCY[chainId]!.address.toLowerCase();\n\n const topByBaseWithTokenInMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByBaseWithTokenOutMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n\n const baseTokens = baseTokensByChain[chainId] ?? [];\n const baseTokensAddresses: Set<string> = new Set();\n\n baseTokens.forEach((token) => {\n const baseTokenAddr = token.address.toLowerCase();\n\n baseTokensAddresses.add(baseTokenAddr);\n topByBaseWithTokenInMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n topByBaseWithTokenOutMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n });\n\n let topByBaseWithTokenInPoolsFound = 0;\n let topByBaseWithTokenOutPoolsFound = 0;\n\n // Main reason we need this is for gas estimates\n // There can ever only be 1 Token/ETH pool, so we will only look for 1\n let topNEthQuoteToken = 1;\n // but, we only need it if token out is not ETH.\n if (\n tokenOut.symbol == 'WETH' ||\n tokenOut.symbol == 'WETH9' ||\n tokenOut.symbol == 'ETH'\n ) {\n // if it's eth we change the topN to 0, so we can break early from the loop.\n topNEthQuoteToken = 0;\n }\n\n const topByEthQuoteTokenPool: V2SubgraphPool[] = [];\n const topByTVLUsingTokenIn: V2SubgraphPool[] = [];\n const topByTVLUsingTokenOut: V2SubgraphPool[] = [];\n const topByTVL: V2SubgraphPool[] = [];\n\n // Used to track how many iterations we do in the first loop\n let loopsInFirstIteration = 0;\n\n // Filtering step for up to first hop\n // The pools are pre-sorted, so we can just iterate through them and fill our heuristics.\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInFirstIteration += 1;\n // Check if we have satisfied all the heuristics, if so, we can stop.\n if (\n topByBaseWithTokenInPoolsFound >= topNWithBaseToken &&\n topByBaseWithTokenOutPoolsFound >= topNWithBaseToken &&\n topByEthQuoteTokenPool.length >= topNEthQuoteToken &&\n topByTVL.length >= topN &&\n topByTVLUsingTokenIn.length >= topNTokenInOut &&\n topByTVLUsingTokenOut.length >= topNTokenInOut\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n // We've already added this pool, so skip it.\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken0TopByBase &&\n subgraphPool.token0.id != tokenOutAddress &&\n subgraphPool.token1.id == tokenInAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken1TopByBase &&\n subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id != tokenOutAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken0TopByBase &&\n subgraphPool.token0.id != tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken1TopByBase &&\n subgraphPool.token0.id == tokenOutAddress &&\n subgraphPool.token1.id != tokenInAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n // Note: we do not need to check other native currencies for the V2 Protocol\n if (\n topByEthQuoteTokenPool.length < topNEthQuoteToken &&\n ((routeType === TradeType.EXACT_INPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenOutAddress))) ||\n (routeType === TradeType.EXACT_OUTPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenInAddress))))\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByEthQuoteTokenPool.push(subgraphPool);\n continue;\n }\n\n if (topByTVL.length < topN) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVL.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenIn.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenIn.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenOut.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenOut.push(subgraphPool);\n continue;\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInFirstIteration',\n loopsInFirstIteration,\n MetricLoggerUnit.Count\n );\n\n const topByBaseWithTokenIn: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenInSelection of topByBaseWithTokenInMap.values()) {\n topByBaseWithTokenIn.push(...topByBaseWithTokenInSelection.pools);\n }\n\n const topByBaseWithTokenOut: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenOutSelection of topByBaseWithTokenOutMap.values()) {\n topByBaseWithTokenOut.push(...topByBaseWithTokenOutSelection.pools);\n }\n\n // Filtering step for second hops\n const topByTVLUsingTokenInSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByTVLUsingTokenOutSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const tokenInSecondHopAddresses = topByTVLUsingTokenIn\n .filter((pool) => {\n // filtering second hops\n if (tokenInAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenInAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n const tokenOutSecondHopAddresses = topByTVLUsingTokenOut\n .filter((pool) => {\n // filtering second hops\n if (tokenOutAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenOutAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n\n for (const secondHopId of tokenInSecondHopAddresses) {\n topByTVLUsingTokenInSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n for (const secondHopId of tokenOutSecondHopAddresses) {\n topByTVLUsingTokenOutSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n\n // Used to track how many iterations we do in the second loop\n let loopsInSecondIteration = 0;\n\n if (\n tokenInSecondHopAddresses.length > 0 ||\n tokenOutSecondHopAddresses.length > 0\n ) {\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInSecondIteration += 1;\n\n let allTokenInSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenInSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n let allTokenOutSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenOutSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n if (\n allTokenInSecondHopsHaveTheirTopN &&\n allTokenOutSecondHopsHaveTheirTopN\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (tokenInToken0SecondHop && !tokenInToken0SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (tokenInToken1SecondHop && !tokenInToken1SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (\n tokenOutToken0SecondHop &&\n !tokenOutToken0SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (\n tokenOutToken1SecondHop &&\n !tokenOutToken1SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInSecondIteration',\n loopsInSecondIteration,\n MetricLoggerUnit.Count\n );\n\n const topByTVLUsingTokenInSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n topByTVLUsingTokenInSecondHops.push(...secondHopPools.pools);\n }\n\n const topByTVLUsingTokenOutSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n topByTVLUsingTokenOutSecondHops.push(...secondHopPools.pools);\n }\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...topByDirectSwapPool,\n ...topByEthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddressesSet: Set<string> = new Set();\n for (const pool of subgraphPools) {\n tokenAddressesSet.add(pool.token0.id);\n tokenAddressesSet.add(pool.token1.id);\n }\n const tokenAddresses = Array.from(tokenAddressesSet);\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V2 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV2SubgraphPool = (s: V2SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV2SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV2SubgraphPool),\n topByTVL: topByTVL.map(printV2SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV2SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV2SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV2SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV2SubgraphPool),\n top2DirectSwap: topByDirectSwapPool.map(printV2SubgraphPool),\n top2EthQuotePool: topByEthQuoteTokenPool.map(printV2SubgraphPool),\n },\n `V2 Candidate pools`\n );\n\n const tokenPairsRaw = _.map<V2SubgraphPool, [Token, Token] | undefined>(\n subgraphPools,\n (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}`\n );\n return undefined;\n }\n\n return [tokenA, tokenB];\n }\n );\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V2PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n // this should be the only place to enable fee-on-transfer fee fetching,\n // because this places loads pools (pairs of tokens with fot taxes) from the subgraph\n const poolAccessor = await poolProvider.getPools(tokenPairs, routingConfig);\n\n metric.putMetric(\n 'V2PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V2,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool,\n topByEthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport async function getUniswapFewTokenV2CandidatePools({\n tokenIn,\n tokenOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n}: UniswapFewV2GetCandidatePoolsParams): Promise<UniswapFewV2CandidatePools> {\n const {\n blockNumber,\n v2PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const beforeSubgraphPools = Date.now();\n\n const allPoolsRaw = await subgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n });\n\n // With tens of thousands of V2 pools, operations that copy pools become costly.\n // Mutate the pool directly rather than creating a new pool / token to optimmize for speed.\n for (const pool of allPoolsRaw) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'Uniswap FewTokenV2SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Sort by pool reserve in descending order.\n const subgraphPoolsSorted = allPoolsRaw.sort((a, b) => b.reserve - a.reserve);\n\n const poolAddressesSoFar = new Set<string>();\n\n // Always add the direct swap pool into the mix regardless of if it exists in the subgraph pool list.\n // Ensures that new pools can be swapped on immediately, and that if a pool was filtered out of the\n // subgraph query for some reason (e.g. trackedReserveETH was 0), then we still consider it.\n let topByDirectSwapPool: V2SubgraphPool[] = [];\n if (topNDirectSwaps > 0) {\n const { token0, token1, poolAddress } = poolProvider.getPoolAddress(\n tokenIn,\n tokenOut\n );\n\n poolAddressesSoFar.add(poolAddress.toLowerCase());\n\n topByDirectSwapPool = [\n {\n id: poolAddress,\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n supply: 10000, // Not used. Set to arbitrary number.\n reserve: 10000, // Not used. Set to arbitrary number.\n reserveUSD: 10000, // Not used. Set to arbitrary number.\n },\n ];\n }\n\n const wethAddress = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!.address.toLowerCase();\n\n const topByBaseWithTokenInMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByBaseWithTokenOutMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n\n const baseTokens = isFewToken(tokenIn) ? fewBaseTokensByChain[chainId]! : baseTokensByChain[chainId]!;\n const baseTokensAddresses: Set<string> = new Set();\n\n baseTokens.forEach((token) => {\n const baseTokenAddr = token.address.toLowerCase();\n\n baseTokensAddresses.add(baseTokenAddr);\n topByBaseWithTokenInMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n topByBaseWithTokenOutMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n });\n\n let topByBaseWithTokenInPoolsFound = 0;\n let topByBaseWithTokenOutPoolsFound = 0;\n\n // Main reason we need this is for gas estimates\n // There can ever only be 1 Token/ETH pool, so we will only look for 1\n let topNEthQuoteToken = 1;\n // but, we only need it if token out is not ETH.\n if (\n tokenOut.symbol == 'WETH' ||\n tokenOut.symbol == 'WETH9' ||\n tokenOut.symbol == 'ETH'\n ) {\n // if it's eth we change the topN to 0, so we can break early from the loop.\n topNEthQuoteToken = 0;\n }\n\n const topByEthQuoteTokenPool: V2SubgraphPool[] = [];\n const topByTVLUsingTokenIn: V2SubgraphPool[] = [];\n const topByTVLUsingTokenOut: V2SubgraphPool[] = [];\n const topByTVL: V2SubgraphPool[] = [];\n\n // Used to track how many iterations we do in the first loop\n let loopsInFirstIteration = 0;\n\n // Filtering step for up to first hop\n // The pools are pre-sorted, so we can just iterate through them and fill our heuristics.\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInFirstIteration += 1;\n // Check if we have satisfied all the heuristics, if so, we can stop.\n if (\n topByBaseWithTokenInPoolsFound >= topNWithBaseToken &&\n topByBaseWithTokenOutPoolsFound >= topNWithBaseToken &&\n topByEthQuoteTokenPool.length >= topNEthQuoteToken &&\n topByTVL.length >= topN &&\n topByTVLUsingTokenIn.length >= topNTokenInOut &&\n topByTVLUsingTokenOut.length >= topNTokenInOut\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n // We've already added this pool, so skip it.\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken0TopByBase &&\n subgraphPool.token0.id != tokenOutAddress &&\n subgraphPool.token1.id == tokenInAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken1TopByBase &&\n subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id != tokenOutAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken0TopByBase &&\n subgraphPool.token0.id != tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken1TopByBase &&\n subgraphPool.token0.id == tokenOutAddress &&\n subgraphPool.token1.id != tokenInAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n // Note: we do not need to check other native currencies for the V2 Protocol\n if (\n topByEthQuoteTokenPool.length < topNEthQuoteToken &&\n ((routeType === TradeType.EXACT_INPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenOutAddress))) ||\n (routeType === TradeType.EXACT_OUTPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenInAddress))))\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByEthQuoteTokenPool.push(subgraphPool);\n continue;\n }\n\n if (topByTVL.length < topN) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVL.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenIn.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenIn.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenOut.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenOut.push(subgraphPool);\n continue;\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInFirstIteration',\n loopsInFirstIteration,\n MetricLoggerUnit.Count\n );\n\n const topByBaseWithTokenIn: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenInSelection of topByBaseWithTokenInMap.values()) {\n topByBaseWithTokenIn.push(...topByBaseWithTokenInSelection.pools);\n }\n\n const topByBaseWithTokenOut: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenOutSelection of topByBaseWithTokenOutMap.values()) {\n topByBaseWithTokenOut.push(...topByBaseWithTokenOutSelection.pools);\n }\n\n // Filtering step for second hops\n const topByTVLUsingTokenInSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByTVLUsingTokenOutSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const tokenInSecondHopAddresses = topByTVLUsingTokenIn\n .filter((pool) => {\n // filtering second hops\n if (tokenInAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenInAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n const tokenOutSecondHopAddresses = topByTVLUsingTokenOut\n .filter((pool) => {\n // filtering second hops\n if (tokenOutAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenOutAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n\n for (const secondHopId of tokenInSecondHopAddresses) {\n topByTVLUsingTokenInSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n for (const secondHopId of tokenOutSecondHopAddresses) {\n topByTVLUsingTokenOutSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n\n // Used to track how many iterations we do in the second loop\n let loopsInSecondIteration = 0;\n\n if (\n tokenInSecondHopAddresses.length > 0 ||\n tokenOutSecondHopAddresses.length > 0\n ) {\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInSecondIteration += 1;\n\n let allTokenInSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenInSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n let allTokenOutSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenOutSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n if (\n allTokenInSecondHopsHaveTheirTopN &&\n allTokenOutSecondHopsHaveTheirTopN\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (tokenInToken0SecondHop && !tokenInToken0SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (tokenInToken1SecondHop && !tokenInToken1SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (\n tokenOutToken0SecondHop &&\n !tokenOutToken0SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (\n tokenOutToken1SecondHop &&\n !tokenOutToken1SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInSecondIteration',\n loopsInSecondIteration,\n MetricLoggerUnit.Count\n );\n\n const topByTVLUsingTokenInSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n topByTVLUsingTokenInSecondHops.push(...secondHopPools.pools);\n }\n\n const topByTVLUsingTokenOutSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n topByTVLUsingTokenOutSecondHops.push(...secondHopPools.pools);\n }\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...topByDirectSwapPool,\n ...topByEthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddressesSet: Set<string> = new Set();\n for (const pool of subgraphPools) {\n tokenAddressesSet.add(pool.token0.id);\n tokenAddressesSet.add(pool.token1.id);\n }\n const tokenAddresses = Array.from(tokenAddressesSet);\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V2 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV2SubgraphPool = (s: V2SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV2SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV2SubgraphPool),\n topByTVL: topByTVL.map(printV2SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV2SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV2SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV2SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV2SubgraphPool),\n top2DirectSwap: topByDirectSwapPool.map(printV2SubgraphPool),\n top2EthQuotePool: topByEthQuoteTokenPool.map(printV2SubgraphPool),\n },\n `V2 Candidate pools`\n );\n\n const tokenPairsRaw = _.map<V2SubgraphPool, [Token, Token] | undefined>(\n subgraphPools,\n (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}`\n );\n return undefined;\n }\n\n return [tokenA, tokenB];\n }\n );\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V2PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n // this should be the only place to enable fee-on-transfer fee fetching,\n // because this places loads pools (pairs of tokens with fot taxes) from the subgraph\n const poolAccessor = await poolProvider.getPools(tokenPairs, routingConfig);\n\n metric.putMetric(\n 'V2PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V2,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool,\n topByEthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport async function getRingFewV2CandidatePools({\n tokenIn,\n tokenOut,\n routeType,\n routingConfig,\n subgraphProvider,\n tokenProvider,\n poolProvider,\n blockedTokenListProvider,\n chainId,\n}: RingFewV2GetCandidatePoolsParams): Promise<RingFewV2CandidatePools> {\n const {\n blockNumber,\n v2PoolSelection: {\n topN,\n topNDirectSwaps,\n topNTokenInOut,\n topNSecondHop,\n tokensToAvoidOnSecondHops,\n topNWithEachBaseToken,\n topNWithBaseToken,\n },\n } = routingConfig;\n const tokenInAddress = tokenIn.address.toLowerCase();\n const tokenOutAddress = tokenOut.address.toLowerCase();\n\n const beforeSubgraphPools = Date.now();\n\n const allPoolsRaw = await subgraphProvider.getPools(tokenIn, tokenOut, {\n blockNumber,\n });\n\n // With tens of thousands of V2 pools, operations that copy pools become costly.\n // Mutate the pool directly rather than creating a new pool / token to optimmize for speed.\n for (const pool of allPoolsRaw) {\n pool.token0.id = pool.token0.id.toLowerCase();\n pool.token1.id = pool.token1.id.toLowerCase();\n }\n\n metric.putMetric(\n 'Ringswap FewTokenV2SubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsFiltered = Date.now();\n\n // Sort by pool reserve in descending order.\n const subgraphPoolsSorted = allPoolsRaw.sort((a, b) => b.reserve - a.reserve);\n\n const poolAddressesSoFar = new Set<string>();\n\n // Always add the direct swap pool into the mix regardless of if it exists in the subgraph pool list.\n // Ensures that new pools can be swapped on immediately, and that if a pool was filtered out of the\n // subgraph query for some reason (e.g. trackedReserveETH was 0), then we still consider it.\n let topByDirectSwapPool: V2SubgraphPool[] = [];\n if (topNDirectSwaps > 0) {\n const { token0, token1, poolAddress } = poolProvider.getPoolAddress(\n tokenIn,\n tokenOut\n );\n\n poolAddressesSoFar.add(poolAddress.toLowerCase());\n\n topByDirectSwapPool = [\n {\n id: poolAddress,\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n supply: 10000, // Not used. Set to arbitrary number.\n reserve: 10000, // Not used. Set to arbitrary number.\n reserveUSD: 10000, // Not used. Set to arbitrary number.\n },\n ];\n }\n\n const wethAddress = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!.address.toLowerCase();\n\n const topByBaseWithTokenInMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByBaseWithTokenOutMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n\n const baseTokens = fewBaseTokensByChain[chainId] ?? [];\n const baseTokensAddresses: Set<string> = new Set();\n\n baseTokens.forEach((token) => {\n const baseTokenAddr = token.address.toLowerCase();\n\n baseTokensAddresses.add(baseTokenAddr);\n topByBaseWithTokenInMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n topByBaseWithTokenOutMap.set(\n baseTokenAddr,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNWithEachBaseToken)\n );\n });\n\n let topByBaseWithTokenInPoolsFound = 0;\n let topByBaseWithTokenOutPoolsFound = 0;\n\n // Main reason we need this is for gas estimates\n // There can ever only be 1 Token/ETH pool, so we will only look for 1\n let topNEthQuoteToken = 1;\n // but, we only need it if token out is not ETH.\n if (\n tokenOut.symbol == 'WETH' ||\n tokenOut.symbol == 'WETH9' ||\n tokenOut.symbol == 'ETH'\n ) {\n // if it's eth we change the topN to 0, so we can break early from the loop.\n topNEthQuoteToken = 0;\n }\n\n const topByEthQuoteTokenPool: V2SubgraphPool[] = [];\n const topByTVLUsingTokenIn: V2SubgraphPool[] = [];\n const topByTVLUsingTokenOut: V2SubgraphPool[] = [];\n const topByTVL: V2SubgraphPool[] = [];\n\n // Used to track how many iterations we do in the first loop\n let loopsInFirstIteration = 0;\n\n // Filtering step for up to first hop\n // The pools are pre-sorted, so we can just iterate through them and fill our heuristics.\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInFirstIteration += 1;\n // Check if we have satisfied all the heuristics, if so, we can stop.\n if (\n topByBaseWithTokenInPoolsFound >= topNWithBaseToken &&\n topByBaseWithTokenOutPoolsFound >= topNWithBaseToken &&\n topByEthQuoteTokenPool.length >= topNEthQuoteToken &&\n topByTVL.length >= topN &&\n topByTVLUsingTokenIn.length >= topNTokenInOut &&\n topByTVLUsingTokenOut.length >= topNTokenInOut\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n // We've already added this pool, so skip it.\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken0TopByBase &&\n subgraphPool.token0.id != tokenOutAddress &&\n subgraphPool.token1.id == tokenInAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1TopByBase = topByBaseWithTokenInMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenInPoolsFound < topNWithBaseToken &&\n tokenInToken1TopByBase &&\n subgraphPool.token0.id == tokenInAddress &&\n subgraphPool.token1.id != tokenOutAddress\n ) {\n topByBaseWithTokenInPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenIn.length < topNTokenInOut) {\n topByTVLUsingTokenIn.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_OUTPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenInToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token0.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken0TopByBase &&\n subgraphPool.token0.id != tokenInAddress &&\n subgraphPool.token1.id == tokenOutAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token0.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken0TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1TopByBase = topByBaseWithTokenOutMap.get(\n subgraphPool.token1.id\n );\n if (\n topByBaseWithTokenOutPoolsFound < topNWithBaseToken &&\n tokenOutToken1TopByBase &&\n subgraphPool.token0.id == tokenOutAddress &&\n subgraphPool.token1.id != tokenInAddress\n ) {\n topByBaseWithTokenOutPoolsFound += 1;\n poolAddressesSoFar.add(subgraphPool.id);\n if (topByTVLUsingTokenOut.length < topNTokenInOut) {\n topByTVLUsingTokenOut.push(subgraphPool);\n }\n if (\n routeType === TradeType.EXACT_INPUT &&\n subgraphPool.token1.id == wethAddress\n ) {\n topByEthQuoteTokenPool.push(subgraphPool);\n }\n tokenOutToken1TopByBase.pools.push(subgraphPool);\n continue;\n }\n\n // Note: we do not need to check other native currencies for the V2 Protocol\n if (\n topByEthQuoteTokenPool.length < topNEthQuoteToken &&\n ((routeType === TradeType.EXACT_INPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenOutAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenOutAddress))) ||\n (routeType === TradeType.EXACT_OUTPUT &&\n ((subgraphPool.token0.id == wethAddress &&\n subgraphPool.token1.id == tokenInAddress) ||\n (subgraphPool.token1.id == wethAddress &&\n subgraphPool.token0.id == tokenInAddress))))\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByEthQuoteTokenPool.push(subgraphPool);\n continue;\n }\n\n if (topByTVL.length < topN) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVL.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenIn.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenInAddress ||\n subgraphPool.token1.id == tokenInAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenIn.push(subgraphPool);\n continue;\n }\n\n if (\n topByTVLUsingTokenOut.length < topNTokenInOut &&\n (subgraphPool.token0.id == tokenOutAddress ||\n subgraphPool.token1.id == tokenOutAddress)\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n topByTVLUsingTokenOut.push(subgraphPool);\n continue;\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInFirstIteration',\n loopsInFirstIteration,\n MetricLoggerUnit.Count\n );\n\n const topByBaseWithTokenIn: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenInSelection of topByBaseWithTokenInMap.values()) {\n topByBaseWithTokenIn.push(...topByBaseWithTokenInSelection.pools);\n }\n\n const topByBaseWithTokenOut: V2SubgraphPool[] = [];\n for (const topByBaseWithTokenOutSelection of topByBaseWithTokenOutMap.values()) {\n topByBaseWithTokenOut.push(...topByBaseWithTokenOutSelection.pools);\n }\n\n // Filtering step for second hops\n const topByTVLUsingTokenInSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const topByTVLUsingTokenOutSecondHopsMap: Map<\n string,\n SubcategorySelectionPools<V2SubgraphPool>\n > = new Map();\n const tokenInSecondHopAddresses = topByTVLUsingTokenIn\n .filter((pool) => {\n // filtering second hops\n if (tokenInAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenInAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n const tokenOutSecondHopAddresses = topByTVLUsingTokenOut\n .filter((pool) => {\n // filtering second hops\n if (tokenOutAddress === pool.token0.id) {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token1.id.toLowerCase()\n );\n } else {\n return !tokensToAvoidOnSecondHops?.includes(\n pool.token0.id.toLowerCase()\n );\n }\n })\n .map((pool) =>\n tokenOutAddress === pool.token0.id ? pool.token1.id : pool.token0.id\n );\n\n for (const secondHopId of tokenInSecondHopAddresses) {\n topByTVLUsingTokenInSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n for (const secondHopId of tokenOutSecondHopAddresses) {\n topByTVLUsingTokenOutSecondHopsMap.set(\n secondHopId,\n new SubcategorySelectionPools<V2SubgraphPool>([], topNSecondHop)\n );\n }\n\n // Used to track how many iterations we do in the second loop\n let loopsInSecondIteration = 0;\n\n if (\n tokenInSecondHopAddresses.length > 0 ||\n tokenOutSecondHopAddresses.length > 0\n ) {\n for (const subgraphPool of subgraphPoolsSorted) {\n loopsInSecondIteration += 1;\n\n let allTokenInSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenInSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n let allTokenOutSecondHopsHaveTheirTopN = true;\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n if (!secondHopPools.hasEnoughPools()) {\n allTokenOutSecondHopsHaveTheirTopN = false;\n break;\n }\n }\n\n if (\n allTokenInSecondHopsHaveTheirTopN &&\n allTokenOutSecondHopsHaveTheirTopN\n ) {\n // We have satisfied all the heuristics, so we can stop.\n break;\n }\n\n if (poolAddressesSoFar.has(subgraphPool.id)) {\n continue;\n }\n\n // Only consider pools where neither tokens are in the blocked token list.\n if (blockedTokenListProvider) {\n const [token0InBlocklist, token1InBlocklist] = await Promise.all([\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token0.id),\n blockedTokenListProvider.hasTokenByAddress(subgraphPool.token1.id),\n ]);\n\n if (token0InBlocklist || token1InBlocklist) {\n continue;\n }\n }\n\n const tokenInToken0SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (tokenInToken0SecondHop && !tokenInToken0SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenInToken1SecondHop = topByTVLUsingTokenInSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (tokenInToken1SecondHop && !tokenInToken1SecondHop.hasEnoughPools()) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenInToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken0SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token0.id\n );\n\n if (\n tokenOutToken0SecondHop &&\n !tokenOutToken0SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken0SecondHop.pools.push(subgraphPool);\n continue;\n }\n\n const tokenOutToken1SecondHop = topByTVLUsingTokenOutSecondHopsMap.get(\n subgraphPool.token1.id\n );\n\n if (\n tokenOutToken1SecondHop &&\n !tokenOutToken1SecondHop.hasEnoughPools()\n ) {\n poolAddressesSoFar.add(subgraphPool.id);\n tokenOutToken1SecondHop.pools.push(subgraphPool);\n continue;\n }\n }\n }\n\n metric.putMetric(\n 'V2SubgraphLoopsInSecondIteration',\n loopsInSecondIteration,\n MetricLoggerUnit.Count\n );\n\n const topByTVLUsingTokenInSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenInSecondHopsMap.values()) {\n topByTVLUsingTokenInSecondHops.push(...secondHopPools.pools);\n }\n\n const topByTVLUsingTokenOutSecondHops: V2SubgraphPool[] = [];\n for (const secondHopPools of topByTVLUsingTokenOutSecondHopsMap.values()) {\n topByTVLUsingTokenOutSecondHops.push(...secondHopPools.pools);\n }\n\n const subgraphPools = _([\n ...topByBaseWithTokenIn,\n ...topByBaseWithTokenOut,\n ...topByDirectSwapPool,\n ...topByEthQuoteTokenPool,\n ...topByTVL,\n ...topByTVLUsingTokenIn,\n ...topByTVLUsingTokenOut,\n ...topByTVLUsingTokenInSecondHops,\n ...topByTVLUsingTokenOutSecondHops,\n ])\n .uniqBy((pool) => pool.id)\n .value();\n\n const tokenAddressesSet: Set<string> = new Set();\n for (const pool of subgraphPools) {\n tokenAddressesSet.add(pool.token0.id);\n tokenAddressesSet.add(pool.token1.id);\n }\n const tokenAddresses = Array.from(tokenAddressesSet);\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} V2 pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(tokenAddresses, {\n blockNumber,\n });\n\n const printV2SubgraphPool = (s: V2SubgraphPool) =>\n `${tokenAccessor.getTokenByAddress(s.token0.id)?.symbol ?? s.token0.id}/${tokenAccessor.getTokenByAddress(s.token1.id)?.symbol ?? s.token1.id\n }`;\n\n log.info(\n {\n topByBaseWithTokenIn: topByBaseWithTokenIn.map(printV2SubgraphPool),\n topByBaseWithTokenOut: topByBaseWithTokenOut.map(printV2SubgraphPool),\n topByTVL: topByTVL.map(printV2SubgraphPool),\n topByTVLUsingTokenIn: topByTVLUsingTokenIn.map(printV2SubgraphPool),\n topByTVLUsingTokenOut: topByTVLUsingTokenOut.map(printV2SubgraphPool),\n topByTVLUsingTokenInSecondHops:\n topByTVLUsingTokenInSecondHops.map(printV2SubgraphPool),\n topByTVLUsingTokenOutSecondHops:\n topByTVLUsingTokenOutSecondHops.map(printV2SubgraphPool),\n top2DirectSwap: topByDirectSwapPool.map(printV2SubgraphPool),\n top2EthQuotePool: topByEthQuoteTokenPool.map(printV2SubgraphPool),\n },\n `V2 Candidate pools`\n );\n\n const tokenPairsRaw = _.map<V2SubgraphPool, [Token, Token] | undefined>(\n subgraphPools,\n (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}`\n );\n return undefined;\n }\n\n return [tokenA, tokenB];\n }\n );\n\n const tokenPairs = _.compact(tokenPairsRaw);\n\n metric.putMetric(\n 'V2PoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n // this should be the only place to enable fee-on-transfer fee fetching,\n // because this places loads pools (pairs of tokens with fot taxes) from the subgraph\n const poolAccessor = await poolProvider.getPools(tokenPairs, routingConfig);\n\n metric.putMetric(\n 'V2PoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.V2,\n selections: {\n topByBaseWithTokenIn,\n topByBaseWithTokenOut,\n topByDirectSwapPool,\n topByEthQuoteTokenPool,\n topByTVL,\n topByTVLUsingTokenIn,\n topByTVLUsingTokenOut,\n topByTVLUsingTokenInSecondHops,\n topByTVLUsingTokenOutSecondHops,\n },\n };\n\n return { poolAccessor, candidatePools: poolsBySelection, subgraphPools };\n}\n\nexport type RingFewV2CandidatePools = {\n poolAccessor: RingFewV2PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: RingV2SubgraphPool[];\n};\n\nexport type MixedCandidatePools = {\n V2poolAccessor: V2PoolAccessor;\n V3poolAccessor: V3PoolAccessor;\n V4poolAccessor: V4PoolAccessor;\n candidatePools: CandidatePoolsBySelectionCriteria;\n subgraphPools: SubgraphPool[];\n};\n\nexport async function getMixedRouteCandidatePools({\n v4CandidatePools,\n v3CandidatePools,\n v2CandidatePools,\n crossLiquidityPools,\n routingConfig,\n tokenProvider,\n v4PoolProvider,\n v3poolProvider,\n v2poolProvider,\n chainId,\n}: MixedRouteGetCandidatePoolsParams): Promise<MixedCandidatePools> {\n const beforeSubgraphPools = Date.now();\n const [v4Results, v3Results, v2Results] = [\n v4CandidatePools,\n v3CandidatePools,\n v2CandidatePools,\n ];\n\n // Create empty defaults for undefined results\n const {\n subgraphPools: V4subgraphPools = [],\n candidatePools: V4candidatePools = {\n protocol: Protocol.V4,\n selections: {\n topByBaseWithTokenIn: [],\n topByBaseWithTokenOut: [],\n topByDirectSwapPool: [],\n topByEthQuoteTokenPool: [],\n topByTVL: [],\n topByTVLUsingTokenIn: [],\n topByTVLUsingTokenOut: [],\n topByTVLUsingTokenInSecondHops: [],\n topByTVLUsingTokenOutSecondHops: [],\n },\n },\n } = v4Results || {};\n\n const {\n subgraphPools: V3subgraphPools = [],\n candidatePools: V3candidatePools = {\n protocol: Protocol.V3,\n selections: {\n topByBaseWithTokenIn: [],\n topByBaseWithTokenOut: [],\n topByDirectSwapPool: [],\n topByEthQuoteTokenPool: [],\n topByTVL: [],\n topByTVLUsingTokenIn: [],\n topByTVLUsingTokenOut: [],\n topByTVLUsingTokenInSecondHops: [],\n topByTVLUsingTokenOutSecondHops: [],\n },\n },\n } = v3Results || {};\n\n const {\n subgraphPools: V2subgraphPools = [],\n candidatePools: V2candidatePools = {\n protocol: Protocol.V2,\n selections: {\n topByBaseWithTokenIn: [],\n topByBaseWithTokenOut: [],\n topByDirectSwapPool: [],\n topByEthQuoteTokenPool: [],\n topByTVL: [],\n topByTVLUsingTokenIn: [],\n topByTVLUsingTokenOut: [],\n topByTVLUsingTokenInSecondHops: [],\n topByTVLUsingTokenOutSecondHops: [],\n },\n },\n } = v2Results || {};\n\n // Injects the liquidity pools found by the getMixedCrossLiquidityCandidatePools function\n V2subgraphPools.push(...crossLiquidityPools.v2Pools);\n V3subgraphPools.push(...crossLiquidityPools.v3Pools);\n\n metric.putMetric(\n 'MixedSubgraphPoolsLoad',\n Date.now() - beforeSubgraphPools,\n MetricLoggerUnit.Milliseconds\n );\n const beforePoolsFiltered = Date.now();\n\n /**\n * Main heuristic for pruning mixedRoutes:\n * - we pick V2 pools with higher liq than respective V3 pools, or if the v3 pool doesn't exist\n *\n * This way we can reduce calls to our provider since it's possible to generate a lot of mixed routes\n */\n /// We only really care about pools involving the tokenIn or tokenOut explictly,\n /// since there's no way a long tail token in V2 would be routed through as an intermediary\n const V2topByTVLPoolIds = new Set(\n [\n ...V2candidatePools.selections.topByTVLUsingTokenIn,\n ...V2candidatePools.selections.topByBaseWithTokenIn,\n /// tokenOut:\n ...V2candidatePools.selections.topByTVLUsingTokenOut,\n ...V2candidatePools.selections.topByBaseWithTokenOut,\n /// Direct swap:\n ...V2candidatePools.selections.topByDirectSwapPool,\n // Cross Liquidity (has to be added to be considered):\n ...crossLiquidityPools.v2Pools,\n ].map((poolId) => poolId.id)\n );\n\n const V2topByTVLSortedPools = _(V2subgraphPools)\n .filter((pool) => V2topByTVLPoolIds.has(pool.id))\n .sortBy((pool) => -pool.reserveUSD)\n .value();\n\n /// we consider all returned V3 pools for this heuristic to \"fill in the gaps\"\n const V3sortedPools = _(V3subgraphPools)\n .sortBy((pool) => -pool.tvlUSD)\n .value();\n\n const V4sortedPools = _(V4subgraphPools)\n .sortBy((pool) => -pool.tvlUSD)\n .value();\n\n /// Finding pools with greater reserveUSD on v2 than tvlUSD on v3, or if there is no v3 liquidity\n const buildV2Pools: V2SubgraphPool[] = [];\n V2topByTVLSortedPools.forEach((V2subgraphPool) => {\n const V3subgraphPool = V3sortedPools.find(\n (pool) =>\n (pool.token0.id == V2subgraphPool.token0.id &&\n pool.token1.id == V2subgraphPool.token1.id) ||\n (pool.token0.id == V2subgraphPool.token1.id &&\n pool.token1.id == V2subgraphPool.token0.id)\n );\n\n if (V3subgraphPool) {\n if (V2subgraphPool.reserveUSD > V3subgraphPool.tvlUSD) {\n log.info(\n {\n token0: V2subgraphPool.token0.id,\n token1: V2subgraphPool.token1.id,\n v2reserveUSD: V2subgraphPool.reserveUSD,\n v3tvlUSD: V3subgraphPool.tvlUSD,\n },\n `MixedRoute heuristic, found a V2 pool with higher liquidity than its V3 counterpart`\n );\n buildV2Pools.push(V2subgraphPool);\n }\n } else {\n log.info(\n {\n token0: V2subgraphPool.token0.id,\n token1: V2subgraphPool.token1.id,\n v2reserveUSD: V2subgraphPool.reserveUSD,\n },\n `MixedRoute heuristic, found a V2 pool with no V3 counterpart`\n );\n buildV2Pools.push(V2subgraphPool);\n }\n\n const V4subgraphPool = V4sortedPools.find(\n (pool) =>\n (pool.token0.id == V2subgraphPool.token0.id &&\n pool.token1.id == V2subgraphPool.token1.id) ||\n (pool.token0.id == V2subgraphPool.token1.id &&\n pool.token1.id == V2subgraphPool.token0.id)\n );\n\n if (V4subgraphPool) {\n if (V2subgraphPool.reserveUSD > V4subgraphPool.tvlUSD) {\n log.info(\n {\n token0: V2subgraphPool.token0.id,\n token1: V2subgraphPool.token1.id,\n v2reserveUSD: V2subgraphPool.reserveUSD,\n v4tvlUSD: V4subgraphPool.tvlUSD,\n },\n `MixedRoute heuristic, found a V2 pool with higher liquidity than its V4 counterpart`\n );\n buildV2Pools.push(V2subgraphPool);\n }\n } else {\n log.info(\n {\n token0: V2subgraphPool.token0.id,\n token1: V2subgraphPool.token1.id,\n v2reserveUSD: V2subgraphPool.reserveUSD,\n },\n `MixedRoute heuristic, found a V2 pool with no V3 counterpart`\n );\n buildV2Pools.push(V2subgraphPool);\n }\n });\n\n log.info(\n buildV2Pools.length,\n `Number of V2 candidate pools that fit first heuristic`\n );\n\n const subgraphPools: Array<V2SubgraphPool | V3SubgraphPool | V4SubgraphPool> =\n [...buildV2Pools, ...V3sortedPools, ...V4sortedPools];\n\n const tokenAddresses = _(subgraphPools)\n .flatMap((subgraphPool) => [subgraphPool.token0.id, subgraphPool.token1.id])\n .compact()\n .uniq()\n .value();\n\n log.info(\n `Getting the ${tokenAddresses.length} tokens within the ${subgraphPools.length} pools we are considering`\n );\n\n const tokenAccessor = await tokenProvider.getTokens(\n tokenAddresses,\n routingConfig\n );\n\n const V4tokenPairsRaw = _.map<\n V4SubgraphPool,\n [Currency, Currency, number, number, string] | undefined\n >(V4sortedPools, (subgraphPool) => {\n // native currency is not erc20 token, therefore there's no way to retrieve native currency metadata as the erc20 token.\n const tokenA = isNativeCurrency(subgraphPool.token0.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = isNativeCurrency(subgraphPool.token1.id)\n ? nativeOnChain(chainId)\n : tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = Number(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier}/${subgraphPool.tickSpacing}/${subgraphPool.hooks} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee}/${subgraphPool.tickSpacing}/${subgraphPool.hooks} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [\n tokenA,\n tokenB,\n fee,\n Number(subgraphPool.tickSpacing),\n subgraphPool.hooks,\n ];\n });\n\n const V4tokenPairs = _.compact(V4tokenPairsRaw);\n\n const V3tokenPairsRaw = _.map<\n V3SubgraphPool,\n [Token, Token, FeeAmount] | undefined\n >(V3sortedPools, (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n let fee: FeeAmount;\n try {\n fee = parseFeeAmount(subgraphPool.feeTier);\n } catch (err) {\n log.info(\n { subgraphPool },\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}/${subgraphPool.feeTier} because fee tier not supported`\n );\n return undefined;\n }\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id\n }/${fee} because ${tokenA ? subgraphPool.token1.id : subgraphPool.token0.id\n } not found by token provider`\n );\n return undefined;\n }\n\n return [tokenA, tokenB, fee];\n });\n\n const V3tokenPairs = _.compact(V3tokenPairsRaw);\n\n const V2tokenPairsRaw = _.map<V2SubgraphPool, [Token, Token] | undefined>(\n buildV2Pools,\n (subgraphPool) => {\n const tokenA = tokenAccessor.getTokenByAddress(subgraphPool.token0.id);\n const tokenB = tokenAccessor.getTokenByAddress(subgraphPool.token1.id);\n\n if (!tokenA || !tokenB) {\n log.info(\n `Dropping candidate pool for ${subgraphPool.token0.id}/${subgraphPool.token1.id}`\n );\n return undefined;\n }\n\n return [tokenA, tokenB];\n }\n );\n\n const V2tokenPairs = _.compact(V2tokenPairsRaw);\n\n metric.putMetric(\n 'MixedPoolsFilterLoad',\n Date.now() - beforePoolsFiltered,\n MetricLoggerUnit.Milliseconds\n );\n\n const beforePoolsLoad = Date.now();\n\n const [V2poolAccessor, V3poolAccessor, V4poolAccessor] = await Promise.all([\n v2poolProvider.getPools(V2tokenPairs, routingConfig),\n v3poolProvider.getPools(V3tokenPairs, routingConfig),\n v4PoolProvider.getPools(V4tokenPairs, routingConfig),\n ]);\n\n metric.putMetric(\n 'MixedPoolsLoad',\n Date.now() - beforePoolsLoad,\n MetricLoggerUnit.Milliseconds\n );\n\n /// @dev a bit tricky here since the original V2CandidateSelections object included pools that we may have dropped\n /// as part of the heuristic. We need to reconstruct a new object with the v3 pools too.\n const buildPoolsBySelection = (key: keyof CandidatePoolsSelections) => {\n return [\n ...buildV2Pools.filter((pool) =>\n V2candidatePools.selections[key].map((p) => p.id).includes(pool.id)\n ),\n ...V3candidatePools.selections[key],\n ...V4candidatePools.selections[key],\n ];\n };\n\n const poolsBySelection: CandidatePoolsBySelectionCriteria = {\n protocol: Protocol.MIXED,\n selections: {\n topByBaseWithTokenIn: buildPoolsBySelection('topByBaseWithTokenIn'),\n topByBaseWithTokenOut: buildPoolsBySelection('topByBaseWithTokenOut'),\n topByDirectSwapPool: buildPoolsBySelection('topByDirectSwapPool'),\n topByEthQuoteTokenPool: buildPoolsBySelection('topByEthQuoteTokenPool'),\n topByTVL: buildPoolsBySelection('topByTVL'),\n topByTVLUsingTokenIn: buildPoolsBySelection('topByTVLUsingTokenIn'),\n topByTVLUsingTokenOut: buildPoolsBySelection('topByTVLUsingTokenOut'),\n topByTVLUsingTokenInSecondHops: buildPoolsBySelection(\n 'topByTVLUsingTokenInSecondHops'\n ),\n topByTVLUsingTokenOutSecondHops: buildPoolsBySelection(\n 'topByTVLUsingTokenOutSecondHops'\n ),\n },\n };\n\n return {\n V2poolAccessor,\n V3poolAccessor,\n V4poolAccessor,\n candidatePools: poolsBySelection,\n subgraphPools,\n };\n}\n"]}
|