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

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 (160) hide show
  1. package/build/main/providers/simulation-provider.js +2 -2
  2. package/build/main/providers/tenderly-simulation-provider.js +2 -2
  3. package/build/main/routers/alpha-router/alpha-router.js +1 -4
  4. package/build/main/tsconfig.tsbuildinfo +1 -1
  5. package/build/main/util/methodParameters.js +1 -3
  6. package/build/module/providers/simulation-provider.js +2 -2
  7. package/build/module/providers/tenderly-simulation-provider.js +2 -2
  8. package/build/module/routers/alpha-router/alpha-router.js +1 -4
  9. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  10. package/build/module/util/methodParameters.js +1 -3
  11. package/package.json +6 -6
  12. package/build/main/index.js.map +0 -1
  13. package/build/main/providers/cache-node.js.map +0 -1
  14. package/build/main/providers/cache.js.map +0 -1
  15. package/build/main/providers/caching/route/index.js.map +0 -1
  16. package/build/main/providers/caching/route/model/cache-mode.js.map +0 -1
  17. package/build/main/providers/caching/route/model/cached-route.js.map +0 -1
  18. package/build/main/providers/caching/route/model/cached-routes.js.map +0 -1
  19. package/build/main/providers/caching/route/model/index.js.map +0 -1
  20. package/build/main/providers/caching/route/route-caching-provider.js.map +0 -1
  21. package/build/main/providers/caching-gas-provider.js.map +0 -1
  22. package/build/main/providers/caching-subgraph-provider.js.map +0 -1
  23. package/build/main/providers/caching-token-list-provider.js.map +0 -1
  24. package/build/main/providers/caching-token-provider.js.map +0 -1
  25. package/build/main/providers/eip-1559-gas-price-provider.js.map +0 -1
  26. package/build/main/providers/eth-estimate-gas-provider.js.map +0 -1
  27. package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +0 -1
  28. package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +0 -1
  29. package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +0 -1
  30. package/build/main/providers/fewV2/ring-pool-provider.js.map +0 -1
  31. package/build/main/providers/fewV2/ring-quote-provider.js.map +0 -1
  32. package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +0 -1
  33. package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +0 -1
  34. package/build/main/providers/fewV2/ring-subgraph-provider.js.map +0 -1
  35. package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +0 -1
  36. package/build/main/providers/gas-price-provider.js.map +0 -1
  37. package/build/main/providers/index.js.map +0 -1
  38. package/build/main/providers/legacy-gas-price-provider.js.map +0 -1
  39. package/build/main/providers/multicall-provider.js.map +0 -1
  40. package/build/main/providers/multicall-ringswap-provider.js.map +0 -1
  41. package/build/main/providers/multicall-uniswap-provider.js.map +0 -1
  42. package/build/main/providers/on-chain-gas-price-provider.js.map +0 -1
  43. package/build/main/providers/on-chain-quote-provider.js.map +0 -1
  44. package/build/main/providers/pool-provider.js.map +0 -1
  45. package/build/main/providers/portion-provider.js.map +0 -1
  46. package/build/main/providers/provider.js.map +0 -1
  47. package/build/main/providers/simulation-provider.js.map +0 -1
  48. package/build/main/providers/static-gas-price-provider.js.map +0 -1
  49. package/build/main/providers/subgraph-provider-with-fallback.js.map +0 -1
  50. package/build/main/providers/subgraph-provider.js.map +0 -1
  51. package/build/main/providers/swap-router-provider.js.map +0 -1
  52. package/build/main/providers/tenderly-simulation-provider.js.map +0 -1
  53. package/build/main/providers/token-fee-fetcher.js.map +0 -1
  54. package/build/main/providers/token-properties-provider.js.map +0 -1
  55. package/build/main/providers/token-provider.js.map +0 -1
  56. package/build/main/providers/token-validator-provider.js.map +0 -1
  57. package/build/main/providers/uri-subgraph-provider.js.map +0 -1
  58. package/build/main/providers/v2/caching-pool-provider.js.map +0 -1
  59. package/build/main/providers/v2/caching-subgraph-provider.js.map +0 -1
  60. package/build/main/providers/v2/pool-provider.js.map +0 -1
  61. package/build/main/providers/v2/quote-provider.js.map +0 -1
  62. package/build/main/providers/v2/static-subgraph-provider.js.map +0 -1
  63. package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +0 -1
  64. package/build/main/providers/v2/subgraph-provider.js.map +0 -1
  65. package/build/main/providers/v2/uri-subgraph-provider.js.map +0 -1
  66. package/build/main/providers/v3/caching-pool-provider.js.map +0 -1
  67. package/build/main/providers/v3/caching-subgraph-provider.js.map +0 -1
  68. package/build/main/providers/v3/gas-data-provider.js.map +0 -1
  69. package/build/main/providers/v3/pool-provider.js.map +0 -1
  70. package/build/main/providers/v3/static-subgraph-provider.js.map +0 -1
  71. package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +0 -1
  72. package/build/main/providers/v3/subgraph-provider.js.map +0 -1
  73. package/build/main/providers/v3/uri-subgraph-provider.js.map +0 -1
  74. package/build/main/providers/v4/caching-pool-provider.js.map +0 -1
  75. package/build/main/providers/v4/caching-subgraph-provider.js.map +0 -1
  76. package/build/main/providers/v4/pool-provider.js.map +0 -1
  77. package/build/main/providers/v4/static-subgraph-provider.js.map +0 -1
  78. package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +0 -1
  79. package/build/main/providers/v4/subgraph-provider.js.map +0 -1
  80. package/build/main/providers/v4/uri-subgraph-provider.js.map +0 -1
  81. package/build/main/routers/alpha-router/alpha-router.js.map +0 -1
  82. package/build/main/routers/alpha-router/config.js.map +0 -1
  83. package/build/main/routers/alpha-router/entities/index.js.map +0 -1
  84. package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +0 -1
  85. package/build/main/routers/alpha-router/functions/best-swap-route.js.map +0 -1
  86. package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +0 -1
  87. package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +0 -1
  88. package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +0 -1
  89. package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +0 -1
  90. package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +0 -1
  91. package/build/main/routers/alpha-router/gas-models/gas-model.js.map +0 -1
  92. package/build/main/routers/alpha-router/gas-models/index.js.map +0 -1
  93. package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +0 -1
  94. package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +0 -1
  95. package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +0 -1
  96. package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +0 -1
  97. package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +0 -1
  98. package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +0 -1
  99. package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +0 -1
  100. package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +0 -1
  101. package/build/main/routers/alpha-router/index.js.map +0 -1
  102. package/build/main/routers/alpha-router/quoters/base-quoter.js.map +0 -1
  103. package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +0 -1
  104. package/build/main/routers/alpha-router/quoters/index.js.map +0 -1
  105. package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +0 -1
  106. package/build/main/routers/alpha-router/quoters/model/index.js.map +0 -1
  107. package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +0 -1
  108. package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +0 -1
  109. package/build/main/routers/alpha-router/quoters/model/results/index.js.map +0 -1
  110. package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +0 -1
  111. package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +0 -1
  112. package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +0 -1
  113. package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +0 -1
  114. package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +0 -1
  115. package/build/main/routers/index.js.map +0 -1
  116. package/build/main/routers/legacy-router/bases.js.map +0 -1
  117. package/build/main/routers/legacy-router/index.js.map +0 -1
  118. package/build/main/routers/legacy-router/legacy-router.js.map +0 -1
  119. package/build/main/routers/router.js.map +0 -1
  120. package/build/main/types/other/commons.js.map +0 -1
  121. package/build/main/types/other/factories/Erc20__factory.js.map +0 -1
  122. package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +0 -1
  123. package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +0 -1
  124. package/build/main/types/other/factories/ITokenValidator__factory.js.map +0 -1
  125. package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +0 -1
  126. package/build/main/types/other/factories/Permit2__factory.js.map +0 -1
  127. package/build/main/types/other/factories/StateView__factory.js.map +0 -1
  128. package/build/main/types/other/factories/SwapRouter02__factory.js.map +0 -1
  129. package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +0 -1
  130. package/build/main/types/other/factories/V4Quoter__factory.js.map +0 -1
  131. package/build/main/types/v2/commons.js.map +0 -1
  132. package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +0 -1
  133. package/build/main/types/v3/commons.js.map +0 -1
  134. package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +0 -1
  135. package/build/main/types/v3/factories/IQuoterV2__factory.js.map +0 -1
  136. package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +0 -1
  137. package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +0 -1
  138. package/build/main/util/addresses.js.map +0 -1
  139. package/build/main/util/amounts.js.map +0 -1
  140. package/build/main/util/callData.js.map +0 -1
  141. package/build/main/util/chains.js.map +0 -1
  142. package/build/main/util/defaultBlocksToLive.js.map +0 -1
  143. package/build/main/util/fewAddress.js.map +0 -1
  144. package/build/main/util/gas-factory-helpers.js.map +0 -1
  145. package/build/main/util/hooksOptions.js.map +0 -1
  146. package/build/main/util/index.js.map +0 -1
  147. package/build/main/util/intent.js.map +0 -1
  148. package/build/main/util/l2FeeChains.js.map +0 -1
  149. package/build/main/util/log.js.map +0 -1
  150. package/build/main/util/methodParameters.js.map +0 -1
  151. package/build/main/util/metric.js.map +0 -1
  152. package/build/main/util/mixedRouteFilterOutV4Pools.js.map +0 -1
  153. package/build/main/util/onchainQuoteProviderConfigs.js.map +0 -1
  154. package/build/main/util/pool.js.map +0 -1
  155. package/build/main/util/protocols.js.map +0 -1
  156. package/build/main/util/routes.js.map +0 -1
  157. package/build/main/util/serializeRouteIds.js.map +0 -1
  158. package/build/main/util/simple-perf-tracker.js.map +0 -1
  159. package/build/main/util/tenderlySimulationErrorBreakDown.js.map +0 -1
  160. package/build/main/util/unsupported-tokens.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-properties-provider.js","sourceRoot":"","sources":["../../../src/providers/token-properties-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Currency } from '@fewprotocol/sdk-core';\n\nimport { getAddressLowerCase, log, metric, MetricLoggerUnit } from '../util';\n\nimport { ICache } from './cache';\nimport { ProviderConfig } from './provider';\nimport {\n DEFAULT_TOKEN_FEE_RESULT,\n ITokenFeeFetcher,\n TokenFeeMap,\n TokenFeeResult,\n} from './token-fee-fetcher';\nimport {\n DEFAULT_ALLOWLIST,\n TokenValidationResult,\n} from './token-validator-provider';\n\nexport const DEFAULT_TOKEN_PROPERTIES_RESULT: TokenPropertiesResult = {\n tokenFeeResult: DEFAULT_TOKEN_FEE_RESULT,\n};\nexport const POSITIVE_CACHE_ENTRY_TTL = 1200; // 20 minutes in seconds\nexport const NEGATIVE_CACHE_ENTRY_TTL = 1200; // 20 minutes in seconds\n\ntype Address = string;\nexport type TokenPropertiesResult = {\n tokenFeeResult?: TokenFeeResult;\n tokenValidationResult?: TokenValidationResult;\n};\nexport type TokenPropertiesMap = Record<Address, TokenPropertiesResult>;\n\nexport interface ITokenPropertiesProvider {\n getTokensProperties(\n currencies: Currency[],\n providerConfig?: ProviderConfig\n ): Promise<TokenPropertiesMap>;\n}\n\nexport class TokenPropertiesProvider implements ITokenPropertiesProvider {\n private CACHE_KEY = (chainId: ChainId, address: string) =>\n `token-properties-${chainId}-${address}`;\n\n constructor(\n private chainId: ChainId,\n private tokenPropertiesCache: ICache<TokenPropertiesResult>,\n private tokenFeeFetcher: ITokenFeeFetcher,\n private allowList = DEFAULT_ALLOWLIST,\n private positiveCacheEntryTTL = POSITIVE_CACHE_ENTRY_TTL,\n private negativeCacheEntryTTL = NEGATIVE_CACHE_ENTRY_TTL\n ) {}\n\n public async getTokensProperties(\n currencies: Currency[],\n providerConfig?: ProviderConfig\n ): Promise<TokenPropertiesMap> {\n const tokenToResult: TokenPropertiesMap = {};\n\n if (!providerConfig?.enableFeeOnTransferFeeFetching) {\n return tokenToResult;\n }\n\n const addressesToFetchFeesOnchain: string[] = [];\n const addressesRaw = this.buildAddressesRaw(currencies);\n const addressesCacheKeys = this.buildAddressesCacheKeys(currencies);\n\n const tokenProperties = await this.tokenPropertiesCache.batchGet(\n addressesCacheKeys\n );\n\n // Check if we have cached token validation results for any tokens.\n for (const address of addressesRaw) {\n const cachedValue =\n tokenProperties[this.CACHE_KEY(this.chainId, address.toLowerCase())];\n if (cachedValue) {\n metric.putMetric(\n 'TokenPropertiesProviderBatchGetCacheHit',\n 1,\n MetricLoggerUnit.Count\n );\n const tokenFee = cachedValue.tokenFeeResult;\n const tokenFeeResultExists: BigNumber | undefined =\n tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps);\n\n if (tokenFeeResultExists) {\n metric.putMetric(\n `TokenPropertiesProviderCacheHitTokenFeeResultExists${tokenFeeResultExists}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(\n `TokenPropertiesProviderCacheHitTokenFeeResultNotExists`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n tokenToResult[address] = cachedValue;\n } else if (this.allowList.has(address)) {\n tokenToResult[address] = {\n tokenValidationResult: TokenValidationResult.UNKN,\n };\n } else {\n addressesToFetchFeesOnchain.push(address);\n }\n }\n\n if (addressesToFetchFeesOnchain.length > 0) {\n let tokenFeeMap: TokenFeeMap = {};\n\n try {\n tokenFeeMap = await this.tokenFeeFetcher.fetchFees(\n addressesToFetchFeesOnchain,\n providerConfig\n );\n } catch (err) {\n log.error(\n { err },\n `Error fetching fees for tokens ${addressesToFetchFeesOnchain}`\n );\n }\n\n await Promise.all(\n addressesToFetchFeesOnchain.map((address) => {\n const tokenFee = tokenFeeMap[address];\n const tokenFeeResultExists: BigNumber | undefined =\n tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps);\n\n if (tokenFeeResultExists) {\n // we will leverage the metric to log the token fee result, if it exists\n // the idea is that the token fee should not differ by too much across tokens,\n // so that we can accurately log the token fee for a particular quote request (without breaching metrics dimensionality limit)\n // in the form of metrics.\n // if we log as logging, given prod traffic volume, the logging volume will be high.\n metric.putMetric(\n `TokenPropertiesProviderTokenFeeResultCacheMissExists${tokenFeeResultExists}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n const tokenPropertiesResult = {\n tokenFeeResult: tokenFee,\n tokenValidationResult: TokenValidationResult.FOT,\n };\n tokenToResult[address] = tokenPropertiesResult;\n\n metric.putMetric(\n 'TokenPropertiesProviderBatchGetCacheMiss',\n 1,\n MetricLoggerUnit.Count\n );\n\n // update cache concurrently\n // at this point, we are confident that the tokens are FOT, so we can hardcode the validation result\n return this.tokenPropertiesCache.set(\n this.CACHE_KEY(this.chainId, address),\n tokenPropertiesResult,\n this.positiveCacheEntryTTL\n );\n } else {\n metric.putMetric(\n `TokenPropertiesProviderTokenFeeResultCacheMissNotExists`,\n 1,\n MetricLoggerUnit.Count\n );\n\n const tokenPropertiesResult = {\n tokenFeeResult: undefined,\n tokenValidationResult: undefined,\n };\n tokenToResult[address] = tokenPropertiesResult;\n\n return this.tokenPropertiesCache.set(\n this.CACHE_KEY(this.chainId, address),\n tokenPropertiesResult,\n this.negativeCacheEntryTTL\n );\n }\n })\n );\n }\n\n return tokenToResult;\n }\n\n private buildAddressesRaw(currencies: Currency[]): Set<string> {\n const addressesRaw = new Set<string>();\n\n for (const currency of currencies) {\n const address = getAddressLowerCase(currency);\n if (!addressesRaw.has(address)) {\n addressesRaw.add(address);\n }\n }\n\n return addressesRaw;\n }\n\n private buildAddressesCacheKeys(currencies: Currency[]): Set<string> {\n const addressesCacheKeys = new Set<string>();\n\n for (const currency of currencies) {\n const addressCacheKey = this.CACHE_KEY(\n this.chainId,\n getAddressLowerCase(currency)\n );\n if (!addressesCacheKeys.has(addressCacheKey)) {\n addressesCacheKeys.add(addressCacheKey);\n }\n }\n\n return addressesCacheKeys;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../../../src/providers/token-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { parseBytes32String } from '@ethersproject/strings';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { IERC20Metadata__factory } from '../types/v3/factories/IERC20Metadata__factory';\nimport { log, WRAPPED_NATIVE_CURRENCY } from '../util';\n\nimport { IMulticallProvider, Result } from './multicall-provider';\nimport { ProviderConfig } from './provider';\n\n/**\n * Provider for getting token data.\n *\n * @export\n * @interface ITokenProvider\n */\nexport interface ITokenProvider {\n /**\n * Gets the token at each address. Any addresses that are not valid ERC-20 are ignored.\n *\n * @param addresses The token addresses to get.\n * @param [providerConfig] The provider config.\n * @returns A token accessor with methods for accessing the tokens.\n */\n getTokens(\n addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<TokenAccessor>;\n}\n\nexport type TokenAccessor = {\n getTokenByAddress(address: string): Token | undefined;\n getTokenBySymbol(symbol: string): Token | undefined;\n getAllTokens: () => Token[];\n};\n\n// Some well known tokens on each chain for seeding cache / testing.\nexport const USDT_HYPER_MAINNET = new Token(\n ChainId.HYPER_MAINNET,\n '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb',\n 6,\n 'USDT',\n 'Tether USD'\n);\n\nexport const FEW_USDT_HYPER_MAINNET = new Token(\n ChainId.HYPER_MAINNET,\n '0x7576dd9a2775bFd789616d9eA7A2af21d06782D0',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport const USDC_MAINNET = new Token(\n ChainId.MAINNET,\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_MAINNET = new Token(\n ChainId.MAINNET,\n '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const AMPL_MAINNET = new Token(\n ChainId.MAINNET,\n '0xD46bA6D942050d489DBd938a2C909A5d5039A161',\n 9,\n 'AMPL',\n 'AMPL'\n);\nexport const FEI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x956F47F50A910163D8BF957Cf5846D573E7f87CA',\n 18,\n 'FEI',\n 'Fei USD'\n);\nexport const UNI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',\n 18,\n 'UNI',\n 'Uniswap'\n);\n\nexport const AAVE_MAINNET = new Token(\n ChainId.MAINNET,\n '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9',\n 18,\n 'AAVE',\n 'Aave Token'\n);\n\nexport const LIDO_MAINNET = new Token(\n ChainId.MAINNET,\n '0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32',\n 18,\n 'LDO',\n 'Lido DAO Token'\n);\n\nexport const WSTETH_MAINNET = new Token(\n ChainId.MAINNET,\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n 18,\n 'wstETH',\n 'Wrapped liquid staked Ether'\n);\n\nexport const USDC_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0xA7a151d60Bbd522d3611C2dB3F1F972Ee9904B3e',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_NATIVE_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x1c7d4b196cb0c7b01d743fbc6116a902379c7238',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const DAI_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x7AF17A48a6336F7dc1beF9D485139f7B6f4FB5C8',\n 18,\n 'DAI',\n 'DAI Token'\n);\nexport const USDC_GOERLI = new Token(\n ChainId.GOERLI,\n '0x07865c6e87b9f70255377e024ace6630c1eaa37f',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_GOERLI = new Token(\n ChainId.GOERLI,\n '0xe583769738b6dd4e7caf8451050d1948be717679',\n 18,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_GOERLI = new Token(\n ChainId.GOERLI,\n '0xa0a5ad2296b38bd3e3eb59aaeaf1589e8d9a29a9',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_GOERLI = new Token(\n ChainId.GOERLI,\n '0x11fe4b6ae13d2a6055c8d9cf65c55bac32b5d844',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const UNI_GOERLI = new Token(\n ChainId.GOERLI,\n '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984',\n 18,\n 'UNI',\n 'Uni token'\n);\n\nexport const USDC_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x68f180fcCe6836688e9084f035309E29Bf0A2095',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const OP_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x4200000000000000000000000000000000000042',\n 18,\n 'OP',\n 'Optimism'\n);\n\nexport const USDC_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0x7E07E15D2a87A24492740D16f5bdF58c16db0c4E',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0x853eb4bA5D0Ba2B77a0A5329Fd2110d5CE149ECE',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0xe0a592353e81a94Db6E3226fD4A99F881751776a',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0x7E07E15D2a87A24492740D16f5bdF58c16db0c4E',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0x853eb4bA5D0Ba2B77a0A5329Fd2110d5CE149ECE',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0xe0a592353e81a94Db6E3226fD4A99F881751776a',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const ARB_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x912CE59144191C1204E64559FE8253a0e49E6548',\n 18,\n 'ARB',\n 'Arbitrum'\n);\n\nexport const DAI_ARBITRUM_GOERLI = new Token(\n ChainId.ARBITRUM_GOERLI,\n '0x0000000000000000000000000000000000000000', // TODO: add address\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const DAI_ARBITRUM_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0xc3826E277485c33F3D99C9e0CBbf8449513210EE',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\n// Bridged version of official Goerli USDC\nexport const USDC_ARBITRUM_GOERLI = new Token(\n ChainId.ARBITRUM_GOERLI,\n '0x8FB1E3fC51F3b789dED7557E680551d93Ea9d892',\n 6,\n 'USDC',\n 'USD//C'\n);\n\n// Bridged version of official Sepolia USDC\nexport const USDC_ARBITRUM_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',\n 6,\n 'USDC',\n 'USD//C'\n);\n\n//polygon tokens\nexport const WMATIC_POLYGON = new Token(\n ChainId.POLYGON,\n '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n 18,\n 'WMATIC',\n 'Wrapped MATIC'\n);\n\nexport const WETH_POLYGON = new Token(\n ChainId.POLYGON,\n '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n 18,\n 'WETH',\n 'Wrapped Ether'\n);\n\nexport const USDC_POLYGON = new Token(\n ChainId.POLYGON,\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_POLYGON = new Token(\n ChainId.POLYGON,\n '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const DAI_POLYGON = new Token(\n ChainId.POLYGON,\n '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const DAI_BASE_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0xE6F6e27c0BF1a4841E3F09d03D7D31Da8eAd0a27',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\n//polygon mumbai tokens\nexport const WMATIC_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',\n 18,\n 'WMATIC',\n 'Wrapped MATIC'\n);\n\nexport const USDC_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0xe11a86849d99f524cac3e7a0ec1241828e332c62',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const DAI_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0x001b3b4d0f3714ca98ba10f6042daebf0b1b7b6f',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const WETH_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0xa6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa',\n 18,\n 'WETH',\n 'Wrapped Ether'\n);\n\n// BNB chain Tokens\nexport const BTC_BNB = new Token(\n ChainId.BNB,\n '0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c',\n 18,\n 'BTCB',\n 'Binance BTC'\n);\n\nexport const BUSD_BNB = new Token(\n ChainId.BNB,\n '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n 18,\n 'BUSD',\n 'BUSD'\n);\n\nexport const DAI_BNB = new Token(\n ChainId.BNB,\n '0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3',\n 18,\n 'DAI',\n 'DAI'\n);\n\nexport const ETH_BNB = new Token(\n ChainId.BNB,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'ETH'\n);\n\nexport const USDC_BNB = new Token(\n ChainId.BNB,\n '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n 18,\n 'USDC',\n 'USDC'\n);\n\nexport const USDT_BNB = new Token(\n ChainId.BNB,\n '0x55d398326f99059fF775485246999027B3197955',\n 18,\n 'USDT',\n 'USDT'\n);\n\n// Celo Tokens\nexport const CELO = new Token(\n ChainId.CELO,\n '0x471EcE3750Da237f93B8E339c536989b8978a438',\n 18,\n 'CELO',\n 'Celo native asset'\n);\n\nexport const DAI_CELO = new Token(\n ChainId.CELO,\n '0xE4fE50cdD716522A56204352f00AA110F731932d',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const CUSD_CELO = new Token(\n ChainId.CELO,\n '0x765DE816845861e75A25fCA122bb6898B8B1282a',\n 18,\n 'CUSD',\n 'Celo Dollar Stablecoin'\n);\nexport const USDC_CELO = new Token(\n ChainId.CELO,\n '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n 18,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_WORMHOLE_CELO = new Token(\n ChainId.CELO,\n '0x37f750B7cC259A2f741AF45294f6a16572CF5cAd',\n 18,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_CELO = new Token(\n ChainId.CELO,\n '0x765DE816845861e75A25fCA122bb6898B8B1282a',\n 18,\n 'USDC',\n 'USD//C'\n);\n\nexport const CEUR_CELO = new Token(\n ChainId.CELO,\n '0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73',\n 18,\n 'CEUR',\n 'Celo Euro Stablecoin'\n);\n\n// Celo Alfajores Tokens\nexport const CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9',\n 18,\n 'CELO',\n 'Celo native asset'\n);\nexport const DAI_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x7d91E51C8F218f7140188A155f5C75388630B6a8',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const CUSD_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1',\n 18,\n 'CUSD',\n 'Celo Dollar Stablecoin'\n);\n\nexport const CEUR_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x10c892A6EC43a53E45D0B916B4b7D383B1b78C0F',\n 18,\n 'CEUR',\n 'Celo Euro Stablecoin'\n);\n\n// Avalanche Tokens\nexport const DAI_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n 18,\n 'DAI.e',\n 'DAI.e Token'\n);\n\nexport const USDC_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_BRIDGED_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_NATIVE_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\n// Base Tokens\nexport const USDC_BASE = new Token(\n ChainId.BASE,\n '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\nexport const USDC_NATIVE_BASE = new Token(\n ChainId.BASE,\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\nexport const VIRTUAL_BASE = new Token(\n ChainId.BASE,\n '0x0b3e328455c4059EEb9e3f84b5543F74E24e7E1b',\n 18,\n 'VIRTUAL',\n 'Virtual Protocol'\n);\n\n// Base Goerli Tokens\nexport const USDC_BASE_GOERLI = new Token(\n ChainId.BASE_GOERLI,\n '0x853154e2A5604E5C74a2546E2871Ad44932eB92C',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\n\n// Gnosis Tokens\nexport const USDC_ETHEREUM_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0xddafbb505ad214d7b80b1f830fccc89b60fb7a83',\n 6,\n 'USDC',\n 'USDC from Ethereum on Gnosis'\n);\n\nexport const WXDAI_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',\n 18,\n 'WXDAI',\n 'Wrapped XDAI on Gnosis'\n);\n\nexport const WBTC_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0x8e5bbbb09ed1ebde8674cda39a0c169401db4252',\n 8,\n 'WBTC',\n 'Wrapped BTC from Ethereum on Gnosis'\n);\n\n// Moonbeam Tokens\nexport const USDC_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b',\n 6,\n 'USDC',\n 'USD Coin bridged using Multichain'\n);\n\nexport const WGLMR_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0xAcc15dC74880C9944775448304B263D191c6077F',\n 18,\n 'WGLMR',\n 'Wrapped GLMR'\n);\n\nexport const DAI_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b',\n 6,\n 'DAI',\n 'Dai on moonbeam bridged using Multichain'\n);\n\nexport const WBTC_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x922D641a426DcFFaeF11680e5358F34d97d112E1',\n 8,\n 'WBTC',\n 'Wrapped BTC bridged using Multichain'\n);\n\n// Blast Tokens\nexport const USDB_BLAST = new Token(\n ChainId.BLAST,\n '0x4300000000000000000000000000000000000003',\n 18,\n 'USDB',\n 'USD Blast'\n);\n\nexport const USDB_BLAST_SEPOLIA = new Token(\n ChainId.BLAST_SEPOLIA,\n '0x4200000000000000000000000000000000000022',\n 18,\n 'USDB',\n 'USD Blast'\n);\n\nexport const FEW_USDB_BLAST_SEPOLIA = new Token(\n ChainId.BLAST_SEPOLIA,\n '0x4D2c669Cf7DC804641Cd4Dec3CD73daB5575c3Da',\n 18,\n 'fwUSDB',\n 'Few Wrapped USDB'\n);\n\nexport const SUSD_STORY_ODYSSEY = new Token(\n ChainId.STORY_ODYSSEY,\n '0xC0F6E387aC0B324Ec18EAcf22EE7271207dCE3d5',\n 18,\n 'SUSD',\n 'Story USD'\n)\n\nexport const FEW_SUSD_STORY_ODYSSEY = new Token(\n ChainId.STORY_ODYSSEY,\n '0xb76452d2e299ee782b30D5EE5b50c7D3c7e6446B',\n 18,\n 'fwSUSD',\n 'Few Wrapped Story USD'\n);\n\nexport const USDC_STORY_MAINNET = new Token(\n ChainId.STORY_MAINNET,\n '0xF1815bd50389c46847f0Bda824eC8da914045D14',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const FEW_USDC_STORY_MAINNET = new Token(\n ChainId.STORY_MAINNET,\n '0x402dD950dD789E5C109363c9c6Fde21c847ab57e',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\n\nexport const USDC_ZORA = new Token(\n ChainId.ZORA,\n '0xCccCCccc7021b32EBb4e8C08314bD62F7c653EC4',\n 6,\n 'USDzC',\n 'USD Coin (Bridged from Ethereum)'\n);\n\nexport const USDC_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4',\n 6,\n 'USDC',\n 'USDC'\n);\n\nexport const USDCE_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4',\n 6,\n 'USDC.e',\n 'Bridged USDC (zkSync)'\n);\n\nexport const DAI_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x4B9eb6c0b6ea15176BBF62841C6B2A8a398cb656',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1',\n 6,\n 'USDC.e',\n 'Bridged USDC (world-chain-mainnet)'\n);\n\nexport const USDT_MONAD_TESTNET = new Token(\n ChainId.MONAD_TESTNET,\n '0xfBC2D240A5eD44231AcA3A9e9066bc4b33f01149',\n 6,\n 'USDT',\n 'USDT'\n);\n\nexport const WLD_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x2cFc85d8E48F8EAB294be644d9E25C3030863003',\n 18,\n 'WLD',\n 'Worldcoin'\n);\n\nexport const WBTC_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\n\nexport const USDC_UNICHAIN_SEPOLIA = new Token(\n ChainId.UNICHAIN_SEPOLIA,\n '0x31d0220469e10c4E71834a79b1f276d740d3768F',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\nexport const USDC_BASE_SEPOLIA = new Token(\n ChainId.BASE_SEPOLIA,\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\nexport const USDC_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n // TODO: validate USDC address is final / validated\n '0x078D782b760474a361dDA0AF3839290b0EF57AD6',\n 6,\n 'USDC',\n 'USD Token'\n);\n\nexport const DAI_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n '0x20CAb320A855b39F724131C69424240519573f81',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_SONEIUM = new Token(\n ChainId.SONEIUM,\n '0xbA9986D2381edf1DA03B0B9c1f8b00dc4AacC369',\n 6,\n 'USDCE',\n 'Soneium Bridged USDC Soneium'\n);\n\n\n// few token\nexport const FEW_USDC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x0492560fa7cfd6a85e50d8be3f77318994f8f429',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\n\nexport const FEW_USDT_MAINNET = new Token(\n ChainId.MAINNET,\n '0xef87f4608e601e8564800265aee1c1ffadf73283',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport const FEW_UNI_MAINNET = new Token(\n ChainId.MAINNET,\n '0xe8e1f50392bd61d0f8f48e8e7af51d3b8a52090a',\n 18,\n 'fwUNI',\n 'Few Wrapped Uniswap'\n);\n\nexport const FEW_WBTC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x2078f336Fdd260f708BEc4a20c82b063274E1b23',\n 8,\n 'fwWBTC',\n 'Few Wrapped Wrapped BTC'\n);\nexport const FEW_RNG_MAINNET = new Token(\n ChainId.MAINNET,\n '0x647C31e149b71D90852Ca10a3bBC40931b55C959',\n 18,\n 'fwRNG',\n 'Few Wrapped Ring Exchange'\n);\nexport const FEW_DAI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x8a6fe57c08c84e0f4ee97aae68a62e820a37d259',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\n\nexport const FEW_RNG_ARB_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x9410675e251Cc4E6E42eF338085873a079d44634',\n 18,\n 'fwRNG',\n 'Few Wrapped Ring Exchange'\n);\n\nexport const FEW_USDC_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x76AC72683C5b7F22C6B5Ed85B5B1511702464F7e',\n 18,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_DAI_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x09D8486e42Aa76229a563bFa0f07CA301aCd29C9',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDC_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n '0x88daE9d30E95C608c3FA3dAc26636Be59Ab2c488',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_USDT_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x49539A32510a4d1706eB1852Cc6a7Db6677dDc1b',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const FEW_USDC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x21719B213646627698c8A5ADa5A6cf2Eb82C540a',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD Coin'\n);\nexport const FEW_DAI_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x925dc2b62CD41a6318cC481752279b0a6D02D1D4',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_WBTC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x0c5EC8a8AE241091A5AcB8fFaA165895E0A9aEc7',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const FEW_DAI_ARB_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0xED43C9E67e04aD647563C53d4136f9F668402017',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDC_BASE = new Token(\n ChainId.BASE,\n '0x3f03d40b28c773649ab75ef6f4853e7f79dc9286',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD Coin'\n);\nexport const FEW_DAI_BASE = new Token(\n ChainId.BASE,\n '0x8d9fd481ee2f5a1dd70ab5e4fc72715a293d62c3',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDT_BASE = new Token(\n ChainId.BASE,\n '0x6177eeccfbb3d4e0cc41b4e9de40a2daed236722',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\nexport const FEW_USDB_BLAST = new Token(\n ChainId.BLAST,\n '0x866f2C06B83Df2ed7Ca9C2D044940E7CD55a06d6',\n 18,\n 'fwUSDB',\n 'Few Wrapped USDB'\n);\nexport const FEW_USDC_BNB = new Token(\n ChainId.BNB,\n '0xACD988Db88EF410ac0415bB2e47794C0C27B6B10',\n 18,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_USDT_BNB = new Token(\n ChainId.BNB,\n '0x95b5aEfbcC9e6E462f21E0847e2d90b89b7Cd028',\n 18,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport class TokenProvider implements ITokenProvider {\n constructor(\n private chainId: ChainId,\n protected multicall2Provider: IMulticallProvider\n ) { }\n\n private async getTokenSymbol(\n addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<{\n result: {\n blockNumber: BigNumber;\n results: Result<[string]>[];\n };\n isBytes32: boolean;\n }> {\n let result;\n let isBytes32 = false;\n\n try {\n result =\n await this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [string]\n >({\n addresses,\n contractInterface: IERC20Metadata__factory.createInterface(),\n functionName: 'symbol',\n providerConfig,\n });\n } catch (error) {\n log.error(\n { addresses },\n `TokenProvider.getTokenSymbol[string] failed with error ${error}. Trying with bytes32.`\n );\n\n const bytes32Interface = new Interface([\n {\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ]);\n\n try {\n result =\n await this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [string]\n >({\n addresses,\n contractInterface: bytes32Interface,\n functionName: 'symbol',\n providerConfig,\n });\n isBytes32 = true;\n } catch (error) {\n log.fatal(\n { addresses },\n `TokenProvider.getTokenSymbol[bytes32] failed with error ${error}.`\n );\n\n throw new Error(\n '[TokenProvider.getTokenSymbol] Impossible to fetch token symbol.'\n );\n }\n }\n\n return { result, isBytes32 };\n }\n\n private async getTokenDecimals(\n addresses: string[],\n providerConfig?: ProviderConfig\n ) {\n return this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [number]\n >({\n addresses,\n contractInterface: IERC20Metadata__factory.createInterface(),\n functionName: 'decimals',\n providerConfig,\n });\n }\n\n public async getTokens(\n _addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<TokenAccessor> {\n const addressToToken: { [address: string]: Token } = {};\n const symbolToToken: { [symbol: string]: Token } = {};\n\n const addresses = _(_addresses)\n .map((address) => address.toLowerCase())\n .uniq()\n .value();\n\n if (addresses.length > 0) {\n const [symbolsResult, decimalsResult] = await Promise.all([\n this.getTokenSymbol(addresses, providerConfig),\n this.getTokenDecimals(addresses, providerConfig),\n ]);\n\n const isBytes32 = symbolsResult.isBytes32;\n const { results: symbols } = symbolsResult.result;\n const { results: decimals } = decimalsResult;\n\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i]!;\n\n const symbolResult = symbols[i];\n const decimalResult = decimals[i];\n\n if (!symbolResult?.success || !decimalResult?.success) {\n log.info(\n {\n symbolResult,\n decimalResult,\n },\n `Dropping token with address ${address} as symbol or decimal are invalid`\n );\n continue;\n }\n\n let symbol;\n\n try {\n symbol = isBytes32\n ? parseBytes32String(symbolResult.result[0]!)\n : symbolResult.result[0]!;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\n 'invalid bytes32 string - no null terminator'\n )\n ) {\n log.error(\n {\n symbolResult,\n error,\n address,\n },\n `invalid bytes32 string - no null terminator`\n );\n }\n\n throw error;\n }\n const decimal = decimalResult.result[0]!;\n\n addressToToken[address.toLowerCase()] = new Token(\n this.chainId,\n address,\n decimal,\n symbol\n );\n symbolToToken[symbol.toLowerCase()] =\n addressToToken[address.toLowerCase()]!;\n }\n\n log.info(\n `Got token symbol and decimals for ${Object.values(addressToToken).length\n } out of ${addresses.length} tokens on-chain ${providerConfig ? `as of: ${providerConfig?.blockNumber}` : ''\n }`\n );\n }\n\n return {\n getTokenByAddress: (address: string): Token | undefined => {\n return addressToToken[address.toLowerCase()];\n },\n getTokenBySymbol: (symbol: string): Token | undefined => {\n return symbolToToken[symbol.toLowerCase()];\n },\n getAllTokens: (): Token[] => {\n return Object.values(addressToToken);\n },\n };\n }\n}\n\nexport const DAI_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return DAI_MAINNET;\n case ChainId.GOERLI:\n return DAI_GOERLI;\n case ChainId.SEPOLIA:\n return DAI_SEPOLIA;\n case ChainId.OPTIMISM:\n return DAI_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return DAI_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return DAI_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return DAI_ARBITRUM;\n case ChainId.ARBITRUM_GOERLI:\n return DAI_ARBITRUM_GOERLI;\n case ChainId.ARBITRUM_SEPOLIA:\n return DAI_ARBITRUM_SEPOLIA;\n case ChainId.POLYGON:\n return DAI_POLYGON;\n case ChainId.POLYGON_MUMBAI:\n return DAI_POLYGON_MUMBAI;\n case ChainId.CELO:\n return DAI_CELO;\n case ChainId.CELO_ALFAJORES:\n return DAI_CELO_ALFAJORES;\n case ChainId.MOONBEAM:\n return DAI_MOONBEAM;\n case ChainId.BNB:\n return DAI_BNB;\n case ChainId.AVALANCHE:\n return DAI_AVAX;\n case ChainId.ZKSYNC:\n return DAI_ZKSYNC;\n case ChainId.UNICHAIN:\n return DAI_UNICHAIN;\n case ChainId.BASE_SEPOLIA:\n return DAI_BASE_SEPOLIA;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const USDT_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return USDT_MAINNET;\n case ChainId.GOERLI:\n return USDT_GOERLI;\n case ChainId.OPTIMISM:\n return USDT_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return USDT_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return USDT_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return USDT_ARBITRUM;\n case ChainId.BNB:\n return USDT_BNB;\n case ChainId.MONAD_TESTNET:\n return USDT_MONAD_TESTNET;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const USDC_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return USDC_MAINNET;\n case ChainId.GOERLI:\n return USDC_GOERLI;\n case ChainId.SEPOLIA:\n return USDC_SEPOLIA;\n case ChainId.OPTIMISM:\n return USDC_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return USDC_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return USDC_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return USDC_ARBITRUM;\n case ChainId.ARBITRUM_GOERLI:\n return USDC_ARBITRUM_GOERLI;\n case ChainId.ARBITRUM_SEPOLIA:\n return USDC_ARBITRUM_SEPOLIA;\n case ChainId.POLYGON:\n return USDC_POLYGON;\n case ChainId.POLYGON_MUMBAI:\n return USDC_POLYGON_MUMBAI;\n case ChainId.GNOSIS:\n return USDC_ETHEREUM_GNOSIS;\n case ChainId.MOONBEAM:\n return USDC_MOONBEAM;\n case ChainId.BNB:\n return USDC_BNB;\n case ChainId.AVALANCHE:\n return USDC_AVAX;\n case ChainId.BASE:\n return USDC_BASE;\n case ChainId.BASE_GOERLI:\n return USDC_BASE_GOERLI;\n case ChainId.ZORA:\n return USDC_ZORA;\n case ChainId.ZKSYNC:\n return USDCE_ZKSYNC;\n case ChainId.WORLDCHAIN:\n return USDC_WORLDCHAIN;\n case ChainId.UNICHAIN_SEPOLIA:\n return USDC_UNICHAIN_SEPOLIA;\n case ChainId.BASE_SEPOLIA:\n return USDC_BASE_SEPOLIA;\n case ChainId.UNICHAIN:\n return USDC_UNICHAIN;\n case ChainId.SONEIUM:\n return USDC_SONEIUM;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const WNATIVE_ON = (chainId: ChainId): Token => {\n return WRAPPED_NATIVE_CURRENCY[chainId];\n};\n\nexport const V4_SEPOLIA_TEST_A = new Token(\n ChainId.SEPOLIA,\n '0x0275C79896215a790dD57F436E1103D4179213be',\n 18,\n 'A',\n 'MockA'\n);\n\nexport const V4_SEPOLIA_TEST_B = new Token(\n ChainId.SEPOLIA,\n '0x1a6990c77cfbba398beb230dd918e28aab71eec2',\n 18,\n 'B',\n 'MockB'\n);\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-validator-provider.js","sourceRoot":"","sources":["../../../src/providers/token-validator-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { ITokenValidator__factory } from '../types/other/factories/ITokenValidator__factory';\nimport {\n log,\n metric,\n MetricLoggerUnit,\n WRAPPED_NATIVE_CURRENCY,\n} from '../util';\n\nimport { ICache } from './cache';\nimport { IMulticallProvider } from './multicall-provider';\nimport { ProviderConfig } from './provider';\n\nexport const DEFAULT_ALLOWLIST = new Set<string>([\n // RYOSHI. Does not allow transfers between contracts so fails validation.\n '0x777E2ae845272a2F540ebf6a3D03734A5a8f618e'.toLowerCase(),\n]);\n\nexport enum TokenValidationResult {\n UNKN = 0,\n FOT = 1,\n STF = 2,\n}\n\nexport interface TokenValidationResults {\n getValidationByToken(token: Token): TokenValidationResult | undefined;\n}\n\nconst TOKEN_VALIDATOR_ADDRESS = '0xb5ee1690b7dcc7859771148d0889be838fe108e0';\nconst AMOUNT_TO_FLASH_BORROW = '1000';\nconst GAS_LIMIT_PER_VALIDATE = 1_000_000;\n\n/**\n * Provider for getting token data.\n *\n * @export\n * @interface ITokenValidatorProvider\n */\nexport interface ITokenValidatorProvider {\n /**\n * Gets the token at each address. Any addresses that are not valid ERC-20 are ignored.\n *\n * @param addresses The token addresses to get.\n * @param [providerConfig] The provider config.\n * @returns A token accessor with methods for accessing the tokens.\n */\n validateTokens(\n tokens: Token[],\n providerConfig?: ProviderConfig\n ): Promise<TokenValidationResults>;\n}\n\nexport class TokenValidatorProvider implements ITokenValidatorProvider {\n private CACHE_KEY = (chainId: ChainId, address: string) =>\n `token-${chainId}-${address}`;\n\n private BASES: string[];\n\n constructor(\n protected chainId: ChainId,\n protected multicall2Provider: IMulticallProvider,\n private tokenValidationCache: ICache<TokenValidationResult>,\n private tokenValidatorAddress = TOKEN_VALIDATOR_ADDRESS,\n private gasLimitPerCall = GAS_LIMIT_PER_VALIDATE,\n private amountToFlashBorrow = AMOUNT_TO_FLASH_BORROW,\n private allowList = DEFAULT_ALLOWLIST\n ) {\n this.BASES = [WRAPPED_NATIVE_CURRENCY[this.chainId]!.address];\n }\n\n public async validateTokens(\n tokens: Token[],\n providerConfig?: ProviderConfig\n ): Promise<TokenValidationResults> {\n const tokenAddressToToken = _.keyBy(tokens, 'address');\n const addressesRaw = _(tokens)\n .map((token) => token.address)\n .uniq()\n .value();\n\n const addresses: string[] = [];\n const tokenToResult: { [tokenAddress: string]: TokenValidationResult } = {};\n\n // Check if we have cached token validation results for any tokens.\n for (const address of addressesRaw) {\n if (\n await this.tokenValidationCache.has(\n this.CACHE_KEY(this.chainId, address)\n )\n ) {\n tokenToResult[address.toLowerCase()] =\n (await this.tokenValidationCache.get(\n this.CACHE_KEY(this.chainId, address)\n ))!;\n\n metric.putMetric(\n `TokenValidatorProviderValidateCacheHitResult${\n tokenToResult[address.toLowerCase()]\n }`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n addresses.push(address);\n }\n }\n\n log.info(\n `Got token validation results for ${\n addressesRaw.length - addresses.length\n } tokens from cache. Getting ${addresses.length} on-chain.`\n );\n\n const functionParams = _(addresses)\n .map((address) => [address, this.BASES, this.amountToFlashBorrow])\n .value() as [string, string[], string][];\n\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 multicallResult =\n await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, string[], string], // address, base token addresses, amount to borrow\n [number]\n >({\n address: this.tokenValidatorAddress,\n contractInterface: ITokenValidator__factory.createInterface(),\n functionName: 'validate',\n functionParams: functionParams,\n providerConfig,\n additionalConfig: {\n gasLimitPerCallOverride: this.gasLimitPerCall,\n },\n });\n\n for (let i = 0; i < multicallResult.results.length; i++) {\n const resultWrapper = multicallResult.results[i]!;\n const tokenAddress = addresses[i]!;\n const token = tokenAddressToToken[tokenAddress]!;\n\n if (this.allowList.has(token.address.toLowerCase())) {\n tokenToResult[token.address.toLowerCase()] = TokenValidationResult.UNKN;\n\n await this.tokenValidationCache.set(\n this.CACHE_KEY(this.chainId, token.address.toLowerCase()),\n tokenToResult[token.address.toLowerCase()]!\n );\n\n continue;\n }\n\n // Could happen if the tokens transfer consumes too much gas so we revert. Just\n // drop the token in that case.\n if (!resultWrapper.success) {\n metric.putMetric(\n 'TokenValidatorProviderValidateFailed',\n 1,\n MetricLoggerUnit.Count\n );\n\n log.error(\n { result: resultWrapper },\n `Failed to validate token ${token.symbol}`\n );\n\n continue;\n }\n\n metric.putMetric(\n 'TokenValidatorProviderValidateSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n const validationResult = resultWrapper.result[0]!;\n\n tokenToResult[token.address.toLowerCase()] =\n validationResult as TokenValidationResult;\n\n await this.tokenValidationCache.set(\n this.CACHE_KEY(this.chainId, token.address.toLowerCase()),\n tokenToResult[token.address.toLowerCase()]!\n );\n\n metric.putMetric(\n `TokenValidatorProviderValidateCacheMissResult${validationResult}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n return {\n getValidationByToken: (token: Token) =>\n tokenToResult[token.address.toLowerCase()],\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uri-subgraph-provider.js","sourceRoot":"","sources":["../../../src/providers/uri-subgraph-provider.ts"],"names":[],"mappings":";;;;;;AACA,8DAAgC;AAChC,kEAAoC;AACpC,kDAA0B;AAE1B,qCAAkC;AAMlC;;;;;;;;GAQG;AACH,MAAa,mBAAmB;IAG9B,YACU,OAAgB,EAChB,GAAW,EACX,UAAU,IAAI,EACd,UAAU,CAAC;QAHX,YAAO,GAAP,OAAO,CAAS;QAChB,QAAG,GAAH,GAAG,CAAQ;QACX,YAAO,GAAP,OAAO,CAAO;QACd,YAAO,GAAP,OAAO,CAAI;IAClB,CAAC;IAEG,KAAK,CAAC,QAAQ;QACnB,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EACjB,wCAAwC,IAAI,CAAC,GAAG,EAAE,CACnD,CAAC;QAEF,IAAI,QAAQ,GAAoB,EAAE,CAAC;QAEnC,MAAM,IAAA,qBAAK,EACT,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,uBAAO,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvD,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,OAAO,EAAE,CACzD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC;YAEb,qCAAqC;YACrC,IAAI;gBACF,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aACpE;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,GAAG,CAAC;aACX;oBAAS;gBACR,OAAO,CAAC,KAAK,EAAE,CAAC;aACjB;YACD,oCAAoC;YAEpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE/C,IAAI,MAAM,IAAI,GAAG,EAAE;gBACjB,SAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,6BAA6B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBAElE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aACzD;YAED,MAAM,KAAK,GAAG,WAA8B,CAAC;YAE7C,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EACtC,qCAAqC,KAAK,CAAC,MAAM,EAAE,CACpD,CAAC;YAEF,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,EACD;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACtB,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,EACP,gCAAgC,IAAI,CAAC,GAAG,oBAAoB,KAAK,EAAE,CACpE,CAAC;YACJ,CAAC;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AArED,kDAqEC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\nimport retry from 'async-retry';\nimport Timeout from 'await-timeout';\nimport axios from 'axios';\n\nimport { log } from '../util/log';\n\nimport { V2SubgraphPool } from './v2/subgraph-provider';\nimport { RingV2SubgraphPool } from './fewV2/ring-subgraph-provider';\nimport { V3SubgraphPool } from './v3/subgraph-provider';\n\n/**\n * Gets subgraph pools from a URI. The URI shoudl contain a JSON\n * stringified array of V2SubgraphPool objects or V3SubgraphPool\n * objects.\n *\n * @export\n * @class URISubgraphProvider\n * @template TSubgraphPool\n */\nexport class URISubgraphProvider<\n TSubgraphPool extends RingV2SubgraphPool | V2SubgraphPool | V3SubgraphPool\n> {\n constructor(\n private chainId: ChainId,\n private uri: string,\n private timeout = 6000,\n private retries = 2\n ) {}\n\n public async getPools(): Promise<TSubgraphPool[]> {\n log.info(\n { uri: this.uri },\n `About to get subgraph pools from URI ${this.uri}`\n );\n\n let allPools: TSubgraphPool[] = [];\n\n await retry(\n async () => {\n const timeout = new Timeout();\n const timerPromise = timeout.set(this.timeout).then(() => {\n throw new Error(\n `Timed out getting pools from subgraph: ${this.timeout}`\n );\n });\n\n let response;\n\n /* eslint-disable no-useless-catch */\n try {\n response = await Promise.race([axios.get(this.uri), timerPromise]);\n } catch (err) {\n throw err;\n } finally {\n timeout.clear();\n }\n /* eslint-enable no-useless-catch */\n\n const { data: poolsBuffer, status } = response;\n\n if (status != 200) {\n log.error({ response }, `Unabled to get pools from ${this.uri}.`);\n\n throw new Error(`Unable to get pools from ${this.uri}`);\n }\n\n const pools = poolsBuffer as TSubgraphPool[];\n\n log.info(\n { uri: this.uri, chain: this.chainId },\n `Got subgraph pools from uri. Num: ${pools.length}`\n );\n\n allPools = pools;\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n log.info(\n { err },\n `Failed to get pools from uri ${this.uri}. Retry attempt: ${retry}`\n );\n },\n }\n );\n\n return allPools;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/caching-pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport _ from 'lodash';\n\nimport { log } from '../../util/log';\n\nimport { ICache } from './../cache';\nimport { ProviderConfig } from './../provider';\nimport { IV2PoolProvider, V2PoolAccessor } from './pool-provider';\n\n/**\n * Provider for getting V2 pools, with functionality for caching the results per block.\n *\n * @export\n * @class CachingV2PoolProvider\n */\nexport class CachingV2PoolProvider implements IV2PoolProvider {\n private POOL_KEY = (chainId: ChainId, address: string) =>\n `pool-${chainId}-${address}`;\n\n /**\n * Creates an instance of CachingV3PoolProvider.\n * @param chainId The chain id to use.\n * @param poolProvider The provider to use to get the pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n protected chainId: ChainId,\n protected poolProvider: IV2PoolProvider,\n // Cache is block aware. For V2 pools we need to use the current blocks reserves values since\n // we compute quotes off-chain.\n // If no block is specified in the call to getPools we just return whatever is in the cache.\n private cache: ICache<{ pair: Pair; block?: number }>\n ) {}\n\n public async getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor> {\n const poolAddressSet: Set<string> = new Set<string>();\n const poolsToGetTokenPairs: Array<[Token, Token]> = [];\n const poolsToGetAddresses: string[] = [];\n const poolAddressToPool: { [poolAddress: string]: Pair } = {};\n\n const blockNumber = await providerConfig?.blockNumber;\n\n for (const [tokenA, tokenB] of tokenPairs) {\n const { poolAddress, token0, token1 } = this.getPoolAddress(\n tokenA,\n tokenB\n );\n\n if (poolAddressSet.has(poolAddress)) {\n continue;\n }\n\n poolAddressSet.add(poolAddress);\n\n const cachedPool = await this.cache.get(\n this.POOL_KEY(this.chainId, poolAddress)\n );\n\n if (cachedPool) {\n // If a block was specified by the caller, ensure that the result in our cache matches the\n // expected block number. If a block number is not specified, just return whatever is in the\n // cache.\n if (!blockNumber || (blockNumber && cachedPool.block == blockNumber)) {\n poolAddressToPool[poolAddress] = cachedPool.pair;\n continue;\n }\n }\n\n poolsToGetTokenPairs.push([token0, token1]);\n poolsToGetAddresses.push(poolAddress);\n }\n\n log.info(\n {\n poolsFound: _.map(\n Object.values(poolAddressToPool),\n (p) => p.token0.symbol + ' ' + p.token1.symbol\n ),\n poolsToGetTokenPairs: _.map(\n poolsToGetTokenPairs,\n (t) => t[0].symbol + ' ' + t[1].symbol\n ),\n },\n `Found ${\n Object.keys(poolAddressToPool).length\n } V2 pools already in local cache for block ${blockNumber}. About to get reserves for ${\n poolsToGetTokenPairs.length\n } pools.`\n );\n\n if (poolsToGetAddresses.length > 0) {\n const poolAccessor = await this.poolProvider.getPools(\n poolsToGetTokenPairs,\n {\n ...providerConfig,\n enableFeeOnTransferFeeFetching: true,\n }\n );\n for (const address of poolsToGetAddresses) {\n const pool = poolAccessor.getPoolByAddress(address);\n if (pool) {\n poolAddressToPool[address] = pool;\n // We don't want to wait for this caching to complete before returning the pools.\n this.cache.set(this.POOL_KEY(this.chainId, address), {\n pair: pool,\n block: blockNumber,\n });\n }\n }\n }\n\n return {\n getPool: (tokenA: Token, tokenB: Token): Pair | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB);\n return poolAddressToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pair | undefined =>\n poolAddressToPool[address],\n getAllPools: (): Pair[] => Object.values(poolAddressToPool),\n };\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token } {\n return this.poolProvider.getPoolAddress(tokenA, tokenB);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/caching-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AAGnD,4EAAuE;AAKvE;;;;;GAKG;AACH,MAAa,yBACX,SAAQ,mDAAuC;IAG/C;;;;;OAKG;IACH,YACE,OAAgB,EAChB,gBAAqC,EACrC,KAA+B;QAE/B,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,8DAiBC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport { CachingSubgraphProvider } from '../caching-subgraph-provider';\n\nimport { ICache } from './../cache';\nimport { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V2 pools, with functionality for caching the results.\n *\n * @export\n * @class CachingV2SubgraphProvider\n */\nexport class CachingV2SubgraphProvider\n extends CachingSubgraphProvider<V2SubgraphPool>\n implements IV2SubgraphProvider\n{\n /**\n * Creates an instance of CachingV2SubgraphProvider.\n * @param chainId The chain id to use.\n * @param subgraphProvider The provider to use to get the subgraph pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n chainId: ChainId,\n subgraphProvider: IV2SubgraphProvider,\n cache: ICache<V2SubgraphPool[]>\n ) {\n super(chainId, subgraphProvider, cache, Protocol.V2);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport retry, { Options as RetryOptions } from 'async-retry';\nimport _ from 'lodash';\n\nimport { IUniswapV2Pair__factory } from '../../types/v2/factories/IUniswapV2Pair__factory';\nimport {\n CurrencyAmount,\n ID_TO_NETWORK_NAME,\n metric,\n MetricLoggerUnit,\n} from '../../util';\nimport { log } from '../../util/log';\nimport { poolToString } from '../../util/routes';\nimport { IMulticallProvider, Result } from '../multicall-provider';\nimport { ProviderConfig } from '../provider';\nimport { ITokenPropertiesProvider } from '../token-properties-provider';\nimport { TokenValidationResult } from '../token-validator-provider';\n\ntype IReserves = {\n reserve0: BigNumber;\n reserve1: BigNumber;\n blockTimestampLast: number;\n};\n\n/**\n * Provider for getting V2 pools.\n *\n * @export\n * @interface IV2PoolProvider\n */\nexport interface IV2PoolProvider {\n /**\n * Gets the pools for the specified token pairs.\n *\n * @param tokenPairs The token pairs to get.\n * @param [providerConfig] The provider config.\n * @returns A pool accessor with methods for accessing the pools.\n */\n getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor>;\n\n /**\n * Gets the pool address for the specified token pair.\n *\n * @param tokenA Token A in the pool.\n * @param tokenB Token B in the pool.\n * @returns The pool address and the two tokens.\n */\n getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token };\n}\n\nexport type V2PoolAccessor = {\n getPool: (tokenA: Token, tokenB: Token) => Pair | undefined;\n getPoolByAddress: (address: string) => Pair | undefined;\n getAllPools: () => Pair[];\n};\n\nexport type V2PoolRetryOptions = RetryOptions;\n\nexport class V2PoolProvider implements IV2PoolProvider {\n // Computing pool addresses is slow as it requires hashing, encoding etc.\n // Addresses never change so can always be cached.\n private POOL_ADDRESS_CACHE: { [key: string]: string } = {};\n\n /**\n * Creates an instance of V2PoolProvider.\n * @param chainId The chain id to use.\n * @param multicall2Provider The multicall provider to use to get the pools.\n * @param tokenPropertiesProvider The token properties provider to use to get token properties.\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 tokenPropertiesProvider: ITokenPropertiesProvider,\n protected retryOptions: V2PoolRetryOptions = {\n retries: 2,\n minTimeout: 50,\n maxTimeout: 500,\n }\n ) {}\n\n public async getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor> {\n const poolAddressSet: Set<string> = new Set<string>();\n const sortedTokenPairs: Array<[Token, Token]> = [];\n const sortedPoolAddresses: string[] = [];\n\n for (const tokenPair of tokenPairs) {\n const [tokenA, tokenB] = tokenPair;\n\n const { poolAddress, token0, token1 } = this.getPoolAddress(\n tokenA,\n tokenB\n );\n\n if (poolAddressSet.has(poolAddress)) {\n continue;\n }\n\n poolAddressSet.add(poolAddress);\n sortedTokenPairs.push([token0, token1]);\n sortedPoolAddresses.push(poolAddress);\n }\n\n log.debug(\n `getPools called with ${tokenPairs.length} token pairs. Deduped down to ${poolAddressSet.size}`\n );\n\n metric.putMetric('V2_RPC_POOL_RPC_CALL', 1, MetricLoggerUnit.None);\n metric.putMetric(\n 'V2GetReservesBatchSize',\n sortedPoolAddresses.length,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `V2GetReservesBatchSize_${ID_TO_NETWORK_NAME(this.chainId)}`,\n sortedPoolAddresses.length,\n MetricLoggerUnit.Count\n );\n\n const [reservesResults, tokenPropertiesMap] = await Promise.all([\n (async () => {\n const beforeReserves = Date.now();\n const result = await this.getPoolsData<IReserves>(\n sortedPoolAddresses,\n 'getReserves',\n providerConfig\n );\n metric.putMetric(\n 'V2GetReservesLatency',\n Date.now() - beforeReserves,\n MetricLoggerUnit.Milliseconds\n );\n return result;\n })(),\n (async () => {\n const beforeTokenProperties = Date.now();\n const result = await this.tokenPropertiesProvider.getTokensProperties(\n this.flatten(tokenPairs),\n providerConfig\n );\n metric.putMetric(\n 'V2GetTokenPropertiesLatency',\n Date.now() - beforeTokenProperties,\n MetricLoggerUnit.Milliseconds\n );\n return result;\n })(),\n ]);\n\n log.info(\n `Got reserves for ${poolAddressSet.size} pools ${\n providerConfig?.blockNumber\n ? `as of block: ${await providerConfig?.blockNumber}.`\n : ``\n }`\n );\n\n const poolAddressToPool: { [poolAddress: string]: Pair } = {};\n\n const invalidPools: [Token, Token][] = [];\n\n for (let i = 0; i < sortedPoolAddresses.length; i++) {\n const reservesResult = reservesResults[i]!;\n\n if (!reservesResult?.success) {\n const [token0, token1] = sortedTokenPairs[i]!;\n invalidPools.push([token0, token1]);\n\n continue;\n }\n\n let [token0, token1] = sortedTokenPairs[i]!;\n if (\n tokenPropertiesMap[token0.address.toLowerCase()]\n ?.tokenValidationResult === TokenValidationResult.FOT\n ) {\n token0 = new Token(\n token0.chainId,\n token0.address,\n token0.decimals,\n token0.symbol,\n token0.name,\n true, // at this point we know it's valid token address\n tokenPropertiesMap[\n token0.address.toLowerCase()\n ]?.tokenFeeResult?.buyFeeBps,\n tokenPropertiesMap[\n token0.address.toLowerCase()\n ]?.tokenFeeResult?.sellFeeBps\n );\n }\n\n if (\n tokenPropertiesMap[token1.address.toLowerCase()]\n ?.tokenValidationResult === TokenValidationResult.FOT\n ) {\n token1 = new Token(\n token1.chainId,\n token1.address,\n token1.decimals,\n token1.symbol,\n token1.name,\n true, // at this point we know it's valid token address\n tokenPropertiesMap[\n token1.address.toLowerCase()\n ]?.tokenFeeResult?.buyFeeBps,\n tokenPropertiesMap[\n token1.address.toLowerCase()\n ]?.tokenFeeResult?.sellFeeBps\n );\n }\n\n const { reserve0, reserve1 } = reservesResult.result;\n\n const pool = new Pair(\n CurrencyAmount.fromRawAmount(token0, reserve0.toString()),\n CurrencyAmount.fromRawAmount(token1, reserve1.toString())\n );\n\n const poolAddress = sortedPoolAddresses[i]!;\n\n poolAddressToPool[poolAddress] = pool;\n }\n\n if (invalidPools.length > 0) {\n log.info(\n {\n invalidPools: _.map(\n invalidPools,\n ([token0, token1]) => `${token0.symbol}/${token1.symbol}`\n ),\n },\n `${invalidPools.length} pools invalid after checking their slot0 and liquidity results. Dropping.`\n );\n }\n\n const poolStrs = _.map(Object.values(poolAddressToPool), poolToString);\n\n log.debug({ poolStrs }, `Found ${poolStrs.length} valid pools`);\n\n return {\n getPool: (tokenA: Token, tokenB: Token): Pair | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB);\n return poolAddressToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pair | undefined =>\n poolAddressToPool[address],\n getAllPools: (): Pair[] => Object.values(poolAddressToPool),\n };\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token } {\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n\n const cacheKey = `${this.chainId}/${token0.address}/${token1.address}`;\n\n const cachedAddress = this.POOL_ADDRESS_CACHE[cacheKey];\n\n if (cachedAddress) {\n return { poolAddress: cachedAddress, token0, token1 };\n }\n\n const poolAddress = Pair.getAddress(token0, token1);\n\n this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;\n\n return { poolAddress, token0, token1 };\n }\n\n private async getPoolsData<TReturn>(\n poolAddresses: string[],\n functionName: string,\n providerConfig?: ProviderConfig\n ): Promise<Result<TReturn>[]> {\n const { results, blockNumber } = await retry(async () => {\n return this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n TReturn\n >({\n addresses: poolAddresses,\n contractInterface: IUniswapV2Pair__factory.createInterface(),\n functionName: functionName,\n providerConfig,\n });\n }, this.retryOptions);\n\n log.debug(`Pool data fetched as of block ${blockNumber}`);\n\n return results;\n }\n\n // We are using ES2017. ES2019 has native flatMap support\n private flatten(tokenPairs: Array<[Token, Token]>): Token[] {\n const tokens = new Array<Token>();\n\n for (const [tokenA, tokenB] of tokenPairs) {\n tokens.push(tokenA);\n tokens.push(tokenB);\n }\n\n return tokens;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"quote-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/quote-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { TradeType } from '@fewprotocol/sdk-core';\nimport {\n InsufficientInputAmountError,\n InsufficientReservesError,\n} from '@fewprotocol/uniswap-v2-sdk';\n\nimport { V2Route } from '../../routers/router';\nimport { CurrencyAmount } from '../../util/amounts';\nimport { log } from '../../util/log';\nimport { routeToString } from '../../util/routes';\nimport { ProviderConfig } from '../provider';\n\n// Quotes can be null (e.g. pool did not have enough liquidity).\nexport type V2AmountQuote = {\n amount: CurrencyAmount;\n quote: BigNumber | null;\n};\n\nexport type V2RouteWithQuotes = [V2Route, V2AmountQuote[]];\n\nexport interface IV2QuoteProvider {\n getQuotesManyExactIn(\n amountIns: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }>;\n\n getQuotesManyExactOut(\n amountOuts: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }>;\n}\n\n/**\n * Computes quotes for V2 off-chain. Quotes are computed using the balances\n * of the pools within each route provided.\n *\n * @export\n * @class V2QuoteProvider\n */\nexport class V2QuoteProvider implements IV2QuoteProvider {\n /* eslint-disable @typescript-eslint/no-empty-function */\n constructor() {}\n\n /* eslint-enable @typescript-eslint/no-empty-function */\n\n public async getQuotesManyExactIn(\n amountIns: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n return this.getQuotes(\n amountIns,\n routes,\n TradeType.EXACT_INPUT,\n providerConfig\n );\n }\n\n public async getQuotesManyExactOut(\n amountOuts: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n return this.getQuotes(\n amountOuts,\n routes,\n TradeType.EXACT_OUTPUT,\n providerConfig\n );\n }\n\n private async getQuotes(\n amounts: CurrencyAmount[],\n routes: V2Route[],\n tradeType: TradeType,\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n const routesWithQuotes: V2RouteWithQuotes[] = [];\n\n const debugStrs: string[] = [];\n for (const route of routes) {\n const amountQuotes: V2AmountQuote[] = [];\n\n let insufficientInputAmountErrorCount = 0;\n let insufficientReservesErrorCount = 0;\n for (const amount of amounts) {\n try {\n if (tradeType == TradeType.EXACT_INPUT) {\n let outputAmount = amount.wrapped;\n\n for (const pair of route.pairs) {\n [outputAmount] = pair.getOutputAmount(\n outputAmount,\n providerConfig.enableFeeOnTransferFeeFetching === true\n );\n }\n\n amountQuotes.push({\n amount,\n quote: BigNumber.from(outputAmount.quotient.toString()),\n });\n } else {\n let inputAmount = amount.wrapped;\n\n for (let i = route.pairs.length - 1; i >= 0; i--) {\n const pair = route.pairs[i]!;\n [inputAmount] = pair.getInputAmount(\n inputAmount,\n providerConfig.enableFeeOnTransferFeeFetching === true\n );\n }\n\n amountQuotes.push({\n amount,\n quote: BigNumber.from(inputAmount.quotient.toString()),\n });\n }\n } catch (err) {\n // Can fail to get quotes, e.g. throws InsufficientReservesError or InsufficientInputAmountError.\n if (err instanceof InsufficientInputAmountError) {\n insufficientInputAmountErrorCount =\n insufficientInputAmountErrorCount + 1;\n amountQuotes.push({ amount, quote: null });\n } else if (err instanceof InsufficientReservesError) {\n insufficientReservesErrorCount = insufficientReservesErrorCount + 1;\n amountQuotes.push({ amount, quote: null });\n } else {\n throw err;\n }\n }\n }\n\n if (\n insufficientInputAmountErrorCount > 0 ||\n insufficientReservesErrorCount > 0\n ) {\n debugStrs.push(\n `${[\n routeToString(route),\n ]} Input: ${insufficientInputAmountErrorCount} Reserves: ${insufficientReservesErrorCount} }`\n );\n }\n\n routesWithQuotes.push([route, amountQuotes]);\n }\n\n if (debugStrs.length > 0) {\n log.info({ debugStrs }, `Failed quotes for V2 routes`);\n }\n\n return {\n routesWithQuotes,\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/static-subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport _ from 'lodash';\n\nimport { FEW_WRAPPED_NATIVE_CURRENCY, WRAPPED_NATIVE_CURRENCY } from '../../util/chains';\nimport { log } from '../../util/log';\nimport {\n ARB_ARBITRUM,\n BTC_BNB,\n BUSD_BNB,\n CELO,\n CEUR_CELO,\n CUSD_CELO,\n DAI_ARBITRUM,\n DAI_AVAX,\n DAI_BNB,\n DAI_CELO,\n DAI_MAINNET,\n DAI_MOONBEAM,\n DAI_OPTIMISM,\n DAI_UNICHAIN,\n ETH_BNB,\n FEW_USDT_HYPER_MAINNET,\n OP_OPTIMISM,\n SUSD_STORY_ODYSSEY,\n USDB_BLAST,\n USDB_BLAST_SEPOLIA,\n USDCE_ZKSYNC,\n USDC_ARBITRUM,\n USDC_AVAX,\n USDC_BASE,\n USDC_BASE_SEPOLIA,\n USDC_BNB,\n USDC_MAINNET,\n USDC_MOONBEAM,\n USDC_NATIVE_ARBITRUM,\n USDC_OPTIMISM,\n USDC_POLYGON,\n USDC_SEPOLIA,\n USDC_SONEIUM,\n USDC_STORY_MAINNET,\n USDC_UNICHAIN,\n USDC_UNICHAIN_SEPOLIA,\n USDC_WORLDCHAIN,\n USDC_ZKSYNC,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n WBTC_ARBITRUM,\n WBTC_MAINNET,\n WBTC_MOONBEAM,\n WBTC_OPTIMISM,\n WBTC_WORLDCHAIN,\n WETH_POLYGON,\n WLD_WORLDCHAIN,\n WMATIC_POLYGON,\n WSTETH_MAINNET,\n} from '../token-provider';\n\nimport { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';\n\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Token[];\n};\n\nconst BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n [ChainId.HYPER_MAINNET]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.HYPER_MAINNET]!,\n FEW_USDT_HYPER_MAINNET,\n ],\n [ChainId.MAINNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]!,\n DAI_MAINNET,\n USDC_MAINNET,\n USDT_MAINNET,\n WBTC_MAINNET,\n WSTETH_MAINNET,\n ],\n [ChainId.GOERLI]: [WRAPPED_NATIVE_CURRENCY[ChainId.GOERLI]!],\n [ChainId.SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.SEPOLIA]!, USDC_SEPOLIA],\n //v2 not deployed on [arbitrum, polygon, celo, gnosis, moonbeam, bnb, avalanche] and their testnets\n [ChainId.OPTIMISM]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.OPTIMISM]!,\n USDC_OPTIMISM,\n DAI_OPTIMISM,\n USDT_OPTIMISM,\n WBTC_OPTIMISM,\n OP_OPTIMISM,\n ],\n [ChainId.ARBITRUM_ONE]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_ONE]!,\n WBTC_ARBITRUM,\n DAI_ARBITRUM,\n USDC_ARBITRUM,\n USDC_NATIVE_ARBITRUM,\n USDT_ARBITRUM,\n ARB_ARBITRUM,\n ],\n [ChainId.ARBITRUM_GOERLI]: [],\n [ChainId.ARBITRUM_SEPOLIA]: [],\n [ChainId.OPTIMISM_GOERLI]: [],\n [ChainId.OPTIMISM_SEPOLIA]: [],\n [ChainId.POLYGON]: [USDC_POLYGON, WETH_POLYGON, WMATIC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [],\n [ChainId.CELO]: [CELO, CUSD_CELO, CEUR_CELO, DAI_CELO],\n [ChainId.CELO_ALFAJORES]: [],\n [ChainId.GNOSIS]: [],\n [ChainId.MOONBEAM]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MOONBEAM],\n DAI_MOONBEAM,\n USDC_MOONBEAM,\n WBTC_MOONBEAM,\n ],\n [ChainId.BNB]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BNB],\n BUSD_BNB,\n DAI_BNB,\n USDC_BNB,\n USDT_BNB,\n BTC_BNB,\n ETH_BNB,\n ],\n [ChainId.AVALANCHE]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.AVALANCHE],\n USDC_AVAX,\n DAI_AVAX,\n ],\n [ChainId.BASE_GOERLI]: [],\n [ChainId.BASE]: [WRAPPED_NATIVE_CURRENCY[ChainId.BASE], USDC_BASE],\n [ChainId.ZORA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA]!],\n [ChainId.ZORA_SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA_SEPOLIA]!],\n [ChainId.ROOTSTOCK]: [WRAPPED_NATIVE_CURRENCY[ChainId.ROOTSTOCK]!],\n [ChainId.BLAST]: [WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!, USDB_BLAST],\n [ChainId.ZKSYNC]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC]!,\n USDCE_ZKSYNC,\n USDC_ZKSYNC,\n ],\n [ChainId.WORLDCHAIN]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!,\n USDC_WORLDCHAIN,\n WLD_WORLDCHAIN,\n WBTC_WORLDCHAIN,\n ],\n [ChainId.UNICHAIN_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA]!,\n USDC_UNICHAIN_SEPOLIA,\n ],\n [ChainId.UNICHAIN]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!,\n DAI_UNICHAIN,\n USDC_UNICHAIN,\n ],\n [ChainId.MONAD_TESTNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MONAD_TESTNET]!,\n USDT_MONAD_TESTNET,\n ],\n [ChainId.BASE_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BASE_SEPOLIA]!,\n USDC_BASE_SEPOLIA,\n ],\n [ChainId.SONEIUM]: [WRAPPED_NATIVE_CURRENCY[ChainId.SONEIUM]!, USDC_SONEIUM],\n // networks exclusive to ring swap\n [ChainId.BLAST_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BLAST_SEPOLIA]!,\n USDB_BLAST_SEPOLIA,\n ],\n [ChainId.STORY_ODYSSEY]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_ODYSSEY]!,\n SUSD_STORY_ODYSSEY,\n ],\n [ChainId.STORY_MAINNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_MAINNET]!,\n USDC_STORY_MAINNET,\n ],\n};\n\n/**\n * Provider that does not get data from an external source and instead returns\n * a hardcoded list of Subgraph pools.\n *\n * Since the pools are hardcoded, the liquidity/price values are dummys and should not\n * be depended on.\n *\n * Useful for instances where other data sources are unavailable. E.g. subgraph not available.\n *\n * @export\n * @class StaticV2SubgraphProvider\n */\nexport class StaticV2SubgraphProvider implements IV2SubgraphProvider {\n constructor(private chainId: ChainId) { }\n\n public async getPools(\n tokenIn?: Token,\n tokenOut?: Token\n ): Promise<V2SubgraphPool[]> {\n log.info('In static subgraph provider for V2');\n const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];\n\n const basePairs: [Token, Token][] = _.flatMap(\n bases,\n (base): [Token, Token][] => bases.map((otherBase) => [base, otherBase])\n );\n\n if (tokenIn && tokenOut) {\n basePairs.push(\n [tokenIn, tokenOut],\n ...bases.map((base): [Token, Token] => [tokenIn, base]),\n ...bases.map((base): [Token, Token] => [tokenOut, base])\n );\n }\n\n const pairs: [Token, Token][] = _(basePairs)\n .filter((tokens): tokens is [Token, Token] =>\n Boolean(tokens[0] && tokens[1])\n )\n .filter(\n ([tokenA, tokenB]) =>\n tokenA.address !== tokenB.address && !tokenA.equals(tokenB)\n )\n .value();\n\n const poolAddressSet = new Set<string>();\n\n const subgraphPools: V2SubgraphPool[] = _(pairs)\n .map(([tokenA, tokenB]) => {\n const poolAddress = Pair.getAddress(tokenA, tokenB);\n\n if (poolAddressSet.has(poolAddress)) {\n return undefined;\n }\n poolAddressSet.add(poolAddress);\n\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n\n return {\n id: poolAddress,\n liquidity: '100',\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n supply: 100,\n reserve: 100,\n reserveUSD: 100,\n };\n })\n .compact()\n .value();\n\n return subgraphPools;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider-with-fallback.js","sourceRoot":"","sources":["../../../../src/providers/v2/subgraph-provider-with-fallback.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AACnD,wFAAmF;AAGnF;;;;;;GAMG;AACH,MAAa,+BACX,SAAQ,+DAA6C;IAGrD;;;OAGG;IACH,YAAY,SAAgC;QAC1C,KAAK,CAAC,SAAS,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;CACF;AAXD,0EAWC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { SubgraphProviderWithFallBacks } from '../subgraph-provider-with-fallback';\nimport { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V2 subgraph pools that falls back to a different provider\n * in the event of failure.\n *\n * @export\n * @class V2SubgraphProviderWithFallBacks\n */\nexport class V2SubgraphProviderWithFallBacks\n extends SubgraphProviderWithFallBacks<V2SubgraphPool>\n implements IV2SubgraphProvider\n{\n /**\n * Creates an instance of V2SubgraphProviderWithFallBacks.\n * @param fallbacks Ordered list of `IV2SubgraphProvider` to try to get pools from.\n */\n constructor(fallbacks: IV2SubgraphProvider[]) {\n super(fallbacks, Protocol.V2);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, 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 { log } from '../../util/log';\nimport { metric } from '../../util/metric';\nimport { ProviderConfig } from '../provider';\n\nexport interface V2SubgraphPool {\n id: string;\n token0: {\n id: string;\n };\n token1: {\n id: string;\n };\n supply: number;\n reserve: number;\n reserveUSD: number;\n}\n\ntype RawV2SubgraphPool = {\n id: string;\n token0: {\n symbol: string;\n id: string;\n };\n token1: {\n symbol: string;\n id: string;\n };\n totalSupply: string;\n trackedReserveETH: string;\n reserveUSD: string;\n};\n\nconst SUBGRAPH_URL_BY_CHAIN: { [chainId in ChainId]?: string } = {\n [ChainId.MAINNET]:\n 'https://api.thegraph.com/subgraphs/name/ianlapham/uniswap-v2-dev',\n};\n\nconst PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.\n\n/**\n * Provider for getting V2 pools from the Subgraph\n *\n * @export\n * @interface IV2SubgraphProvider\n */\nexport interface IV2SubgraphProvider {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<V2SubgraphPool[]>;\n}\n\nexport class V2SubgraphProvider implements IV2SubgraphProvider {\n private client: GraphQLClient;\n\n constructor(\n private chainId: ChainId,\n private retries = 2,\n private timeout = 360000,\n private rollback = true,\n private pageSize = PAGE_SIZE,\n private trackedEthThreshold = 0.025,\n private untrackedUsdThreshold = Number.MAX_VALUE,\n private subgraphUrlOverride?: string\n ) {\n const subgraphUrl =\n this.subgraphUrlOverride ?? SUBGRAPH_URL_BY_CHAIN[this.chainId];\n if (!subgraphUrl) {\n throw new Error(`No subgraph url for chain id: ${this.chainId}`);\n }\n this.client = new GraphQLClient(subgraphUrl);\n }\n\n public async getPools(\n _tokenIn?: Token,\n _tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<V2SubgraphPool[]> {\n const beforeAll = Date.now();\n let blockNumber = providerConfig?.blockNumber\n ? await providerConfig.blockNumber\n : undefined;\n // Due to limitations with the Subgraph API this is the only way to parameterize the query.\n const query2 = gql`\n query getPools($pageSize: Int!, $id: String) {\n pairs(\n first: $pageSize\n ${blockNumber ? `block: { number: ${blockNumber} }` : ``}\n where: { id_gt: $id }\n ) {\n id\n token0 { id, symbol }\n token1 { id, symbol }\n totalSupply\n trackedReserveETH\n reserveETH\n reserveUSD\n }\n }\n `;\n\n let pools: RawV2SubgraphPool[] = [];\n\n log.info(\n `Getting V2 pools from the subgraph with page size ${this.pageSize}${\n providerConfig?.blockNumber\n ? ` as of block ${providerConfig?.blockNumber}`\n : ''\n }.`\n );\n\n let outerRetries = 0;\n await retry(\n async () => {\n const timeout = new Timeout();\n\n const getPools = async (): Promise<RawV2SubgraphPool[]> => {\n let lastId = '';\n let pairs: RawV2SubgraphPool[] = [];\n let pairsPage: RawV2SubgraphPool[] = [];\n\n // metrics variables\n let totalPages = 0;\n let retries = 0;\n\n do {\n totalPages += 1;\n\n await retry(\n async () => {\n const before = Date.now();\n const poolsResult = await this.client.request<{\n pairs: RawV2SubgraphPool[];\n }>(query2, {\n pageSize: this.pageSize,\n id: lastId,\n });\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.paginate.latency`,\n Date.now() - before\n );\n\n pairsPage = poolsResult.pairs;\n\n pairs = pairs.concat(pairsPage);\n lastId = pairs[pairs.length - 1]!.id;\n\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.paginate.pageSize`,\n pairsPage.length\n );\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n pools = [];\n retries += 1;\n log.error(\n { err, lastId },\n `Failed request for page of pools from subgraph. Retry attempt: ${retry}. LastId: ${lastId}`\n );\n },\n }\n );\n } while (pairsPage.length > 0);\n\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.paginate`,\n totalPages\n );\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.pairs.length`,\n pairs.length\n );\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.paginate.retries`,\n retries\n );\n\n return pairs;\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 V2 Subgraph Pools.');\n throw err;\n } finally {\n timeout.clear();\n }\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n outerRetries += 1;\n if (\n this.rollback &&\n blockNumber &&\n _.includes(err.message, 'indexed up to')\n ) {\n metric.putMetric(\n `V2SubgraphProvider.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 `V2SubgraphProvider.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 `V2SubgraphProvider.chain_${this.chainId}.getPools.retries`,\n outerRetries\n );\n\n // Filter pools that have tracked reserve ETH less than threshold.\n // trackedReserveETH filters pools that do not involve a pool from this allowlist:\n // https://github.com/Uniswap/v2-subgraph/blob/7c82235cad7aee4cfce8ea82f0030af3d224833e/src/mappings/pricing.ts#L43\n // Which helps filter pools with manipulated prices/liquidity.\n\n // TODO: Remove. Temporary fix to ensure tokens without trackedReserveETH are in the list.\n const FEI = '0x956f47f50a910163d8bf957cf5846d573e7f87ca';\n\n const tracked = pools.filter(\n (pool) =>\n pool.token0.id == FEI ||\n pool.token1.id == FEI ||\n this.isVirtualPairBaseV2Pool(pool) ||\n parseFloat(pool.trackedReserveETH) > this.trackedEthThreshold\n );\n\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.filter.length`,\n tracked.length\n );\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.filter.percent`,\n (tracked.length / pools.length) * 100\n );\n\n const beforeFilter = Date.now();\n const poolsSanitized: V2SubgraphPool[] = pools\n .filter((pool) => {\n return (\n pool.token0.id == FEI ||\n pool.token1.id == FEI ||\n this.isVirtualPairBaseV2Pool(pool) ||\n parseFloat(pool.trackedReserveETH) > this.trackedEthThreshold ||\n parseFloat(pool.reserveUSD) > this.untrackedUsdThreshold\n );\n })\n .map((pool) => {\n return {\n id: pool.id.toLowerCase(),\n token0: {\n id: pool.token0.id.toLowerCase(),\n },\n token1: {\n id: pool.token1.id.toLowerCase(),\n },\n supply: parseFloat(pool.totalSupply),\n reserve: parseFloat(pool.trackedReserveETH),\n reserveUSD: parseFloat(pool.reserveUSD),\n };\n });\n\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.filter.latency`,\n Date.now() - beforeFilter\n );\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.untracked.length`,\n poolsSanitized.length\n );\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.untracked.percent`,\n (poolsSanitized.length / pools.length) * 100\n );\n metric.putMetric(`V2SubgraphProvider.chain_${this.chainId}.getPools`, 1);\n metric.putMetric(\n `V2SubgraphProvider.chain_${this.chainId}.getPools.latency`,\n Date.now() - beforeAll\n );\n\n log.info(\n `Got ${pools.length} V2 pools from the subgraph. ${poolsSanitized.length} after filtering`\n );\n\n return poolsSanitized;\n }\n\n // This method checks if a given pool contains the VIRTUAL token.\n public isVirtualPairBaseV2Pool(pool: RawV2SubgraphPool): boolean {\n const virtualTokenAddress =\n '0x0b3e328455c4059eeb9e3f84b5543f74e24e7e1b'.toLowerCase();\n return (\n this.chainId === ChainId.BASE &&\n (pool.token0.id.toLowerCase() === virtualTokenAddress ||\n pool.token1.id.toLowerCase() === virtualTokenAddress)\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uri-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/uri-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,oEAA+D;AAI/D,MAAa,qBACX,SAAQ,2CAAmC;CACV;AAFnC,sDAEmC","sourcesContent":["import { URISubgraphProvider } from '../uri-subgraph-provider';\n\nimport { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';\n\nexport class V2URISubgraphProvider\n extends URISubgraphProvider<V2SubgraphPool>\n implements IV2SubgraphProvider {}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/caching-pool-provider.ts"],"names":[],"mappings":";;;;;;AAEA,oDAAuB;AAEvB,qCAAsD;AACtD,wCAAqC;AAMrC;;;;;;;GAOG;AACH,MAAa,qBAAqB;IAUhC;;;;;OAKG;IACH,YACY,OAAgB,EAChB,YAA6B,EAC/B,KAAmB;QAFjB,YAAO,GAAP,OAAO,CAAS;QAChB,iBAAY,GAAZ,YAAY,CAAiB;QAC/B,UAAK,GAAL,KAAK,CAAc;QAlBrB,aAAQ,GAAG,CACjB,OAAgB,EAChB,OAAe,EACf,WAAoB,EACpB,EAAE,CACF,WAAW;YACT,CAAC,CAAC,QAAQ,OAAO,IAAI,OAAO,IAAI,WAAW,EAAE;YAC7C,CAAC,CAAC,QAAQ,OAAO,IAAI,OAAO,EAAE,CAAC;IAYhC,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,UAAuC,EACvC,cAA+B;QAE/B,MAAM,cAAc,GAAgB,IAAI,GAAG,EAAU,CAAC;QACtD,MAAM,oBAAoB,GAAqC,EAAE,CAAC;QAClE,MAAM,mBAAmB,GAAa,EAAE,CAAC;QACzC,MAAM,iBAAiB,GAAoC,EAAE,CAAC;QAC9D,MAAM,WAAW,GAAG,MAAM,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,CAAA,CAAC;QAEtD,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,IAAI,UAAU,EAAE;YACpD,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CACzD,MAAM,EACN,MAAM,EACN,SAAS,CACV,CAAC;YAEF,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBACnC,SAAS;aACV;YAED,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAEhC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,WAAW,EAAE,WAAW,CAAC,CACtD,CAAC;YACF,IAAI,UAAU,EAAE;gBACd,aAAM,CAAC,SAAS,CACd,wCAAwC,EACxC,CAAC,EACD,uBAAgB,CAAC,IAAI,CACtB,CAAC;gBACF,iBAAiB,CAAC,WAAW,CAAC,GAAG,UAAU,CAAC;gBAC5C,SAAS;aACV;YAED,aAAM,CAAC,SAAS,CACd,6CAA6C,EAC7C,CAAC,EACD,uBAAgB,CAAC,IAAI,CACtB,CAAC;YACF,oBAAoB,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC;YACvD,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;SACvC;QAED,SAAG,CAAC,IAAI,CACN;YACE,UAAU,EAAE,gBAAC,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAChC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CACxD;YACD,oBAAoB,EAAE,gBAAC,CAAC,GAAG,CACzB,oBAAoB,EACpB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAC/C;SACF,EACD,SACE,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MACjC,2EACE,oBAAoB,CAAC,MACvB,SAAS,CACV,CAAC;QAEF,IAAI,mBAAmB,CAAC,MAAM,GAAG,CAAC,EAAE;YAClC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CACnD,oBAAoB,EACpB,cAAc,CACf,CAAC;YACF,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE;gBACzC,MAAM,IAAI,GAAG,YAAY,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACpD,IAAI,IAAI,EAAE;oBACR,iBAAiB,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBAClC,iFAAiF;oBACjF,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EACjD,IAAI,CACL,CAAC;iBACH;aACF;SACF;QAED,OAAO;YACL,OAAO,EAAE,CACP,MAAa,EACb,MAAa,EACb,SAAoB,EACF,EAAE;gBACpB,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;gBACvE,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACxC,CAAC;YACD,gBAAgB,EAAE,CAAC,OAAe,EAAoB,EAAE,CACtD,iBAAiB,CAAC,OAAO,CAAC;YAC5B,WAAW,EAAE,GAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC;SAC5D,CAAC;IACJ,CAAC;IAEM,cAAc,CACnB,MAAa,EACb,MAAa,EACb,SAAoB;QAEpB,OAAO,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACrE,CAAC;CACF;AA7HD,sDA6HC","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { FeeAmount, Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport _ from 'lodash';\n\nimport { metric, MetricLoggerUnit } from '../../util';\nimport { log } from '../../util/log';\n\nimport { ICache } from './../cache';\nimport { ProviderConfig } from './../provider';\nimport { IV3PoolProvider, V3PoolAccessor } from './pool-provider';\n\n/**\n * Provider for getting V3 pools, with functionality for caching the results.\n * Does not cache by block because we compute quotes using the on-chain quoter\n * so do not mind if the liquidity values are out of date.\n *\n * @export\n * @class CachingV3PoolProvider\n */\nexport class CachingV3PoolProvider implements IV3PoolProvider {\n private POOL_KEY = (\n chainId: ChainId,\n address: string,\n blockNumber?: number\n ) =>\n blockNumber\n ? `pool-${chainId}-${address}-${blockNumber}`\n : `pool-${chainId}-${address}`;\n\n /**\n * Creates an instance of CachingV3PoolProvider.\n * @param chainId The chain id to use.\n * @param poolProvider The provider to use to get the pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n protected chainId: ChainId,\n protected poolProvider: IV3PoolProvider,\n private cache: ICache<Pool>\n ) {}\n\n public async getPools(\n tokenPairs: [Token, Token, FeeAmount][],\n providerConfig?: ProviderConfig\n ): Promise<V3PoolAccessor> {\n const poolAddressSet: Set<string> = new Set<string>();\n const poolsToGetTokenPairs: Array<[Token, Token, FeeAmount]> = [];\n const poolsToGetAddresses: string[] = [];\n const poolAddressToPool: { [poolAddress: string]: Pool } = {};\n const blockNumber = await providerConfig?.blockNumber;\n\n for (const [tokenA, tokenB, feeAmount] of tokenPairs) {\n const { poolAddress, token0, token1 } = this.getPoolAddress(\n tokenA,\n tokenB,\n feeAmount\n );\n\n if (poolAddressSet.has(poolAddress)) {\n continue;\n }\n\n poolAddressSet.add(poolAddress);\n\n const cachedPool = await this.cache.get(\n this.POOL_KEY(this.chainId, poolAddress, blockNumber)\n );\n if (cachedPool) {\n metric.putMetric(\n 'V3_INMEMORY_CACHING_POOL_HIT_IN_MEMORY',\n 1,\n MetricLoggerUnit.None\n );\n poolAddressToPool[poolAddress] = cachedPool;\n continue;\n }\n\n metric.putMetric(\n 'V3_INMEMORY_CACHING_POOL_MISS_NOT_IN_MEMORY',\n 1,\n MetricLoggerUnit.None\n );\n poolsToGetTokenPairs.push([token0, token1, feeAmount]);\n poolsToGetAddresses.push(poolAddress);\n }\n\n log.info(\n {\n poolsFound: _.map(\n Object.values(poolAddressToPool),\n (p) => `${p.token0.symbol} ${p.token1.symbol} ${p.fee}`\n ),\n poolsToGetTokenPairs: _.map(\n poolsToGetTokenPairs,\n (t) => `${t[0].symbol} ${t[1].symbol} ${t[2]}`\n ),\n },\n `Found ${\n Object.keys(poolAddressToPool).length\n } V3 pools already in local cache. About to get liquidity and slot0s for ${\n poolsToGetTokenPairs.length\n } pools.`\n );\n\n if (poolsToGetAddresses.length > 0) {\n const poolAccessor = await this.poolProvider.getPools(\n poolsToGetTokenPairs,\n providerConfig\n );\n for (const address of poolsToGetAddresses) {\n const pool = poolAccessor.getPoolByAddress(address);\n if (pool) {\n poolAddressToPool[address] = pool;\n // We don't want to wait for this caching to complete before returning the pools.\n this.cache.set(\n this.POOL_KEY(this.chainId, address, blockNumber),\n pool\n );\n }\n }\n }\n\n return {\n getPool: (\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ): Pool | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB, feeAmount);\n return poolAddressToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pool | undefined =>\n poolAddressToPool[address],\n getAllPools: (): Pool[] => Object.values(poolAddressToPool),\n };\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ): { poolAddress: string; token0: Token; token1: Token } {\n return this.poolProvider.getPoolAddress(tokenA, tokenB, feeAmount);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/caching-subgraph-provider.ts"],"names":[],"mappings":";;;AAEA,wDAAmD;AACnD,4EAAuE;AAIvE;;;;;GAKG;AACH,MAAa,yBACX,SAAQ,mDAAuC;IAG/C;;;;;OAKG;IACH,YACE,OAAgB,EAChB,gBAAqC,EACrC,KAA+B;QAE/B,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,8DAiBC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\n\nimport { Protocol } from '@fewprotocol/router-sdk';\nimport { CachingSubgraphProvider } from '../caching-subgraph-provider';\nimport { ICache } from './../cache';\nimport { IV3SubgraphProvider, V3SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V3 pools, with functionality for caching the results.\n *\n * @export\n * @class CachingV3SubgraphProvider\n */\nexport class CachingV3SubgraphProvider\n extends CachingSubgraphProvider<V3SubgraphPool>\n implements IV3SubgraphProvider\n{\n /**\n * Creates an instance of CachingV3SubgraphProvider.\n * @param chainId The chain id to use.\n * @param subgraphProvider The provider to use to get the subgraph pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n chainId: ChainId,\n subgraphProvider: IV3SubgraphProvider,\n cache: ICache<V3SubgraphPool[]>\n ) {\n super(chainId, subgraphProvider, cache, Protocol.V3);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gas-data-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/gas-data-provider.ts"],"names":[],"mappings":";;;AAIA,mGAAgG;AAChG,qCAAiD;AA4BjD,MAAa,uBAAuB;IAMlC,YACY,OAAgB,EAChB,QAAsB,EAChC,cAAuB;QAFb,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAc;QAGhC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,0BAAmB,CAAC;IAC9E,CAAC;IAEM,KAAK,CAAC,UAAU,CAAC,cAA+B;QACrD,MAAM,eAAe,GAAG,mDAAwB,CAAC,OAAO,CACtD,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,cAAc,CAAC;YACnD,QAAQ,EAAE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW;SACtC,CAAC,CAAC;QACH,MAAM,iBAAiB,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO;YACL,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;YACtB,gBAAgB,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3C,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC;SAC3B,CAAC;IACJ,CAAC;CACF;AA7BD,0DA6BC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport { GasDataArbitrum__factory } from '../../types/other/factories/GasDataArbitrum__factory';\nimport { ARB_GASINFO_ADDRESS } from '../../util';\nimport { ProviderConfig } from '../provider';\n\n/**\n * Provider for getting gas constants on L2s.\n *\n * @export\n * @interface IL2GasDataProvider\n */\nexport interface IL2GasDataProvider<T> {\n /**\n * Gets the data constants needed to calculate the l1 security fee on L2s like arbitrum and optimism.\n * @returns An object that includes the data necessary for the off chain estimations.\n */\n getGasData(providerConfig?: ProviderConfig): Promise<T>;\n}\n\n/**\n * perL2TxFee is the base fee in wei for an l2 transaction.\n * perL2CalldataFee is the fee in wei per byte of calldata the swap uses. Multiply by the total bytes of the calldata.\n * perArbGasTotal is the fee in wei per unit of arbgas. Multiply this by the estimate we calculate based on ticks/hops in the gasModel.\n */\nexport type ArbitrumGasData = {\n perL2TxFee: BigNumber;\n perL1CalldataFee: BigNumber;\n perArbGasTotal: BigNumber;\n};\n\nexport class ArbitrumGasDataProvider\n implements IL2GasDataProvider<ArbitrumGasData>\n{\n protected gasFeesAddress: string;\n protected blockNumberOverride: number | Promise<number> | undefined;\n\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n gasDataAddress?: string\n ) {\n this.gasFeesAddress = gasDataAddress ? gasDataAddress : ARB_GASINFO_ADDRESS;\n }\n\n public async getGasData(providerConfig?: ProviderConfig) {\n const gasDataContract = GasDataArbitrum__factory.connect(\n this.gasFeesAddress,\n this.provider\n );\n const gasData = await gasDataContract.getPricesInWei({\n blockTag: providerConfig?.blockNumber,\n });\n const perL1CalldataByte = gasData[1];\n return {\n perL2TxFee: gasData[0],\n perL1CalldataFee: perL1CalldataByte.div(16),\n perArbGasTotal: gasData[5],\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { computePoolAddress, FeeAmount, Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport retry, { Options as RetryOptions } from 'async-retry';\n\nimport { IUniswapV3PoolState__factory } from '../../types/v3/factories/IUniswapV3PoolState__factory';\nimport { V3_CORE_FACTORY_ADDRESSES } from '../../util/addresses';\nimport { log } from '../../util/log';\nimport { IMulticallProvider, Result } from '../multicall-provider';\nimport { ILiquidity, ISlot0, PoolProvider } from '../pool-provider';\nimport { ProviderConfig } from '../provider';\n\ntype V3ISlot0 = ISlot0 & {\n sqrtPriceX96: BigNumber;\n tick: number;\n};\n\ntype V3ILiquidity = ILiquidity;\n\n/**\n * Provider or getting V3 pools.\n *\n * @export\n * @interface IV3PoolProvider\n */\nexport interface IV3PoolProvider {\n /**\n * Gets the specified pools.\n *\n * @param tokenPairs The token pairs and fee amount of the pools to get.\n * @param [providerConfig] The provider config.\n * @returns A pool accessor with methods for accessing the pools.\n */\n getPools(\n tokenPairs: [Token, Token, FeeAmount][],\n providerConfig?: ProviderConfig\n ): Promise<V3PoolAccessor>;\n\n /**\n * Gets the pool address for the specified token pair and fee tier.\n *\n * @param tokenA Token A in the pool.\n * @param tokenB Token B in the pool.\n * @param feeAmount The fee amount of the pool.\n * @returns The pool address and the two tokens.\n */\n getPoolAddress(\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ): { poolAddress: string; token0: Token; token1: Token };\n}\n\nexport type V3PoolAccessor = {\n getPool: (\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ) => Pool | undefined;\n getPoolByAddress: (address: string) => Pool | undefined;\n getAllPools: () => Pool[];\n};\n\nexport type V3PoolRetryOptions = RetryOptions;\nexport type V3PoolConstruct = [Token, Token, FeeAmount];\n\nexport class V3PoolProvider\n extends PoolProvider<\n Token,\n V3PoolConstruct,\n V3ISlot0,\n V3ILiquidity,\n V3PoolAccessor\n >\n implements IV3PoolProvider\n{\n // Computing pool addresses is slow as it requires hashing, encoding etc.\n // Addresses never change so can always be cached.\n private POOL_ADDRESS_CACHE: { [key: string]: string } = {};\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 chainId: ChainId,\n multicall2Provider: IMulticallProvider,\n retryOptions: V3PoolRetryOptions = {\n retries: 2,\n minTimeout: 50,\n maxTimeout: 500,\n }\n ) {\n super(chainId, multicall2Provider, retryOptions);\n }\n\n public async getPools(\n tokenPairs: V3PoolConstruct[],\n providerConfig?: ProviderConfig\n ): Promise<V3PoolAccessor> {\n return await super.getPoolsInternal(tokenPairs, providerConfig);\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ): { poolAddress: string; token0: Token; token1: Token } {\n const { poolIdentifier, currency0, currency1 } = this.getPoolIdentifier([\n tokenA,\n tokenB,\n feeAmount,\n ]);\n return {\n poolAddress: poolIdentifier,\n token0: currency0,\n token1: currency1,\n };\n }\n\n protected override getLiquidityFunctionName(): string {\n return 'liquidity';\n }\n\n protected override getSlot0FunctionName(): string {\n return 'slot0';\n }\n\n protected override async getPoolsData<TReturn>(\n poolAddresses: string[],\n functionName: string,\n providerConfig?: ProviderConfig\n ): Promise<Result<TReturn>[]> {\n const { results, blockNumber } = await retry(async () => {\n return this.multicall2Provider.callSameFunctionOnMultipleContracts<\n any,\n TReturn\n >({\n addresses: poolAddresses,\n contractInterface: IUniswapV3PoolState__factory.createInterface(),\n functionName: functionName,\n providerConfig,\n });\n }, this.retryOptions);\n\n log.debug(`Pool data fetched as of block ${blockNumber}`);\n\n return results;\n }\n\n protected override getPoolIdentifier(pool: V3PoolConstruct): {\n poolIdentifier: string;\n currency0: Token;\n currency1: Token;\n } {\n const [tokenA, tokenB, feeAmount] = pool;\n\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n\n const cacheKey = `${this.chainId}/${token0.address}/${token1.address}/${feeAmount}`;\n\n const cachedAddress = this.POOL_ADDRESS_CACHE[cacheKey];\n\n if (cachedAddress) {\n return {\n poolIdentifier: cachedAddress,\n currency0: token0,\n currency1: token1,\n };\n }\n\n const poolAddress = computePoolAddress({\n factoryAddress: V3_CORE_FACTORY_ADDRESSES[this.chainId]!,\n tokenA: token0,\n tokenB: token1,\n fee: feeAmount,\n initCodeHashManualOverride: undefined,\n chainId: this.chainId,\n });\n\n this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;\n\n return {\n poolIdentifier: poolAddress,\n currency0: token0,\n currency1: token1,\n };\n }\n\n protected instantiatePool(\n pool: V3PoolConstruct,\n slot0: V3ISlot0,\n liquidity: V3ILiquidity\n ): Pool {\n const [token0, token1, feeAmount] = pool;\n\n return new Pool(\n token0,\n token1,\n feeAmount,\n slot0.sqrtPriceX96.toString(),\n liquidity.toString(),\n slot0.tick\n );\n }\n\n protected instantiatePoolAccessor(poolIdentifierToPool: {\n [p: string]: Pool;\n }): V3PoolAccessor {\n return {\n getPool: (\n tokenA: Token,\n tokenB: Token,\n feeAmount: FeeAmount\n ): Pool | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB, feeAmount);\n return poolIdentifierToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pool | undefined =>\n poolIdentifierToPool[address],\n getAllPools: (): Pool[] => Object.values(poolIdentifierToPool),\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/static-subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/no-non-null-assertion */\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { FeeAmount, Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport JSBI from 'jsbi';\nimport _ from 'lodash';\n\nimport { unparseFeeAmount } from '../../util/amounts';\nimport { FEW_WRAPPED_NATIVE_CURRENCY, WRAPPED_NATIVE_CURRENCY } from '../../util/chains';\nimport { log } from '../../util/log';\nimport { ProviderConfig } from '../provider';\nimport {\n ARB_ARBITRUM,\n BTC_BNB,\n BUSD_BNB,\n CELO,\n CELO_ALFAJORES,\n CEUR_CELO,\n CEUR_CELO_ALFAJORES,\n CUSD_CELO,\n CUSD_CELO_ALFAJORES,\n DAI_ARBITRUM,\n DAI_AVAX,\n DAI_BNB,\n DAI_CELO,\n DAI_CELO_ALFAJORES,\n DAI_GOERLI,\n DAI_MAINNET,\n DAI_MOONBEAM,\n DAI_OPTIMISM,\n DAI_OPTIMISM_GOERLI,\n DAI_POLYGON_MUMBAI,\n DAI_UNICHAIN,\n ETH_BNB,\n FEW_USDT_HYPER_MAINNET,\n OP_OPTIMISM,\n SUSD_STORY_ODYSSEY,\n USDB_BLAST,\n USDB_BLAST_SEPOLIA,\n USDCE_ZKSYNC,\n USDC_ARBITRUM,\n USDC_ARBITRUM_GOERLI,\n USDC_AVAX,\n USDC_BASE,\n USDC_BASE_SEPOLIA,\n USDC_BNB,\n USDC_ETHEREUM_GNOSIS,\n USDC_GOERLI,\n USDC_MAINNET,\n USDC_MOONBEAM,\n USDC_OPTIMISM,\n USDC_OPTIMISM_GOERLI,\n USDC_POLYGON,\n USDC_SEPOLIA,\n USDC_SONEIUM,\n USDC_STORY_MAINNET,\n USDC_UNICHAIN,\n USDC_UNICHAIN_SEPOLIA,\n USDC_WORLDCHAIN,\n USDC_ZKSYNC,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_GOERLI,\n USDT_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n USDT_OPTIMISM_GOERLI,\n WBTC_ARBITRUM,\n WBTC_GNOSIS,\n WBTC_GOERLI,\n WBTC_MAINNET,\n WBTC_MOONBEAM,\n WBTC_OPTIMISM,\n WBTC_OPTIMISM_GOERLI,\n WBTC_WORLDCHAIN,\n WETH_POLYGON,\n WLD_WORLDCHAIN,\n WMATIC_POLYGON,\n WMATIC_POLYGON_MUMBAI,\n WSTETH_MAINNET,\n WXDAI_GNOSIS,\n} from '../token-provider';\n\nimport { IV3PoolProvider } from './pool-provider';\nimport { IV3SubgraphProvider, V3SubgraphPool } from './subgraph-provider';\n\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Token[];\n};\n\nconst BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n [ChainId.HYPER_MAINNET]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.HYPER_MAINNET]!,\n FEW_USDT_HYPER_MAINNET,\n ],\n [ChainId.MAINNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]!,\n DAI_MAINNET,\n USDC_MAINNET,\n USDT_MAINNET,\n WBTC_MAINNET,\n WSTETH_MAINNET,\n ],\n [ChainId.GOERLI]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.GOERLI]!,\n USDT_GOERLI,\n USDC_GOERLI,\n WBTC_GOERLI,\n DAI_GOERLI,\n ],\n [ChainId.SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.SEPOLIA]!, USDC_SEPOLIA],\n [ChainId.OPTIMISM]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.OPTIMISM]!,\n USDC_OPTIMISM,\n DAI_OPTIMISM,\n USDT_OPTIMISM,\n WBTC_OPTIMISM,\n OP_OPTIMISM,\n ],\n // todo: once subgraph is created\n [ChainId.OPTIMISM_SEPOLIA]: [\n // WRAPPED_NATIVE_CURRENCY[ChainId.OPTIMISM_SEPOLIA]!,\n ],\n [ChainId.ARBITRUM_ONE]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_ONE]!,\n WBTC_ARBITRUM,\n DAI_ARBITRUM,\n USDC_ARBITRUM,\n USDT_ARBITRUM,\n ARB_ARBITRUM,\n ],\n [ChainId.ARBITRUM_GOERLI]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_GOERLI]!,\n USDC_ARBITRUM_GOERLI,\n ],\n [ChainId.ARBITRUM_SEPOLIA]: [\n // WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_SEPOLIA]!,\n ],\n [ChainId.OPTIMISM_GOERLI]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.OPTIMISM_GOERLI]!,\n USDC_OPTIMISM_GOERLI,\n DAI_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n WBTC_OPTIMISM_GOERLI,\n ],\n [ChainId.POLYGON]: [USDC_POLYGON, WETH_POLYGON, WMATIC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [\n DAI_POLYGON_MUMBAI,\n WRAPPED_NATIVE_CURRENCY[ChainId.POLYGON_MUMBAI]!,\n WMATIC_POLYGON_MUMBAI,\n ],\n [ChainId.CELO]: [CELO, CUSD_CELO, CEUR_CELO, DAI_CELO],\n [ChainId.CELO_ALFAJORES]: [\n CELO_ALFAJORES,\n CUSD_CELO_ALFAJORES,\n CEUR_CELO_ALFAJORES,\n DAI_CELO_ALFAJORES,\n ],\n [ChainId.GNOSIS]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.GNOSIS],\n WBTC_GNOSIS,\n WXDAI_GNOSIS,\n USDC_ETHEREUM_GNOSIS,\n ],\n [ChainId.BNB]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BNB],\n BUSD_BNB,\n DAI_BNB,\n USDC_BNB,\n USDT_BNB,\n BTC_BNB,\n ETH_BNB,\n ],\n [ChainId.AVALANCHE]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.AVALANCHE],\n USDC_AVAX,\n DAI_AVAX,\n ],\n [ChainId.MOONBEAM]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MOONBEAM],\n DAI_MOONBEAM,\n USDC_MOONBEAM,\n WBTC_MOONBEAM,\n ],\n [ChainId.BASE_GOERLI]: [WRAPPED_NATIVE_CURRENCY[ChainId.BASE_GOERLI]],\n [ChainId.BASE]: [WRAPPED_NATIVE_CURRENCY[ChainId.BASE], USDC_BASE],\n [ChainId.ZORA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA]!],\n [ChainId.ZORA_SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA_SEPOLIA]!],\n [ChainId.ROOTSTOCK]: [WRAPPED_NATIVE_CURRENCY[ChainId.ROOTSTOCK]!],\n [ChainId.BLAST]: [WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!, USDB_BLAST],\n [ChainId.ZKSYNC]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC]!,\n USDCE_ZKSYNC,\n USDC_ZKSYNC,\n ],\n [ChainId.WORLDCHAIN]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!,\n USDC_WORLDCHAIN,\n WLD_WORLDCHAIN,\n WBTC_WORLDCHAIN,\n ],\n [ChainId.UNICHAIN_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA]!,\n USDC_UNICHAIN_SEPOLIA,\n ],\n [ChainId.UNICHAIN]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!,\n DAI_UNICHAIN,\n USDC_UNICHAIN,\n ],\n [ChainId.MONAD_TESTNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.MONAD_TESTNET]!,\n USDT_MONAD_TESTNET,\n ],\n [ChainId.BASE_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BASE_SEPOLIA]!,\n USDC_BASE_SEPOLIA,\n ],\n [ChainId.SONEIUM]: [WRAPPED_NATIVE_CURRENCY[ChainId.SONEIUM]!, USDC_SONEIUM],\n // networks exclusive to ring swap\n [ChainId.BLAST_SEPOLIA]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.BLAST_SEPOLIA]!,\n USDB_BLAST_SEPOLIA,\n ],\n [ChainId.STORY_ODYSSEY]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_ODYSSEY]!,\n SUSD_STORY_ODYSSEY,\n ],\n [ChainId.STORY_MAINNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_MAINNET]!,\n USDC_STORY_MAINNET,\n ],\n};\n\n/**\n * Provider that uses a hardcoded list of V3 pools to generate a list of subgraph pools.\n *\n * Since the pools are hardcoded and the data does not come from the Subgraph, the TVL values\n * are dummys and should not be depended on.\n *\n * Useful for instances where other data sources are unavailable. E.g. Subgraph not available.\n *\n * @export\n * @class StaticV3SubgraphProvider\n */\nexport class StaticV3SubgraphProvider implements IV3SubgraphProvider {\n constructor(\n private chainId: ChainId,\n private poolProvider: IV3PoolProvider\n ) {}\n\n public async getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<V3SubgraphPool[]> {\n log.info('In static subgraph provider for V3');\n const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];\n\n const basePairs: [Token, Token][] = _.flatMap(\n bases,\n (base): [Token, Token][] => bases.map((otherBase) => [base, otherBase])\n );\n\n if (tokenIn && tokenOut) {\n basePairs.push(\n [tokenIn, tokenOut],\n ...bases.map((base): [Token, Token] => [tokenIn, base]),\n ...bases.map((base): [Token, Token] => [tokenOut, base])\n );\n }\n\n const pairs: [Token, Token, FeeAmount][] = _(basePairs)\n .filter((tokens): tokens is [Token, Token] =>\n Boolean(tokens[0] && tokens[1])\n )\n .filter(\n ([tokenA, tokenB]) =>\n tokenA.address !== tokenB.address && !tokenA.equals(tokenB)\n )\n .flatMap<[Token, Token, FeeAmount]>(([tokenA, tokenB]) => {\n return [\n [tokenA, tokenB, FeeAmount.LOWEST],\n [tokenA, tokenB, FeeAmount.LOW],\n [tokenA, tokenB, FeeAmount.MEDIUM],\n [tokenA, tokenB, FeeAmount.HIGH],\n ];\n })\n .value();\n\n log.info(\n `V3 Static subgraph provider about to get ${pairs.length} pools on-chain`\n );\n const poolAccessor = await this.poolProvider.getPools(\n pairs,\n providerConfig\n );\n const pools = poolAccessor.getAllPools();\n\n const poolAddressSet = new Set<string>();\n const subgraphPools: V3SubgraphPool[] = _(pools)\n .map((pool) => {\n const { token0, token1, fee, liquidity } = pool;\n\n const poolAddress = Pool.getAddress(pool.token0, pool.token1, pool.fee);\n\n if (poolAddressSet.has(poolAddress)) {\n return undefined;\n }\n poolAddressSet.add(poolAddress);\n\n const liquidityNumber = JSBI.toNumber(liquidity);\n\n return {\n id: poolAddress,\n feeTier: unparseFeeAmount(fee),\n liquidity: liquidity.toString(),\n token0: {\n id: token0.address,\n },\n token1: {\n id: token1.address,\n },\n // As a very rough proxy we just use liquidity for TVL.\n tvlETH: liquidityNumber,\n tvlUSD: liquidityNumber,\n };\n })\n .compact()\n .value();\n\n return subgraphPools;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider-with-fallback.js","sourceRoot":"","sources":["../../../../src/providers/v3/subgraph-provider-with-fallback.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AACnD,wFAAmF;AAGnF;;;;;;GAMG;AACH,MAAa,+BACX,SAAQ,+DAA6C;IAGrD,YAAY,SAAgC;QAC1C,KAAK,CAAC,SAAS,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IAChC,CAAC;CACF;AAPD,0EAOC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { SubgraphProviderWithFallBacks } from '../subgraph-provider-with-fallback';\nimport { IV3SubgraphProvider, V3SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V3 subgraph pools that falls back to a different provider\n * in the event of failure.\n *\n * @export\n * @class V3SubgraphProviderWithFallBacks\n */\nexport class V3SubgraphProviderWithFallBacks\n extends SubgraphProviderWithFallBacks<V3SubgraphPool>\n implements IV3SubgraphProvider\n{\n constructor(fallbacks: IV3SubgraphProvider[]) {\n super(fallbacks, Protocol.V3);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AACnD,oDAAuD;AAGvD,4DAAwD;AAiCxD,MAAM,qBAAqB,GAAsC;IAC/D,CAAC,kBAAO,CAAC,OAAO,CAAC,EACf,4DAA4D;IAC9D,CAAC,kBAAO,CAAC,QAAQ,CAAC,EAChB,2EAA2E;IAC7E,kCAAkC;IAClC,CAAC,kBAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC9B,CAAC,kBAAO,CAAC,YAAY,CAAC,EACpB,oEAAoE;IACtE,kCAAkC;IAClC,CAAC,kBAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC9B,CAAC,kBAAO,CAAC,OAAO,CAAC,EACf,sEAAsE;IACxE,CAAC,kBAAO,CAAC,IAAI,CAAC,EACZ,iEAAiE;IACnE,CAAC,kBAAO,CAAC,MAAM,CAAC,EACd,oEAAoE;IACtE,CAAC,kBAAO,CAAC,GAAG,CAAC,EACX,uEAAuE;IACzE,CAAC,kBAAO,CAAC,SAAS,CAAC,EACjB,oEAAoE;IACtE,CAAC,kBAAO,CAAC,IAAI,CAAC,EACZ,4EAA4E;IAC9E,CAAC,kBAAO,CAAC,KAAK,CAAC,EACb,8IAA8I;CACjJ,CAAC;AAgBF,MAAa,kBACX,SAAQ,oCAAmD;IAG3D,YACE,OAAgB,EAChB,OAAO,GAAG,CAAC,EACX,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,IAAI,EACf,mBAAmB,GAAG,IAAI,EAC1B,qBAAqB,GAAG,MAAM,CAAC,SAAS,EACxC,mBAA4B;QAE5B,KAAK,CACH,qBAAQ,CAAC,EAAE,EACX,OAAO,EACP,OAAO,EACP,OAAO,EACP,QAAQ,EACR,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,aAAnB,mBAAmB,cAAnB,mBAAmB,GAAI,qBAAqB,CAAC,OAAO,CAAC,CACtD,CAAC;IACJ,CAAC;IAEkB,aAAa,CAAC,WAAoB;QACnD,OAAO;;;;UAID,WAAW,CAAC,CAAC,CAAC,oBAAoB,WAAW,IAAI,CAAC,CAAC,CAAC,EAAE;;;;;;;;;;;;;;;;;;;IAmB5D,CAAC;IACH,CAAC;IAEkB,eAAe,CAChC,OAA0B;QAE1B,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,MAAM,EAAE;gBACN,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;aACtB;YACD,MAAM,EAAE;gBACN,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;aACtB;YACD,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC;YAC/C,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,mBAAmB,CAAC;SAChD,CAAC;IACJ,CAAC;CACF;AArED,gDAqEC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\n\nimport { ProviderConfig } from '../provider';\nimport { SubgraphProvider } from '../subgraph-provider';\n\nexport interface V3SubgraphPool {\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 V3RawSubgraphPool = {\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\nconst SUBGRAPH_URL_BY_CHAIN: { [chainId in ChainId]?: string } = {\n [ChainId.MAINNET]:\n 'https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v3',\n [ChainId.OPTIMISM]:\n 'https://api.thegraph.com/subgraphs/name/ianlapham/optimism-post-regenesis',\n // todo: add once subgraph is live\n [ChainId.OPTIMISM_SEPOLIA]: '',\n [ChainId.ARBITRUM_ONE]:\n 'https://api.thegraph.com/subgraphs/name/ianlapham/arbitrum-minimal',\n // todo: add once subgraph is live\n [ChainId.ARBITRUM_SEPOLIA]: '',\n [ChainId.POLYGON]:\n 'https://api.thegraph.com/subgraphs/name/ianlapham/uniswap-v3-polygon',\n [ChainId.CELO]:\n 'https://api.thegraph.com/subgraphs/name/jesse-sawa/uniswap-celo',\n [ChainId.GOERLI]:\n 'https://api.thegraph.com/subgraphs/name/ianlapham/uniswap-v3-gorli',\n [ChainId.BNB]:\n 'https://api.thegraph.com/subgraphs/name/ilyamk/uniswap-v3---bnb-chain',\n [ChainId.AVALANCHE]:\n 'https://api.thegraph.com/subgraphs/name/lynnshaoyu/uniswap-v3-avax',\n [ChainId.BASE]:\n 'https://api.studio.thegraph.com/query/48211/uniswap-v3-base/version/latest',\n [ChainId.BLAST]:\n 'https://gateway-arbitrum.network.thegraph.com/api/0ae45f0bf40ae2e73119b44ccd755967/subgraphs/id/2LHovKznvo8YmKC9ZprPjsYAZDCc4K5q4AYz8s3cnQn1',\n};\n\n/**\n * Provider for getting V3 pools from the Subgraph\n *\n * @export\n * @interface IV3SubgraphProvider\n */\nexport interface IV3SubgraphProvider {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<V3SubgraphPool[]>;\n}\n\nexport class V3SubgraphProvider\n extends SubgraphProvider<V3RawSubgraphPool, V3SubgraphPool>\n implements IV3SubgraphProvider\n{\n constructor(\n chainId: ChainId,\n retries = 2,\n timeout = 30000,\n rollback = true,\n trackedEthThreshold = 0.01,\n untrackedUsdThreshold = Number.MAX_VALUE,\n subgraphUrlOverride?: string\n ) {\n super(\n Protocol.V3,\n chainId,\n retries,\n timeout,\n rollback,\n trackedEthThreshold,\n untrackedUsdThreshold,\n subgraphUrlOverride ?? SUBGRAPH_URL_BY_CHAIN[chainId]\n );\n }\n\n protected override subgraphQuery(blockNumber?: number): string {\n return `\n query getPools($pageSize: Int!, $id: String) {\n pools(\n first: $pageSize\n ${blockNumber ? `block: { number: ${blockNumber} }` : ``}\n where: { id_gt: $id }\n ) {\n id\n token0 {\n symbol\n id\n }\n token1 {\n symbol\n id\n }\n feeTier\n liquidity\n totalValueLockedUSD\n totalValueLockedETH\n totalValueLockedUSDUntracked\n }\n }\n `;\n }\n\n protected override mapSubgraphPool(\n rawPool: V3RawSubgraphPool\n ): V3SubgraphPool {\n return {\n id: rawPool.id,\n feeTier: rawPool.feeTier,\n liquidity: rawPool.liquidity,\n token0: {\n id: rawPool.token0.id,\n },\n token1: {\n id: rawPool.token1.id,\n },\n tvlETH: parseFloat(rawPool.totalValueLockedETH),\n tvlUSD: parseFloat(rawPool.totalValueLockedUSD),\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"uri-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v3/uri-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,oEAA+D;AAI/D,MAAa,qBACX,SAAQ,2CAAmC;CACV;AAFnC,sDAEmC","sourcesContent":["import { URISubgraphProvider } from '../uri-subgraph-provider';\n\nimport { IV3SubgraphProvider, V3SubgraphPool } from './subgraph-provider';\n\nexport class V3URISubgraphProvider\n extends URISubgraphProvider<V3SubgraphPool>\n implements IV3SubgraphProvider {}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v4/caching-pool-provider.ts"],"names":[],"mappings":";;;;;;AAEA,oDAAuB;AACvB,qCAA2D;AAK3D,MAAa,qBAAqB;IAUhC;;;;;OAKG;IACH,YACY,OAAgB,EAChB,YAA6B,EAC/B,KAAmB;QAFjB,YAAO,GAAP,OAAO,CAAS;QAChB,iBAAY,GAAZ,YAAY,CAAiB;QAC/B,UAAK,GAAL,KAAK,CAAc;QAlBrB,aAAQ,GAAG,CACjB,OAAgB,EAChB,OAAe,EACf,WAAoB,EACpB,EAAE,CACF,WAAW;YACT,CAAC,CAAC,QAAQ,OAAO,IAAI,OAAO,IAAI,WAAW,EAAE;YAC7C,CAAC,CAAC,QAAQ,OAAO,IAAI,OAAO,EAAE,CAAC;IAYhC,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,aAA6D,EAC7D,cAA+B;QAE/B,MAAM,SAAS,GAAgB,IAAI,GAAG,EAAU,CAAC;QACjD,MAAM,uBAAuB,GAEzB,EAAE,CAAC;QACP,MAAM,aAAa,GAAa,EAAE,CAAC;QACnC,MAAM,YAAY,GAA+B,EAAE,CAAC;QACpD,MAAM,WAAW,GAAG,MAAM,CAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,CAAA,CAAC;QAEtD,KAAK,MAAM,CACT,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,KAAK,EACN,IAAI,aAAa,EAAE;YAClB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CACrD,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,KAAK,CACN,CAAC;YAEF,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;gBACzB,SAAS;aACV;YAED,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEtB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CACjD,CAAC;YACF,IAAI,UAAU,EAAE;gBACd,aAAM,CAAC,SAAS,CACd,wCAAwC,EACxC,CAAC,EACD,uBAAgB,CAAC,IAAI,CACtB,CAAC;gBACF,YAAY,CAAC,MAAM,CAAC,GAAG,UAAU,CAAC;gBAClC,SAAS;aACV;YAED,aAAM,CAAC,SAAS,CACd,6CAA6C,EAC7C,CAAC,EACD,uBAAgB,CAAC,IAAI,CACtB,CAAC;YACF,uBAAuB,CAAC,IAAI,CAAC;gBAC3B,SAAS;gBACT,SAAS;gBACT,SAAS;gBACT,WAAW;gBACX,KAAK;aACN,CAAC,CAAC;YACH,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SAC5B;QAED,UAAG,CAAC,IAAI,CACN;YACE,UAAU,EAAE,gBAAC,CAAC,GAAG,CACf,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,EAC3B,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,EAAE,CACxD;YACD,oBAAoB,EAAE,gBAAC,CAAC,GAAG,CACzB,uBAAuB,EACvB,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAC/C;SACF,EACD,SACE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAC5B,2EACE,uBAAuB,CAAC,MAC1B,SAAS,CACV,CAAC;QAEF,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE;YACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CACnD,uBAAuB,EACvB,cAAc,CACf,CAAC;YACF,KAAK,MAAM,OAAO,IAAI,aAAa,EAAE;gBACnC,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC/C,IAAI,IAAI,EAAE;oBACR,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC;oBAC7B,iFAAiF;oBACjF,IAAI,CAAC,KAAK,CAAC,GAAG,CACZ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,EACjD,IAAI,CACL,CAAC;iBACH;aACF;SACF;QAED,OAAO;YACL,OAAO,EAAE,CACP,SAAmB,EACnB,SAAmB,EACnB,GAAW,EACX,WAAmB,EACnB,KAAa,EACb,EAAE;gBACF,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,SAAS,CAC5C,SAAS,EACT,SAAS,EACT,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAC;gBACF,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YACD,WAAW,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;YACrD,WAAW,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC;SAC/C,CAAC;IACJ,CAAC;IAEM,SAAS,CACd,SAAmB,EACnB,SAAmB,EACnB,GAAW,EACX,WAAmB,EACnB,KAAa;QAEb,OAAO,IAAI,CAAC,YAAY,CAAC,SAAS,CAChC,SAAS,EACT,SAAS,EACT,GAAG,EACH,WAAW,EACX,KAAK,CACN,CAAC;IACJ,CAAC;CACF;AA5JD,sDA4JC","sourcesContent":["import { ChainId, Currency } from '@fewprotocol/sdk-core';\nimport { Pool } from '@fewprotocol/uniswap-v4-sdk';\nimport _ from 'lodash';\nimport { log, metric, MetricLoggerUnit } from '../../util';\nimport { ICache } from '../cache';\nimport { ProviderConfig } from '../provider';\nimport { IV4PoolProvider, V4PoolAccessor } from './pool-provider';\n\nexport class CachingV4PoolProvider implements IV4PoolProvider {\n private POOL_KEY = (\n chainId: ChainId,\n address: string,\n blockNumber?: number\n ) =>\n blockNumber\n ? `pool-${chainId}-${address}-${blockNumber}`\n : `pool-${chainId}-${address}`;\n\n /**\n * Creates an instance of CachingV4PoolProvider.\n * @param chainId The chain id to use.\n * @param poolProvider The provider to use to get the pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n protected chainId: ChainId,\n protected poolProvider: IV4PoolProvider,\n private cache: ICache<Pool>\n ) {}\n\n public async getPools(\n currencyPairs: [Currency, Currency, number, number, string][],\n providerConfig?: ProviderConfig\n ): Promise<V4PoolAccessor> {\n const poolIdSet: Set<string> = new Set<string>();\n const poolsToGetCurrencyPairs: Array<\n [Currency, Currency, number, number, string]\n > = [];\n const poolsToGetIds: string[] = [];\n const poolIdToPool: { [poolId: string]: Pool } = {};\n const blockNumber = await providerConfig?.blockNumber;\n\n for (const [\n currencyA,\n currencyB,\n feeAmount,\n tickSpacing,\n hooks,\n ] of currencyPairs) {\n const { poolId, currency0, currency1 } = this.getPoolId(\n currencyA,\n currencyB,\n feeAmount,\n tickSpacing,\n hooks\n );\n\n if (poolIdSet.has(poolId)) {\n continue;\n }\n\n poolIdSet.add(poolId);\n\n const cachedPool = await this.cache.get(\n this.POOL_KEY(this.chainId, poolId, blockNumber)\n );\n if (cachedPool) {\n metric.putMetric(\n 'V4_INMEMORY_CACHING_POOL_HIT_IN_MEMORY',\n 1,\n MetricLoggerUnit.None\n );\n poolIdToPool[poolId] = cachedPool;\n continue;\n }\n\n metric.putMetric(\n 'V4_INMEMORY_CACHING_POOL_MISS_NOT_IN_MEMORY',\n 1,\n MetricLoggerUnit.None\n );\n poolsToGetCurrencyPairs.push([\n currency0,\n currency1,\n feeAmount,\n tickSpacing,\n hooks,\n ]);\n poolsToGetIds.push(poolId);\n }\n\n log.info(\n {\n poolsFound: _.map(\n Object.values(poolIdToPool),\n (p) => `${p.token0.symbol} ${p.token1.symbol} ${p.fee}`\n ),\n poolsToGetTokenPairs: _.map(\n poolsToGetCurrencyPairs,\n (t) => `${t[0].symbol} ${t[1].symbol} ${t[2]}`\n ),\n },\n `Found ${\n Object.keys(poolIdToPool).length\n } V4 pools already in local cache. About to get liquidity and slot0s for ${\n poolsToGetCurrencyPairs.length\n } pools.`\n );\n\n if (poolsToGetCurrencyPairs.length > 0) {\n const poolAccessor = await this.poolProvider.getPools(\n poolsToGetCurrencyPairs,\n providerConfig\n );\n for (const address of poolsToGetIds) {\n const pool = poolAccessor.getPoolById(address);\n if (pool) {\n poolIdToPool[address] = pool;\n // We don't want to wait for this caching to complete before returning the pools.\n this.cache.set(\n this.POOL_KEY(this.chainId, address, blockNumber),\n pool\n );\n }\n }\n }\n\n return {\n getPool: (\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ) => {\n const { poolId } = this.poolProvider.getPoolId(\n currencyA,\n currencyB,\n fee,\n tickSpacing,\n hooks\n );\n return poolIdToPool[poolId];\n },\n getPoolById: (poolId: string) => poolIdToPool[poolId],\n getAllPools: () => Object.values(poolIdToPool),\n };\n }\n\n public getPoolId(\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ): { poolId: string; currency0: Currency; currency1: Currency } {\n return this.poolProvider.getPoolId(\n currencyA,\n currencyB,\n fee,\n tickSpacing,\n hooks\n );\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"caching-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v4/caching-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AAGnD,4EAAuE;AAGvE;;;;;GAKG;AACH,MAAa,yBACX,SAAQ,mDAAuC;IAG/C;;;;;OAKG;IACH,YACE,OAAgB,EAChB,gBAAqC,EACrC,KAA+B;QAE/B,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,8DAiBC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport { ICache } from '../cache';\nimport { CachingSubgraphProvider } from '../caching-subgraph-provider';\nimport { IV4SubgraphProvider, V4SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V4 pools, with functionality for caching the results.\n *\n * @export\n * @class CachingV4SubgraphProvider\n */\nexport class CachingV4SubgraphProvider\n extends CachingSubgraphProvider<V4SubgraphPool>\n implements IV4SubgraphProvider\n{\n /**\n * Creates an instance of CachingV3SubgraphProvider.\n * @param chainId The chain id to use.\n * @param subgraphProvider The provider to use to get the subgraph pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n chainId: ChainId,\n subgraphProvider: IV4SubgraphProvider,\n cache: ICache<V4SubgraphPool[]>\n ) {\n super(chainId, subgraphProvider, cache, Protocol.V4);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v4/pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Currency } from '@fewprotocol/sdk-core';\nimport { Pool } from '@fewprotocol/uniswap-v4-sdk';\nimport retry, { Options as RetryOptions } from 'async-retry';\nimport { getAddress, log, STATE_VIEW_ADDRESSES } from '../../util';\nimport { IMulticallProvider, Result } from '../multicall-provider';\nimport { ProviderConfig } from '../provider';\n\nimport { StateView__factory } from '../../types/other/factories/StateView__factory';\nimport { ILiquidity, ISlot0, PoolProvider } from '../pool-provider';\n\ntype V4ISlot0 = ISlot0 & {\n poolId: string;\n protocolFee: number;\n lpFee: number;\n};\n\ntype V4ILiquidity = ILiquidity;\n\nexport interface IV4PoolProvider {\n getPools(\n currencyPairs: V4PoolConstruct[],\n providerConfig?: ProviderConfig\n ): Promise<V4PoolAccessor>;\n\n getPoolId(\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ): { poolId: string; currency0: Currency; currency1: Currency };\n}\n\nexport type V4PoolAccessor = {\n getPool: (\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ) => Pool | undefined;\n getPoolById: (poolId: string) => Pool | undefined;\n getAllPools: () => Pool[];\n};\n\nexport type V4PoolRetryOptions = RetryOptions;\nexport type V4PoolConstruct = [Currency, Currency, number, number, string];\n\n// TODO: export sortsBefore from v4-sdk https://github.com/Uniswap/sdks/tree/main/sdks/v4-sdk/src/utils to avoid duplication\nexport function sortsBefore(currencyA: Currency, currencyB: Currency): boolean {\n if (currencyA.isNative) return true;\n if (currencyB.isNative) return false;\n return currencyA.wrapped.sortsBefore(currencyB.wrapped);\n}\n\nexport class V4PoolProvider\n extends PoolProvider<\n Currency,\n V4PoolConstruct,\n V4ISlot0,\n V4ILiquidity,\n V4PoolAccessor\n >\n implements IV4PoolProvider\n{\n // Computing pool id is slow as it requires hashing, encoding etc.\n // Addresses never change so can always be cached.\n private POOL_ID_CACHE: { [key: string]: string } = {};\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 chainId: ChainId,\n multicall2Provider: IMulticallProvider,\n retryOptions: V4PoolRetryOptions = {\n retries: 2,\n minTimeout: 50,\n maxTimeout: 500,\n }\n ) {\n super(chainId, multicall2Provider, retryOptions);\n }\n\n public async getPools(\n currencyPairs: V4PoolConstruct[],\n providerConfig?: ProviderConfig\n ): Promise<V4PoolAccessor> {\n return await super.getPoolsInternal(currencyPairs, providerConfig);\n }\n\n public getPoolId(\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ): { poolId: string; currency0: Currency; currency1: Currency } {\n const { poolIdentifier, currency0, currency1 } = this.getPoolIdentifier([\n currencyA,\n currencyB,\n fee,\n tickSpacing,\n hooks,\n ]);\n return { poolId: poolIdentifier, currency0, currency1 };\n }\n\n protected override getLiquidityFunctionName(): string {\n return 'getLiquidity';\n }\n\n protected override getSlot0FunctionName(): string {\n return 'getSlot0';\n }\n\n protected override async getPoolsData<TReturn>(\n poolIds: string[],\n functionName: string,\n providerConfig?: ProviderConfig\n ): Promise<Result<TReturn>[]> {\n const { results, blockNumber } = await retry(async () => {\n // NOTE: V4 pools are a singleton living under PoolsManager.\n // We have to retrieve the pool data from the state view contract.\n // To begin with, we will be consistent with how v4 subgraph retrieves the pool state - via state view.\n return this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n string[],\n TReturn\n >({\n address: STATE_VIEW_ADDRESSES[this.chainId]!,\n contractInterface: StateView__factory.createInterface(),\n functionName: functionName,\n functionParams: poolIds.map((poolId) => [poolId]),\n providerConfig,\n });\n }, this.retryOptions);\n\n log.debug(`Pool data fetched as of block ${blockNumber}`);\n\n return results;\n }\n\n protected override getPoolIdentifier(pool: V4PoolConstruct): {\n poolIdentifier: string;\n currency0: Currency;\n currency1: Currency;\n } {\n const [currencyA, currencyB, fee, tickSpacing, hooks] = pool;\n\n const [currency0, currency1] = sortsBefore(currencyA, currencyB)\n ? [currencyA, currencyB]\n : [currencyB, currencyA];\n const currency0Addr = getAddress(currency0);\n const currency1Addr = getAddress(currency1);\n\n const cacheKey = `${this.chainId}/${currency0Addr}/${currency1Addr}/${fee}/${tickSpacing}/${hooks}`;\n\n const cachedId = this.POOL_ID_CACHE[cacheKey];\n\n if (cachedId) {\n return { poolIdentifier: cachedId, currency0, currency1 };\n }\n\n const poolId = Pool.getPoolId(\n currency0,\n currency1,\n fee,\n tickSpacing,\n hooks\n );\n\n this.POOL_ID_CACHE[cacheKey] = poolId;\n\n return { poolIdentifier: poolId, currency0, currency1 };\n }\n\n protected instantiatePool(\n pool: V4PoolConstruct,\n slot0: V4ISlot0,\n liquidity: V4ILiquidity\n ): Pool {\n const [currency0, currency1, fee, tickSpacing, hooks] = pool;\n\n return new Pool(\n currency0,\n currency1,\n fee,\n tickSpacing,\n hooks,\n slot0.sqrtPriceX96.toString(),\n liquidity.toString(),\n slot0.tick\n );\n }\n\n protected instantiatePoolAccessor(poolIdentifierToPool: {\n [p: string]: Pool;\n }): V4PoolAccessor {\n return {\n getPool: (\n currencyA: Currency,\n currencyB: Currency,\n fee: number,\n tickSpacing: number,\n hooks: string\n ): Pool | undefined => {\n const { poolIdentifier } = this.getPoolIdentifier([\n currencyA,\n currencyB,\n fee,\n tickSpacing,\n hooks,\n ]);\n return poolIdentifierToPool[poolIdentifier];\n },\n getPoolById: (poolId: string): Pool | undefined =>\n poolIdentifierToPool[poolId],\n getAllPools: (): Pool[] => Object.values(poolIdentifierToPool),\n };\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v4/static-subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Currency } from '@fewprotocol/sdk-core';\nimport { Pool } from '@fewprotocol/uniswap-v4-sdk';\nimport _ from 'lodash';\n\nimport {\n getAddress,\n getApplicableV4FeesTickspacingsHooks,\n log,\n} from '../../util';\nimport { BASES_TO_CHECK_TRADES_AGAINST } from '../caching-subgraph-provider';\n\nimport JSBI from 'jsbi';\nimport { ProviderConfig } from '../provider';\nimport { IV4PoolProvider, V4PoolConstruct } from './pool-provider';\nimport { IV4SubgraphProvider, V4SubgraphPool } from './subgraph-provider';\n\nexport class StaticV4SubgraphProvider implements IV4SubgraphProvider {\n constructor(\n private chainId: ChainId,\n private poolProvider: IV4PoolProvider,\n private v4PoolParams: Array<\n [number, number, string]\n > = getApplicableV4FeesTickspacingsHooks(chainId)\n ) {}\n\n public async getPools(\n currencyIn?: Currency,\n currencyOut?: Currency,\n providerConfig?: ProviderConfig\n ): Promise<V4SubgraphPool[]> {\n log.info('In static subgraph provider for V4');\n const bases = BASES_TO_CHECK_TRADES_AGAINST[this.chainId];\n\n const basePairs: [Currency, Currency][] = _.flatMap(\n bases,\n (base): [Currency, Currency][] =>\n bases.map((otherBase) => [base, otherBase])\n );\n\n if (currencyIn && currencyOut) {\n basePairs.push(\n [currencyIn, currencyOut],\n ...bases.map((base): [Currency, Currency] => [currencyIn, base]),\n ...bases.map((base): [Currency, Currency] => [currencyOut, base])\n );\n }\n\n const pairs: V4PoolConstruct[] = _(basePairs)\n .filter((tokens): tokens is [Currency, Currency] =>\n Boolean(tokens[0] && tokens[1])\n )\n .filter(\n ([tokenA, tokenB]) =>\n tokenA.wrapped.address !== tokenB.wrapped.address &&\n !tokenA.equals(tokenB)\n )\n .flatMap<V4PoolConstruct>(([tokenA, tokenB]) => {\n const tokensWithPoolParams: Array<\n [Currency, Currency, number, number, string]\n > = this.v4PoolParams.map(([feeAmount, tickSpacing, hooks]) => {\n return [tokenA, tokenB, feeAmount, tickSpacing, hooks];\n });\n\n return tokensWithPoolParams;\n })\n .value();\n\n log.info(\n `V4 Static subgraph provider about to get ${pairs.length} pools on-chain`\n );\n const poolAccessor = await this.poolProvider.getPools(\n pairs,\n providerConfig\n );\n const pools = poolAccessor.getAllPools();\n\n const poolAddressSet = new Set<string>();\n const subgraphPools: V4SubgraphPool[] = _(pools)\n .map((pool) => {\n const { token0, token1, fee, tickSpacing, hooks, liquidity } = pool;\n\n const poolAddress = Pool.getPoolId(\n token0,\n token1,\n fee,\n tickSpacing,\n hooks\n );\n\n if (poolAddressSet.has(poolAddress)) {\n return undefined;\n }\n poolAddressSet.add(poolAddress);\n\n const liquidityNumber = JSBI.toNumber(liquidity);\n\n return {\n id: poolAddress,\n feeTier: fee.toString(),\n tickSpacing: tickSpacing.toString(),\n hooks: hooks,\n liquidity: liquidity.toString(),\n token0: {\n id: getAddress(token0),\n },\n token1: {\n id: getAddress(token1),\n },\n // As a very rough proxy we just use liquidity for TVL.\n tvlETH: liquidityNumber,\n tvlUSD: liquidityNumber,\n };\n })\n .compact()\n .value();\n\n return subgraphPools;\n }\n}\n"]}