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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/build/main/index.js.map +1 -0
  2. package/build/main/providers/cache-node.js.map +1 -0
  3. package/build/main/providers/cache.js.map +1 -0
  4. package/build/main/providers/caching/route/index.js.map +1 -0
  5. package/build/main/providers/caching/route/model/cache-mode.js.map +1 -0
  6. package/build/main/providers/caching/route/model/cached-route.js.map +1 -0
  7. package/build/main/providers/caching/route/model/cached-routes.js.map +1 -0
  8. package/build/main/providers/caching/route/model/index.js.map +1 -0
  9. package/build/main/providers/caching/route/route-caching-provider.js.map +1 -0
  10. package/build/main/providers/caching-gas-provider.js.map +1 -0
  11. package/build/main/providers/caching-subgraph-provider.js.map +1 -0
  12. package/build/main/providers/caching-token-list-provider.js.map +1 -0
  13. package/build/main/providers/caching-token-provider.js.map +1 -0
  14. package/build/main/providers/eip-1559-gas-price-provider.js.map +1 -0
  15. package/build/main/providers/eth-estimate-gas-provider.js.map +1 -0
  16. package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +1 -0
  17. package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +1 -0
  18. package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +1 -0
  19. package/build/main/providers/fewV2/ring-pool-provider.js.map +1 -0
  20. package/build/main/providers/fewV2/ring-quote-provider.js.map +1 -0
  21. package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +1 -0
  22. package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +1 -0
  23. package/build/main/providers/fewV2/ring-subgraph-provider.js.map +1 -0
  24. package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +1 -0
  25. package/build/main/providers/gas-price-provider.js.map +1 -0
  26. package/build/main/providers/index.js.map +1 -0
  27. package/build/main/providers/legacy-gas-price-provider.js.map +1 -0
  28. package/build/main/providers/multicall-provider.js.map +1 -0
  29. package/build/main/providers/multicall-ringswap-provider.js.map +1 -0
  30. package/build/main/providers/multicall-uniswap-provider.js.map +1 -0
  31. package/build/main/providers/on-chain-gas-price-provider.js.map +1 -0
  32. package/build/main/providers/on-chain-quote-provider.d.ts +4 -4
  33. package/build/main/providers/on-chain-quote-provider.js +35 -37
  34. package/build/main/providers/on-chain-quote-provider.js.map +1 -0
  35. package/build/main/providers/pool-provider.js.map +1 -0
  36. package/build/main/providers/portion-provider.js.map +1 -0
  37. package/build/main/providers/provider.js.map +1 -0
  38. package/build/main/providers/simulation-provider.js.map +1 -0
  39. package/build/main/providers/static-gas-price-provider.js.map +1 -0
  40. package/build/main/providers/subgraph-provider-with-fallback.js.map +1 -0
  41. package/build/main/providers/subgraph-provider.js.map +1 -0
  42. package/build/main/providers/swap-router-provider.js.map +1 -0
  43. package/build/main/providers/tenderly-simulation-provider.js.map +1 -0
  44. package/build/main/providers/token-fee-fetcher.js.map +1 -0
  45. package/build/main/providers/token-properties-provider.js.map +1 -0
  46. package/build/main/providers/token-provider.js.map +1 -0
  47. package/build/main/providers/token-validator-provider.js.map +1 -0
  48. package/build/main/providers/uri-subgraph-provider.js.map +1 -0
  49. package/build/main/providers/v2/caching-pool-provider.js.map +1 -0
  50. package/build/main/providers/v2/caching-subgraph-provider.js.map +1 -0
  51. package/build/main/providers/v2/pool-provider.js.map +1 -0
  52. package/build/main/providers/v2/quote-provider.js.map +1 -0
  53. package/build/main/providers/v2/static-subgraph-provider.js.map +1 -0
  54. package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +1 -0
  55. package/build/main/providers/v2/subgraph-provider.js.map +1 -0
  56. package/build/main/providers/v2/uri-subgraph-provider.js.map +1 -0
  57. package/build/main/providers/v3/caching-pool-provider.js.map +1 -0
  58. package/build/main/providers/v3/caching-subgraph-provider.js.map +1 -0
  59. package/build/main/providers/v3/gas-data-provider.js.map +1 -0
  60. package/build/main/providers/v3/pool-provider.js.map +1 -0
  61. package/build/main/providers/v3/static-subgraph-provider.js.map +1 -0
  62. package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +1 -0
  63. package/build/main/providers/v3/subgraph-provider.js.map +1 -0
  64. package/build/main/providers/v3/uri-subgraph-provider.js.map +1 -0
  65. package/build/main/providers/v4/caching-pool-provider.js.map +1 -0
  66. package/build/main/providers/v4/caching-subgraph-provider.js.map +1 -0
  67. package/build/main/providers/v4/pool-provider.js.map +1 -0
  68. package/build/main/providers/v4/static-subgraph-provider.js.map +1 -0
  69. package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +1 -0
  70. package/build/main/providers/v4/subgraph-provider.js.map +1 -0
  71. package/build/main/providers/v4/uri-subgraph-provider.js.map +1 -0
  72. package/build/main/routers/alpha-router/alpha-router.d.ts +9 -0
  73. package/build/main/routers/alpha-router/alpha-router.js +4 -1
  74. package/build/main/routers/alpha-router/alpha-router.js.map +1 -0
  75. package/build/main/routers/alpha-router/config.js.map +1 -0
  76. package/build/main/routers/alpha-router/entities/index.js.map +1 -0
  77. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +1 -0
  78. package/build/main/routers/alpha-router/functions/best-swap-route.js.map +1 -0
  79. package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +1 -0
  80. package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +1 -0
  81. package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +1 -0
  82. package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +1 -0
  83. package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +1 -0
  84. package/build/main/routers/alpha-router/gas-models/gas-model.js.map +1 -0
  85. package/build/main/routers/alpha-router/gas-models/index.js.map +1 -0
  86. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +1 -0
  87. package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +1 -0
  88. package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +1 -0
  89. package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +1 -0
  90. package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +1 -0
  91. package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +1 -0
  92. package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +1 -0
  93. package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +1 -0
  94. package/build/main/routers/alpha-router/index.js.map +1 -0
  95. package/build/main/routers/alpha-router/quoters/base-quoter.js.map +1 -0
  96. package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +1 -0
  97. package/build/main/routers/alpha-router/quoters/index.js.map +1 -0
  98. package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +1 -0
  99. package/build/main/routers/alpha-router/quoters/model/index.js.map +1 -0
  100. package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +1 -0
  101. package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +1 -0
  102. package/build/main/routers/alpha-router/quoters/model/results/index.js.map +1 -0
  103. package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +1 -0
  104. package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +1 -0
  105. package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +1 -0
  106. package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +1 -0
  107. package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +1 -0
  108. package/build/main/routers/index.js.map +1 -0
  109. package/build/main/routers/legacy-router/bases.js.map +1 -0
  110. package/build/main/routers/legacy-router/index.js.map +1 -0
  111. package/build/main/routers/legacy-router/legacy-router.js.map +1 -0
  112. package/build/main/routers/router.js.map +1 -0
  113. package/build/main/tsconfig.tsbuildinfo +1 -1
  114. package/build/main/types/other/commons.js.map +1 -0
  115. package/build/main/types/other/factories/Erc20__factory.js.map +1 -0
  116. package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +1 -0
  117. package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +1 -0
  118. package/build/main/types/other/factories/ITokenValidator__factory.js.map +1 -0
  119. package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +1 -0
  120. package/build/main/types/other/factories/Permit2__factory.js.map +1 -0
  121. package/build/main/types/other/factories/StateView__factory.js.map +1 -0
  122. package/build/main/types/other/factories/SwapRouter02__factory.js.map +1 -0
  123. package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +1 -0
  124. package/build/main/types/other/factories/V4Quoter__factory.js.map +1 -0
  125. package/build/main/types/v2/commons.js.map +1 -0
  126. package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +1 -0
  127. package/build/main/types/v3/commons.js.map +1 -0
  128. package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +1 -0
  129. package/build/main/types/v3/factories/IQuoterV2__factory.js.map +1 -0
  130. package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +1 -0
  131. package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +1 -0
  132. package/build/main/util/addresses.js.map +1 -0
  133. package/build/main/util/amounts.js.map +1 -0
  134. package/build/main/util/callData.js.map +1 -0
  135. package/build/main/util/chains.js.map +1 -0
  136. package/build/main/util/defaultBlocksToLive.js.map +1 -0
  137. package/build/main/util/fewAddress.js.map +1 -0
  138. package/build/main/util/gas-factory-helpers.js.map +1 -0
  139. package/build/main/util/hooksOptions.js.map +1 -0
  140. package/build/main/util/index.js.map +1 -0
  141. package/build/main/util/intent.js.map +1 -0
  142. package/build/main/util/l2FeeChains.js.map +1 -0
  143. package/build/main/util/log.js.map +1 -0
  144. package/build/main/util/methodParameters.js +3 -1
  145. package/build/main/util/methodParameters.js.map +1 -0
  146. package/build/main/util/metric.js.map +1 -0
  147. package/build/main/util/mixedRouteFilterOutV4Pools.js.map +1 -0
  148. package/build/main/util/onchainQuoteProviderConfigs.js.map +1 -0
  149. package/build/main/util/pool.js.map +1 -0
  150. package/build/main/util/protocols.js.map +1 -0
  151. package/build/main/util/routes.js.map +1 -0
  152. package/build/main/util/serializeRouteIds.js.map +1 -0
  153. package/build/main/util/simple-perf-tracker.js.map +1 -0
  154. package/build/main/util/tenderlySimulationErrorBreakDown.js.map +1 -0
  155. package/build/main/util/unsupported-tokens.js.map +1 -0
  156. package/build/module/providers/on-chain-quote-provider.d.ts +4 -4
  157. package/build/module/providers/on-chain-quote-provider.js +35 -37
  158. package/build/module/routers/alpha-router/alpha-router.d.ts +9 -0
  159. package/build/module/routers/alpha-router/alpha-router.js +4 -1
  160. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  161. package/build/module/util/methodParameters.js +3 -1
  162. package/package.json +1 -1
