@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.
Files changed (156) hide show
  1. package/build/main/routers/alpha-router/alpha-router.js +1 -4
  2. package/build/main/tsconfig.tsbuildinfo +1 -1
  3. package/build/main/util/methodParameters.js +1 -3
  4. package/build/module/routers/alpha-router/alpha-router.js +1 -4
  5. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  6. package/build/module/util/methodParameters.js +1 -3
  7. package/package.json +5 -5
  8. package/build/main/index.js.map +0 -1
  9. package/build/main/providers/cache-node.js.map +0 -1
  10. package/build/main/providers/cache.js.map +0 -1
  11. package/build/main/providers/caching/route/index.js.map +0 -1
  12. package/build/main/providers/caching/route/model/cache-mode.js.map +0 -1
  13. package/build/main/providers/caching/route/model/cached-route.js.map +0 -1
  14. package/build/main/providers/caching/route/model/cached-routes.js.map +0 -1
  15. package/build/main/providers/caching/route/model/index.js.map +0 -1
  16. package/build/main/providers/caching/route/route-caching-provider.js.map +0 -1
  17. package/build/main/providers/caching-gas-provider.js.map +0 -1
  18. package/build/main/providers/caching-subgraph-provider.js.map +0 -1
  19. package/build/main/providers/caching-token-list-provider.js.map +0 -1
  20. package/build/main/providers/caching-token-provider.js.map +0 -1
  21. package/build/main/providers/eip-1559-gas-price-provider.js.map +0 -1
  22. package/build/main/providers/eth-estimate-gas-provider.js.map +0 -1
  23. package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +0 -1
  24. package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +0 -1
  25. package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +0 -1
  26. package/build/main/providers/fewV2/ring-pool-provider.js.map +0 -1
  27. package/build/main/providers/fewV2/ring-quote-provider.js.map +0 -1
  28. package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +0 -1
  29. package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +0 -1
  30. package/build/main/providers/fewV2/ring-subgraph-provider.js.map +0 -1
  31. package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +0 -1
  32. package/build/main/providers/gas-price-provider.js.map +0 -1
  33. package/build/main/providers/index.js.map +0 -1
  34. package/build/main/providers/legacy-gas-price-provider.js.map +0 -1
  35. package/build/main/providers/multicall-provider.js.map +0 -1
  36. package/build/main/providers/multicall-ringswap-provider.js.map +0 -1
  37. package/build/main/providers/multicall-uniswap-provider.js.map +0 -1
  38. package/build/main/providers/on-chain-gas-price-provider.js.map +0 -1
  39. package/build/main/providers/on-chain-quote-provider.js.map +0 -1
  40. package/build/main/providers/pool-provider.js.map +0 -1
  41. package/build/main/providers/portion-provider.js.map +0 -1
  42. package/build/main/providers/provider.js.map +0 -1
  43. package/build/main/providers/simulation-provider.js.map +0 -1
  44. package/build/main/providers/static-gas-price-provider.js.map +0 -1
  45. package/build/main/providers/subgraph-provider-with-fallback.js.map +0 -1
  46. package/build/main/providers/subgraph-provider.js.map +0 -1
  47. package/build/main/providers/swap-router-provider.js.map +0 -1
  48. package/build/main/providers/tenderly-simulation-provider.js.map +0 -1
  49. package/build/main/providers/token-fee-fetcher.js.map +0 -1
  50. package/build/main/providers/token-properties-provider.js.map +0 -1
  51. package/build/main/providers/token-provider.js.map +0 -1
  52. package/build/main/providers/token-validator-provider.js.map +0 -1
  53. package/build/main/providers/uri-subgraph-provider.js.map +0 -1
  54. package/build/main/providers/v2/caching-pool-provider.js.map +0 -1
  55. package/build/main/providers/v2/caching-subgraph-provider.js.map +0 -1
  56. package/build/main/providers/v2/pool-provider.js.map +0 -1
  57. package/build/main/providers/v2/quote-provider.js.map +0 -1
  58. package/build/main/providers/v2/static-subgraph-provider.js.map +0 -1
  59. package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +0 -1
  60. package/build/main/providers/v2/subgraph-provider.js.map +0 -1
  61. package/build/main/providers/v2/uri-subgraph-provider.js.map +0 -1
  62. package/build/main/providers/v3/caching-pool-provider.js.map +0 -1
  63. package/build/main/providers/v3/caching-subgraph-provider.js.map +0 -1
  64. package/build/main/providers/v3/gas-data-provider.js.map +0 -1
  65. package/build/main/providers/v3/pool-provider.js.map +0 -1
  66. package/build/main/providers/v3/static-subgraph-provider.js.map +0 -1
  67. package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +0 -1
  68. package/build/main/providers/v3/subgraph-provider.js.map +0 -1
  69. package/build/main/providers/v3/uri-subgraph-provider.js.map +0 -1
  70. package/build/main/providers/v4/caching-pool-provider.js.map +0 -1
  71. package/build/main/providers/v4/caching-subgraph-provider.js.map +0 -1
  72. package/build/main/providers/v4/pool-provider.js.map +0 -1
  73. package/build/main/providers/v4/static-subgraph-provider.js.map +0 -1
  74. package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +0 -1
  75. package/build/main/providers/v4/subgraph-provider.js.map +0 -1
  76. package/build/main/providers/v4/uri-subgraph-provider.js.map +0 -1
  77. package/build/main/routers/alpha-router/alpha-router.js.map +0 -1
  78. package/build/main/routers/alpha-router/config.js.map +0 -1
  79. package/build/main/routers/alpha-router/entities/index.js.map +0 -1
  80. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +0 -1
  81. package/build/main/routers/alpha-router/functions/best-swap-route.js.map +0 -1
  82. package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +0 -1
  83. package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +0 -1
  84. package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +0 -1
  85. package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +0 -1
  86. package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +0 -1
  87. package/build/main/routers/alpha-router/gas-models/gas-model.js.map +0 -1
  88. package/build/main/routers/alpha-router/gas-models/index.js.map +0 -1
  89. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +0 -1
  90. package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +0 -1
  91. package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +0 -1
  92. package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +0 -1
  93. package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +0 -1
  94. package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +0 -1
  95. package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +0 -1
  96. package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +0 -1
  97. package/build/main/routers/alpha-router/index.js.map +0 -1
  98. package/build/main/routers/alpha-router/quoters/base-quoter.js.map +0 -1
  99. package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +0 -1
  100. package/build/main/routers/alpha-router/quoters/index.js.map +0 -1
  101. package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +0 -1
  102. package/build/main/routers/alpha-router/quoters/model/index.js.map +0 -1
  103. package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +0 -1
  104. package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +0 -1
  105. package/build/main/routers/alpha-router/quoters/model/results/index.js.map +0 -1
  106. package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +0 -1
  107. package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +0 -1
  108. package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +0 -1
  109. package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +0 -1
  110. package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +0 -1
  111. package/build/main/routers/index.js.map +0 -1
  112. package/build/main/routers/legacy-router/bases.js.map +0 -1
  113. package/build/main/routers/legacy-router/index.js.map +0 -1
  114. package/build/main/routers/legacy-router/legacy-router.js.map +0 -1
  115. package/build/main/routers/router.js.map +0 -1
  116. package/build/main/types/other/commons.js.map +0 -1
  117. package/build/main/types/other/factories/Erc20__factory.js.map +0 -1
  118. package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +0 -1
  119. package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +0 -1
  120. package/build/main/types/other/factories/ITokenValidator__factory.js.map +0 -1
  121. package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +0 -1
  122. package/build/main/types/other/factories/Permit2__factory.js.map +0 -1
  123. package/build/main/types/other/factories/StateView__factory.js.map +0 -1
  124. package/build/main/types/other/factories/SwapRouter02__factory.js.map +0 -1
  125. package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +0 -1
  126. package/build/main/types/other/factories/V4Quoter__factory.js.map +0 -1
  127. package/build/main/types/v2/commons.js.map +0 -1
  128. package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +0 -1
  129. package/build/main/types/v3/commons.js.map +0 -1
  130. package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +0 -1
  131. package/build/main/types/v3/factories/IQuoterV2__factory.js.map +0 -1
  132. package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +0 -1
  133. package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +0 -1
  134. package/build/main/util/addresses.js.map +0 -1
  135. package/build/main/util/amounts.js.map +0 -1
  136. package/build/main/util/callData.js.map +0 -1
  137. package/build/main/util/chains.js.map +0 -1
  138. package/build/main/util/defaultBlocksToLive.js.map +0 -1
  139. package/build/main/util/fewAddress.js.map +0 -1
  140. package/build/main/util/gas-factory-helpers.js.map +0 -1
  141. package/build/main/util/hooksOptions.js.map +0 -1
  142. package/build/main/util/index.js.map +0 -1
  143. package/build/main/util/intent.js.map +0 -1
  144. package/build/main/util/l2FeeChains.js.map +0 -1
  145. package/build/main/util/log.js.map +0 -1
  146. package/build/main/util/methodParameters.js.map +0 -1
  147. package/build/main/util/metric.js.map +0 -1
  148. package/build/main/util/mixedRouteFilterOutV4Pools.js.map +0 -1
  149. package/build/main/util/onchainQuoteProviderConfigs.js.map +0 -1
  150. package/build/main/util/pool.js.map +0 -1
  151. package/build/main/util/protocols.js.map +0 -1
  152. package/build/main/util/routes.js.map +0 -1
  153. package/build/main/util/serializeRouteIds.js.map +0 -1
  154. package/build/main/util/simple-perf-tracker.js.map +0 -1
  155. package/build/main/util/tenderlySimulationErrorBreakDown.js.map +0 -1
  156. package/build/main/util/unsupported-tokens.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"multicall-ringswap-provider.js","sourceRoot":"","sources":["../../../src/providers/multicall-ringswap-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\nimport stats from 'stats-lite';\n\nimport { UniswapInterfaceMulticall__factory } from '../types/v3/factories/UniswapInterfaceMulticall__factory';\nimport { UniswapInterfaceMulticall } from '../types/v3/UniswapInterfaceMulticall';\nimport { RING_UNISWAP_MULTICALL_ADDRESSES } from '../util/addresses';\nimport { log } from '../util/log';\n\nimport {\n CallMultipleFunctionsOnSameContractParams,\n CallSameFunctionOnContractWithMultipleParams,\n CallSameFunctionOnMultipleContractsParams,\n IMulticallProvider,\n Result,\n} from './multicall-provider';\nimport { UniswapMulticallConfig } from './multicall-uniswap-provider';\n\n/**\n * The UniswapMulticall contract has added functionality for limiting the amount of gas\n * that each call within the multicall can consume. This is useful for operations where\n * a call could consume such a large amount of gas that it causes the node to error out\n * with an out of gas error.\n *\n * @export\n * @class RingswapMulticallProvider\n */\nexport class RingswapMulticallProvider extends IMulticallProvider<UniswapMulticallConfig> {\n private multicallContract: UniswapInterfaceMulticall;\n\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n protected gasLimitPerCall = 1_000_000\n ) {\n super();\n const multicallAddress = RING_UNISWAP_MULTICALL_ADDRESSES[this.chainId];\n\n if (!multicallAddress) {\n throw new Error(\n `No address for Uniswap Multicall Contract on chain id: ${chainId}`\n );\n }\n\n this.multicallContract = UniswapInterfaceMulticall__factory.connect(\n multicallAddress,\n this.provider\n );\n }\n\n public async callSameFunctionOnMultipleContracts<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnMultipleContractsParams<TFunctionParams>\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }> {\n const {\n addresses,\n contractInterface,\n functionName,\n functionParams,\n providerConfig,\n } = params;\n\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const fragment = contractInterface.getFunction(functionName);\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParams\n );\n\n const calls = _.map(addresses, (address) => {\n return {\n target: address,\n callData,\n gasLimit: this.gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} across ${addresses.length} addresses`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid calls.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} on address ${addresses[i]}`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results },\n `Results for multicall on ${functionName} across ${addresses.length} addresses as of block ${blockNumber}`\n );\n\n return { blockNumber, results };\n }\n\n public async callSameFunctionOnContractWithMultipleParams<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionName,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n const fragment = contractInterface.getFunction(functionName);\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionParams, (functionParam) => {\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParam\n );\n\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} address ${address} with params ${functionParams[i]}`\n );\n results.push({\n success: false,\n returnData,\n gasUsed,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionName, address },\n `Results for multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n\n public async callMultipleFunctionsOnSameContract<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionNames,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionNames, (functionName, i) => {\n const fragment = contractInterface.getFunction(functionName);\n const param = functionParams ? functionParams[i] : [];\n const callData = contractInterface.encodeFunctionData(fragment, param);\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionNames.length} functions at address ${address} with ${functionParams?.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const fragment = contractInterface.getFunction(functionNames[i]!);\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionNames[i]} with ${\n functionParams ? functionParams[i] : '0'\n } params`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionNames, address },\n `Results for multicall for ${\n functionNames.length\n } functions at address ${address} with ${\n functionParams ? functionParams.length : ' 0'\n } different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"multicall-uniswap-provider.js","sourceRoot":"","sources":["../../../src/providers/multicall-uniswap-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\nimport stats from 'stats-lite';\n\nimport { UniswapInterfaceMulticall__factory } from '../types/v3/factories/UniswapInterfaceMulticall__factory';\nimport { UniswapInterfaceMulticall } from '../types/v3/UniswapInterfaceMulticall';\nimport { UNISWAP_MULTICALL_ADDRESSES } from '../util/addresses';\nimport { log } from '../util/log';\n\nimport {\n CallMultipleFunctionsOnSameContractParams,\n CallSameFunctionOnContractWithMultipleParams,\n CallSameFunctionOnMultipleContractsParams,\n IMulticallProvider,\n Result,\n} from './multicall-provider';\n\nexport type UniswapMulticallConfig = {\n gasLimitPerCallOverride?: number;\n};\n\n/**\n * The UniswapMulticall contract has added functionality for limiting the amount of gas\n * that each call within the multicall can consume. This is useful for operations where\n * a call could consume such a large amount of gas that it causes the node to error out\n * with an out of gas error.\n *\n * @export\n * @class UniswapMulticallProvider\n */\nexport class UniswapMulticallProvider extends IMulticallProvider<UniswapMulticallConfig> {\n private multicallContract: UniswapInterfaceMulticall;\n\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n protected gasLimitPerCall = 1_000_000\n ) {\n super();\n const multicallAddress = UNISWAP_MULTICALL_ADDRESSES[this.chainId];\n\n if (!multicallAddress) {\n throw new Error(\n `No address for Uniswap Multicall Contract on chain id: ${chainId}`\n );\n }\n\n this.multicallContract = UniswapInterfaceMulticall__factory.connect(\n multicallAddress,\n this.provider\n );\n }\n\n public async callSameFunctionOnMultipleContracts<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnMultipleContractsParams<TFunctionParams>\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }> {\n const {\n addresses,\n contractInterface,\n functionName,\n functionParams,\n providerConfig,\n } = params;\n\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const fragment = contractInterface.getFunction(functionName);\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParams\n );\n\n const calls = _.map(addresses, (address) => {\n return {\n target: address,\n callData,\n gasLimit: this.gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} across ${addresses.length} addresses`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid calls.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} on address ${addresses[i]}`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results },\n `Results for multicall on ${functionName} across ${addresses.length} addresses as of block ${blockNumber}`\n );\n\n return { blockNumber, results };\n }\n\n public async callSameFunctionOnContractWithMultipleParams<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionName,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n const fragment = contractInterface.getFunction(functionName);\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionParams, (functionParam) => {\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParam\n );\n\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} address ${address} with params ${functionParams[i]}`\n );\n results.push({\n success: false,\n returnData,\n gasUsed,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionName, address },\n `Results for multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n\n public async callMultipleFunctionsOnSameContract<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionNames,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionNames, (functionName, i) => {\n const fragment = contractInterface.getFunction(functionName);\n const param = functionParams ? functionParams[i] : [];\n const callData = contractInterface.encodeFunctionData(fragment, param);\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionNames.length} functions at address ${address} with ${functionParams?.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const fragment = contractInterface.getFunction(functionNames[i]!);\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionNames[i]} with ${\n functionParams ? functionParams[i] : '0'\n } params`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionNames, address },\n `Results for multicall for ${\n functionNames.length\n } functions at address ${address} with ${\n functionParams ? functionParams.length : ' 0'\n } different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"on-chain-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/on-chain-gas-price-provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;AAEhD,qDAAoD;AAEpD,6DAAmE;AAGnE,MAAM,iCAAiC,GAAG;IACxC,kBAAO,CAAC,OAAO;IACf,kBAAO,CAAC,MAAM;IACd,kBAAO,CAAC,cAAc;IACtB,kBAAO,CAAC,YAAY;IACpB,GAAG,2BAAa;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,MAAa,uBAAwB,SAAQ,sCAAiB;IAC5D,YACY,OAAgB,EAChB,uBAAgD,EAChD,sBAA8C,EAC9C,YAAuB,iCAAiC;QAElE,KAAK,EAAE,CAAC;QALE,YAAO,GAAP,OAAO,CAAS;QAChB,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,2BAAsB,GAAtB,sBAAsB,CAAwB;QAC9C,cAAS,GAAT,SAAS,CAA+C;IAGpE,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,iBAAyB,EACzB,kBAA2B;QAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAC7C,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;SACH;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAC5C,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AA1BD,0DA0BC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\n\nimport { opStackChains } from '../util/l2FeeChains';\nimport { EIP1559GasPriceProvider } from './eip-1559-gas-price-provider';\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\nimport { LegacyGasPriceProvider } from './legacy-gas-price-provider';\n\nconst DEFAULT_EIP_1559_SUPPORTED_CHAINS = [\n ChainId.MAINNET,\n ChainId.GOERLI,\n ChainId.POLYGON_MUMBAI,\n ChainId.ARBITRUM_ONE,\n ...opStackChains,\n];\n\n/**\n * Gets gas prices on chain. If the chain supports EIP-1559 and has the feeHistory API,\n * uses the EIP1559 provider. Otherwise it will use a legacy provider that uses eth_gasPrice\n *\n * @export\n * @class OnChainGasPriceProvider\n */\nexport class OnChainGasPriceProvider extends IGasPriceProvider {\n constructor(\n protected chainId: ChainId,\n protected eip1559GasPriceProvider: EIP1559GasPriceProvider,\n protected legacyGasPriceProvider: LegacyGasPriceProvider,\n protected eipChains: ChainId[] = DEFAULT_EIP_1559_SUPPORTED_CHAINS\n ) {\n super();\n }\n\n public override async getGasPrice(\n latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<GasPrice> {\n if (this.eipChains.includes(this.chainId)) {\n return this.eip1559GasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n }\n\n return this.legacyGasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n }\n}\n"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
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"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"portion-provider.js","sourceRoot":"","sources":["../../../src/providers/portion-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ZERO } from '@fewprotocol/router-sdk';\nimport { Fraction, TradeType } from '@fewprotocol/sdk-core';\n\nimport {\n RouteWithValidQuote,\n SwapOptions,\n SwapOptionsUniversalRouter,\n SwapType,\n} from '../routers';\nimport { CurrencyAmount } from '../util';\n\nimport { ProviderConfig } from './provider';\n\nexport interface IPortionProvider {\n /**\n * Get the portion amount for the given token out amount.\n * portion amount is always calculated against the token out amount.\n *\n * @param tokenOutAmount the token out amount, either the quote for exact in, or the swapper requested amount for exact out\n * @param tradeType the trade type, exact in or exact out\n * @param externalTransferFailed fees charged on token transfers where the to or from address is NOT the uniswap V2 pair address\n * @param feeTakenOnTransfer double fee taken on transfer as part of universal router custody\n * @param swapConfig swap config, containing the portion related data\n */\n getPortionAmount(\n tokenOutAmount: CurrencyAmount,\n tradeType: TradeType,\n externalTransferFailed?: boolean,\n feeTakenOnTransfer?: boolean,\n swapConfig?: SwapOptions\n ): CurrencyAmount | undefined;\n\n /**\n * Get the portion quote amount for the given portion amount.\n * Only applicable for exact out. For exact out, will return zero amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quote token in amount for exact out.\n * @param amount swapper request amount for exact out.\n * @param portionAmount the portion amount\n */\n getPortionQuoteAmount(\n tradeType: TradeType,\n quote: CurrencyAmount,\n amount: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined;\n\n /**\n * In-place update the route quote amount with the portion amount deducted.\n * This method is only applicable for exact in.\n * For exact out, the portion amount gets added into the swapper requested amount at the beginning of\n * `AlphaRouter.route(...)` method.\n *\n * For exact in, the portion amount gets subtracted from the quote amount at the end of\n * get best swap route.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param routeWithQuotes the route with quotes\n * @param swapConfig swap config, containing the portion related data\n * @param providerConfig provider config, for the FOT fee related data\n */\n getRouteWithQuotePortionAdjusted(\n tradeType: TradeType,\n routeWithQuotes: RouteWithValidQuote[],\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): RouteWithValidQuote[];\n\n /**\n * Get the quote gas adjusted amount for exact in and exact out.\n * For exact in, quote amount is the same as the best swap quote.\n * For exact out, quote amount is the best swap quote minus the portion quote token amount.\n * The reason is SOR adds the portion amount into the exact out swapper requested amount.\n * SOR needs to estimate the equivalent portion quote token amount, and have quote amount subtract portion quote token amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quote the best swap quote\n * @param portionQuoteAmount the portion quote token amount\n */\n getQuote(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount;\n\n /**\n * Get the quote gas adjusted amount for exact in and exact out.\n * For exact in, quote gas adjusted amount is the same as the best swap quote gas adjusted amount.\n * For exact out, quote gas adjusted amount is the best swap quote gas adjusted amount minus the portion quote token amount.\n * The reason is SOR adds the portion amount into the exact out swapper requested amount.\n * SOR needs to estimate the equivalent portion quote token amount, and have quote gas adjusted amount subtract portion quote token amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quoteGasAdjusted the best swap quote gas adjusted amount\n * @param portionQuoteAmount the portion quote token amount\n */\n getQuoteGasAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount;\n\n /**\n * Get the quote gas and portion adjusted amount for exact in and exact out.\n * For exact in, quote gas and portion adjusted amount is the best swap quote gas adjusted amount minus the portion amount.\n * The reason is because quote gas and portion adjusted amount for exact in does not know anything about portion.\n * For exact out, quote gas and portion adjusted amount is the best swap quote gas adjusted amount.\n * The reason is because quote gas and portion adjusted amount for exact out has already added the portion quote token amount.\n *\n * @param tradeType\n * @param quoteGasAdjusted\n * @param portionAmount\n */\n getQuoteGasAndPortionAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined;\n}\n\nexport class PortionProvider implements IPortionProvider {\n getPortionAmount(\n tokenOutAmount: CurrencyAmount,\n tradeType: TradeType,\n externalTransferFailed?: boolean,\n feeTakenOnTransfer?: boolean,\n swapConfig?: SwapOptions\n ): CurrencyAmount | undefined {\n if (\n externalTransferFailed ||\n feeTakenOnTransfer ||\n swapConfig?.type !== SwapType.UNIVERSAL_ROUTER\n ) {\n return undefined;\n }\n\n const swapConfigUniversalRouter = swapConfig as SwapOptionsUniversalRouter;\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n if (\n swapConfigUniversalRouter.fee &&\n swapConfigUniversalRouter.fee.fee.greaterThan(ZERO)\n ) {\n return tokenOutAmount.multiply(swapConfigUniversalRouter.fee.fee);\n }\n\n return undefined;\n case TradeType.EXACT_OUTPUT:\n if (\n swapConfigUniversalRouter.flatFee &&\n swapConfigUniversalRouter.flatFee.amount > BigNumber.from(0)\n ) {\n return CurrencyAmount.fromRawAmount(\n tokenOutAmount.currency,\n swapConfigUniversalRouter.flatFee.amount.toString()\n );\n }\n\n return undefined;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getPortionQuoteAmount(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionAdjustedAmount: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined {\n if (!portionAmount) {\n return undefined;\n }\n\n // this method can only be called for exact out\n // for exact in, there is no need to compute the portion quote amount, since portion is always against token out amount\n if (tradeType !== TradeType.EXACT_OUTPUT) {\n return undefined;\n }\n\n // 1. then we know portion amount and portion adjusted exact out amount,\n // we can get a ratio\n // i.e. portionToPortionAdjustedAmountRatio = portionAmountToken / portionAdjustedAmount\n const portionToPortionAdjustedAmountRatio = new Fraction(\n portionAmount.quotient,\n portionAdjustedAmount.quotient\n );\n // 2. we have the portionAmountToken / portionAdjustedAmount ratio\n // then we can estimate the portion amount for quote, i.e. what is the estimated token in amount deducted for the portion\n // this amount will be portionQuoteAmountToken = portionAmountToken / portionAdjustedAmount * quote\n // CAVEAT: we prefer to use the quote currency amount OVER quote gas adjusted currency amount for the formula\n // because the portion amount calculated from the exact out has no way to account for the gas units.\n return CurrencyAmount.fromRawAmount(\n quote.currency,\n portionToPortionAdjustedAmountRatio.multiply(quote).quotient\n );\n }\n\n getRouteWithQuotePortionAdjusted(\n tradeType: TradeType,\n routeWithQuotes: RouteWithValidQuote[],\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): RouteWithValidQuote[] {\n // the route with quote portion adjustment is only needed for exact in routes with quotes\n // because the route with quotes does not know the output amount needs to subtract the portion amount\n if (tradeType !== TradeType.EXACT_INPUT) {\n return routeWithQuotes;\n }\n\n // the route with quote portion adjustment is only needed for universal router\n // for swap router 02, it doesn't have portion-related commands\n if (swapConfig?.type !== SwapType.UNIVERSAL_ROUTER) {\n return routeWithQuotes;\n }\n\n return routeWithQuotes.map((routeWithQuote) => {\n const portionAmount = this.getPortionAmount(\n routeWithQuote.quote,\n tradeType,\n providerConfig?.externalTransferFailed,\n providerConfig?.feeTakenOnTransfer,\n swapConfig\n );\n\n // This is a sub-optimal solution agreed among the teams to work around the exact in\n // portion amount issue for universal router.\n // The most optimal solution is to update router-sdk https://github.com/Uniswap/router-sdk/blob/main/src/entities/trade.ts#L215\n // `minimumAmountOut` to include portionBips as well, `public minimumAmountOut(slippageTolerance: Percent, amountOut = this.outputAmount, portionBips: Percent)\n // but this will require a new release of router-sdk, and bump router-sdk versions in across downstream dependencies across the stack.\n // We opt to use this sub-optimal solution for now, and revisit the optimal solution in the future.\n // Since SOR subtracts portion amount from EACH route output amount (note the routeWithQuote.quote above),\n // SOR will have as accurate ouput amount per route as possible, which helps with the final `minimumAmountOut`\n if (portionAmount) {\n routeWithQuote.quote = routeWithQuote.quote.subtract(portionAmount);\n }\n\n return routeWithQuote;\n });\n }\n\n getQuote(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount {\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quote;\n case TradeType.EXACT_OUTPUT:\n return portionQuoteAmount ? quote.subtract(portionQuoteAmount) : quote;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getQuoteGasAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount {\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quoteGasAdjusted;\n case TradeType.EXACT_OUTPUT:\n return portionQuoteAmount\n ? quoteGasAdjusted.subtract(portionQuoteAmount)\n : quoteGasAdjusted;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getQuoteGasAndPortionAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined {\n if (!portionAmount) {\n return undefined;\n }\n\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quoteGasAdjusted.subtract(portionAmount);\n case TradeType.EXACT_OUTPUT:\n return quoteGasAdjusted;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"","sourcesContent":["import { UniversalRouterVersion } from '@fewprotocol/universal-router-sdk';\n\nexport type ProviderConfig = {\n /**\n * The block number to use when getting data on-chain.\n */\n blockNumber?: number | Promise<number>;\n /*\n * Debug flag to test some codepaths\n */\n debugRouting?: boolean;\n /**\n * Flag for token properties provider to enable fetching fee-on-transfer tokens.\n */\n enableFeeOnTransferFeeFetching?: boolean;\n /**\n * Tenderly natively support save simulation failures if failed,\n * we need this as a pass-through flag to enable/disable this feature.\n */\n saveTenderlySimulationIfFailed?: boolean;\n /**\n * Flag to indicate whether to use the CachedRoutes in optimistic mode.\n * Optimistic mode means that we will allow blocksToLive greater than 1.\n */\n optimisticCachedRoutes?: boolean;\n /**\n * FOT fees charged on token transfers where the to or from address is NOT the uniswap V2 pair address\n */\n externalTransferFailed?: boolean;\n /**\n * double FOT fee taken on transfer as part of universal router custody\n */\n feeTakenOnTransfer?: boolean;\n /**\n * The version of the universal router to use.\n */\n universalRouterVersion?: UniversalRouterVersion;\n};\n\nexport type LocalCacheEntry<T> = {\n entry: T;\n blockNumber: number;\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"simulation-provider.js","sourceRoot":"","sources":["../../../src/providers/simulation-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from '@ethersproject/providers';\nimport { ChainId, TradeType } from '@fewprotocol/sdk-core';\nimport { BigNumber } from 'ethers/lib/ethers';\n\nimport {\n GasModelProviderConfig,\n SwapOptions,\n SwapRoute,\n SwapType,\n} from '../routers';\nimport { Erc20__factory } from '../types/other/factories/Erc20__factory';\nimport { Permit2__factory } from '../types/other/factories/Permit2__factory';\nimport { CurrencyAmount, log, SWAP_ROUTER_02_ADDRESSES } from '../util';\n\nimport { permit2Address } from '@uniswap/permit2-sdk';\nimport { IPortionProvider } from './portion-provider';\n\nexport type SimulationResult = {\n transaction: {\n hash: string;\n gas_used: number;\n gas: number;\n error_message: string;\n };\n simulation: { state_overrides: Record<string, unknown> };\n};\n\nexport enum SimulationStatus {\n NotSupported = 0,\n Failed = 1,\n Succeeded = 2,\n InsufficientBalance = 3,\n NotApproved = 4,\n SystemDown = 5,\n SlippageTooLow = 6,\n TransferFromFailed = 7,\n}\n\n/**\n * Provider for dry running transactions.\n *\n * @export\n * @class Simulator\n */\nexport abstract class Simulator {\n protected provider: JsonRpcProvider;\n protected portionProvider: IPortionProvider;\n\n /**\n * Returns a new SwapRoute with simulated gas estimates\n * @returns SwapRoute\n */\n constructor(\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n protected chainId: ChainId\n ) {\n this.provider = provider;\n this.portionProvider = portionProvider;\n }\n\n public async simulate(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n amount: CurrencyAmount,\n quote: CurrencyAmount,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n const neededBalance =\n swapRoute.trade.tradeType == TradeType.EXACT_INPUT ? amount : quote;\n if (\n // we assume we always have enough eth mainnet balance because we use beacon address later\n (neededBalance.currency.isNative && this.chainId == ChainId.MAINNET) ||\n (await this.userHasSufficientBalance(\n fromAddress,\n swapRoute.trade.tradeType,\n amount,\n quote\n ))\n ) {\n log.info(\n 'User has sufficient balance to simulate. Simulating transaction.'\n );\n try {\n return this.simulateTransaction(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n } catch (e) {\n log.error({ e }, 'Error simulating transaction');\n return {\n ...swapRoute,\n simulationStatus: SimulationStatus.Failed,\n };\n }\n } else {\n log.error('User does not have sufficient balance to simulate.');\n return {\n ...swapRoute,\n simulationStatus: SimulationStatus.InsufficientBalance,\n };\n }\n }\n\n protected abstract simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute>;\n\n protected async userHasSufficientBalance(\n fromAddress: string,\n tradeType: TradeType,\n amount: CurrencyAmount,\n quote: CurrencyAmount\n ): Promise<boolean> {\n try {\n const neededBalance = tradeType == TradeType.EXACT_INPUT ? amount : quote;\n let balance;\n if (neededBalance.currency.isNative) {\n balance = await this.provider.getBalance(fromAddress);\n } else {\n const tokenContract = Erc20__factory.connect(\n neededBalance.currency.address,\n this.provider\n );\n balance = await tokenContract.balanceOf(fromAddress);\n }\n\n const hasBalance = balance.gte(\n BigNumber.from(neededBalance.quotient.toString())\n );\n log.info(\n {\n fromAddress,\n balance: balance.toString(),\n neededBalance: neededBalance.quotient.toString(),\n neededAddress: neededBalance.wrapped.currency.address,\n hasBalance,\n },\n 'Result of balance check for simulation'\n );\n return hasBalance;\n } catch (e) {\n log.error(e, 'Error while checking user balance');\n return false;\n }\n }\n\n protected async checkTokenApproved(\n fromAddress: string,\n inputAmount: CurrencyAmount,\n swapOptions: SwapOptions,\n provider: JsonRpcProvider\n ): Promise<boolean> {\n // Check token has approved Permit2 more than expected amount.\n const tokenContract = Erc20__factory.connect(\n inputAmount.currency.wrapped.address,\n provider\n );\n\n if (swapOptions.type == SwapType.UNIVERSAL_ROUTER) {\n const permit2Allowance = await tokenContract.allowance(\n fromAddress,\n permit2Address(this.chainId)\n );\n\n // If a permit has been provided we don't need to check if UR has already been allowed.\n if (swapOptions.inputTokenPermit) {\n log.info(\n {\n permitAllowance: permit2Allowance.toString(),\n inputAmount: inputAmount.quotient.toString(),\n },\n 'Permit was provided for simulation on UR, checking that Permit2 has been approved.'\n );\n return permit2Allowance.gte(\n BigNumber.from(inputAmount.quotient.toString())\n );\n }\n\n // Check UR has been approved from Permit2.\n const permit2Contract = Permit2__factory.connect(\n permit2Address(this.chainId),\n provider\n );\n\n const { amount: universalRouterAllowance, expiration: tokenExpiration } =\n await permit2Contract.allowance(\n fromAddress,\n inputAmount.currency.wrapped.address,\n SWAP_ROUTER_02_ADDRESSES(this.chainId)\n );\n\n const nowTimestampS = Math.round(Date.now() / 1000);\n const inputAmountBN = BigNumber.from(inputAmount.quotient.toString());\n\n const permit2Approved = permit2Allowance.gte(inputAmountBN);\n const universalRouterApproved =\n universalRouterAllowance.gte(inputAmountBN);\n const expirationValid = tokenExpiration > nowTimestampS;\n log.info(\n {\n permitAllowance: permit2Allowance.toString(),\n tokenAllowance: universalRouterAllowance.toString(),\n tokenExpirationS: tokenExpiration,\n nowTimestampS,\n inputAmount: inputAmount.quotient.toString(),\n permit2Approved,\n universalRouterApproved,\n expirationValid,\n },\n `Simulating on UR, Permit2 approved: ${permit2Approved}, UR approved: ${universalRouterApproved}, Expiraton valid: ${expirationValid}.`\n );\n return permit2Approved && universalRouterApproved && expirationValid;\n } else if (swapOptions.type == SwapType.SWAP_ROUTER_02) {\n if (swapOptions.inputTokenPermit) {\n log.info(\n {\n inputAmount: inputAmount.quotient.toString(),\n },\n 'Simulating on SwapRouter02 info - Permit was provided for simulation. Not checking allowances.'\n );\n return true;\n }\n\n const allowance = await tokenContract.allowance(\n fromAddress,\n SWAP_ROUTER_02_ADDRESSES(this.chainId)\n );\n const hasAllowance = allowance.gte(\n BigNumber.from(inputAmount.quotient.toString())\n );\n log.info(\n {\n hasAllowance,\n allowance: allowance.toString(),\n inputAmount: inputAmount.quotient.toString(),\n },\n `Simulating on SwapRouter02 - Has allowance: ${hasAllowance}`\n );\n // Return true if token allowance is greater than input amount\n return hasAllowance;\n }\n\n throw new Error(`Unsupported swap type ${swapOptions}`);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/static-gas-price-provider.ts"],"names":[],"mappings":";;;AAKA,MAAa,sBAAsB;IACjC,YAAoB,WAAsB;QAAtB,gBAAW,GAAX,WAAW,CAAW;IAAG,CAAC;IAE9C,KAAK,CAAC,WAAW,CACf,kBAA0B,EAC1B,mBAA4B;QAE5B,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;CACF;AATD,wDASC","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { BigNumber } from 'ethers';\n\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\nexport class StaticGasPriceProvider implements IGasPriceProvider {\n constructor(private gasPriceWei: BigNumber) {}\n\n async getGasPrice(\n _latestBlockNumber: number,\n _requestBlockNumber?: number\n ): Promise<GasPrice> {\n return { gasPriceWei: this.gasPriceWei };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider-with-fallback.js","sourceRoot":"","sources":["../../../src/providers/subgraph-provider-with-fallback.ts"],"names":[],"mappings":";;;AAGA,kCAA8B;AAI9B,MAAsB,6BAA6B;IAIjD,YACU,SAA6C,EAC7C,QAAkB;QADlB,cAAS,GAAT,SAAS,CAAoC;QAC7C,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,UAAkB,EAClB,WAAmB,EACnB,cAA+B;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YACpC,IAAI;gBACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CACnC,UAAU,EACV,WAAW,EACX,cAAc,CACf,CAAC;gBACF,OAAO,KAAK,CAAC;aACd;YAAC,OAAO,GAAG,EAAE;gBACZ,UAAG,CAAC,IAAI,CACN,oCAAoC,IAAI,CAAC,QAAQ,mBAAmB,CAAC,EAAE,CACxE,CAAC;aACH;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;CACF;AAhCD,sEAgCC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { Token } from '@fewprotocol/sdk-core';\nimport { SubgraphPool } from '../routers/alpha-router/functions/get-candidate-pools';\nimport { log } from '../util';\nimport { ProviderConfig } from './provider';\nimport { ISubgraphProvider } from './subgraph-provider';\n\nexport abstract class SubgraphProviderWithFallBacks<\n TSubgraphPool extends SubgraphPool\n> implements ISubgraphProvider<TSubgraphPool>\n{\n protected constructor(\n private fallbacks: ISubgraphProvider<TSubgraphPool>[],\n private protocol: Protocol\n ) {}\n\n public async getPools(\n currencyIn?: Token,\n currencyOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]> {\n for (let i = 0; i < this.fallbacks.length; i++) {\n const provider = this.fallbacks[i]!;\n try {\n const pools = await provider.getPools(\n currencyIn,\n currencyOut,\n providerConfig\n );\n return pools;\n } catch (err) {\n log.info(\n `Failed to get subgraph pools for ${this.protocol} from fallback #${i}`\n );\n }\n }\n\n throw new Error('Failed to get subgraph pools from any providers');\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider.js","sourceRoot":"","sources":["../../../src/providers/subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token } from '@fewprotocol/sdk-core';\nimport retry from 'async-retry';\nimport Timeout from 'await-timeout';\nimport { gql, GraphQLClient } from 'graphql-request';\nimport _ from 'lodash';\n\nimport { SubgraphPool } from '../routers/alpha-router/functions/get-candidate-pools';\nimport { log, metric } from '../util';\n\nimport { ProviderConfig } from './provider';\n\nexport interface ISubgraphProvider<TSubgraphPool extends SubgraphPool> {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]>;\n}\n\nconst PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.\n\nexport type V3V4SubgraphPool = {\n id: string;\n feeTier: string;\n liquidity: string;\n token0: {\n id: string;\n };\n token1: {\n id: string;\n };\n tvlETH: number;\n tvlUSD: number;\n};\n\nexport type V3V4RawSubgraphPool = {\n id: string;\n feeTier: string;\n liquidity: string;\n token0: {\n symbol: string;\n id: string;\n };\n token1: {\n symbol: string;\n id: string;\n };\n totalValueLockedUSD: string;\n totalValueLockedETH: string;\n totalValueLockedUSDUntracked: string;\n};\n\nexport abstract class SubgraphProvider<\n TRawSubgraphPool extends V3V4RawSubgraphPool,\n TSubgraphPool extends V3V4SubgraphPool\n> {\n private client: GraphQLClient;\n\n constructor(\n private protocol: Protocol,\n private chainId: ChainId,\n private retries = 2,\n private timeout = 30000,\n private rollback = true,\n private trackedEthThreshold = 0.01,\n private untrackedUsdThreshold = Number.MAX_VALUE,\n private subgraphUrl?: string\n ) {\n this.protocol = protocol;\n if (!this.subgraphUrl) {\n throw new Error(`No subgraph url for chain id: ${this.chainId}`);\n }\n this.client = new GraphQLClient(this.subgraphUrl);\n }\n\n public async getPools(\n _currencyIn?: Currency,\n _currencyOut?: Currency,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]> {\n const beforeAll = Date.now();\n let blockNumber = providerConfig?.blockNumber\n ? await providerConfig.blockNumber\n : undefined;\n\n const query = gql`\n ${this.subgraphQuery(blockNumber)}\n `;\n\n let pools: TRawSubgraphPool[] = [];\n\n log.info(\n `Getting ${\n this.protocol\n } pools from the subgraph with page size ${PAGE_SIZE}${\n providerConfig?.blockNumber\n ? ` as of block ${providerConfig?.blockNumber}`\n : ''\n }.`\n );\n\n let retries = 0;\n\n await retry(\n async () => {\n const timeout = new Timeout();\n\n const getPools = async (): Promise<TRawSubgraphPool[]> => {\n let lastId = '';\n let pools: TRawSubgraphPool[] = [];\n let poolsPage: TRawSubgraphPool[] = [];\n\n // metrics variables\n let totalPages = 0;\n\n do {\n totalPages += 1;\n\n const poolsResult = await this.client.request<{\n pools: TRawSubgraphPool[];\n }>(query, {\n pageSize: PAGE_SIZE,\n id: lastId,\n });\n\n poolsPage = poolsResult.pools;\n\n pools = pools.concat(poolsPage);\n\n lastId = pools[pools.length - 1]!.id;\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.paginate.pageSize`,\n poolsPage.length\n );\n } while (poolsPage.length > 0);\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.paginate`,\n totalPages\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.pools.length`,\n pools.length\n );\n\n return pools;\n };\n\n try {\n const getPoolsPromise = getPools();\n const timerPromise = timeout.set(this.timeout).then(() => {\n throw new Error(\n `Timed out getting pools from subgraph: ${this.timeout}`\n );\n });\n pools = await Promise.race([getPoolsPromise, timerPromise]);\n return;\n } catch (err) {\n log.error({ err }, `Error fetching ${this.protocol} Subgraph Pools.`);\n throw err;\n } finally {\n timeout.clear();\n }\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n retries += 1;\n if (\n this.rollback &&\n blockNumber &&\n _.includes(err.message, 'indexed up to')\n ) {\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.indexError`,\n 1\n );\n blockNumber = blockNumber - 10;\n log.info(\n `Detected subgraph indexing error. Rolled back block number to: ${blockNumber}`\n );\n }\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.timeout`,\n 1\n );\n pools = [];\n log.info(\n { err },\n `Failed to get pools from subgraph. Retry attempt: ${retry}`\n );\n },\n }\n );\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.retries`,\n retries\n );\n\n const untrackedPools = pools.filter(\n (pool) =>\n parseInt(pool.liquidity) > 0 ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold ||\n parseFloat(pool.totalValueLockedUSDUntracked) >\n this.untrackedUsdThreshold\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.untracked.length`,\n untrackedPools.length\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.untracked.percent`,\n (untrackedPools.length / pools.length) * 100\n );\n\n const beforeFilter = Date.now();\n let poolsSanitized: TSubgraphPool[] = [];\n if (this.protocol === Protocol.V3) {\n // Special treatment for all V3 pools in order to reduce latency due to thousands of pools with very low TVL locked\n // - Include \"parseFloat(pool.totalValueLockedETH) === 0\" as in certain occasions we have no way of calculating derivedETH so this is 0\n poolsSanitized = pools\n .filter(\n (pool) =>\n (parseInt(pool.liquidity) > 0 &&\n parseFloat(pool.totalValueLockedETH) === 0) ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold\n )\n .map((pool) => {\n return this.mapSubgraphPool(pool);\n });\n } else {\n poolsSanitized = pools\n .filter(\n (pool) =>\n parseInt(pool.liquidity) > 0 ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold\n )\n .map((pool) => {\n return this.mapSubgraphPool(pool);\n });\n }\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.latency`,\n Date.now() - beforeFilter\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.length`,\n poolsSanitized.length\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.percent`,\n (poolsSanitized.length / pools.length) * 100\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools`,\n 1\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.latency`,\n Date.now() - beforeAll\n );\n\n log.info(\n `Got ${pools.length} ${this.protocol} pools from the subgraph. ${poolsSanitized.length} after filtering`\n );\n\n return poolsSanitized;\n }\n\n protected abstract subgraphQuery(blockNumber?: number): string;\n\n protected abstract mapSubgraphPool(\n rawSubgraphPool: TRawSubgraphPool\n ): TSubgraphPool;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"swap-router-provider.js","sourceRoot":"","sources":["../../../src/providers/swap-router-provider.ts"],"names":[],"mappings":";;;AAGA,0FAAuF;AACvF,kCAAwD;AA6BxD,MAAa,kBAAkB;IAC7B,YACY,kBAAsC,EACtC,OAAgB;QADhB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,YAAO,GAAP,OAAO,CAAS;IACzB,CAAC;IAEG,KAAK,CAAC,eAAe,CAC1B,aAAuC,EACvC,cAAwC;;QAExC,MAAM,cAAc,GAAuB;YACzC;gBACE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACtC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE;aAClC;YACD;gBACE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACvC,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE;aACnC;SACF,CAAC;QAEF,MAAM,EAAE,GACN,MAAM,IAAI,CAAC,kBAAkB,CAAC,4CAA4C,CAGxE;YACA,OAAO,EAAE,IAAA,+BAAwB,EAAC,IAAI,CAAC,OAAO,CAAC;YAC/C,iBAAiB,EAAE,6CAAqB,CAAC,eAAe,EAAE;YAC1D,YAAY,EAAE,iBAAiB;YAC/B,cAAc;SACf,CAAC,CAAC;QAEL,IAAI,CAAC,CAAA,MAAA,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAA,IAAI,CAAC,CAAA,MAAA,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAA,EAAE;YACtD,UAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EACvB,wEAAwE,CACzE,CAAC;YACF,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;SACH;QAED,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC;QAEpD,OAAO;YACL,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;YACnC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;SACtC,CAAC;IACJ,CAAC;CACF;AAlDD,gDAkDC","sourcesContent":["import { ApprovalTypes } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, CurrencyAmount } from '@fewprotocol/sdk-core';\n\nimport { SwapRouter02__factory } from '../types/other/factories/SwapRouter02__factory';\nimport { log, SWAP_ROUTER_02_ADDRESSES } from '../util';\n\nimport { IMulticallProvider } from './multicall-provider';\n\ntype TokenApprovalTypes = {\n approvalTokenIn: ApprovalTypes;\n approvalTokenOut: ApprovalTypes;\n};\n\n/**\n * Provider for accessing the SwapRouter02 Contract .\n *\n * @export\n * @interface IRouterProvider\n */\nexport interface ISwapRouterProvider {\n /**\n * Get the approval method needed for each token. Throws an error if either query fails.\n *\n * @param tokenInAmount The Currency Amount of tokenIn needed by the user\n * @param tokenOutAmount The Currency Amount of tokenOut needed by the user\n * @returns the Approval Types for each token.\n */\n getApprovalType(\n tokenInAmount: CurrencyAmount<Currency>,\n tokenOutAmount: CurrencyAmount<Currency>\n ): Promise<TokenApprovalTypes>;\n}\n\nexport class SwapRouterProvider implements ISwapRouterProvider {\n constructor(\n protected multicall2Provider: IMulticallProvider,\n protected chainId: ChainId\n ) {}\n\n public async getApprovalType(\n tokenInAmount: CurrencyAmount<Currency>,\n tokenOutAmount: CurrencyAmount<Currency>\n ): Promise<TokenApprovalTypes> {\n const functionParams: [string, string][] = [\n [\n tokenInAmount.currency.wrapped.address,\n tokenInAmount.quotient.toString(),\n ],\n [\n tokenOutAmount.currency.wrapped.address,\n tokenOutAmount.quotient.toString(),\n ],\n ];\n\n const tx =\n await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, string],\n [ApprovalTypes]\n >({\n address: SWAP_ROUTER_02_ADDRESSES(this.chainId),\n contractInterface: SwapRouter02__factory.createInterface(),\n functionName: 'getApprovalType',\n functionParams,\n });\n\n if (!tx.results[0]?.success || !tx.results[1]?.success) {\n log.info(\n { results: tx.results },\n 'Failed to get approval type from swap router for token in or token out'\n );\n throw new Error(\n 'Failed to get approval type from swap router for token in or token out'\n );\n }\n\n const { result: approvalTokenIn } = tx.results![0];\n const { result: approvalTokenOut } = tx.results![1];\n\n return {\n approvalTokenIn: approvalTokenIn[0],\n approvalTokenOut: approvalTokenOut[0],\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tenderly-simulation-provider.js","sourceRoot":"","sources":["../../../src/providers/tenderly-simulation-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaxUint256 } from '@ethersproject/constants';\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { permit2Address } from '@uniswap/permit2-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport { UNIVERSAL_ROUTER_ADDRESS } from '@fewprotocol/universal-router-sdk';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport { BigNumber } from 'ethers/lib/ethers';\n\nimport {\n GasModelProviderConfig,\n metric,\n MetricLoggerUnit,\n SwapOptions,\n SwapRoute,\n SwapType,\n} from '../routers';\nimport { Erc20__factory } from '../types/other/factories/Erc20__factory';\nimport { Permit2__factory } from '../types/other/factories/Permit2__factory';\nimport {\n BEACON_CHAIN_DEPOSIT_ADDRESS,\n log,\n MAX_UINT160,\n SWAP_ROUTER_02_ADDRESSES,\n} from '../util';\nimport { APPROVE_TOKEN_FOR_TRANSFER } from '../util/callData';\nimport {\n calculateGasUsed,\n initSwapRouteFromExisting,\n logGasEstimationVsSimulationMetrics,\n} from '../util/gas-factory-helpers';\n\nimport { breakDownTenderlySimulationError } from '../util/tenderlySimulationErrorBreakDown';\nimport { EthEstimateGasSimulator } from './eth-estimate-gas-provider';\nimport { IPortionProvider } from './portion-provider';\nimport {\n SimulationResult,\n SimulationStatus,\n Simulator,\n} from './simulation-provider';\nimport { IV2PoolProvider } from './v2/pool-provider';\nimport { IV3PoolProvider } from './v3/pool-provider';\nimport { IV4PoolProvider } from './v4/pool-provider';\n\nexport type TenderlyResponseUniversalRouter = {\n config: {\n url: string;\n method: string;\n data: string;\n };\n simulation_results: [SimulationResult, SimulationResult, SimulationResult];\n};\n\nexport type TenderlyResponseSwapRouter02 = {\n config: {\n url: string;\n method: string;\n data: string;\n };\n simulation_results: [SimulationResult, SimulationResult];\n};\n\nexport type GasBody = {\n gas: string;\n gasUsed: string;\n};\n\n// Standard JSON RPC error response https://www.jsonrpc.org/specification#error_object\nexport type JsonRpcError = {\n error: {\n code: number;\n message: string;\n data: string;\n };\n};\n\n// export type TenderlyResponseEstimateGasBundle = {\n// id: number;\n// jsonrpc: string;\n// result: Array<JsonRpcError | GasBody>;\n// };\n\nenum TenderlySimulationType {\n QUICK = 'quick',\n FULL = 'full',\n ABI = 'abi',\n}\n\ntype TenderlySimulationRequest = {\n network_id: ChainId;\n estimate_gas: boolean;\n input: string;\n to: string;\n value: string;\n from: string;\n simulation_type: TenderlySimulationType;\n block_number?: number;\n save_if_fails?: boolean;\n};\n\ntype TenderlySimulationBody = {\n simulations: TenderlySimulationRequest[];\n estimate_gas: boolean;\n};\n\ntype EthJsonRpcRequestBody = {\n from: string;\n to: string;\n data: string;\n};\n\ntype blockNumber =\n | number\n | string\n | 'latest'\n | 'pending'\n | 'earliest'\n | 'finalized'\n | 'safe';\n\ntype TenderlyNodeEstimateGasBundleBody = {\n id: number;\n jsonrpc: string;\n method: string;\n params: Array<Array<EthJsonRpcRequestBody> | blockNumber>;\n};\n\nconst TENDERLY_BATCH_SIMULATE_API = (\n tenderlyBaseUrl: string,\n tenderlyUser: string,\n tenderlyProject: string\n) =>\n `${tenderlyBaseUrl}/api/v1/account/${tenderlyUser}/project/${tenderlyProject}/simulate-batch`;\n\nconst TENDERLY_NODE_API = (chainId: ChainId, tenderlyNodeApiKey: string) => {\n switch (chainId) {\n case ChainId.MAINNET:\n return `https://mainnet.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.BASE:\n return `https://base.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.ARBITRUM_ONE:\n return `https://arbitrum.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.OPTIMISM:\n return `https://optimism.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.POLYGON:\n return `https://polygon.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.AVALANCHE:\n return `https://avalanche.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.BLAST:\n return `https://blast.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.WORLDCHAIN:\n return `https://worldchain-mainnet.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.UNICHAIN:\n return `https://unichain.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.SONEIUM:\n return `https://soneium.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n default:\n throw new Error(\n `ChainId ${chainId} does not correspond to a tenderly node endpoint`\n );\n }\n};\n\nexport const TENDERLY_NOT_SUPPORTED_CHAINS = [\n ChainId.CELO,\n ChainId.CELO_ALFAJORES,\n ChainId.ZKSYNC,\n // tenderly node RPC supports BNB and ZORA upon request, we will make them available\n ChainId.BNB,\n ChainId.ZORA,\n ChainId.MONAD_TESTNET,\n];\n\n// We multiply tenderly gas limit by this to overestimate gas limit\nconst DEFAULT_ESTIMATE_MULTIPLIER = 1.3;\n\nexport class FallbackTenderlySimulator extends Simulator {\n private tenderlySimulator: TenderlySimulator;\n private ethEstimateGasSimulator: EthEstimateGasSimulator;\n constructor(\n chainId: ChainId,\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n tenderlySimulator: TenderlySimulator,\n ethEstimateGasSimulator: EthEstimateGasSimulator\n ) {\n super(provider, portionProvider, chainId);\n this.tenderlySimulator = tenderlySimulator;\n this.ethEstimateGasSimulator = ethEstimateGasSimulator;\n }\n\n protected async simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n // Make call to eth estimate gas if possible\n // For erc20s, we must check if the token allowance is sufficient\n const inputAmount = swapRoute.trade.inputAmount;\n\n if (\n inputAmount.currency.isNative ||\n (await this.checkTokenApproved(\n fromAddress,\n inputAmount,\n swapOptions,\n this.provider\n ))\n ) {\n log.info(\n 'Simulating with eth_estimateGas since token is native or approved.'\n );\n\n try {\n const swapRouteWithGasEstimate =\n await this.ethEstimateGasSimulator.ethEstimateGas(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n return swapRouteWithGasEstimate;\n } catch (err) {\n log.info({ err: err }, 'Error simulating using eth_estimateGas');\n // If it fails, we should still try to simulate using Tenderly\n // return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n }\n\n try {\n return await this.tenderlySimulator.simulateTransaction(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n } catch (err) {\n log.error({ err: err }, 'Failed to simulate via Tenderly');\n\n if (err instanceof Error && err.message.includes('timeout')) {\n metric.putMetric(\n 'TenderlySimulationTimeouts',\n 1,\n MetricLoggerUnit.Count\n );\n }\n return { ...swapRoute, simulationStatus: SimulationStatus.SystemDown };\n }\n }\n}\n\nexport class TenderlySimulator extends Simulator {\n private tenderlyBaseUrl: string;\n private tenderlyUser: string;\n private tenderlyProject: string;\n private tenderlyAccessKey: string;\n private tenderlyNodeApiKey: string;\n private v2PoolProvider: IV2PoolProvider;\n private v3PoolProvider: IV3PoolProvider;\n private v4PoolProvider: IV4PoolProvider;\n private overrideEstimateMultiplier: { [chainId in ChainId]?: number };\n private tenderlyRequestTimeout?: number;\n private tenderlyNodeApiMigrationPercent?: number;\n private tenderlyNodeApiEnabledChains?: ChainId[] = [];\n\n constructor(\n chainId: ChainId,\n tenderlyBaseUrl: string,\n tenderlyUser: string,\n tenderlyProject: string,\n tenderlyAccessKey: string,\n tenderlyNodeApiKey: string,\n v2PoolProvider: IV2PoolProvider,\n v3PoolProvider: IV3PoolProvider,\n v4PoolProvider: IV4PoolProvider,\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n overrideEstimateMultiplier?: { [chainId in ChainId]?: number },\n tenderlyRequestTimeout?: number,\n tenderlyNodeApiMigrationPercent?: number,\n tenderlyNodeApiEnabledChains?: ChainId[]\n ) {\n super(provider, portionProvider, chainId);\n this.tenderlyBaseUrl = tenderlyBaseUrl;\n this.tenderlyUser = tenderlyUser;\n this.tenderlyProject = tenderlyProject;\n this.tenderlyAccessKey = tenderlyAccessKey;\n this.tenderlyNodeApiKey = tenderlyNodeApiKey;\n this.v2PoolProvider = v2PoolProvider;\n this.v3PoolProvider = v3PoolProvider;\n this.v4PoolProvider = v4PoolProvider;\n this.overrideEstimateMultiplier = overrideEstimateMultiplier ?? {};\n this.tenderlyRequestTimeout = tenderlyRequestTimeout;\n this.tenderlyNodeApiMigrationPercent = tenderlyNodeApiMigrationPercent;\n this.tenderlyNodeApiEnabledChains = tenderlyNodeApiEnabledChains;\n }\n\n public async simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n const currencyIn = swapRoute.trade.inputAmount.currency;\n const tokenIn = currencyIn.wrapped;\n const currencyOut = swapRoute.trade.outputAmount.currency;\n const tokenOut = currencyOut.wrapped;\n const chainId = this.chainId;\n\n if (TENDERLY_NOT_SUPPORTED_CHAINS.includes(chainId)) {\n const msg = `${TENDERLY_NOT_SUPPORTED_CHAINS.toString()} not supported by Tenderly!`;\n log.info(msg);\n return { ...swapRoute, simulationStatus: SimulationStatus.NotSupported };\n }\n\n if (!swapRoute.methodParameters) {\n const msg = 'No calldata provided to simulate transaction';\n log.info(msg);\n throw new Error(msg);\n }\n\n const { calldata } = swapRoute.methodParameters;\n\n log.info(\n {\n calldata: swapRoute.methodParameters.calldata,\n fromAddress: fromAddress,\n chainId: chainId,\n tokenInAddress: tokenIn.address,\n router: swapOptions.type,\n },\n 'Simulating transaction on Tenderly'\n );\n\n const blockNumber = await providerConfig?.blockNumber;\n let estimatedGasUsed: BigNumber;\n const estimateMultiplier =\n this.overrideEstimateMultiplier[chainId] ?? DEFAULT_ESTIMATE_MULTIPLIER;\n\n if (swapOptions.type == SwapType.UNIVERSAL_ROUTER) {\n // simulating from beacon chain deposit address that should always hold **enough balance**\n if (currencyIn.isNative && this.chainId == ChainId.MAINNET) {\n fromAddress = BEACON_CHAIN_DEPOSIT_ADDRESS;\n }\n // Do initial onboarding approval of Permit2.\n const erc20Interface = Erc20__factory.createInterface();\n const approvePermit2Calldata = erc20Interface.encodeFunctionData(\n 'approve',\n [permit2Address(this.chainId), MaxUint256]\n );\n\n // We are unsure if the users calldata contains a permit or not. We just\n // max approve the Universal Router from Permit2 instead, which will cover both cases.\n const permit2Interface = Permit2__factory.createInterface();\n const approveUniversalRouterCallData =\n permit2Interface.encodeFunctionData('approve', [\n tokenIn.address,\n UNIVERSAL_ROUTER_ADDRESS(swapOptions.version, this.chainId),\n MAX_UINT160,\n Math.floor(new Date().getTime() / 1000) + 10000000,\n ]);\n\n const approvePermit2: TenderlySimulationRequest = {\n network_id: chainId,\n estimate_gas: true,\n input: approvePermit2Calldata,\n to: tokenIn.address,\n value: '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const approveUniversalRouter: TenderlySimulationRequest = {\n network_id: chainId,\n estimate_gas: true,\n input: approveUniversalRouterCallData,\n to: permit2Address(this.chainId),\n value: '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const swap: TenderlySimulationRequest = {\n network_id: chainId,\n input: calldata,\n estimate_gas: true,\n to: UNIVERSAL_ROUTER_ADDRESS(swapOptions.version, this.chainId),\n value: currencyIn.isNative ? swapRoute.methodParameters.value : '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const body: TenderlySimulationBody = {\n simulations: [approvePermit2, approveUniversalRouter, swap],\n estimate_gas: true,\n };\n const opts: AxiosRequestConfig = {\n headers: {\n 'X-Access-Key': this.tenderlyAccessKey,\n },\n timeout: this.tenderlyRequestTimeout,\n };\n const url = TENDERLY_BATCH_SIMULATE_API(\n this.tenderlyBaseUrl,\n this.tenderlyUser,\n this.tenderlyProject\n );\n\n metric.putMetric(\n 'TenderlySimulationUniversalRouterRequests',\n 1,\n MetricLoggerUnit.Count\n );\n\n const before = Date.now();\n\n if (\n Math.random() * 100 < (this.tenderlyNodeApiMigrationPercent ?? 0) &&\n (this.tenderlyNodeApiEnabledChains ?? []).find(\n (chainId) => chainId === this.chainId\n )\n ) {\n const { data: resp, status: httpStatus } =\n await this.requestNodeSimulation(\n approvePermit2,\n approveUniversalRouter,\n swap\n );\n // We will maintain the original metrics TenderlySimulationUniversalRouterLatencies and TenderlySimulationUniversalRouterResponseStatus\n // so that they don't provide the existing tenderly dashboard as well as simulation alerts\n // In the meanwhile, we also add tenderly node metrics to distinguish from the tenderly api metrics\n // Once we migrate to node endpoint 100%, original metrics TenderlySimulationUniversalRouterLatencies and TenderlySimulationUniversalRouterResponseStatus\n // will work as is\n metric.putMetric(\n 'TenderlySimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyNodeSimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n `TenderlySimulationUniversalRouterResponseStatus${httpStatus}`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `TenderlyNodeSimulationUniversalRouterResponseStatus${httpStatus}`,\n 1,\n MetricLoggerUnit.Count\n );\n // technically, we can also early return SimulationStatus.SystemDown when http status is not 200.\n // in reality, when tenderly is down for whatever reason, i see it always throw during axios http request\n // so that it hits the catch block in https://github.com/Uniswap/smart-order-router/blob/8bfec299001d3204483f761f57a38be04512a948/src/providers/tenderly-simulation-provider.ts#L226\n // which is where we want to actually return SimulationStatus.SystemDown\n // in other words, I've never see a TenderlySimulationUniversalRouterResponseStatus metric with a non-200 status\n // if there's downtime, it won't log metric at https://github.com/Uniswap/smart-order-router/blob/8bfec299001d3204483f761f57a38be04512a948/src/providers/tenderly-simulation-provider.ts#L434\n\n // Validate tenderly response body\n if (\n !resp ||\n !resp.result ||\n resp.result.length < 3 ||\n (resp.result[2] as JsonRpcError).error\n ) {\n log.error(\n { resp },\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}.`\n );\n\n if (\n resp &&\n resp.result &&\n resp.result.length >= 3 &&\n (resp.result[2] as JsonRpcError).error &&\n (resp.result[2] as JsonRpcError).error.data\n ) {\n return {\n ...swapRoute,\n simulationStatus: breakDownTenderlySimulationError(\n tokenIn,\n tokenOut,\n (resp.result[2] as JsonRpcError).error.data\n ),\n };\n }\n\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n Number((resp.result[2] as GasBody).gas) * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approvePermit2GasUsed: (resp.result[0] as GasBody).gasUsed,\n approveUniversalRouterGasUsed: (resp.result[1] as GasBody).gasUsed,\n swapGasUsed: (resp.result[2] as GasBody).gasUsed,\n approvePermit2Gas: (resp.result[0] as GasBody).gas,\n approveUniversalRouterGas: (resp.result[1] as GasBody).gas,\n swapGas: (resp.result[2] as GasBody).gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approvals + Swap via Tenderly node endpoint for Universal Router. Gas used.'\n );\n } else {\n const resp = (\n await axios.post<TenderlyResponseUniversalRouter>(url, body, opts)\n ).data;\n\n metric.putMetric(\n 'TenderlySimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyApiSimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n\n // Validate tenderly response body\n if (\n !resp ||\n resp.simulation_results.length < 3 ||\n !resp.simulation_results[2].transaction ||\n resp.simulation_results[2].transaction.error_message\n ) {\n this.logTenderlyErrorResponse(resp);\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n resp.simulation_results[2].transaction.gas * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approvePermit2GasUsed:\n resp.simulation_results[0].transaction.gas_used,\n approveUniversalRouterGasUsed:\n resp.simulation_results[1].transaction.gas_used,\n swapGasUsed: resp.simulation_results[2].transaction.gas_used,\n approvePermit2Gas: resp.simulation_results[0].transaction.gas,\n approveUniversalRouterGas:\n resp.simulation_results[1].transaction.gas,\n swapGas: resp.simulation_results[2].transaction.gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approvals + Swap via Tenderly Api endpoint for Universal Router. Gas used.'\n );\n\n log.info(\n {\n body,\n swapSimulation: resp.simulation_results[2].simulation,\n swapTransaction: resp.simulation_results[2].transaction,\n },\n 'Successful Tenderly Api endpoint Swap Simulation for Universal Router'\n );\n }\n } else if (swapOptions.type == SwapType.SWAP_ROUTER_02) {\n const approve: TenderlySimulationRequest = {\n network_id: chainId,\n input: APPROVE_TOKEN_FOR_TRANSFER,\n estimate_gas: true,\n to: tokenIn.address,\n value: '0',\n from: fromAddress,\n simulation_type: TenderlySimulationType.QUICK,\n };\n\n const swap: TenderlySimulationRequest = {\n network_id: chainId,\n input: calldata,\n to: SWAP_ROUTER_02_ADDRESSES(chainId),\n estimate_gas: true,\n value: currencyIn.isNative ? swapRoute.methodParameters.value : '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n };\n\n const body = { simulations: [approve, swap] };\n const opts: AxiosRequestConfig = {\n headers: {\n 'X-Access-Key': this.tenderlyAccessKey,\n },\n timeout: this.tenderlyRequestTimeout,\n };\n\n const url = TENDERLY_BATCH_SIMULATE_API(\n this.tenderlyBaseUrl,\n this.tenderlyUser,\n this.tenderlyProject\n );\n\n metric.putMetric(\n 'TenderlySimulationSwapRouter02Requests',\n 1,\n MetricLoggerUnit.Count\n );\n\n const before = Date.now();\n\n const resp = (\n await axios.post<TenderlyResponseSwapRouter02>(url, body, opts)\n ).data;\n\n const latencies = Date.now() - before;\n log.info(\n `Tenderly simulation swap router02 request body: ${body}, having latencies ${latencies} in milliseconds.`\n );\n metric.putMetric(\n 'TenderlySimulationSwapRouter02Latencies',\n latencies,\n MetricLoggerUnit.Milliseconds\n );\n\n // Validate tenderly response body\n if (\n !resp ||\n resp.simulation_results.length < 2 ||\n !resp.simulation_results[1].transaction ||\n resp.simulation_results[1].transaction.error_message\n ) {\n const msg = `Failed to Simulate Via Tenderly!: ${resp.simulation_results[1].transaction.error_message}`;\n log.info(\n { err: resp.simulation_results[1].transaction.error_message },\n msg\n );\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n resp.simulation_results[1].transaction.gas * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approveGasUsed: resp.simulation_results[0].transaction.gas_used,\n swapGasUsed: resp.simulation_results[1].transaction.gas_used,\n approveGas: resp.simulation_results[0].transaction.gas,\n swapGas: resp.simulation_results[1].transaction.gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approval + Swap via Tenderly for SwapRouter02. Gas used.'\n );\n\n log.info(\n {\n body,\n swapTransaction: resp.simulation_results[1].transaction,\n swapSimulation: resp.simulation_results[1].simulation,\n },\n 'Successful Tenderly Swap Simulation for SwapRouter02'\n );\n } else {\n throw new Error(`Unsupported swap type: ${swapOptions}`);\n }\n\n const {\n estimatedGasUsedUSD,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedGasToken,\n quoteGasAdjusted,\n } = await calculateGasUsed(\n chainId,\n swapRoute,\n estimatedGasUsed,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.provider,\n providerConfig\n );\n\n logGasEstimationVsSimulationMetrics(swapRoute, estimatedGasUsed, chainId);\n\n return {\n ...initSwapRouteFromExisting(\n swapRoute,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.v4PoolProvider,\n this.portionProvider,\n quoteGasAdjusted,\n estimatedGasUsed,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedUSD,\n swapOptions,\n estimatedGasUsedGasToken,\n providerConfig\n ),\n simulationStatus: SimulationStatus.Succeeded,\n };\n }\n\n private logTenderlyErrorResponse(resp: TenderlyResponseUniversalRouter) {\n log.info(\n {\n resp,\n },\n 'Failed to Simulate on Tenderly'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 1\n ? resp.simulation_results[0].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #1 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 1\n ? resp.simulation_results[0].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #1 Simulation'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 2\n ? resp.simulation_results[1].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #2 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 2\n ? resp.simulation_results[1].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #2 Simulation'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 3\n ? resp.simulation_results[2].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #3 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 3\n ? resp.simulation_results[2].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #3 Simulation'\n );\n }\n\n private async requestNodeSimulation(\n approvePermit2: TenderlySimulationRequest,\n approveUniversalRouter: TenderlySimulationRequest,\n swap: TenderlySimulationRequest\n ): Promise<{ data: any; status: number }> {\n const nodeEndpoint = TENDERLY_NODE_API(\n this.chainId,\n this.tenderlyNodeApiKey\n );\n // TODO: ROUTE-362 - Revisit tenderly node simulation hardcode latest block number\n // https://linear.app/uniswap/issue/ROUTE-362/revisit-tenderly-node-simulation-hardcode-latest-block-number\n const blockNumber = // swap.block_number\n // ? BigNumber.from(swap.block_number).toHexString().replace('0x0', '0x')\n 'latest';\n const body: TenderlyNodeEstimateGasBundleBody = {\n id: 1,\n jsonrpc: '2.0',\n method: 'tenderly_estimateGasBundle',\n params: [\n [\n {\n from: approvePermit2.from,\n to: approvePermit2.to,\n data: approvePermit2.input,\n },\n {\n from: approveUniversalRouter.from,\n to: approveUniversalRouter.to,\n data: approveUniversalRouter.input,\n },\n { from: swap.from, to: swap.to, data: swap.input },\n ],\n blockNumber,\n ],\n };\n\n const opts: AxiosRequestConfig = {\n timeout: this.tenderlyRequestTimeout,\n };\n\n const before = Date.now();\n\n try {\n // For now, we don't timeout tenderly node endpoint, but we should before we live switch to node endpoint\n const { data: resp, status: httpStatus } = (\n await axios.post<TenderlyResponseSwapRouter02>(nodeEndpoint, body, opts)\n );\n\n const latencies = Date.now() - before;\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleLatencies',\n latencies,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n if (httpStatus !== 200) {\n log.error(\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}. HTTP Status: ${httpStatus}`,\n { resp }\n );\n return { data: resp.simulation_results[1], status: httpStatus };\n }\n\n return { data: resp.simulation_results[1], status: httpStatus };\n } catch (err) {\n log.error(\n { err },\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}. Error: ${err}`\n );\n\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleFailure',\n 1,\n MetricLoggerUnit.Count\n );\n\n // we will have to re-throw the error, so that simulation-provider can catch the error, and return simulation status = failed\n throw err;\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-fee-fetcher.js","sourceRoot":"","sources":["../../../src/providers/token-fee-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport { TokenFeeDetector__factory } from '../types/other/factories/TokenFeeDetector__factory';\nimport { TokenFeeDetector } from '../types/other/TokenFeeDetector';\nimport {\n log,\n metric,\n MetricLoggerUnit,\n WRAPPED_NATIVE_CURRENCY,\n} from '../util';\n\nimport { ProviderConfig } from './provider';\n\nconst DEFAULT_TOKEN_BUY_FEE_BPS = BigNumber.from(0);\nconst DEFAULT_TOKEN_SELL_FEE_BPS = BigNumber.from(0);\n\n// on detector failure, assume no fee\nexport const DEFAULT_TOKEN_FEE_RESULT = {\n buyFeeBps: DEFAULT_TOKEN_BUY_FEE_BPS,\n sellFeeBps: DEFAULT_TOKEN_SELL_FEE_BPS,\n};\n\ntype Address = string;\n\nexport type TokenFeeResult = {\n buyFeeBps?: BigNumber;\n sellFeeBps?: BigNumber;\n feeTakenOnTransfer?: boolean;\n externalTransferFailed?: boolean;\n sellReverted?: boolean;\n};\nexport type TokenFeeMap = Record<Address, TokenFeeResult>;\n\n// address at which the FeeDetector lens is deployed\nconst FEE_DETECTOR_ADDRESS = (chainId: ChainId) => {\n switch (chainId) {\n case ChainId.MAINNET:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.OPTIMISM:\n return '0x95aDC98A949dCD94645A8cD56830D86e4Cf34Eff';\n case ChainId.BNB:\n return '0xCF6220e4496B091a6b391D48e770f1FbaC63E740';\n case ChainId.POLYGON:\n return '0xC988e19819a63C0e487c6Ad8d6668Ac773923BF2';\n case ChainId.BASE:\n return '0xCF6220e4496B091a6b391D48e770f1FbaC63E740';\n case ChainId.ARBITRUM_ONE:\n return '0x37324D81e318260DC4f0fCb68035028eFdE6F50e';\n case ChainId.CELO:\n return '0x8eEa35913DdeD795001562f9bA5b282d3ac04B60';\n case ChainId.AVALANCHE:\n return '0x8269d47c4910B8c87789aA0eC128C11A8614dfC8';\n case ChainId.WORLDCHAIN:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.UNICHAIN_SEPOLIA:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.UNICHAIN:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.SONEIUM:\n return '0x7A5299822b2cD9aC9A9f67756Aa2d62140e9A66f';\n default:\n // just default to mainnet contract\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n }\n};\n\n// Amount has to be big enough to avoid rounding errors, but small enough that\n// most v2 pools will have at least this many token units\n// 100000 is the smallest number that avoids rounding errors in bps terms\n// 10000 was not sufficient due to rounding errors for rebase token (e.g. stETH)\nconst AMOUNT_TO_FLASH_BORROW = '100000';\n// 1M gas limit per validate call, should cover most swap cases\nconst GAS_LIMIT_PER_VALIDATE = 1_000_000;\n\nexport interface ITokenFeeFetcher {\n fetchFees(\n addresses: Address[],\n providerConfig?: ProviderConfig\n ): Promise<TokenFeeMap>;\n}\n\nexport class OnChainTokenFeeFetcher implements ITokenFeeFetcher {\n private BASE_TOKEN: string;\n private readonly contract: TokenFeeDetector;\n\n constructor(\n private chainId: ChainId,\n rpcProvider: BaseProvider,\n private tokenFeeAddress = FEE_DETECTOR_ADDRESS(chainId),\n private gasLimitPerCall = GAS_LIMIT_PER_VALIDATE,\n private amountToFlashBorrow = AMOUNT_TO_FLASH_BORROW\n ) {\n this.BASE_TOKEN = WRAPPED_NATIVE_CURRENCY[this.chainId]?.address;\n this.contract = TokenFeeDetector__factory.connect(\n this.tokenFeeAddress,\n rpcProvider\n );\n }\n\n public async fetchFees(\n addresses: Address[],\n providerConfig?: ProviderConfig\n ): Promise<TokenFeeMap> {\n const tokenToResult: TokenFeeMap = {};\n\n const addressesWithoutBaseToken = addresses.filter(\n (address) => address.toLowerCase() !== this.BASE_TOKEN.toLowerCase()\n );\n const functionParams = addressesWithoutBaseToken.map((address) => [\n address,\n this.BASE_TOKEN,\n this.amountToFlashBorrow,\n ]) as [string, string, string][];\n\n const results = await Promise.all(\n functionParams.map(async ([address, baseToken, amountToBorrow]) => {\n try {\n // We use the validate function instead of batchValidate to avoid poison pill problem.\n // One token that consumes too much gas could cause the entire batch to fail.\n const feeResult = await this.contract.callStatic.validate(\n address,\n baseToken,\n amountToBorrow,\n {\n gasLimit: this.gasLimitPerCall,\n blockTag: providerConfig?.blockNumber,\n }\n );\n\n metric.putMetric(\n 'TokenFeeFetcherFetchFeesSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n return { address, ...feeResult };\n } catch (err) {\n log.error(\n { err },\n `Error calling validate on-chain for token ${address}`\n );\n\n metric.putMetric(\n 'TokenFeeFetcherFetchFeesFailure',\n 1,\n MetricLoggerUnit.Count\n );\n\n // in case of FOT token fee fetch failure, we return null\n // so that they won't get returned from the token-fee-fetcher\n // and thus no fee will be applied, and the cache won't cache on FOT tokens with failed fee fetching\n return {\n address,\n buyFeeBps: undefined,\n sellFeeBps: undefined,\n feeTakenOnTransfer: false,\n externalTransferFailed: false,\n sellReverted: false,\n };\n }\n })\n );\n\n results.forEach(\n ({\n address,\n buyFeeBps,\n sellFeeBps,\n feeTakenOnTransfer,\n externalTransferFailed,\n sellReverted,\n }) => {\n if (buyFeeBps || sellFeeBps) {\n tokenToResult[address] = {\n buyFeeBps,\n sellFeeBps,\n feeTakenOnTransfer,\n externalTransferFailed,\n sellReverted,\n };\n }\n }\n );\n\n return tokenToResult;\n }\n}\n"]}