@@ -220,8 +220,8 @@ export declare class OnChainQuoteProvider implements IOnChainQuoteProvider {
220
220
  protected gasErrorFailureOverride: (protocol: Protocol) => FailureOverrides;
221
221
  protected successRateFailureOverrides: (protocol: Protocol) => FailureOverrides;
222
222
  protected blockNumberConfig: (protocol: Protocol) => BlockNumberConfig;
223
- protected quoterAddressOverride?: ((useMixedRouteQuoter: boolean, useFewV2RouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol) => string | undefined) | undefined;
224
- protected metricsPrefix: (chainId: ChainId, useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, useFewV2RouteQuoter: boolean, protocol: Protocol, optimisticCachedRoutes: boolean) => string;
223
+ protected quoterAddressOverride?: ((useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol) => string | undefined) | undefined;
224
+ protected metricsPrefix: (chainId: ChainId, useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol, optimisticCachedRoutes: boolean) => string;
225
225
  /**
226
226
  * Creates an instance of OnChainQuoteProvider.
227
227
  *
@@ -237,7 +237,7 @@ export declare class OnChainQuoteProvider implements IOnChainQuoteProvider {
237
237
  * @param [quoterAddressOverride] Overrides the address of the quoter contract to use.
238
238
  * @param metricsPrefix metrics prefix to differentiate between different instances of the quote provider.
239
239
  */
240
- constructor(chainId: ChainId, provider: BaseProvider, multicall2Provider: UniswapMulticallProvider, ringMulticall2Provider: RingswapMulticallProvider, retryOptions?: QuoteRetryOptions, batchParams?: (optimisticCachedRoutes: boolean, protocol: Protocol) => BatchParams, gasErrorFailureOverride?: (protocol: Protocol) => FailureOverrides, successRateFailureOverrides?: (protocol: Protocol) => FailureOverrides, blockNumberConfig?: (protocol: Protocol) => BlockNumberConfig, quoterAddressOverride?: ((useMixedRouteQuoter: boolean, useFewV2RouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol) => string | undefined) | undefined, metricsPrefix?: (chainId: ChainId, useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, useFewV2RouteQuoter: boolean, protocol: Protocol, optimisticCachedRoutes: boolean) => string);
240
+ constructor(chainId: ChainId, provider: BaseProvider, multicall2Provider: UniswapMulticallProvider, ringMulticall2Provider: RingswapMulticallProvider, retryOptions?: QuoteRetryOptions, batchParams?: (optimisticCachedRoutes: boolean, protocol: Protocol) => BatchParams, gasErrorFailureOverride?: (protocol: Protocol) => FailureOverrides, successRateFailureOverrides?: (protocol: Protocol) => FailureOverrides, blockNumberConfig?: (protocol: Protocol) => BlockNumberConfig, quoterAddressOverride?: ((useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol) => string | undefined) | undefined, metricsPrefix?: (chainId: ChainId, useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol, optimisticCachedRoutes: boolean) => string);
241
241
  private getQuoterAddress;
242
242
  getQuotesManyExactIn<TRoute extends SupportedRoutes>(amountIns: CurrencyAmount[], routes: TRoute[], providerConfig?: ProviderConfig): Promise<OnChainQuotes<TRoute>>;
243
243
  getQuotesManyExactOut<TRoute extends SupportedExactOutRoutes>(amountOuts: CurrencyAmount[], routes: TRoute[], providerConfig?: ProviderConfig): Promise<OnChainQuotes<TRoute>>;
@@ -248,7 +248,7 @@ export declare class OnChainQuoteProvider implements IOnChainQuoteProvider {
248
248
  private partitionQuotes;
249
249
  private processQuoteResults;
250
250
  private validateBlockNumbers;
251
- protected validateSuccessRate(allResults: Result<[BigNumber, BigNumber[], number[], BigNumber]>[], haveRetriedForSuccessRate: boolean, useMixedRouteQuoter: boolean, useFewV2RouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol, optimisticCachedRoutes: boolean): void | SuccessRateError;
251
+ protected validateSuccessRate(allResults: Result<[BigNumber, BigNumber[], number[], BigNumber]>[], haveRetriedForSuccessRate: boolean, useMixedRouteQuoter: boolean, mixedRouteContainsV4Pool: boolean, protocol: Protocol, optimisticCachedRoutes: boolean): void | SuccessRateError;
252
252
  /**
253
253
  * Throw an error for incorrect routes / function combinations
254
254
  * @param routes Any combination of V3, FewV2, V2, and Mixed routes.
@@ -137,11 +137,9 @@ class OnChainQuoteProvider {
137
137
  return onchainQuoteProviderConfigs_1.DEFAULT_SUCCESS_RATE_FAILURE_OVERRIDES;
138
138
  }, blockNumberConfig = (_protocol) => {
139
139
  return onchainQuoteProviderConfigs_1.DEFAULT_BLOCK_NUMBER_CONFIGS;
140
- }, quoterAddressOverride, metricsPrefix = (chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, useFewV2RouteQuoter, protocol, optimisticCachedRoutes) => useMixedRouteQuoter
140
+ }, quoterAddressOverride, metricsPrefix = (chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes) => useMixedRouteQuoter
141
141
  ? `ChainId_${chainId}_${protocol}RouteQuoter${mixedRouteContainsV4Pool ? 'V2' : 'V1'}_OptimisticCachedRoutes${optimisticCachedRoutes}_`
142
- : useFewV2RouteQuoter
143
- ? `ChainId_${chainId}_FewV2Quoter_OptimisticCachedRoutes${optimisticCachedRoutes}_`
144
- : `ChainId_${chainId}_${protocol}Quoter_OptimisticCachedRoutes${optimisticCachedRoutes}_`) {
142
+ : `ChainId_${chainId}_${protocol}Quoter_OptimisticCachedRoutes${optimisticCachedRoutes}_`) {
145
143
  this.chainId = chainId;
146
144
  this.provider = provider;
147
145
  this.multicall2Provider = multicall2Provider;
@@ -154,9 +152,9 @@ class OnChainQuoteProvider {
154
152
  this.quoterAddressOverride = quoterAddressOverride;
155
153
  this.metricsPrefix = metricsPrefix;
156
154
  }
157
- getQuoterAddress(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol) {
155
+ getQuoterAddress(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol) {
158
156
  if (this.quoterAddressOverride) {
159
- const quoterAddress = this.quoterAddressOverride(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol);
157
+ const quoterAddress = this.quoterAddressOverride(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol);
160
158
  if (!quoterAddress) {
161
159
  throw new Error(`No address for the quoter contract on chain id: ${this.chainId} ${useMixedRouteQuoter} ${mixedRouteContainsV4Pool} ${protocol}`);
162
160
  }
@@ -201,8 +199,8 @@ class OnChainQuoteProvider {
201
199
  throw new Error(`Unsupported protocol for the route: ${JSON.stringify(route)}`);
202
200
  }
203
201
  }
204
- getContractInterface(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol) {
205
- if (useMixedRouteQuoter || useFewV2RouteQuoter) {
202
+ getContractInterface(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol) {
203
+ if (useMixedRouteQuoter) {
206
204
  if (mixedRouteContainsV4Pool) {
207
205
  return MixedRouteQuoterV2__factory_1.MixedRouteQuoterV2__factory.createInterface();
208
206
  }
@@ -219,12 +217,12 @@ class OnChainQuoteProvider {
219
217
  throw new Error(`Unsupported protocol: ${protocol}`);
220
218
  }
221
219
  }
222
- async consolidateResults(protocol, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, functionName, inputs, providerConfig, gasLimitOverride) {
220
+ async consolidateResults(protocol, useMixedRouteQuoter, mixedRouteContainsV4Pool, functionName, inputs, providerConfig, gasLimitOverride) {
223
221
  if ((protocol === router_sdk_1.Protocol.MIXED && mixedRouteContainsV4Pool) ||
224
222
  protocol === router_sdk_1.Protocol.V4) {
225
223
  const mixedQuote = await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams({
226
- address: this.getQuoterAddress(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol),
227
- contractInterface: this.getContractInterface(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol),
224
+ address: this.getQuoterAddress(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol),
225
+ contractInterface: this.getContractInterface(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol),
228
226
  functionName,
229
227
  functionParams: inputs,
230
228
  providerConfig,
@@ -261,8 +259,8 @@ class OnChainQuoteProvider {
261
259
  }
262
260
  else {
263
261
  return await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams({
264
- address: this.getQuoterAddress(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol),
265
- contractInterface: this.getContractInterface(useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol),
262
+ address: this.getQuoterAddress(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol),
263
+ contractInterface: this.getContractInterface(useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol),
266
264
  functionName,
267
265
  functionParams: inputs,
268
266
  providerConfig,
@@ -352,8 +350,8 @@ class OnChainQuoteProvider {
352
350
  log_1.log.info(`About to get ${inputs.length} quotes in chunks of ${normalizedChunk} [${lodash_1.default.map(inputsChunked, (i) => i.length).join(',')}] ${gasLimitOverride
353
351
  ? `with a gas limit override of ${gasLimitOverride}`
354
352
  : ''} and block number: ${await providerConfig.blockNumber} [Original before offset: ${originalBlockNumber}].`);
355
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBatchSize`, inputs.length, util_1.MetricLoggerUnit.Count);
356
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBatchSize_${(0, util_1.ID_TO_NETWORK_NAME)(this.chainId)}`, inputs.length, util_1.MetricLoggerUnit.Count);
353
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBatchSize`, inputs.length, util_1.MetricLoggerUnit.Count);
354
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBatchSize_${(0, util_1.ID_TO_NETWORK_NAME)(this.chainId)}`, inputs.length, util_1.MetricLoggerUnit.Count);
357
355
  const startTime = Date.now();
358
356
  let haveRetriedForSuccessRate = false;
359
357
  let haveRetriedForBlockHeader = false;
@@ -382,8 +380,8 @@ class OnChainQuoteProvider {
382
380
  const { inputs } = quoteState;
383
381
  try {
384
382
  totalCallsMade = totalCallsMade + 1;
385
- const results = await this.consolidateResults(protocol, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, functionName, inputs, providerConfig, gasLimitOverride);
386
- const successRateError = this.validateSuccessRate(results.results, haveRetriedForSuccessRate, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes);
383
+ const results = await this.consolidateResults(protocol, useMixedRouteQuoter, mixedRouteContainsV4Pool, functionName, inputs, providerConfig, gasLimitOverride);
384
+ const successRateError = this.validateSuccessRate(results.results, haveRetriedForSuccessRate, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes);
387
385
  if (successRateError) {
388
386
  return {
389
387
  status: 'failed',
@@ -447,14 +445,14 @@ class OnChainQuoteProvider {
447
445
  log_1.log.info({ error }, `[QuoteFetchError] Attempt ${attemptNumber}. ${error.message}`);
448
446
  if (error instanceof BlockConflictError) {
449
447
  if (!haveRetriedForBlockConflictError) {
450
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBlockConflictErrorRetry`, 1, util_1.MetricLoggerUnit.Count);
448
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBlockConflictErrorRetry`, 1, util_1.MetricLoggerUnit.Count);
451
449
  haveRetriedForBlockConflictError = true;
452
450
  }
453
451
  retryAll = true;
454
452
  }
455
453
  else if (error instanceof ProviderBlockHeaderError) {
456
454
  if (!haveRetriedForBlockHeader) {
457
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBlockHeaderNotFoundRetry`, 1, util_1.MetricLoggerUnit.Count);
455
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteBlockHeaderNotFoundRetry`, 1, util_1.MetricLoggerUnit.Count);
458
456
  haveRetriedForBlockHeader = true;
459
457
  }
460
458
  // Ensure that if multiple calls fail due to block header in the current pending batch,
@@ -480,13 +478,13 @@ class OnChainQuoteProvider {
480
478
  }
481
479
  else if (error instanceof ProviderTimeoutError) {
482
480
  if (!haveRetriedForTimeout) {
483
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteTimeoutRetry`, 1, util_1.MetricLoggerUnit.Count);
481
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteTimeoutRetry`, 1, util_1.MetricLoggerUnit.Count);
484
482
  haveRetriedForTimeout = true;
485
483
  }
486
484
  }
487
485
  else if (error instanceof ProviderGasError) {
488
486
  if (!haveRetriedForOutOfGas) {
489
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteOutOfGasExceptionRetry`, 1, util_1.MetricLoggerUnit.Count);
487
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteOutOfGasExceptionRetry`, 1, util_1.MetricLoggerUnit.Count);
490
488
  haveRetriedForOutOfGas = true;
491
489
  }
492
490
  gasLimitOverride =
@@ -497,7 +495,7 @@ class OnChainQuoteProvider {
497
495
  }
498
496
  else if (error instanceof SuccessRateError) {
499
497
  if (!haveRetriedForSuccessRate) {
500
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteSuccessRateRetry`, 1, util_1.MetricLoggerUnit.Count);
498
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteSuccessRateRetry`, 1, util_1.MetricLoggerUnit.Count);
501
499
  haveRetriedForSuccessRate = true;
502
500
  // Low success rate can indicate too little gas given to each call.
503
501
  gasLimitOverride =
@@ -509,7 +507,7 @@ class OnChainQuoteProvider {
509
507
  }
510
508
  else {
511
509
  if (!haveRetriedForUnknownReason) {
512
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteUnknownReasonRetry`, 1, util_1.MetricLoggerUnit.Count);
510
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteUnknownReasonRetry`, 1, util_1.MetricLoggerUnit.Count);
513
511
  haveRetriedForUnknownReason = true;
514
512
  }
515
513
  }
@@ -558,25 +556,25 @@ class OnChainQuoteProvider {
558
556
  }, Object.assign({ retries: DEFAULT_BATCH_RETRIES }, this.retryOptions));
559
557
  const routesQuotes = this.processQuoteResults(quoteResults, routes, amounts, bignumber_1.BigNumber.from(gasLimitOverride));
560
558
  const endTime = Date.now();
561
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteLatency`, endTime - startTime, util_1.MetricLoggerUnit.Milliseconds);
562
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteApproxGasUsedPerSuccessfulCall`, approxGasUsedPerSuccessCall, util_1.MetricLoggerUnit.Count);
563
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteNumRetryLoops`, finalAttemptNumber - 1, util_1.MetricLoggerUnit.Count);
564
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteTotalCallsToProvider`, totalCallsMade, util_1.MetricLoggerUnit.Count);
565
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteExpectedCallsToProvider`, expectedCallsMade, util_1.MetricLoggerUnit.Count);
566
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteNumRetriedCalls`, totalCallsMade - expectedCallsMade, util_1.MetricLoggerUnit.Count);
559
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteLatency`, endTime - startTime, util_1.MetricLoggerUnit.Milliseconds);
560
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteApproxGasUsedPerSuccessfulCall`, approxGasUsedPerSuccessCall, util_1.MetricLoggerUnit.Count);
561
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteNumRetryLoops`, finalAttemptNumber - 1, util_1.MetricLoggerUnit.Count);
562
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteTotalCallsToProvider`, totalCallsMade, util_1.MetricLoggerUnit.Count);
563
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteExpectedCallsToProvider`, expectedCallsMade, util_1.MetricLoggerUnit.Count);
564
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteNumRetriedCalls`, totalCallsMade - expectedCallsMade, util_1.MetricLoggerUnit.Count);
567
565
  const [successfulQuotes, failedQuotes] = (0, lodash_1.default)(routesQuotes)
568
566
  .flatMap((routeWithQuotes) => routeWithQuotes[1])
569
567
  .partition((quote) => quote.quote != null)
570
568
  .value();
571
569
  log_1.log.info(`Got ${successfulQuotes.length} successful quotes, ${failedQuotes.length} failed quotes. Took ${finalAttemptNumber - 1} attempt loops. Total calls made to provider: ${totalCallsMade}. Have retried for timeout: ${haveRetriedForTimeout}`);
572
570
  // Log total routes
573
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesLength`, routesQuotes.length, util_1.MetricLoggerUnit.Count);
571
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesLength`, routesQuotes.length, util_1.MetricLoggerUnit.Count);
574
572
  // Log total quotes
575
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesQuotesLength`, successfulQuotes.length + failedQuotes.length, util_1.MetricLoggerUnit.Count);
573
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesQuotesLength`, successfulQuotes.length + failedQuotes.length, util_1.MetricLoggerUnit.Count);
576
574
  // log successful quotes
577
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesSuccessfulQuotesLength`, successfulQuotes.length, util_1.MetricLoggerUnit.Count);
575
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesSuccessfulQuotesLength`, successfulQuotes.length, util_1.MetricLoggerUnit.Count);
578
576
  // log failed quotes
579
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesFailedQuotesLength`, failedQuotes.length, util_1.MetricLoggerUnit.Count);
577
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}RoutesFailedQuotesLength`, failedQuotes.length, util_1.MetricLoggerUnit.Count);
580
578
  return {
581
579
  routesWithQuotes: routesQuotes,
582
580
  blockNumber,
@@ -662,7 +660,7 @@ class OnChainQuoteProvider {
662
660
  } */
663
661
  return new BlockConflictError(`Quotes returned from different blocks. ${uniqBlocks}. ${totalCalls} calls were made with gas limit ${gasLimitOverride}`);
664
662
  }
665
- validateSuccessRate(allResults, haveRetriedForSuccessRate, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes) {
663
+ validateSuccessRate(allResults, haveRetriedForSuccessRate, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes) {
666
664
  const numResults = allResults.length;
667
665
  const numSuccessResults = allResults.filter((result) => result.success).length;
668
666
  const successRate = (1.0 * numSuccessResults) / numResults;
@@ -670,10 +668,10 @@ class OnChainQuoteProvider {
670
668
  if (successRate < quoteMinSuccessRate) {
671
669
  if (haveRetriedForSuccessRate) {
672
670
  log_1.log.info(`Quote success rate still below threshold despite retry. Continuing. ${quoteMinSuccessRate}: ${successRate}`);
673
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteRetriedSuccessRateLow`, successRate, util_1.MetricLoggerUnit.Percent);
671
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteRetriedSuccessRateLow`, successRate, util_1.MetricLoggerUnit.Percent);
674
672
  return;
675
673
  }
676
- util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, useFewV2RouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteSuccessRateLow`, successRate, util_1.MetricLoggerUnit.Percent);
674
+ util_1.metric.putMetric(`${this.metricsPrefix(this.chainId, useMixedRouteQuoter, mixedRouteContainsV4Pool, protocol, optimisticCachedRoutes)}QuoteSuccessRateLow`, successRate, util_1.MetricLoggerUnit.Percent);
677
675
  return new SuccessRateError(`Quote success rate below threshold of ${quoteMinSuccessRate}: ${successRate}`);
678
676
  }
679
677
  }
@@ -699,4 +697,4 @@ class OnChainQuoteProvider {
699
697
  }
700
698
  }
701
699
  exports.OnChainQuoteProvider = OnChainQuoteProvider;
702
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tY2hhaW4tcXVvdGUtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL29uLWNoYWluLXF1b3RlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHdEQUFtRTtBQUduRSwwREFJbUM7QUFDbkMsc0RBQWtEO0FBQ2xELGtEQUFpRjtBQUNqRixrREFHK0I7QUFDL0IsOERBQTZEO0FBQzdELG9EQUF1QjtBQUN2Qiw0REFBK0I7QUFFL0IsOENBTTJCO0FBQzNCLHdHQUFxRztBQUNyRyxzR0FBbUc7QUFDbkcsa0ZBQStFO0FBQy9FLGlGQUE4RTtBQUM5RSxrQ0FVaUI7QUFFakIscUNBQWtDO0FBQ2xDLHFGQUc2QztBQUM3QywyQ0FBK0M7QUFzRS9DLE1BQWEsa0JBQW1CLFNBQVEsS0FBSztJQUE3Qzs7UUFDUyxTQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztDQUFBO0FBRkQsZ0RBRUM7QUFFRCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFBM0M7O1FBQ1MsU0FBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7Q0FBQTtBQUZELDRDQUVDO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxLQUFLO0lBQW5EOztRQUNTLFNBQUksR0FBRywwQkFBMEIsQ0FBQztJQUMzQyxDQUFDO0NBQUE7QUFGRCw0REFFQztBQUVELE1BQWEsb0JBQXFCLFNBQVEsS0FBSztJQUEvQzs7UUFDUyxTQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDdkMsQ0FBQztDQUFBO0FBRkQsb0RBRUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFBM0M7O1FBQ1MsU0FBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7Q0FBQTtBQUZELDRDQUVDO0FBd0pELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dB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
700
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib24tY2hhaW4tcXVvdGUtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcHJvdmlkZXJzL29uLWNoYWluLXF1b3RlLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLHdEQUFtRTtBQUduRSwwREFJbUM7QUFDbkMsc0RBQWtEO0FBQ2xELGtEQUFpRjtBQUNqRixrREFHK0I7QUFDL0IsOERBQTZEO0FBQzdELG9EQUF1QjtBQUN2Qiw0REFBK0I7QUFFL0IsOENBTTJCO0FBQzNCLHdHQUFxRztBQUNyRyxzR0FBbUc7QUFDbkcsa0ZBQStFO0FBQy9FLGlGQUE4RTtBQUM5RSxrQ0FVaUI7QUFFakIscUNBQWtDO0FBQ2xDLHFGQUc2QztBQUM3QywyQ0FBK0M7QUFzRS9DLE1BQWEsa0JBQW1CLFNBQVEsS0FBSztJQUE3Qzs7UUFDUyxTQUFJLEdBQUcsb0JBQW9CLENBQUM7SUFDckMsQ0FBQztDQUFBO0FBRkQsZ0RBRUM7QUFFRCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFBM0M7O1FBQ1MsU0FBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7Q0FBQTtBQUZELDRDQUVDO0FBRUQsTUFBYSx3QkFBeUIsU0FBUSxLQUFLO0lBQW5EOztRQUNTLFNBQUksR0FBRywwQkFBMEIsQ0FBQztJQUMzQyxDQUFDO0NBQUE7QUFGRCw0REFFQztBQUVELE1BQWEsb0JBQXFCLFNBQVEsS0FBSztJQUEvQzs7UUFDUyxTQUFJLEdBQUcsc0JBQXNCLENBQUM7SUFDdkMsQ0FBQztDQUFBO0FBRkQsb0RBRUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLEtBQUs7SUFBM0M7O1FBQ1MsU0FBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ25DLENBQUM7Q0FBQTtBQUZELDRDQUVDO0FBd0pELE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dB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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"on-chain-quote-provider.js","sourceRoot":"","sources":["../../../src/providers/on-chain-quote-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { BigNumber, BigNumberish } from '@ethersproject/bignumber';\nimport { BytesLike } from '@ethersproject/bytes';\nimport { BaseProvider } from '@ethersproject/providers';\nimport {\n encodeMixedRouteToPath,\n MixedRouteSDK,\n Protocol,\n} from '@fewprotocol/router-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport { encodeRouteToPath as encodeV3RouteToPath } from '@fewprotocol/uniswap-v3-sdk';\nimport {\n encodeRouteToPath as encodeV4RouteToPath,\n Pool as V4Pool,\n} from '@fewprotocol/uniswap-v4-sdk';\nimport retry, { Options as RetryOptions } from 'async-retry';\nimport _ from 'lodash';\nimport stats from 'stats-lite';\n\nimport {\n MixedRoute,\n SupportedRoutes,\n V2Route,\n V3Route,\n V4Route,\n} from '../routers/router';\nimport { IMixedRouteQuoterV1__factory } from '../types/other/factories/IMixedRouteQuoterV1__factory';\nimport { MixedRouteQuoterV2__factory } from '../types/other/factories/MixedRouteQuoterV2__factory';\nimport { V4Quoter__factory } from '../types/other/factories/V4Quoter__factory';\nimport { IQuoterV2__factory } from '../types/v3/factories/IQuoterV2__factory';\nimport {\n getAddress,\n ID_TO_NETWORK_NAME,\n metric,\n MetricLoggerUnit,\n MIXED_ROUTE_QUOTER_V1_ADDRESSES,\n MIXED_ROUTE_QUOTER_V2_ADDRESSES,\n NEW_QUOTER_V2_ADDRESSES,\n PROTOCOL_V4_QUOTER_ADDRESSES,\n RING_MIXED_ROUTE_QUOTER_V1_ADDRESSES,\n} from '../util';\nimport { CurrencyAmount } from '../util/amounts';\nimport { log } from '../util/log';\nimport {\n DEFAULT_BLOCK_NUMBER_CONFIGS,\n DEFAULT_SUCCESS_RATE_FAILURE_OVERRIDES,\n} from '../util/onchainQuoteProviderConfigs';\nimport { routeToString } from '../util/routes';\n\nimport { Result, SuccessResult } from './multicall-provider';\nimport { UniswapMulticallProvider } from './multicall-uniswap-provider';\nimport { ProviderConfig } from './provider';\nimport { RingswapMulticallProvider } from './multicall-ringswap-provider';\n\n/**\n * Emulate on-chain [PathKey](https://github.com/Uniswap/v4-periphery/blob/main/src/libraries/PathKey.sol#L8) struct\n */\nexport type PathKey = {\n intermediateCurrency: string;\n fee: BigNumberish;\n tickSpacing: BigNumberish;\n hooks: string;\n hookData: BytesLike;\n};\nexport type SupportedPath = string | PathKey[];\n/**\n * Emulate on-chain [QuoteExactParams](https://github.com/Uniswap/v4-periphery/blob/main/src/interfaces/IQuoter.sol#L34) struct\n */\nexport type QuoteExactParams = {\n exactCurrency: string;\n path: PathKey[];\n exactAmount: BigNumberish;\n};\n\n/**\n * Emulate on-chain [ExtraQuoteExactInputParams](https://github.com/Uniswap/mixed-quoter/blob/main/src/interfaces/IMixedRouteQuoterV2.sol#L44C12-L44C38) struct\n */\ntype NonEncodableData = {\n hookData: BytesLike;\n};\nexport type ExtraQuoteExactInputParams = {\n nonEncodableData: NonEncodableData[];\n};\nexport type QuoteInputType =\n | QuoteExactParams[]\n | [string, string]\n | [string, ExtraQuoteExactInputParams, string];\n\n/**\n * An on chain quote for a swap.\n */\nexport type AmountQuote = {\n amount: CurrencyAmount;\n /**\n * Quotes can be null (e.g. pool did not have enough liquidity).\n */\n quote: BigNumber | null;\n /**\n * For each pool in the route, the sqrtPriceX96 after the swap.\n */\n sqrtPriceX96AfterList: BigNumber[] | null;\n /**\n * For each pool in the route, the number of ticks crossed.\n */\n initializedTicksCrossedList: number[] | null;\n /**\n * An estimate of the gas used by the swap. This is returned by the multicall\n * and is not necessarily accurate due to EIP-2929 causing gas costs to vary\n * depending on if the slot has already been loaded in the call.\n */\n gasEstimate: BigNumber | null;\n /**\n * Final attempted gas limit set by the on-chain quote provider\n */\n gasLimit: BigNumber | null;\n};\n\nexport class BlockConflictError extends Error {\n public name = 'BlockConflictError';\n}\n\nexport class SuccessRateError extends Error {\n public name = 'SuccessRateError';\n}\n\nexport class ProviderBlockHeaderError extends Error {\n public name = 'ProviderBlockHeaderError';\n}\n\nexport class ProviderTimeoutError extends Error {\n public name = 'ProviderTimeoutError';\n}\n\n/**\n * This error typically means that the gas used by the multicall has\n * exceeded the total call gas limit set by the node provider.\n *\n * This can be resolved by modifying BatchParams to request fewer\n * quotes per call, or to set a lower gas limit per quote.\n *\n * @export\n * @class ProviderGasError\n */\nexport class ProviderGasError extends Error {\n public name = 'ProviderGasError';\n}\n\nexport type QuoteRetryOptions = RetryOptions;\n\n/**\n * The V3 route and a list of quotes for that route.\n */\nexport type RouteWithQuotes<TRoute extends SupportedRoutes> = [\n TRoute,\n AmountQuote[]\n];\n\n/**\n * Final consolidated return type of all on-chain quotes.\n */\nexport type OnChainQuotes<TRoute extends SupportedRoutes> = {\n routesWithQuotes: RouteWithQuotes<TRoute>[];\n blockNumber: BigNumber;\n};\n\nexport type SupportedExactOutRoutes = V4Route | V3Route;\n\ntype QuoteBatchSuccess<TQuoteParams> = {\n status: 'success';\n inputs: TQuoteParams[];\n results: {\n blockNumber: BigNumber;\n results: Result<[BigNumber, BigNumber[], number[], BigNumber]>[];\n approxGasUsedPerSuccessCall: number;\n };\n};\n\ntype QuoteBatchFailed<TQuoteParams> = {\n status: 'failed';\n inputs: TQuoteParams[];\n reason: Error;\n results?: {\n blockNumber: BigNumber;\n results: Result<[BigNumber, BigNumber[], number[], BigNumber]>[];\n approxGasUsedPerSuccessCall: number;\n };\n};\n\ntype QuoteBatchPending<TQuoteParams> = {\n status: 'pending';\n inputs: TQuoteParams[];\n};\n\ntype QuoteBatchState<TQuoteParams> =\n | QuoteBatchSuccess<TQuoteParams>\n | QuoteBatchFailed<TQuoteParams>\n | QuoteBatchPending<TQuoteParams>;\n\n/**\n * Provider for getting on chain quotes using routes containing V3 pools or V2 pools.\n *\n * @export\n * @interface IOnChainQuoteProvider\n */\nexport interface IOnChainQuoteProvider {\n /**\n * For every route, gets an exactIn quotes for every amount provided.\n * @notice While passing in exactIn V2Routes is supported, we recommend using the V2QuoteProvider to compute off chain quotes for V2 whenever possible\n *\n * @param amountIns The amounts to get quotes for.\n * @param routes The routes to get quotes for.\n * @param [providerConfig] The provider config.\n * @returns For each route returns a RouteWithQuotes object that contains all the quotes.\n * @returns The blockNumber used when generating the quotes.\n */\n getQuotesManyExactIn<TRoute extends SupportedRoutes>(\n amountIns: CurrencyAmount[],\n routes: TRoute[],\n providerConfig?: ProviderConfig\n ): Promise<OnChainQuotes<TRoute>>;\n\n /**\n * For every route, gets ane exactOut quote for every amount provided.\n * @notice This does not support quotes for MixedRoutes (routes with both V3 and V2 pools/pairs) or pure V2 routes\n *\n * @param amountOuts The amounts to get quotes for.\n * @param routes The routes to get quotes for.\n * @param [providerConfig] The provider config.\n * @returns For each route returns a RouteWithQuotes object that contains all the quotes.\n * @returns The blockNumber used when generating the quotes.\n */\n getQuotesManyExactOut<TRoute extends SupportedExactOutRoutes>(\n amountOuts: CurrencyAmount[],\n routes: TRoute[],\n providerConfig?: ProviderConfig\n ): Promise<OnChainQuotes<TRoute>>;\n}\n\n/**\n * The parameters for the multicalls we make.\n *\n * It is important to ensure that (gasLimitPerCall * multicallChunk) < providers gas limit per call.\n *\n * On chain quotes can consume a lot of gas (if the swap is so large that it swaps through a large\n * number of ticks), so there is a risk of exceeded gas limits in these multicalls.\n */\nexport type BatchParams = {\n /**\n * The number of quotes to fetch in each multicall.\n */\n multicallChunk: number;\n /**\n * The maximum call to consume for each quote in the multicall.\n */\n gasLimitPerCall: number;\n /**\n * The minimum success rate for all quotes across all multicalls.\n * If we set our gasLimitPerCall too low it could result in a large number of\n * quotes failing due to out of gas. This parameters will fail the overall request\n * in this case.\n */\n quoteMinSuccessRate: number;\n};\n\n/**\n * The fallback values for gasLimit and multicallChunk if any failures occur.\n *\n */\n\nexport type FailureOverrides = {\n multicallChunk: number;\n gasLimitOverride: number;\n};\n\nexport type BlockHeaderFailureOverridesDisabled = { enabled: false };\nexport type BlockHeaderFailureOverridesEnabled = {\n enabled: true;\n // Offset to apply in the case of a block header failure. e.g. -10 means rollback by 10 blocks.\n rollbackBlockOffset: number;\n // Number of batch failures due to block header before trying a rollback.\n attemptsBeforeRollback: number;\n};\nexport type BlockHeaderFailureOverrides =\n | BlockHeaderFailureOverridesDisabled\n | BlockHeaderFailureOverridesEnabled;\n\n/**\n * Config around what block number to query and how to handle failures due to block header errors.\n */\nexport type BlockNumberConfig = {\n // Applies an offset to the block number specified when fetching quotes. e.g. -10 means rollback by 10 blocks.\n // Useful for networks where the latest block may not be available on all nodes, causing frequent 'header not found' errors.\n baseBlockOffset: number;\n // Config for handling header not found errors.\n rollback: BlockHeaderFailureOverrides;\n};\n\nconst DEFAULT_BATCH_RETRIES = 2;\n\n/**\n * Computes on chain quotes for swaps. For pure V3 routes, quotes are computed on-chain using\n * the 'QuoterV2' smart contract. For exactIn mixed and V2 routes, quotes are computed using the 'MixedRouteQuoterV1' contract\n * This is because computing quotes off-chain would require fetching all the tick data for each pool, which is a lot of data.\n *\n * To minimize the number of requests for quotes we use a Multicall contract. Generally\n * the number of quotes to fetch exceeds the maximum we can fit in a single multicall\n * while staying under gas limits, so we also batch these quotes across multiple multicalls.\n *\n * The biggest challenge with the quote provider is dealing with various gas limits.\n * Each provider sets a limit on the amount of gas a call can consume (on Infura this\n * is approximately 10x the block max size), so we must ensure each multicall does not\n * exceed this limit. Additionally, each quote on V3 can consume a large number of gas if\n * the pool lacks liquidity and the swap would cause all the ticks to be traversed.\n *\n * To ensure we don't exceed the node's call limit, we limit the gas used by each quote to\n * a specific value, and we limit the number of quotes in each multicall request. Users of this\n * class should set BatchParams such that multicallChunk * gasLimitPerCall is less than their node\n * providers total gas limit per call.\n *\n * @export\n * @class OnChainQuoteProvider\n */\nexport class OnChainQuoteProvider implements IOnChainQuoteProvider {\n /**\n * Creates an instance of OnChainQuoteProvider.\n *\n * @param chainId The chain to get quotes for.\n * @param provider The web 3 provider.\n * @param multicall2Provider The multicall provider to use to get the quotes on-chain.\n * Only supports the Uniswap Multicall contract as it needs the gas limitting functionality.\n * @param retryOptions The retry options for each call to the multicall.\n * @param batchParams The parameters for each batched call to the multicall.\n * @param gasErrorFailureOverride The gas and chunk parameters to use when retrying a batch that failed due to out of gas.\n * @param successRateFailureOverrides The parameters for retries when we fail to get quotes.\n * @param blockNumberConfig Parameters for adjusting which block we get quotes from, and how to handle block header not found errors.\n * @param [quoterAddressOverride] Overrides the address of the quoter contract to use.\n * @param metricsPrefix metrics prefix to differentiate between different instances of the quote provider.\n */\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n // Only supports Uniswap Multicall as it needs the gas limitting functionality.\n protected multicall2Provider: UniswapMulticallProvider,\n // Only supports Ringswap Multicall as it needs the gas limitting functionality.\n protected ringMulticall2Provider: RingswapMulticallProvider,\n // retryOptions, batchParams, and gasErrorFailureOverride are always override in alpha-router\n // so below default values are always not going to be picked up in prod.\n // So we will not extract out below default values into constants.\n protected retryOptions: QuoteRetryOptions = {\n retries: DEFAULT_BATCH_RETRIES,\n minTimeout: 25,\n maxTimeout: 250,\n },\n protected batchParams: (\n optimisticCachedRoutes: boolean,\n protocol: Protocol\n ) => BatchParams = (_optimisticCachedRoutes, _protocol) => {\n return {\n multicallChunk: 150,\n gasLimitPerCall: 1_000_000,\n quoteMinSuccessRate: 0.2,\n };\n },\n protected gasErrorFailureOverride: (\n protocol: Protocol\n ) => FailureOverrides = (_protocol: Protocol) => {\n return {\n gasLimitOverride: 1_500_000,\n multicallChunk: 100,\n };\n },\n // successRateFailureOverrides and blockNumberConfig are not always override in alpha-router.\n // So we will extract out below default values into constants.\n // In alpha-router default case, we will also define the constants with same values as below.\n protected successRateFailureOverrides: (\n protocol: Protocol\n ) => FailureOverrides = (_protocol: Protocol) => {\n return DEFAULT_SUCCESS_RATE_FAILURE_OVERRIDES;\n },\n protected blockNumberConfig: (protocol: Protocol) => BlockNumberConfig = (\n _protocol: Protocol\n ) => {\n return DEFAULT_BLOCK_NUMBER_CONFIGS;\n },\n protected quoterAddressOverride?: (\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n protocol: Protocol,\n ) => string | undefined,\n protected metricsPrefix: (\n chainId: ChainId,\n useMixedRouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n useFewV2RouteQuoter: boolean,\n protocol: Protocol,\n optimisticCachedRoutes: boolean\n ) => string = (\n chainId,\n useMixedRouteQuoter,\n mixedRouteContainsV4Pool,\n useFewV2RouteQuoter,\n protocol,\n optimisticCachedRoutes\n ) =>\n useMixedRouteQuoter\n ? `ChainId_${chainId}_${protocol}RouteQuoter${\n mixedRouteContainsV4Pool ? 'V2' : 'V1'\n }_OptimisticCachedRoutes${optimisticCachedRoutes}_`\n : useFewV2RouteQuoter\n ? `ChainId_${chainId}_FewV2Quoter_OptimisticCachedRoutes${optimisticCachedRoutes}_`\n : `ChainId_${chainId}_${protocol}Quoter_OptimisticCachedRoutes${optimisticCachedRoutes}_`\n ) {}\n\n private getQuoterAddress(\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n protocol: Protocol,\n ): string {\n if (this.quoterAddressOverride) {\n const quoterAddress = this.quoterAddressOverride(\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol\n );\n\n if (!quoterAddress) {\n throw new Error(\n `No address for the quoter contract on chain id: ${this.chainId} ${useMixedRouteQuoter} ${mixedRouteContainsV4Pool} ${protocol}`\n );\n }\n return quoterAddress;\n }\n const quoterAddress = useMixedRouteQuoter\n ? mixedRouteContainsV4Pool\n ? MIXED_ROUTE_QUOTER_V2_ADDRESSES[this.chainId]\n : MIXED_ROUTE_QUOTER_V1_ADDRESSES[this.chainId]\n : protocol === Protocol.V3\n ? NEW_QUOTER_V2_ADDRESSES[this.chainId]\n : protocol === Protocol.FEWV2\n ? RING_MIXED_ROUTE_QUOTER_V1_ADDRESSES[this.chainId]\n : PROTOCOL_V4_QUOTER_ADDRESSES[this.chainId];\n\n if (!quoterAddress) {\n throw new Error(\n `No address for the quoter contract on chain id: ${this.chainId}`\n );\n }\n return quoterAddress;\n }\n\n public async getQuotesManyExactIn<TRoute extends SupportedRoutes>(\n amountIns: CurrencyAmount[],\n routes: TRoute[],\n providerConfig?: ProviderConfig\n ): Promise<OnChainQuotes<TRoute>> {\n return this.getQuotesManyData(\n amountIns,\n routes,\n 'quoteExactInput',\n providerConfig\n );\n }\n\n public async getQuotesManyExactOut<TRoute extends SupportedExactOutRoutes>(\n amountOuts: CurrencyAmount[],\n routes: TRoute[],\n providerConfig?: ProviderConfig\n ): Promise<OnChainQuotes<TRoute>> {\n return this.getQuotesManyData(\n amountOuts,\n routes,\n 'quoteExactOutput',\n providerConfig\n );\n }\n\n private encodeRouteToPath<\n TRoute extends SupportedRoutes,\n TPath extends SupportedPath\n >(route: TRoute, functionName: string): TPath {\n switch (route.protocol) {\n case Protocol.V3:\n return encodeV3RouteToPath(\n route,\n functionName == 'quoteExactOutput' // For exactOut must be true to ensure the routes are reversed.\n ) as TPath;\n case Protocol.V4:\n return encodeV4RouteToPath(\n route,\n functionName == 'quoteExactOutput'\n ) as TPath;\n // We don't have onchain V2 quoter, but we do have a mixed quoter that can quote against v2 routes onchain\n // Hence in case of V2 or mixed, we explicitly encode into mixed routes.\n case Protocol.V2:\n case Protocol.MIXED:\n // we need to retain the fake pool data for the mixed route\n return encodeMixedRouteToPath(\n route instanceof V2Route\n ? new MixedRouteSDK(route.pairs, route.input, route.output, true)\n : route\n ) as TPath;\n default:\n throw new Error(\n `Unsupported protocol for the route: ${JSON.stringify(route)}`\n );\n }\n }\n\n private getContractInterface(\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n protocol: Protocol\n ): Interface {\n if (useMixedRouteQuoter || useFewV2RouteQuoter) {\n if (mixedRouteContainsV4Pool) {\n return MixedRouteQuoterV2__factory.createInterface();\n } else {\n return IMixedRouteQuoterV1__factory.createInterface();\n }\n }\n\n switch (protocol) {\n case Protocol.V3:\n return IQuoterV2__factory.createInterface();\n case Protocol.V4:\n return V4Quoter__factory.createInterface();\n default:\n throw new Error(`Unsupported protocol: ${protocol}`);\n }\n }\n\n private async consolidateResults(\n protocol: Protocol,\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n functionName: string,\n inputs: QuoteInputType[],\n providerConfig?: ProviderConfig,\n gasLimitOverride?: number\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<[BigNumber, BigNumber[], number[], BigNumber]>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n if (\n (protocol === Protocol.MIXED && mixedRouteContainsV4Pool) ||\n protocol === Protocol.V4\n ) {\n const mixedQuote =\n await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, ExtraQuoteExactInputParams, string],\n [BigNumber, BigNumber] // amountIn/amountOut, gasEstimate\n >({\n address: this.getQuoterAddress(\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol\n ),\n contractInterface: this.getContractInterface(\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol\n ),\n functionName,\n functionParams: inputs as [\n string,\n ExtraQuoteExactInputParams,\n string\n ][],\n providerConfig,\n additionalConfig: {\n gasLimitPerCallOverride: gasLimitOverride,\n },\n });\n\n return {\n blockNumber: mixedQuote.blockNumber,\n approxGasUsedPerSuccessCall: mixedQuote.approxGasUsedPerSuccessCall,\n results: mixedQuote.results.map((result) => {\n if (result.success) {\n switch (functionName) {\n case 'quoteExactInput':\n case 'quoteExactOutput':\n return {\n success: true,\n result: [\n result.result[0],\n Array<BigNumber>(inputs.length),\n Array<number>(inputs.length),\n result.result[1],\n ],\n } as SuccessResult<\n [BigNumber, BigNumber[], number[], BigNumber]\n >;\n default:\n throw new Error(`Unsupported function name: ${functionName}`);\n }\n } else {\n return result;\n }\n }),\n };\n } else {\n return await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, string],\n [BigNumber, BigNumber[], number[], BigNumber] // amountIn/amountOut, sqrtPriceX96AfterList, initializedTicksCrossedList, gasEstimate\n >({\n address: this.getQuoterAddress(\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol\n ),\n contractInterface: this.getContractInterface(\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol\n ),\n functionName,\n functionParams: inputs as [string, string][],\n providerConfig,\n additionalConfig: {\n gasLimitPerCallOverride: gasLimitOverride,\n },\n });\n }\n }\n\n private async getQuotesManyData<TRoute extends SupportedRoutes>(\n amounts: CurrencyAmount[],\n routes: TRoute[],\n functionName: 'quoteExactInput' | 'quoteExactOutput',\n _providerConfig?: ProviderConfig\n ): Promise<OnChainQuotes<TRoute>> {\n const useMixedRouteQuoter =\n routes.some((route) => route.protocol === Protocol.V2) ||\n routes.some((route) => route.protocol === Protocol.MIXED);\n const useFewV2RouteQuoter =\n routes.some((route) => route.protocol === Protocol.FEWV2);\n const useV4RouteQuoter =\n routes.some((route) => route.protocol === Protocol.V4) &&\n !useMixedRouteQuoter;\n const mixedRouteContainsV4Pool = useMixedRouteQuoter\n ? routes.some(\n (route) =>\n route.protocol === Protocol.MIXED &&\n (route as MixedRoute).pools.some((pool) => pool instanceof V4Pool)\n )\n : false;\n const protocol = useMixedRouteQuoter\n ? Protocol.MIXED\n : useFewV2RouteQuoter\n ? Protocol.FEWV2\n : useV4RouteQuoter\n ? Protocol.V4\n : Protocol.V3;\n\n const optimisticCachedRoutes =\n _providerConfig?.optimisticCachedRoutes ?? false;\n\n /// Validate that there are no incorrect routes / function combinations\n this.validateRoutes(routes, functionName, useMixedRouteQuoter, useFewV2RouteQuoter);\n\n let multicallChunk = this.batchParams(\n optimisticCachedRoutes,\n protocol\n ).multicallChunk;\n let gasLimitOverride = this.batchParams(\n optimisticCachedRoutes,\n protocol\n ).gasLimitPerCall;\n const { baseBlockOffset, rollback } = this.blockNumberConfig(protocol);\n\n // Apply the base block offset if provided\n const originalBlockNumber = await this.provider.getBlockNumber();\n const providerConfig: ProviderConfig = {\n ..._providerConfig,\n blockNumber:\n _providerConfig?.blockNumber ?? originalBlockNumber + baseBlockOffset,\n };\n\n const inputs: QuoteInputType[] = _(routes)\n .flatMap((route) => {\n const encodedRoute = this.encodeRouteToPath(route, functionName);\n\n const routeInputs: QuoteInputType[] = amounts.map((amount) => {\n switch (route.protocol) {\n case Protocol.V4:\n return [\n {\n exactCurrency: getAddress(amount.currency),\n path: encodedRoute as PathKey[],\n exactAmount: amount.quotient.toString(),\n },\n ] as QuoteExactParams[];\n case Protocol.FEWV2:\n return [encodedRoute as string, amount.quotient.toString()];\n case Protocol.MIXED:\n if (mixedRouteContainsV4Pool) {\n return [\n encodedRoute as string,\n {\n nonEncodableData: route.pools.map((_) => {\n return {\n hookData: '0x',\n };\n }) as NonEncodableData[],\n } as ExtraQuoteExactInputParams,\n amount.quotient.toString(),\n ];\n } else {\n return [encodedRoute as string, amount.quotient.toString()];\n }\n default:\n return [\n encodedRoute as string,\n `0x${amount.quotient.toString(16)}`,\n ];\n }\n });\n return routeInputs;\n })\n .value();\n\n const normalizedChunk = Math.ceil(\n inputs.length / Math.ceil(inputs.length / multicallChunk)\n );\n const inputsChunked = _.chunk(inputs, normalizedChunk);\n let quoteStates: QuoteBatchState<QuoteInputType>[] = _.map(\n inputsChunked,\n (inputChunk) => {\n return {\n status: 'pending',\n inputs: inputChunk,\n };\n }\n );\n\n log.info(\n `About to get ${\n inputs.length\n } quotes in chunks of ${normalizedChunk} [${_.map(\n inputsChunked,\n (i) => i.length\n ).join(',')}] ${\n gasLimitOverride\n ? `with a gas limit override of ${gasLimitOverride}`\n : ''\n } and block number: ${await providerConfig.blockNumber} [Original before offset: ${originalBlockNumber}].`\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteBatchSize`,\n inputs.length,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteBatchSize_${ID_TO_NETWORK_NAME(this.chainId)}`,\n inputs.length,\n MetricLoggerUnit.Count\n );\n\n const startTime = Date.now();\n\n let haveRetriedForSuccessRate = false;\n let haveRetriedForBlockHeader = false;\n let blockHeaderRetryAttemptNumber = 0;\n let haveIncrementedBlockHeaderFailureCounter = false;\n let blockHeaderRolledBack = false;\n let haveRetriedForBlockConflictError = false;\n let haveRetriedForOutOfGas = false;\n let haveRetriedForTimeout = false;\n let haveRetriedForUnknownReason = false;\n let finalAttemptNumber = 1;\n const expectedCallsMade = quoteStates.length;\n let totalCallsMade = 0;\n\n const {\n results: quoteResults,\n blockNumber,\n approxGasUsedPerSuccessCall,\n } = await retry(\n async (_bail, attemptNumber) => {\n haveIncrementedBlockHeaderFailureCounter = false;\n finalAttemptNumber = attemptNumber;\n\n const [success, failed, pending] = this.partitionQuotes(quoteStates);\n\n log.info(\n `Starting attempt: ${attemptNumber}.\n Currently ${success.length} success, ${failed.length} failed, ${pending.length} pending.\n Gas limit override: ${gasLimitOverride} Block number override: ${providerConfig.blockNumber}.`\n );\n\n quoteStates = await Promise.all(\n _.map(\n quoteStates,\n async (\n quoteState: QuoteBatchState<QuoteInputType>,\n idx: number\n ) => {\n if (quoteState.status == 'success') {\n return quoteState;\n }\n\n // QuoteChunk is pending or failed, so we try again\n const { inputs } = quoteState;\n\n try {\n totalCallsMade = totalCallsMade + 1;\n\n const results = await this.consolidateResults(\n protocol,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n functionName,\n inputs,\n providerConfig,\n gasLimitOverride\n );\n\n const successRateError = this.validateSuccessRate(\n results.results,\n haveRetriedForSuccessRate,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n );\n\n if (successRateError) {\n return {\n status: 'failed',\n inputs,\n reason: successRateError,\n results,\n } as QuoteBatchFailed<QuoteInputType>;\n }\n\n return {\n status: 'success',\n inputs,\n results,\n } as QuoteBatchSuccess<QuoteInputType>;\n } catch (err: any) {\n // Error from providers have huge messages that include all the calldata and fill the logs.\n // Catch them and rethrow with shorter message.\n if (err.message.includes('header not found')) {\n return {\n status: 'failed',\n inputs,\n reason: new ProviderBlockHeaderError(\n err.message.slice(0, 500)\n ),\n } as QuoteBatchFailed<QuoteInputType>;\n }\n\n if (err.message.includes('timeout')) {\n return {\n status: 'failed',\n inputs,\n reason: new ProviderTimeoutError(\n `Req ${idx}/${quoteStates.length}. Request had ${\n inputs.length\n } inputs. ${err.message.slice(0, 500)}`\n ),\n } as QuoteBatchFailed<QuoteInputType>;\n }\n\n if (err.message.includes('out of gas')) {\n return {\n status: 'failed',\n inputs,\n reason: new ProviderGasError(err.message.slice(0, 500)),\n } as QuoteBatchFailed<QuoteInputType>;\n }\n\n return {\n status: 'failed',\n inputs,\n reason: new Error(\n `Unknown error from provider: ${err.message.slice(0, 500)}`\n ),\n } as QuoteBatchFailed<QuoteInputType>;\n }\n }\n )\n );\n\n const [successfulQuoteStates, failedQuoteStates, pendingQuoteStates] =\n this.partitionQuotes(quoteStates);\n\n if (pendingQuoteStates.length > 0) {\n throw new Error('Pending quote after waiting for all promises.');\n }\n\n let retryAll = false;\n\n const blockNumberError = this.validateBlockNumbers<QuoteInputType>(\n successfulQuoteStates,\n inputsChunked.length,\n gasLimitOverride\n );\n\n // If there is a block number conflict we retry all the quotes.\n if (blockNumberError) {\n retryAll = true;\n }\n\n const reasonForFailureStr = _.map(\n failedQuoteStates,\n (failedQuoteState) => failedQuoteState.reason.name\n ).join(', ');\n\n if (failedQuoteStates.length > 0) {\n log.info(\n `On attempt ${attemptNumber}: ${failedQuoteStates.length}/${quoteStates.length} quotes failed. Reasons: ${reasonForFailureStr}`\n );\n\n for (const failedQuoteState of failedQuoteStates) {\n const { reason: error } = failedQuoteState;\n\n log.info(\n { error },\n `[QuoteFetchError] Attempt ${attemptNumber}. ${error.message}`\n );\n\n if (error instanceof BlockConflictError) {\n if (!haveRetriedForBlockConflictError) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteBlockConflictErrorRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForBlockConflictError = true;\n }\n\n retryAll = true;\n } else if (error instanceof ProviderBlockHeaderError) {\n if (!haveRetriedForBlockHeader) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteBlockHeaderNotFoundRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForBlockHeader = true;\n }\n\n // Ensure that if multiple calls fail due to block header in the current pending batch,\n // we only count once.\n if (!haveIncrementedBlockHeaderFailureCounter) {\n blockHeaderRetryAttemptNumber =\n blockHeaderRetryAttemptNumber + 1;\n haveIncrementedBlockHeaderFailureCounter = true;\n }\n\n if (rollback.enabled) {\n const { rollbackBlockOffset, attemptsBeforeRollback } =\n rollback;\n\n if (\n blockHeaderRetryAttemptNumber >= attemptsBeforeRollback &&\n !blockHeaderRolledBack\n ) {\n log.info(\n `Attempt ${attemptNumber}. Have failed due to block header ${\n blockHeaderRetryAttemptNumber - 1\n } times. Rolling back block number by ${rollbackBlockOffset} for next retry`\n );\n providerConfig.blockNumber = providerConfig.blockNumber\n ? (await providerConfig.blockNumber) + rollbackBlockOffset\n : (await this.provider.getBlockNumber()) +\n rollbackBlockOffset;\n\n retryAll = true;\n blockHeaderRolledBack = true;\n }\n }\n } else if (error instanceof ProviderTimeoutError) {\n if (!haveRetriedForTimeout) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteTimeoutRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForTimeout = true;\n }\n } else if (error instanceof ProviderGasError) {\n if (!haveRetriedForOutOfGas) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteOutOfGasExceptionRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForOutOfGas = true;\n }\n gasLimitOverride =\n this.gasErrorFailureOverride(protocol).gasLimitOverride;\n multicallChunk =\n this.gasErrorFailureOverride(protocol).multicallChunk;\n retryAll = true;\n } else if (error instanceof SuccessRateError) {\n if (!haveRetriedForSuccessRate) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteSuccessRateRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForSuccessRate = true;\n\n // Low success rate can indicate too little gas given to each call.\n gasLimitOverride =\n this.successRateFailureOverrides(protocol).gasLimitOverride;\n multicallChunk =\n this.successRateFailureOverrides(protocol).multicallChunk;\n retryAll = true;\n }\n } else {\n if (!haveRetriedForUnknownReason) {\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteUnknownReasonRetry`,\n 1,\n MetricLoggerUnit.Count\n );\n haveRetriedForUnknownReason = true;\n }\n }\n }\n }\n\n if (retryAll) {\n log.info(\n `Attempt ${attemptNumber}. Resetting all requests to pending for next attempt.`\n );\n\n const normalizedChunk = Math.ceil(\n inputs.length / Math.ceil(inputs.length / multicallChunk)\n );\n\n const inputsChunked = _.chunk(inputs, normalizedChunk);\n quoteStates = _.map(inputsChunked, (inputChunk) => {\n return {\n status: 'pending',\n inputs: inputChunk,\n };\n });\n }\n\n if (failedQuoteStates.length > 0) {\n // TODO: Work with Arbitrum to find a solution for making large multicalls with gas limits that always\n // successfully.\n //\n // On Arbitrum we can not set a gas limit for every call in the multicall and guarantee that\n // we will not run out of gas on the node. This is because they have a different way of accounting\n // for gas, that seperates storage and compute gas costs, and we can not cover both in a single limit.\n //\n // To work around this and avoid throwing errors when really we just couldn't get a quote, we catch this\n // case and return 0 quotes found.\n if (\n (this.chainId == ChainId.ARBITRUM_ONE ||\n this.chainId == ChainId.ARBITRUM_GOERLI) &&\n _.every(\n failedQuoteStates,\n (failedQuoteState) =>\n failedQuoteState.reason instanceof ProviderGasError\n ) &&\n attemptNumber == this.retryOptions.retries\n ) {\n log.error(\n `Failed to get quotes on Arbitrum due to provider gas error issue. Overriding error to return 0 quotes.`\n );\n return {\n results: [],\n blockNumber: BigNumber.from(0),\n approxGasUsedPerSuccessCall: 0,\n };\n }\n throw new Error(\n `Failed to get ${failedQuoteStates.length} quotes. Reasons: ${reasonForFailureStr}`\n );\n }\n\n const callResults = _.map(\n successfulQuoteStates,\n (quoteState) => quoteState.results\n );\n\n return {\n results: _.flatMap(callResults, (result) => result.results),\n blockNumber: BigNumber.from(callResults[0]!.blockNumber),\n approxGasUsedPerSuccessCall: stats.percentile(\n _.map(callResults, (result) => result.approxGasUsedPerSuccessCall),\n 100\n ),\n };\n },\n {\n retries: DEFAULT_BATCH_RETRIES,\n ...this.retryOptions,\n }\n );\n\n const routesQuotes = this.processQuoteResults(\n quoteResults,\n routes,\n amounts,\n BigNumber.from(gasLimitOverride)\n );\n\n const endTime = Date.now();\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteLatency`,\n endTime - startTime,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteApproxGasUsedPerSuccessfulCall`,\n approxGasUsedPerSuccessCall,\n MetricLoggerUnit.Count\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteNumRetryLoops`,\n finalAttemptNumber - 1,\n MetricLoggerUnit.Count\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteTotalCallsToProvider`,\n totalCallsMade,\n MetricLoggerUnit.Count\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteExpectedCallsToProvider`,\n expectedCallsMade,\n MetricLoggerUnit.Count\n );\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteNumRetriedCalls`,\n totalCallsMade - expectedCallsMade,\n MetricLoggerUnit.Count\n );\n\n const [successfulQuotes, failedQuotes] = _(routesQuotes)\n .flatMap((routeWithQuotes: RouteWithQuotes<TRoute>) => routeWithQuotes[1])\n .partition((quote) => quote.quote != null)\n .value();\n\n log.info(\n `Got ${successfulQuotes.length} successful quotes, ${\n failedQuotes.length\n } failed quotes. Took ${\n finalAttemptNumber - 1\n } attempt loops. Total calls made to provider: ${totalCallsMade}. Have retried for timeout: ${haveRetriedForTimeout}`\n );\n\n // Log total routes\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}RoutesLength`,\n routesQuotes.length,\n MetricLoggerUnit.Count\n );\n\n // Log total quotes\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}RoutesQuotesLength`,\n successfulQuotes.length + failedQuotes.length,\n MetricLoggerUnit.Count\n );\n\n // log successful quotes\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}RoutesSuccessfulQuotesLength`,\n successfulQuotes.length,\n MetricLoggerUnit.Count\n );\n\n // log failed quotes\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}RoutesFailedQuotesLength`,\n failedQuotes.length,\n MetricLoggerUnit.Count\n );\n\n return {\n routesWithQuotes: routesQuotes,\n blockNumber,\n } as OnChainQuotes<TRoute>;\n }\n\n private partitionQuotes<TQuoteParams>(\n quoteStates: QuoteBatchState<TQuoteParams>[]\n ): [\n QuoteBatchSuccess<TQuoteParams>[],\n QuoteBatchFailed<TQuoteParams>[],\n QuoteBatchPending<TQuoteParams>[]\n ] {\n const successfulQuoteStates: QuoteBatchSuccess<TQuoteParams>[] = _.filter<\n QuoteBatchState<TQuoteParams>,\n QuoteBatchSuccess<TQuoteParams>\n >(\n quoteStates,\n (quoteState): quoteState is QuoteBatchSuccess<TQuoteParams> =>\n quoteState.status == 'success'\n );\n\n const failedQuoteStates: QuoteBatchFailed<TQuoteParams>[] = _.filter<\n QuoteBatchState<TQuoteParams>,\n QuoteBatchFailed<TQuoteParams>\n >(\n quoteStates,\n (quoteState): quoteState is QuoteBatchFailed<TQuoteParams> =>\n quoteState.status == 'failed'\n );\n\n const pendingQuoteStates: QuoteBatchPending<TQuoteParams>[] = _.filter<\n QuoteBatchState<TQuoteParams>,\n QuoteBatchPending<TQuoteParams>\n >(\n quoteStates,\n (quoteState): quoteState is QuoteBatchPending<TQuoteParams> =>\n quoteState.status == 'pending'\n );\n\n return [successfulQuoteStates, failedQuoteStates, pendingQuoteStates];\n }\n\n private processQuoteResults<TRoute extends SupportedRoutes>(\n quoteResults: Result<[BigNumber, BigNumber[], number[], BigNumber]>[],\n routes: TRoute[],\n amounts: CurrencyAmount[],\n gasLimit: BigNumber\n ): RouteWithQuotes<TRoute>[] {\n const routesQuotes: RouteWithQuotes<TRoute>[] = [];\n\n const quotesResultsByRoute = _.chunk(quoteResults, amounts.length);\n\n const debugFailedQuotes: {\n amount: string;\n percent: number;\n route: string;\n }[] = [];\n\n for (let i = 0; i < quotesResultsByRoute.length; i++) {\n const route = routes[i]!;\n const quoteResults = quotesResultsByRoute[i]!;\n const quotes: AmountQuote[] = _.map(\n quoteResults,\n (\n quoteResult: Result<[BigNumber, BigNumber[], number[], BigNumber]>,\n index: number\n ) => {\n const amount = amounts[index]!;\n if (!quoteResult.success) {\n const percent = (100 / amounts.length) * (index + 1);\n\n const amountStr = amount.toFixed(\n Math.min(amount.currency.decimals, 2)\n );\n const routeStr = routeToString(route);\n debugFailedQuotes.push({\n route: routeStr,\n percent,\n amount: amountStr,\n });\n\n return {\n amount,\n quote: null,\n sqrtPriceX96AfterList: null,\n gasEstimate: quoteResult.gasUsed ?? null,\n gasLimit: gasLimit,\n initializedTicksCrossedList: null,\n };\n }\n\n return {\n amount,\n quote: quoteResult.result[0],\n sqrtPriceX96AfterList: quoteResult.result[1],\n initializedTicksCrossedList: quoteResult.result[2],\n gasEstimate: quoteResult.result[3],\n gasLimit: gasLimit,\n };\n }\n );\n\n routesQuotes.push([route, quotes]);\n }\n\n // For routes and amounts that we failed to get a quote for, group them by route\n // and batch them together before logging to minimize number of logs.\n const debugChunk = 80;\n _.forEach(_.chunk(debugFailedQuotes, debugChunk), (quotes, idx) => {\n const failedQuotesByRoute = _.groupBy(quotes, (q) => q.route);\n const failedFlat = _.mapValues(failedQuotesByRoute, (f) =>\n _(f)\n .map((f) => `${f.percent}%[${f.amount}]`)\n .join(',')\n );\n\n log.info(\n {\n failedQuotes: _.map(\n failedFlat,\n (amounts, routeStr) => `${routeStr} : ${amounts}`\n ),\n },\n `Failed on chain quotes for routes Part ${idx}/${Math.ceil(\n debugFailedQuotes.length / debugChunk\n )}`\n );\n });\n\n return routesQuotes;\n }\n\n private validateBlockNumbers<TQuoteParams>(\n successfulQuoteStates: QuoteBatchSuccess<TQuoteParams>[],\n totalCalls: number,\n gasLimitOverride?: number\n ): BlockConflictError | null {\n if (successfulQuoteStates.length <= 1) {\n return null;\n }\n\n const results = _.map(\n successfulQuoteStates,\n (quoteState) => quoteState.results\n );\n\n const blockNumbers = _.map(results, (result) => result.blockNumber);\n\n const uniqBlocks = _(blockNumbers)\n .map((blockNumber) => blockNumber.toNumber())\n .uniq()\n .value();\n\n if (uniqBlocks.length == 1) {\n return null;\n }\n\n /* if (\n uniqBlocks.length == 2 &&\n Math.abs(uniqBlocks[0]! - uniqBlocks[1]!) <= 1\n ) {\n return null;\n } */\n\n return new BlockConflictError(\n `Quotes returned from different blocks. ${uniqBlocks}. ${totalCalls} calls were made with gas limit ${gasLimitOverride}`\n );\n }\n\n protected validateSuccessRate(\n allResults: Result<[BigNumber, BigNumber[], number[], BigNumber]>[],\n haveRetriedForSuccessRate: boolean,\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean,\n mixedRouteContainsV4Pool: boolean,\n protocol: Protocol,\n optimisticCachedRoutes: boolean\n ): void | SuccessRateError {\n const numResults = allResults.length;\n const numSuccessResults = allResults.filter(\n (result) => result.success\n ).length;\n\n const successRate = (1.0 * numSuccessResults) / numResults;\n\n const { quoteMinSuccessRate } = this.batchParams(\n optimisticCachedRoutes,\n protocol\n );\n if (successRate < quoteMinSuccessRate) {\n if (haveRetriedForSuccessRate) {\n log.info(\n `Quote success rate still below threshold despite retry. Continuing. ${quoteMinSuccessRate}: ${successRate}`\n );\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteRetriedSuccessRateLow`,\n successRate,\n MetricLoggerUnit.Percent\n );\n\n return;\n }\n\n metric.putMetric(\n `${this.metricsPrefix(\n this.chainId,\n useMixedRouteQuoter,\n useFewV2RouteQuoter,\n mixedRouteContainsV4Pool,\n protocol,\n optimisticCachedRoutes\n )}QuoteSuccessRateLow`,\n successRate,\n MetricLoggerUnit.Percent\n );\n return new SuccessRateError(\n `Quote success rate below threshold of ${quoteMinSuccessRate}: ${successRate}`\n );\n }\n }\n\n /**\n * Throw an error for incorrect routes / function combinations\n * @param routes Any combination of V3, FewV2, V2, and Mixed routes.\n * @param functionName\n * @param useMixedRouteQuoter true if there are ANY V2Routes or MixedRoutes in the routes parameter\n */\n protected validateRoutes(\n routes: SupportedRoutes[],\n functionName: string,\n useMixedRouteQuoter: boolean,\n useFewV2RouteQuoter: boolean\n ) {\n /// We do not send any V3Routes to new qutoer becuase it is not deployed on chains besides mainnet\n if (\n routes.some((route) => route.protocol === Protocol.V3) &&\n useMixedRouteQuoter\n ) {\n throw new Error(`Cannot use mixed route quoter with V3 routes`);\n }\n\n /// We cannot call quoteExactOutput with V2 or Mixed routes\n if (functionName === 'quoteExactOutput' && useMixedRouteQuoter) {\n throw new Error('Cannot call quoteExactOutput with V2 or Mixed routes');\n }\n\n if (functionName === 'quoteExactOutput' && useFewV2RouteQuoter) {\n throw new Error('Cannot call quoteExactOutput with FEV2 routes');\n }\n }\n}\n"]}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pool-provider.js","sourceRoot":"","sources":["../../../src/providers/pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Currency } from '@fewprotocol/sdk-core';\nimport { Pool as V3Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport { Pool as V4Pool } from '@fewprotocol/uniswap-v4-sdk';\nimport { Options as RetryOptions } from 'async-retry';\nimport _ from 'lodash';\n\nimport { log, poolToString } from '../util';\n\nimport { IMulticallProvider, Result } from './multicall-provider';\nimport { ProviderConfig } from './provider';\n\nexport type PoolConstruct<TCurrency extends Currency> = [\n TCurrency,\n TCurrency,\n ...Array<string | number>\n];\nexport type Pool = V3Pool | V4Pool;\n\nexport type ISlot0 = {\n sqrtPriceX96: BigNumber;\n tick: number;\n};\n\nexport type ILiquidity = { liquidity: BigNumber };\n\nexport abstract class PoolProvider<\n TCurrency extends Currency,\n TPoolConstruct extends PoolConstruct<TCurrency>,\n TISlot0 extends ISlot0,\n TILiquidity extends ILiquidity,\n TPoolAccessor\n> {\n /**\n * Creates an instance of V4PoolProvider.\n * @param chainId The chain id to use.\n * @param multicall2Provider The multicall provider to use to get the pools.\n * @param retryOptions The retry options for each call to the multicall.\n */\n constructor(\n protected chainId: ChainId,\n protected multicall2Provider: IMulticallProvider,\n protected retryOptions: RetryOptions = {\n retries: 2,\n minTimeout: 50,\n maxTimeout: 500,\n }\n ) {}\n\n protected async getPoolsInternal(\n poolConstructs: TPoolConstruct[],\n providerConfig?: ProviderConfig\n ): Promise<TPoolAccessor> {\n const poolIdentifierSet: Set<string> = new Set<string>();\n const sortedCurrencyPairs: Array<TPoolConstruct> = [];\n const sortedPoolIdentifiers: string[] = [];\n\n for (const poolConstruct of poolConstructs) {\n const {\n poolIdentifier: poolIdentifier,\n currency0,\n currency1,\n } = this.getPoolIdentifier(poolConstruct);\n\n if (poolIdentifierSet.has(poolIdentifier)) {\n continue;\n }\n\n // It's the easiest way to change the pool construct in place, since we don't know the entire pool construct at compiling time.\n poolConstruct[0] = currency0;\n poolConstruct[1] = currency1;\n poolIdentifierSet.add(poolIdentifier);\n sortedCurrencyPairs.push(poolConstruct);\n sortedPoolIdentifiers.push(poolIdentifier);\n }\n\n log.debug(\n `getPools called with ${poolConstructs.length} token pairs. Deduped down to ${poolIdentifierSet.size}`\n );\n\n const [slot0Results, liquidityResults] = await Promise.all([\n this.getPoolsData<TISlot0>(\n sortedPoolIdentifiers,\n this.getSlot0FunctionName(),\n providerConfig\n ),\n this.getPoolsData<[TILiquidity]>(\n sortedPoolIdentifiers,\n this.getLiquidityFunctionName(),\n providerConfig\n ),\n ]);\n\n log.info(\n `Got liquidity and slot0s for ${poolIdentifierSet.size} pools ${\n providerConfig?.blockNumber\n ? `as of block: ${providerConfig?.blockNumber}.`\n : ``\n }`\n );\n\n const poolIdentifierToPool: { [poolIdentifier: string]: Pool } = {};\n\n const invalidPools: TPoolConstruct[] = [];\n\n for (let i = 0; i < sortedPoolIdentifiers.length; i++) {\n const slot0Result = slot0Results[i];\n const liquidityResult = liquidityResults[i];\n\n // These properties tell us if a pool is valid and initialized or not.\n if (\n !slot0Result?.success ||\n !liquidityResult?.success ||\n slot0Result.result.sqrtPriceX96.eq(0)\n ) {\n invalidPools.push(sortedCurrencyPairs[i]!);\n\n continue;\n }\n\n const slot0 = slot0Result.result;\n const liquidity = liquidityResult.result[0];\n\n const pool = this.instantiatePool(\n sortedCurrencyPairs[i]!,\n slot0,\n liquidity\n );\n\n const poolIdentifier = sortedPoolIdentifiers[i]!;\n poolIdentifierToPool[poolIdentifier] = pool;\n }\n\n const poolStrs = _.map(Object.values(poolIdentifierToPool), poolToString);\n\n log.debug({ poolStrs }, `Found ${poolStrs.length} valid pools`);\n\n return this.instantiatePoolAccessor(poolIdentifierToPool);\n }\n\n protected abstract getLiquidityFunctionName(): string;\n\n protected abstract getSlot0FunctionName(): string;\n\n protected abstract getPoolsData<TReturn>(\n poolIdentifiers: string[],\n functionName: string,\n providerConfig?: ProviderConfig\n ): Promise<Result<TReturn>[]>;\n\n protected abstract getPoolIdentifier(pool: TPoolConstruct): {\n poolIdentifier: string;\n currency0: TCurrency;\n currency1: TCurrency;\n };\n\n protected abstract instantiatePool(\n pool: TPoolConstruct,\n slot0: TISlot0,\n liquidity: TILiquidity\n ): Pool;\n\n protected abstract instantiatePoolAccessor(poolIdentifierToPool: {\n [poolId: string]: Pool;\n }): TPoolAccessor;\n}\n"]}