@ring-protocol/smart-order-router 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/main/index.js.map +1 -0
- package/build/main/providers/cache-node.js.map +1 -0
- package/build/main/providers/cache.js.map +1 -0
- package/build/main/providers/caching/route/index.js.map +1 -0
- package/build/main/providers/caching/route/model/cache-mode.js.map +1 -0
- package/build/main/providers/caching/route/model/cached-route.js.map +1 -0
- package/build/main/providers/caching/route/model/cached-routes.js.map +1 -0
- package/build/main/providers/caching/route/model/index.js.map +1 -0
- package/build/main/providers/caching/route/route-caching-provider.js.map +1 -0
- package/build/main/providers/caching-gas-provider.js.map +1 -0
- package/build/main/providers/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/caching-token-list-provider.js.map +1 -0
- package/build/main/providers/caching-token-provider.js.map +1 -0
- package/build/main/providers/eip-1559-gas-price-provider.js.map +1 -0
- package/build/main/providers/eth-estimate-gas-provider.js.map +1 -0
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-pool-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-quote-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/fewV2/ring-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/gas-price-provider.js.map +1 -0
- package/build/main/providers/index.js.map +1 -0
- package/build/main/providers/legacy-gas-price-provider.js.map +1 -0
- package/build/main/providers/multicall-provider.js.map +1 -0
- package/build/main/providers/multicall-ringswap-provider.js.map +1 -0
- package/build/main/providers/multicall-uniswap-provider.js.map +1 -0
- package/build/main/providers/on-chain-gas-price-provider.js.map +1 -0
- package/build/main/providers/on-chain-quote-provider.d.ts +4 -4
- package/build/main/providers/on-chain-quote-provider.js +35 -37
- package/build/main/providers/on-chain-quote-provider.js.map +1 -0
- package/build/main/providers/pool-provider.js.map +1 -0
- package/build/main/providers/portion-provider.js.map +1 -0
- package/build/main/providers/provider.js.map +1 -0
- package/build/main/providers/simulation-provider.js.map +1 -0
- package/build/main/providers/static-gas-price-provider.js.map +1 -0
- package/build/main/providers/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/subgraph-provider.js.map +1 -0
- package/build/main/providers/swap-router-provider.js.map +1 -0
- package/build/main/providers/tenderly-simulation-provider.js.map +1 -0
- package/build/main/providers/token-fee-fetcher.js.map +1 -0
- package/build/main/providers/token-properties-provider.js.map +1 -0
- package/build/main/providers/token-provider.js.map +1 -0
- package/build/main/providers/token-validator-provider.js.map +1 -0
- package/build/main/providers/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v2/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/pool-provider.js.map +1 -0
- package/build/main/providers/v2/quote-provider.js.map +1 -0
- package/build/main/providers/v2/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v2/subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v3/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/gas-data-provider.js.map +1 -0
- package/build/main/providers/v3/pool-provider.js.map +1 -0
- package/build/main/providers/v3/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v3/subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v4/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/pool-provider.js.map +1 -0
- package/build/main/providers/v4/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v4/subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/uri-subgraph-provider.js.map +1 -0
- package/build/main/routers/alpha-router/alpha-router.d.ts +9 -0
- package/build/main/routers/alpha-router/alpha-router.js +4 -1
- package/build/main/routers/alpha-router/alpha-router.js.map +1 -0
- package/build/main/routers/alpha-router/config.js.map +1 -0
- package/build/main/routers/alpha-router/entities/index.js.map +1 -0
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +1 -0
- package/build/main/routers/alpha-router/functions/best-swap-route.js.map +1 -0
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +1 -0
- package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +1 -0
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/index.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/base-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +1 -0
- package/build/main/routers/index.js.map +1 -0
- package/build/main/routers/legacy-router/bases.js.map +1 -0
- package/build/main/routers/legacy-router/index.js.map +1 -0
- package/build/main/routers/legacy-router/legacy-router.js.map +1 -0
- package/build/main/routers/router.js.map +1 -0
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/types/other/commons.js.map +1 -0
- package/build/main/types/other/factories/Erc20__factory.js.map +1 -0
- package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +1 -0
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +1 -0
- package/build/main/types/other/factories/ITokenValidator__factory.js.map +1 -0
- package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +1 -0
- package/build/main/types/other/factories/Permit2__factory.js.map +1 -0
- package/build/main/types/other/factories/StateView__factory.js.map +1 -0
- package/build/main/types/other/factories/SwapRouter02__factory.js.map +1 -0
- package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +1 -0
- package/build/main/types/other/factories/V4Quoter__factory.js.map +1 -0
- package/build/main/types/v2/commons.js.map +1 -0
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +1 -0
- package/build/main/types/v3/commons.js.map +1 -0
- package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +1 -0
- package/build/main/types/v3/factories/IQuoterV2__factory.js.map +1 -0
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +1 -0
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +1 -0
- package/build/main/util/addresses.js.map +1 -0
- package/build/main/util/amounts.js.map +1 -0
- package/build/main/util/callData.js.map +1 -0
- package/build/main/util/chains.js.map +1 -0
- package/build/main/util/defaultBlocksToLive.js.map +1 -0
- package/build/main/util/fewAddress.js.map +1 -0
- package/build/main/util/gas-factory-helpers.js.map +1 -0
- package/build/main/util/hooksOptions.js.map +1 -0
- package/build/main/util/index.js.map +1 -0
- package/build/main/util/intent.js.map +1 -0
- package/build/main/util/l2FeeChains.js.map +1 -0
- package/build/main/util/log.js.map +1 -0
- package/build/main/util/methodParameters.js +3 -1
- package/build/main/util/methodParameters.js.map +1 -0
- package/build/main/util/metric.js.map +1 -0
- package/build/main/util/mixedRouteFilterOutV4Pools.js.map +1 -0
- package/build/main/util/onchainQuoteProviderConfigs.js.map +1 -0
- package/build/main/util/pool.js.map +1 -0
- package/build/main/util/protocols.js.map +1 -0
- package/build/main/util/routes.js.map +1 -0
- package/build/main/util/serializeRouteIds.js.map +1 -0
- package/build/main/util/simple-perf-tracker.js.map +1 -0
- package/build/main/util/tenderlySimulationErrorBreakDown.js.map +1 -0
- package/build/main/util/unsupported-tokens.js.map +1 -0
- package/build/module/providers/on-chain-quote-provider.d.ts +4 -4
- package/build/module/providers/on-chain-quote-provider.js +35 -37
- package/build/module/routers/alpha-router/alpha-router.d.ts +9 -0
- package/build/module/routers/alpha-router/alpha-router.js +4 -1
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/methodParameters.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,4CAA0B;AAC1B,yCAAuB","sourcesContent":["export * from './providers';\nexport * from './routers';\nexport * from './util';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-node.js","sourceRoot":"","sources":["../../../src/providers/cache-node.ts"],"names":[],"mappings":";;;AAIA,MAAa,WAAW;IACtB,YAAoB,SAAoB;QAApB,cAAS,GAAT,SAAS,CAAW;IAAG,CAAC;IAE5C,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,IAAiB;QAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEtE,MAAM,MAAM,GAAkC,EAAE,CAAC;QAEjD,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC7B,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW,EAAE,KAAQ,EAAE,GAAY;QAC3C,IAAI,GAAG,EAAE;YACP,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;SAC5C;aAAM;YACL,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;SACvC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;CACF;AA/BD,kCA+BC","sourcesContent":["import NodeCache from 'node-cache';\n\nimport { ICache } from './cache';\n\nexport class NodeJSCache<T> implements ICache<T> {\n constructor(private nodeCache: NodeCache) {}\n\n async get(key: string): Promise<T | undefined> {\n return this.nodeCache.get<T>(key);\n }\n\n async batchGet(keys: Set<string>): Promise<Record<string, T | undefined>> {\n const keysArr = Array.from(keys);\n const values = await Promise.all(keysArr.map((key) => this.get(key)));\n\n const result: Record<string, T | undefined> = {};\n\n keysArr.forEach((key, index) => {\n result[key] = values[index];\n });\n\n return result;\n }\n\n async set(key: string, value: T, ttl?: number): Promise<boolean> {\n if (ttl) {\n return this.nodeCache.set(key, value, ttl);\n } else {\n return this.nodeCache.set(key, value);\n }\n }\n\n async has(key: string): Promise<boolean> {\n return this.nodeCache.has(key);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/providers/cache.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * Generic cache used by providers. Allows caching of results to minimize\n * round trips to external data sources.\n *\n * @export\n * @interface ICache\n * @template T\n */\nexport interface ICache<T> {\n get(key: string): Promise<T | undefined>;\n\n batchGet(keys: Set<string>): Promise<Record<string, T | undefined>>;\n\n set(key: string, value: T, ttl?: number): Promise<boolean>;\n\n has(key: string): Promise<boolean>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/providers/caching/route/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2DAAyC","sourcesContent":["export * from './model/';\nexport * from './route-caching-provider';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache-mode.js","sourceRoot":"","sources":["../../../../../../src/providers/caching/route/model/cache-mode.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,IAAY,SAIX;AAJD,WAAY,SAAS;IACnB,kCAAqB,CAAA;IACrB,kCAAqB,CAAA;IACrB,sCAAyB,CAAA;AAC3B,CAAC,EAJW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAIpB","sourcesContent":["/**\n * CacheMode enum that controls the way that the RouteCachingProvider works.\n * - *Livemode*: This mode will set materialized routes into cache and fetch routes from cache.\n * If the route exists in cache, it will be quoted and returned, otherwise it will materialized.\n * - *Darkmode*: This mode indicates that the cache will not be used, it will not be inserted nor fetched.\n * Routes will always be materialized.\n * - *Tapcompare*: In this mode we will insert and fetch routes to/from cache, and we will also materialize the route.\n * Ultimately the materialized route will be returned, but we will log some metrics comparing both.\n *\n * @enum {string}\n */\nexport enum CacheMode {\n Livemode = 'livemode',\n Darkmode = 'darkmode',\n Tapcompare = 'tapcompare',\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached-route.js","sourceRoot":"","sources":["../../../../../../src/providers/caching/route/model/cached-route.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { Currency } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport { Pool as V3Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport { Pool as V4Pool } from '@fewprotocol/uniswap-v4-sdk';\n\nimport {\n MixedRoute,\n SupportedRoutes,\n V2Route,\n V3Route,\n V4Route,\n} from '../../../../routers';\nimport { getAddress } from '../../../../util';\n\ninterface CachedRouteParams<Route extends SupportedRoutes> {\n route: Route;\n percent: number;\n}\n\n/**\n * Class defining the route to cache\n *\n * @export\n * @class CachedRoute\n */\nexport class CachedRoute<Route extends SupportedRoutes> {\n public readonly route: Route;\n public readonly percent: number;\n // Hashing function copying the same implementation as Java's `hashCode`\n // Sourced from: https://gist.github.com/hyamamoto/fd435505d29ebfa3d9716fd2be8d42f0?permalink_comment_id=4613539#gistcomment-4613539\n private hashCode = (str: string) =>\n [...str].reduce((s, c) => (Math.imul(31, s) + c.charCodeAt(0)) | 0, 0);\n\n /**\n * @param route\n * @param percent\n */\n constructor({ route, percent }: CachedRouteParams<Route>) {\n this.route = route;\n this.percent = percent;\n }\n\n public get protocol(): Protocol {\n return this.route.protocol;\n }\n\n public get currencyIn(): Currency {\n return this.route.input;\n }\n\n public get currencyOut(): Currency {\n return this.route.output;\n }\n\n public get routePath(): string {\n switch (this.protocol) {\n case Protocol.V4:\n return (this.route as V4Route).pools\n .map(\n (pool) =>\n `[V4]${getAddress(pool.token0)}/${getAddress(pool.token1)}`\n )\n .join('->');\n case Protocol.V3:\n return (this.route as V3Route).pools\n .map(\n (pool) =>\n `[V3]${pool.token0.address}/${pool.token1.address}/${pool.fee}`\n )\n .join('->');\n case Protocol.V2:\n return (this.route as V2Route).pairs\n .map((pair) => `[V2]${pair.token0.address}/${pair.token1.address}`)\n .join('->');\n case Protocol.MIXED:\n return (this.route as MixedRoute).pools\n .map((pool) => {\n if (pool instanceof V4Pool) {\n // TODO: ROUTE-217 - Support native currency routing in V4\n return `[V4]${\n pool.token0.isToken\n ? pool.token0.wrapped.address\n : pool.token0.symbol\n }/${\n pool.token1.isToken\n ? pool.token1.wrapped.address\n : pool.token1.symbol\n }`;\n } else if (pool instanceof V3Pool) {\n return `[V3]${pool.token0.address}/${pool.token1.address}/${pool.fee}`;\n } else if (pool instanceof Pair) {\n return `[V2]${pool.token0.address}/${pool.token1.address}`;\n } else {\n throw new Error(`Unsupported pool type ${JSON.stringify(pool)}`);\n }\n })\n .join('->');\n default:\n throw new Error(`Unsupported protocol ${this.protocol}`);\n }\n }\n\n public get routeId(): number {\n return this.hashCode(this.routePath);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cached-routes.js","sourceRoot":"","sources":["../../../../../../src/providers/caching/route/model/cached-routes.ts"],"names":[],"mappings":";;;;;;AAEA,oDAAuB;AAIvB,iDAA6C;AAc7C;;;;;GAKG;AACH,MAAa,YAAY;IAYvB;;;;;;;;;;OAUG;IACH,YAAY,EACV,MAAM,EACN,OAAO,EACP,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,WAAW,EACX,SAAS,EACT,cAAc,EACd,YAAY,GAAG,CAAC,GACG;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;IACnC,CAAC;IAED;;;;;;;;;;;;;OAaG;IACI,MAAM,CAAC,yBAAyB,CACrC,MAA6B,EAC7B,OAAgB,EAChB,UAAoB,EACpB,WAAqB,EACrB,gBAA4B,EAC5B,WAAmB,EACnB,SAAoB,EACpB,cAAsB;QAEtB,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC;YAAE,OAAO,SAAS,CAAC;QAEzC,MAAM,YAAY,GAAG,gBAAC,CAAC,GAAG,CACxB,MAAM,EACN,CAAC,KAA0B,EAAE,EAAE,CAC7B,IAAI,0BAAW,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAClE,CAAC;QAEF,OAAO,IAAI,YAAY,CAAC;YACtB,MAAM,EAAE,YAAY;YACpB,OAAO;YACP,UAAU;YACV,WAAW;YACX,gBAAgB;YAChB,WAAW;YACX,SAAS;YACT,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACI,UAAU,CAAC,kBAA0B,EAAE,UAAU,GAAG,KAAK;QAC9D,2EAA2E;QAC3E,MAAM,YAAY,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QACxD,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC;QAE/D,OAAO,gBAAgB,IAAI,YAAY,CAAC;IAC1C,CAAC;CACF;AAtGD,oCAsGC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { RouteWithValidQuote, SupportedRoutes } from '../../../../routers';\n\nimport { CachedRoute } from './cached-route';\n\ninterface CachedRoutesParams {\n routes: CachedRoute<SupportedRoutes>[];\n chainId: ChainId;\n currencyIn: Currency;\n currencyOut: Currency;\n protocolsCovered: Protocol[];\n blockNumber: number;\n tradeType: TradeType;\n originalAmount: string;\n blocksToLive?: number;\n}\n\n/**\n * Class defining the route to cache\n *\n * @export\n * @class CachedRoute\n */\nexport class CachedRoutes {\n public readonly routes: CachedRoute<SupportedRoutes>[];\n public readonly chainId: ChainId;\n public readonly currencyIn: Currency;\n public readonly currencyOut: Currency;\n public readonly protocolsCovered: Protocol[];\n public readonly blockNumber: number;\n public readonly tradeType: TradeType;\n public readonly originalAmount: string;\n\n public blocksToLive: number;\n\n /**\n * @param routes\n * @param chainId\n * @param currencyIn\n * @param currencyOut\n * @param protocolsCovered\n * @param blockNumber\n * @param tradeType\n * @param originalAmount\n * @param blocksToLive\n */\n constructor({\n routes,\n chainId,\n currencyIn,\n currencyOut,\n protocolsCovered,\n blockNumber,\n tradeType,\n originalAmount,\n blocksToLive = 0,\n }: CachedRoutesParams) {\n this.routes = routes;\n this.chainId = chainId;\n this.currencyIn = currencyIn;\n this.currencyOut = currencyOut;\n this.protocolsCovered = protocolsCovered;\n this.blockNumber = blockNumber;\n this.tradeType = tradeType;\n this.originalAmount = originalAmount;\n this.blocksToLive = blocksToLive;\n }\n\n /**\n * Factory method that creates a `CachedRoutes` object from an array of RouteWithValidQuote.\n *\n * @public\n * @static\n * @param routes\n * @param chainId\n * @param currencyIn\n * @param currencyOut\n * @param protocolsCovered\n * @param blockNumber\n * @param tradeType\n * @param originalAmount\n */\n public static fromRoutesWithValidQuotes(\n routes: RouteWithValidQuote[],\n chainId: ChainId,\n currencyIn: Currency,\n currencyOut: Currency,\n protocolsCovered: Protocol[],\n blockNumber: number,\n tradeType: TradeType,\n originalAmount: string\n ): CachedRoutes | undefined {\n if (routes.length == 0) return undefined;\n\n const cachedRoutes = _.map(\n routes,\n (route: RouteWithValidQuote) =>\n new CachedRoute({ route: route.route, percent: route.percent })\n );\n\n return new CachedRoutes({\n routes: cachedRoutes,\n chainId,\n currencyIn,\n currencyOut,\n protocolsCovered,\n blockNumber,\n tradeType,\n originalAmount,\n });\n }\n\n /**\n * Function to determine if, given a block number, the CachedRoute is expired or not.\n *\n * @param currentBlockNumber\n * @param optimistic\n */\n public notExpired(currentBlockNumber: number, optimistic = false): boolean {\n // When it's not optimistic, we only allow the route of the existing block.\n const blocksToLive = optimistic ? this.blocksToLive : 0;\n const blocksDifference = currentBlockNumber - this.blockNumber;\n\n return blocksDifference <= blocksToLive;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/providers/caching/route/model/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,iDAA+B;AAC/B,kDAAgC","sourcesContent":["export * from './cache-mode';\nexport * from './cached-route';\nexport * from './cached-routes';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"route-caching-provider.js","sourceRoot":"","sources":["../../../../../src/providers/caching/route/route-caching-provider.ts"],"names":[],"mappings":";;;AAOA,oDAK+B;AAG/B,mCAAoC;AAGpC;;;GAGG;AACH,MAAsB,qBAAqB;IAA3C;QACE;;;;;;;;;;;WAWG;QACa,mBAAc,GAAG,KAAK;QACpC,+EAA+E;QAC/E,OAAe,EACf,MAAgC,EAChC,aAAuB,EACvB,SAAoB,EACpB,SAAqB,EACrB,WAAmB,EACnB,UAAU,GAAG,KAAK,EAClB,iBAAqC,EACF,EAAE;YACrC,IACE,CAAC,MAAM,IAAI,CAAC,YAAY,CACtB,OAAO,EACP,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,CACV,CAAC,IAAI,iBAAS,CAAC,QAAQ,EACxB;gBACA,OAAO,SAAS,CAAC;aAClB;YAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAC5C,OAAO,EACP,MAAM,EACN,aAAa,EACb,SAAS,EACT,SAAS,EACT,WAAW,EACX,UAAU,EACV,iBAAiB,CAClB,CAAC;YAEF,OAAO,IAAI,CAAC,yBAAyB,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC;QAC9E,CAAC,CAAC;QAEF;;;;;;;;WAQG;QACa,mBAAc,GAAG,KAAK;QACpC,+EAA+E;QAC/E,YAA0B,EAC1B,MAAgC,EACd,EAAE;YACpB,IACE,CAAC,MAAM,IAAI,CAAC,4BAA4B,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;gBAC/D,iBAAS,CAAC,QAAQ,EAClB;gBACA,OAAO,KAAK,CAAC;aACd;YAED,YAAY,CAAC,YAAY,GAAG,MAAM,IAAI,CAAC,gBAAgB,CACrD,YAAY,EACZ,MAAM,CACP,CAAC;YAEF,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC,CAAC;IAqGJ,CAAC;IAnGC;;;;;OAKG;IACI,4BAA4B,CACjC,YAA0B,EAC1B,MAAgC;QAEhC,MAAM,aAAa,GACjB,YAAY,CAAC,SAAS,IAAI,oBAAS,CAAC,WAAW;YAC7C,CAAC,CAAC,YAAY,CAAC,WAAW;YAC1B,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC;QAE9B,OAAO,IAAI,CAAC,YAAY,CACtB,YAAY,CAAC,OAAO,EACpB,MAAM,EACN,aAAa,EACb,YAAY,CAAC,SAAS,EACtB,YAAY,CAAC,gBAAgB,CAC9B,CAAC;IACJ,CAAC;IAmBS,yBAAyB,CACjC,YAAsC,EACtC,WAAmB,EACnB,UAAmB;QAEnB,OAAO,CAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC;YACtD,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,SAAS,CAAC;IAChB,CAAC;CAkDF;AAlLD,sDAkLC","sourcesContent":["/**\n * Provider for getting currency data from a currency List.\n *\n * @export\n * @interface IRouteCachingProvider\n */\nimport { Protocol } from '@fewprotocol/router-sdk';\nimport {\n ChainId,\n Currency,\n CurrencyAmount,\n TradeType,\n} from '@fewprotocol/sdk-core';\n\nimport { AlphaRouterConfig } from '../../../routers';\nimport { CacheMode } from './model';\nimport { CachedRoutes } from './model/cached-routes';\n\n/**\n * Abstract class for a RouteCachingProvider.\n * Defines the base methods of how to interact with this interface, but not the implementation of how to cache.\n */\nexport abstract class IRouteCachingProvider {\n /**\n * Final implementation of the public `getCachedRoute` method, this is how code will interact with the implementation\n *\n * @public\n * @readonly\n * @param chainId\n * @param amount\n * @param quoteCurrency\n * @param tradeType\n * @param protocols\n * @param blockNumber\n */\n public readonly getCachedRoute = async (\n // Defined as a readonly member instead of a regular function to make it final.\n chainId: number,\n amount: CurrencyAmount<Currency>,\n quoteCurrency: Currency,\n tradeType: TradeType,\n protocols: Protocol[],\n blockNumber: number,\n optimistic = false,\n alphaRouterConfig?: AlphaRouterConfig\n ): Promise<CachedRoutes | undefined> => {\n if (\n (await this.getCacheMode(\n chainId,\n amount,\n quoteCurrency,\n tradeType,\n protocols\n )) == CacheMode.Darkmode\n ) {\n return undefined;\n }\n\n const cachedRoute = await this._getCachedRoute(\n chainId,\n amount,\n quoteCurrency,\n tradeType,\n protocols,\n blockNumber,\n optimistic,\n alphaRouterConfig\n );\n\n return this.filterExpiredCachedRoutes(cachedRoute, blockNumber, optimistic);\n };\n\n /**\n * Final implementation of the public `setCachedRoute` method.\n * This method will set the blockToLive in the CachedRoutes object before calling the internal method to insert in cache.\n *\n * @public\n * @readonly\n * @param cachedRoutes The route to cache.\n * @returns Promise<boolean> Indicates if the route was inserted into cache.\n */\n public readonly setCachedRoute = async (\n // Defined as a readonly member instead of a regular function to make it final.\n cachedRoutes: CachedRoutes,\n amount: CurrencyAmount<Currency>\n ): Promise<boolean> => {\n if (\n (await this.getCacheModeFromCachedRoutes(cachedRoutes, amount)) ==\n CacheMode.Darkmode\n ) {\n return false;\n }\n\n cachedRoutes.blocksToLive = await this._getBlocksToLive(\n cachedRoutes,\n amount\n );\n\n return this._setCachedRoute(cachedRoutes, amount);\n };\n\n /**\n * Returns the CacheMode for the given cachedRoutes and amount\n *\n * @param cachedRoutes\n * @param amount\n */\n public getCacheModeFromCachedRoutes(\n cachedRoutes: CachedRoutes,\n amount: CurrencyAmount<Currency>\n ): Promise<CacheMode> {\n const quoteCurrency =\n cachedRoutes.tradeType == TradeType.EXACT_INPUT\n ? cachedRoutes.currencyOut\n : cachedRoutes.currencyIn;\n\n return this.getCacheMode(\n cachedRoutes.chainId,\n amount,\n quoteCurrency,\n cachedRoutes.tradeType,\n cachedRoutes.protocolsCovered\n );\n }\n\n /**\n * Returns the CacheMode for the given combination of chainId, currencyIn, currencyOut and tradetype\n *\n * @public\n * @abstract\n * @param chainId\n * @param amount\n * @param tradeType\n */\n public abstract getCacheMode(\n chainId: ChainId,\n amount: CurrencyAmount<Currency>,\n quoteCurrency: Currency,\n tradeType: TradeType,\n protocols: Protocol[]\n ): Promise<CacheMode>;\n\n protected filterExpiredCachedRoutes(\n cachedRoutes: CachedRoutes | undefined,\n blockNumber: number,\n optimistic: boolean\n ): CachedRoutes | undefined {\n return cachedRoutes?.notExpired(blockNumber, optimistic)\n ? cachedRoutes\n : undefined;\n }\n\n /**\n * Internal function to fetch the CachedRoute from the cache.\n * Must be implemented.\n *\n * @param chainId\n * @param amount\n * @param quoteCurrency\n * @param tradeType\n * @param protocols\n * @protected\n */\n protected abstract _getCachedRoute(\n chainId: ChainId,\n amount: CurrencyAmount<Currency>,\n quoteCurrency: Currency,\n tradeType: TradeType,\n protocols: Protocol[],\n currentBlockNumber: number,\n optimistic: boolean,\n alphaRouterConfig?: AlphaRouterConfig\n ): Promise<CachedRoutes | undefined>;\n\n /**\n * Internal function to insert the CachedRoute into cache.\n * Must be implemented.\n *\n * @param cachedRoutes\n * @param amount\n * @protected\n */\n protected abstract _setCachedRoute(\n cachedRoutes: CachedRoutes,\n amount: CurrencyAmount<Currency>\n ): Promise<boolean>;\n\n /**\n * Internal function to getBlocksToLive for a given cachedRoute.\n * This function is called before attempting to insert the route into cache.\n * Must be implemented.\n *\n * @param cachedRoutes\n * @param amount\n * @protected\n */\n protected abstract _getBlocksToLive(\n cachedRoutes: CachedRoutes,\n amount: CurrencyAmount<Currency>\n ): Promise<number>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-gas-provider.js","sourceRoot":"","sources":["../../../src/providers/caching-gas-provider.ts"],"names":[],"mappings":";;;AAEA,qCAAkC;AAGlC,6DAAmE;AAEnE;;;;;GAKG;AACH,MAAa,yBAA0B,SAAQ,sCAAiB;IAI9D;;;;;OAKG;IACH,YACY,OAAgB,EAClB,gBAAmC,EACnC,KAAuB;QAE/B,KAAK,EAAE,CAAC;QAJE,YAAO,GAAP,OAAO,CAAS;QAClB,qBAAgB,GAAhB,gBAAgB,CAAmB;QACnC,UAAK,GAAL,KAAK,CAAkB;QAZzB,YAAO,GAAG,CAAC,OAAgB,EAAE,WAAmB,EAAE,EAAE,CAC1D,YAAY,OAAO,IAAI,WAAW,EAAE,CAAC;IAcvC,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,iBAAyB,EACzB,kBAA2B;QAE3B,+GAA+G;QAC/G,iDAAiD;QACjD,MAAM,iBAAiB,GAAG,kBAAkB,aAAlB,kBAAkB,cAAlB,kBAAkB,GAAI,iBAAiB,CAAC;QAClE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CACzC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAC9C,CAAC;QAEF,IAAI,cAAc,EAAE;YAClB,SAAG,CAAC,IAAI,CACN,EAAE,cAAc,EAAE,EAClB,2CAA2C,cAAc,CAAC,WAAW,GAAG,CACzE,CAAC;YAEF,OAAO,cAAc,CAAC;SACvB;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CACtD,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;QACF,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,iBAAiB,CAAC,EAC7C,QAAQ,CACT,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAjDD,8DAiDC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\n\nimport { log } from '../util/log';\n\nimport { ICache } from './cache';\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\n/**\n * Provider for getting gas price, with functionality for caching the results.\n *\n * @export\n * @class CachingV3SubgraphProvider\n */\nexport class CachingGasStationProvider extends IGasPriceProvider {\n private GAS_KEY = (chainId: ChainId, blockNumber: number) =>\n `gasPrice-${chainId}-${blockNumber}`;\n\n /**\n * Creates an instance of CachingGasStationProvider.\n * @param chainId The chain id to use.\n * @param gasPriceProvider The provider to use to get the gas price when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n protected chainId: ChainId,\n private gasPriceProvider: IGasPriceProvider,\n private cache: ICache<GasPrice>\n ) {\n super();\n }\n\n public override async getGasPrice(\n latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<GasPrice> {\n // If block number is specified in the request, we have to use that block number find any potential cache hits.\n // Otherwise, we can use the latest block number.\n const targetBlockNumber = requestBlockNumber ?? latestBlockNumber;\n const cachedGasPrice = await this.cache.get(\n this.GAS_KEY(this.chainId, targetBlockNumber)\n );\n\n if (cachedGasPrice) {\n log.info(\n { cachedGasPrice },\n `Got gas station price from local cache: ${cachedGasPrice.gasPriceWei}.`\n );\n\n return cachedGasPrice;\n }\n\n const gasPrice = await this.gasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n await this.cache.set(\n this.GAS_KEY(this.chainId, targetBlockNumber),\n gasPrice\n );\n\n return gasPrice;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-subgraph-provider.js","sourceRoot":"","sources":["../../../src/providers/caching-subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token } from '@fewprotocol/sdk-core';\n\nimport { SubgraphPool } from '../routers/alpha-router/functions/get-candidate-pools';\nimport { nativeOnChain, WRAPPED_NATIVE_CURRENCY } from '../util';\n\nimport { ICache } from './cache';\nimport { ProviderConfig } from './provider';\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 OP_OPTIMISM,\n SUSD_STORY_ODYSSEY,\n USDB_BLAST,\n USDB_BLAST_SEPOLIA,\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 USDCE_ZKSYNC,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_HYPER_MAINNET,\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';\nimport { V3SubgraphPool } from './v3/subgraph-provider';\n\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Currency[];\n};\n\nexport const BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n [ChainId.HYPER_MAINNET]: [\n nativeOnChain(ChainId.HYPER_MAINNET),\n WRAPPED_NATIVE_CURRENCY[ChainId.HYPER_MAINNET]!,\n USDT_HYPER_MAINNET,\n ],\n [ChainId.MAINNET]: [\n nativeOnChain(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]: [\n nativeOnChain(ChainId.SEPOLIA),\n WRAPPED_NATIVE_CURRENCY[ChainId.SEPOLIA]!,\n USDC_SEPOLIA,\n ],\n //v2 not deployed on [arbitrum, polygon, celo, gnosis, moonbeam, bnb, avalanche] and their testnets\n [ChainId.OPTIMISM]: [\n nativeOnChain(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 nativeOnChain(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]: [\n nativeOnChain(ChainId.POLYGON),\n USDC_POLYGON,\n WETH_POLYGON,\n WMATIC_POLYGON,\n ],\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 nativeOnChain(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]: [\n nativeOnChain(ChainId.BASE),\n WRAPPED_NATIVE_CURRENCY[ChainId.BASE],\n USDC_BASE,\n ],\n [ChainId.ZORA]: [\n nativeOnChain(ChainId.ZORA),\n WRAPPED_NATIVE_CURRENCY[ChainId.ZORA]!,\n ],\n [ChainId.ZORA_SEPOLIA]: [WRAPPED_NATIVE_CURRENCY[ChainId.ZORA_SEPOLIA]!],\n [ChainId.ROOTSTOCK]: [WRAPPED_NATIVE_CURRENCY[ChainId.ROOTSTOCK]!],\n [ChainId.BLAST]: [\n nativeOnChain(ChainId.BLAST),\n WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!,\n USDB_BLAST,\n ],\n [ChainId.ZKSYNC]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC]!,\n USDCE_ZKSYNC,\n USDC_ZKSYNC,\n ],\n [ChainId.WORLDCHAIN]: [\n nativeOnChain(ChainId.WORLDCHAIN),\n WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN]!,\n USDC_WORLDCHAIN,\n WLD_WORLDCHAIN,\n WBTC_WORLDCHAIN,\n ],\n [ChainId.UNICHAIN_SEPOLIA]: [\n nativeOnChain(ChainId.UNICHAIN_SEPOLIA),\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA]!,\n USDC_UNICHAIN_SEPOLIA,\n ],\n [ChainId.UNICHAIN]: [\n nativeOnChain(ChainId.UNICHAIN),\n WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!,\n DAI_UNICHAIN,\n USDC_UNICHAIN,\n ],\n [ChainId.BASE_SEPOLIA]: [\n nativeOnChain(ChainId.BASE_SEPOLIA),\n WRAPPED_NATIVE_CURRENCY[ChainId.BASE_SEPOLIA]!,\n USDC_BASE_SEPOLIA,\n ],\n [ChainId.MONAD_TESTNET]: [\n nativeOnChain(ChainId.MONAD_TESTNET),\n WRAPPED_NATIVE_CURRENCY[ChainId.MONAD_TESTNET]!,\n USDT_MONAD_TESTNET,\n ],\n [ChainId.SONEIUM]: [\n nativeOnChain(ChainId.SONEIUM),\n WRAPPED_NATIVE_CURRENCY[ChainId.SONEIUM]!,\n USDC_SONEIUM,\n ],\n // networks exclusive to ring swap\n [ChainId.BLAST_SEPOLIA]: [\n nativeOnChain(ChainId.BLAST_SEPOLIA),\n WRAPPED_NATIVE_CURRENCY[ChainId.BLAST_SEPOLIA]!,\n USDB_BLAST_SEPOLIA,\n ],\n [ChainId.STORY_ODYSSEY]: [\n nativeOnChain(ChainId.STORY_ODYSSEY),\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_ODYSSEY]!,\n SUSD_STORY_ODYSSEY,\n ],\n [ChainId.STORY_MAINNET]: [\n nativeOnChain(ChainId.STORY_MAINNET),\n WRAPPED_NATIVE_CURRENCY[ChainId.STORY_MAINNET]!,\n USDC_STORY_MAINNET,\n ],\n};\n\nexport interface IV3SubgraphProvider {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<V3SubgraphPool[]>;\n}\n\nexport interface ISubgraphProvider<TSubgraphPool extends SubgraphPool> {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]>;\n}\n\nexport abstract class CachingSubgraphProvider<\n TSubgraphPool extends SubgraphPool\n> implements ISubgraphProvider<TSubgraphPool> {\n private SUBGRAPH_KEY = (chainId: ChainId) =>\n `subgraph-pools-${this.protocol}-${chainId}`;\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 * @param protocol Subgraph protocol version\n */\n constructor(\n private chainId: ChainId,\n protected subgraphProvider: ISubgraphProvider<TSubgraphPool>,\n private cache: ICache<TSubgraphPool[]>,\n private protocol: Protocol\n ) { }\n\n public async getPools(): Promise<TSubgraphPool[]> {\n const cachedPools = await this.cache.get(this.SUBGRAPH_KEY(this.chainId));\n\n if (cachedPools) {\n return cachedPools;\n }\n\n const pools = await this.subgraphProvider.getPools();\n\n await this.cache.set(this.SUBGRAPH_KEY(this.chainId), pools);\n\n return pools;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-token-list-provider.js","sourceRoot":"","sources":["../../../src/providers/caching-token-list-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 { TokenInfo, TokenList } from '@uniswap/token-lists';\nimport axios from 'axios';\n\nimport { log } from '../util/log';\nimport { metric, MetricLoggerUnit } from '../util/metric';\n\nimport { ICache } from './cache';\nimport { ITokenProvider, TokenAccessor } from './token-provider';\n\n/**\n * Provider for getting token data from a Token List.\n *\n * @export\n * @interface ITokenListProvider\n */\nexport interface ITokenListProvider {\n hasTokenBySymbol(_symbol: string): Promise<boolean>;\n\n getTokenBySymbol(_symbol: string): Promise<Token | undefined>;\n\n hasTokenByAddress(address: string): Promise<boolean>;\n\n getTokenByAddress(address: string): Promise<Token | undefined>;\n}\n\nexport class CachingTokenListProvider\n implements ITokenProvider, ITokenListProvider\n{\n private CACHE_KEY = (tokenInfo: TokenInfo) =>\n `token-list-token-${this.chainId}/${this.tokenList.name}/${\n this.tokenList.timestamp\n }/${this.tokenList.version}/${tokenInfo.address.toLowerCase()}/${\n tokenInfo.decimals\n }/${tokenInfo.symbol}/${tokenInfo.name}`;\n\n private chainId: ChainId;\n private chainToTokenInfos: Map<string, TokenInfo[]>;\n private chainSymbolToTokenInfo: Map<string, TokenInfo>;\n private chainAddressToTokenInfo: Map<string, TokenInfo>;\n private tokenList: TokenList;\n\n private CHAIN_SYMBOL_KEY = (chainId: ChainId, symbol: string) =>\n `${chainId.toString()}/${symbol}`;\n private CHAIN_ADDRESS_KEY = (chainId: ChainId, address: string) =>\n `${chainId.toString()}/${address.toLowerCase()}`;\n\n /**\n * Creates an instance of CachingTokenListProvider.\n * Token metadata (e.g. symbol and decimals) generally don't change so can be cached indefinitely.\n *\n * @param chainId The chain id to use.\n * @param tokenList The token list to get the tokens from.\n * @param tokenCache Cache instance to hold cached tokens.\n */\n constructor(\n chainId: ChainId | number,\n tokenList: TokenList,\n private tokenCache: ICache<Token>\n ) {\n this.chainId = chainId;\n this.tokenList = tokenList;\n\n this.chainToTokenInfos = new Map();\n this.chainSymbolToTokenInfo = new Map();\n this.chainAddressToTokenInfo = new Map();\n\n for (const tokenInfo of this.tokenList.tokens) {\n const chainId = tokenInfo.chainId;\n const chainIdString = chainId.toString();\n const symbol = tokenInfo.symbol;\n const address = tokenInfo.address.toLowerCase();\n\n if (!this.chainToTokenInfos.has(chainIdString)) {\n this.chainToTokenInfos.set(chainIdString, []);\n }\n this.chainToTokenInfos.get(chainIdString)!.push(tokenInfo);\n\n this.chainSymbolToTokenInfo.set(\n this.CHAIN_SYMBOL_KEY(chainId, symbol),\n tokenInfo\n );\n this.chainAddressToTokenInfo.set(\n this.CHAIN_ADDRESS_KEY(chainId, address),\n tokenInfo\n );\n }\n }\n\n public static async fromTokenListURI(\n chainId: ChainId | number,\n tokenListURI: string,\n tokenCache: ICache<Token>\n ) {\n const now = Date.now();\n const tokenList = await this.buildTokenList(tokenListURI);\n\n metric.putMetric(\n 'TokenListLoad',\n Date.now() - now,\n MetricLoggerUnit.Milliseconds\n );\n\n return new CachingTokenListProvider(chainId, tokenList, tokenCache);\n }\n\n private static async buildTokenList(\n tokenListURI: string\n ): Promise<TokenList> {\n log.info(`Getting tokenList from ${tokenListURI}.`);\n const response = await axios.get(tokenListURI);\n log.info(`Got tokenList from ${tokenListURI}.`);\n\n const { data: tokenList, status } = response;\n\n if (status != 200) {\n log.error(\n { response },\n `Unabled to get token list from ${tokenListURI}.`\n );\n\n throw new Error(`Unable to get token list from ${tokenListURI}`);\n }\n\n return tokenList;\n }\n\n public static async fromTokenList(\n chainId: ChainId | number,\n tokenList: TokenList,\n tokenCache: ICache<Token>\n ) {\n const now = Date.now();\n\n const tokenProvider = new CachingTokenListProvider(\n chainId,\n tokenList,\n tokenCache\n );\n\n metric.putMetric(\n 'TokenListLoad',\n Date.now() - now,\n MetricLoggerUnit.Milliseconds\n );\n\n return tokenProvider;\n }\n\n /**\n * If no addresses array is specified, all tokens in the token list are\n * returned.\n *\n * @param _addresses (optional) The token addresses to get.\n * @returns Promise<TokenAccessor> A token accessor with methods for accessing the tokens.\n */\n public async getTokens(_addresses?: string[]): Promise<TokenAccessor> {\n const addressToToken: Map<string, Token> = new Map();\n const symbolToToken: Map<string, Token> = new Map();\n\n const addToken = (token?: Token) => {\n if (!token) return;\n addressToToken.set(token.address.toLowerCase(), token);\n if (token.symbol !== undefined) {\n symbolToToken.set(token.symbol.toLowerCase(), token);\n }\n };\n\n if (_addresses) {\n for (const address of _addresses) {\n const token = await this.getTokenByAddress(address);\n addToken(token);\n }\n } else {\n const chainTokens =\n this.chainToTokenInfos.get(this.chainId.toString()) ?? [];\n for (const info of chainTokens) {\n const token = await this.buildToken(info);\n addToken(token);\n }\n }\n\n return {\n getTokenByAddress: (address: string) =>\n addressToToken.get(address.toLowerCase()),\n getTokenBySymbol: (symbol: string) =>\n symbolToToken.get(symbol.toLowerCase()),\n getAllTokens: (): Token[] => {\n return Array.from(addressToToken.values());\n },\n };\n }\n\n public async hasTokenBySymbol(_symbol: string): Promise<boolean> {\n return this.chainSymbolToTokenInfo.has(\n this.CHAIN_SYMBOL_KEY(this.chainId, _symbol)\n );\n }\n\n public async getTokenBySymbol(_symbol: string): Promise<Token | undefined> {\n let symbol = _symbol;\n\n // We consider ETH as a regular ERC20 Token throughout this package. We don't use the NativeCurrency object from the sdk.\n // When we build the calldata for swapping we insert wrapping/unwrapping as needed.\n if (_symbol == 'ETH') {\n symbol = 'WETH';\n }\n\n const tokenInfo = this.chainSymbolToTokenInfo.get(\n this.CHAIN_SYMBOL_KEY(this.chainId, symbol)\n );\n\n if (!tokenInfo) {\n return undefined;\n }\n\n const token: Token = await this.buildToken(tokenInfo);\n\n return token;\n }\n\n public async hasTokenByAddress(address: string): Promise<boolean> {\n return this.chainAddressToTokenInfo.has(\n this.CHAIN_ADDRESS_KEY(this.chainId, address)\n );\n }\n\n public async getTokenByAddress(address: string): Promise<Token | undefined> {\n const tokenInfo = this.chainAddressToTokenInfo.get(\n this.CHAIN_ADDRESS_KEY(this.chainId, address)\n );\n\n if (!tokenInfo) {\n return undefined;\n }\n\n const token: Token = await this.buildToken(tokenInfo);\n\n return token;\n }\n\n private async buildToken(tokenInfo: TokenInfo): Promise<Token> {\n const cacheKey = this.CACHE_KEY(tokenInfo);\n const cachedToken = await this.tokenCache.get(cacheKey);\n\n if (cachedToken) {\n return cachedToken;\n }\n\n const token = new Token(\n this.chainId,\n tokenInfo.address,\n tokenInfo.decimals,\n tokenInfo.symbol,\n tokenInfo.name\n );\n\n await this.tokenCache.set(cacheKey, token);\n\n return token;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-token-provider.js","sourceRoot":"","sources":["../../../src/providers/caching-token-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { log, WRAPPED_NATIVE_CURRENCY } from '../util';\n\nimport { ICache } from './cache';\nimport {\n BTC_BNB,\n BUSD_BNB,\n CELO,\n CELO_ALFAJORES,\n CEUR_CELO,\n CUSD_CELO,\n CUSD_CELO_ALFAJORES,\n DAI_ARBITRUM,\n DAI_ARBITRUM_SEPOLIA,\n DAI_AVAX,\n DAI_BNB,\n DAI_CELO,\n DAI_CELO_ALFAJORES,\n DAI_MAINNET,\n DAI_MOONBEAM,\n DAI_OPTIMISM,\n DAI_OPTIMISM_GOERLI,\n DAI_OPTIMISM_SEPOLIA,\n DAI_POLYGON_MUMBAI,\n DAI_UNICHAIN,\n ETH_BNB,\n ITokenProvider,\n TokenAccessor,\n USDB_BLAST,\n USDC_ARBITRUM,\n USDC_ARBITRUM_GOERLI,\n USDC_ARBITRUM_SEPOLIA,\n USDC_AVAX,\n USDC_BASE,\n USDC_BASE_SEPOLIA,\n USDC_BNB,\n USDC_ETHEREUM_GNOSIS,\n USDC_MAINNET,\n USDC_MOONBEAM,\n USDC_OPTIMISM,\n USDC_OPTIMISM_GOERLI,\n USDC_OPTIMISM_SEPOLIA,\n USDC_POLYGON,\n USDC_SEPOLIA,\n USDC_SONEIUM,\n USDC_UNICHAIN,\n USDC_WORLDCHAIN,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n USDT_OPTIMISM_GOERLI,\n USDT_OPTIMISM_SEPOLIA,\n WBTC_ARBITRUM,\n WBTC_MAINNET,\n WBTC_MOONBEAM,\n WBTC_OPTIMISM,\n WBTC_OPTIMISM_GOERLI,\n WBTC_OPTIMISM_SEPOLIA,\n WBTC_WORLDCHAIN,\n WLD_WORLDCHAIN,\n WMATIC_POLYGON,\n WMATIC_POLYGON_MUMBAI,\n} from './token-provider';\n\n// These tokens will added to the Token cache on initialization.\nexport const CACHE_SEED_TOKENS: {\n [chainId in ChainId]?: { [symbol: string]: Token };\n} = {\n [ChainId.MAINNET]: {\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]!,\n USDC: USDC_MAINNET,\n USDT: USDT_MAINNET,\n WBTC: WBTC_MAINNET,\n DAI: DAI_MAINNET,\n // This token stores its symbol as bytes32, therefore can not be fetched on-chain using\n // our token providers.\n // This workaround adds it to the cache, so we won't try to fetch it on-chain.\n RING: new Token(\n ChainId.MAINNET,\n '0x9469D013805bFfB7D3DEBe5E7839237e535ec483',\n 18,\n 'RING',\n 'RING'\n ),\n },\n [ChainId.SEPOLIA]: {\n USDC: USDC_SEPOLIA,\n },\n [ChainId.OPTIMISM]: {\n USDC: USDC_OPTIMISM,\n USDT: USDT_OPTIMISM,\n WBTC: WBTC_OPTIMISM,\n DAI: DAI_OPTIMISM,\n },\n [ChainId.OPTIMISM_GOERLI]: {\n USDC: USDC_OPTIMISM_GOERLI,\n USDT: USDT_OPTIMISM_GOERLI,\n WBTC: WBTC_OPTIMISM_GOERLI,\n DAI: DAI_OPTIMISM_GOERLI,\n },\n [ChainId.OPTIMISM_SEPOLIA]: {\n USDC: USDC_OPTIMISM_SEPOLIA,\n USDT: USDT_OPTIMISM_SEPOLIA,\n WBTC: WBTC_OPTIMISM_SEPOLIA,\n DAI: DAI_OPTIMISM_SEPOLIA,\n },\n [ChainId.ARBITRUM_ONE]: {\n USDC: USDC_ARBITRUM,\n USDT: USDT_ARBITRUM,\n WBTC: WBTC_ARBITRUM,\n DAI: DAI_ARBITRUM,\n },\n [ChainId.ARBITRUM_GOERLI]: {\n USDC: USDC_ARBITRUM_GOERLI,\n },\n [ChainId.ARBITRUM_SEPOLIA]: {\n USDC: USDC_ARBITRUM_SEPOLIA,\n DAI: DAI_ARBITRUM_SEPOLIA,\n },\n [ChainId.POLYGON]: {\n WMATIC: WMATIC_POLYGON,\n USDC: USDC_POLYGON,\n },\n [ChainId.POLYGON_MUMBAI]: {\n WMATIC: WMATIC_POLYGON_MUMBAI,\n DAI: DAI_POLYGON_MUMBAI,\n },\n [ChainId.CELO]: {\n CELO: CELO,\n CUSD: CUSD_CELO,\n CEUR: CEUR_CELO,\n DAI: DAI_CELO,\n },\n [ChainId.CELO_ALFAJORES]: {\n CELO: CELO_ALFAJORES,\n CUSD: CUSD_CELO_ALFAJORES,\n CEUR: CUSD_CELO_ALFAJORES,\n DAI: DAI_CELO_ALFAJORES,\n },\n [ChainId.GNOSIS]: {\n WXDAI: WRAPPED_NATIVE_CURRENCY[ChainId.GNOSIS],\n USDC_ETHEREUM_GNOSIS: USDC_ETHEREUM_GNOSIS,\n },\n [ChainId.MOONBEAM]: {\n USDC: USDC_MOONBEAM,\n DAI: DAI_MOONBEAM,\n WBTC: WBTC_MOONBEAM,\n WGLMR: WRAPPED_NATIVE_CURRENCY[ChainId.MOONBEAM],\n },\n [ChainId.BNB]: {\n USDC: USDC_BNB,\n USDT: USDT_BNB,\n BUSD: BUSD_BNB,\n ETH: ETH_BNB,\n DAI: DAI_BNB,\n BTC: BTC_BNB,\n WBNB: WRAPPED_NATIVE_CURRENCY[ChainId.BNB],\n },\n [ChainId.AVALANCHE]: {\n USDC: USDC_AVAX,\n DAI: DAI_AVAX,\n WAVAX: WRAPPED_NATIVE_CURRENCY[ChainId.AVALANCHE],\n },\n [ChainId.BASE]: {\n USDC: USDC_BASE,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.BASE],\n },\n [ChainId.BLAST]: {\n USDB: USDB_BLAST,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.BLAST],\n },\n [ChainId.ZORA]: {\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.ZORA],\n },\n [ChainId.ZKSYNC]: {\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.ZKSYNC],\n },\n [ChainId.WORLDCHAIN]: {\n USDC: USDC_WORLDCHAIN,\n WLD: WLD_WORLDCHAIN,\n WBTC: WBTC_WORLDCHAIN,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.WORLDCHAIN],\n },\n [ChainId.UNICHAIN_SEPOLIA]: {\n USDC: USDC_SEPOLIA,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN_SEPOLIA],\n },\n [ChainId.MONAD_TESTNET]: {\n USDT: USDT_MONAD_TESTNET,\n WMON: WRAPPED_NATIVE_CURRENCY[ChainId.MONAD_TESTNET],\n },\n [ChainId.BASE_SEPOLIA]: {\n USDC: USDC_BASE_SEPOLIA,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.BASE_SEPOLIA],\n },\n [ChainId.UNICHAIN]: {\n DAI: DAI_UNICHAIN,\n USDC: USDC_UNICHAIN,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN],\n },\n [ChainId.SONEIUM]: {\n USDC: USDC_SONEIUM,\n WETH: WRAPPED_NATIVE_CURRENCY[ChainId.SONEIUM],\n },\n // Currently we do not have providers for Moonbeam mainnet or Gnosis testnet\n};\n\n/**\n * Provider for getting token metadata that falls back to a different provider\n * in the event of failure.\n *\n * @export\n * @class CachingTokenProviderWithFallback\n */\nexport class CachingTokenProviderWithFallback implements ITokenProvider {\n private CACHE_KEY = (chainId: ChainId, address: string) =>\n `token-${chainId}-${address}`;\n\n constructor(\n protected chainId: ChainId,\n // Token metadata (e.g. symbol and decimals) don't change so can be cached indefinitely.\n // Constructing a new token object is slow as sdk-core does checksumming.\n private tokenCache: ICache<Token>,\n protected primaryTokenProvider: ITokenProvider,\n protected fallbackTokenProvider?: ITokenProvider\n ) {}\n\n public async getTokens(_addresses: string[]): Promise<TokenAccessor> {\n const seedTokens = CACHE_SEED_TOKENS[this.chainId];\n\n if (seedTokens) {\n for (const token of Object.values(seedTokens)) {\n await this.tokenCache.set(\n this.CACHE_KEY(this.chainId, token.address.toLowerCase()),\n token\n );\n }\n }\n\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 const addressesToFindInPrimary = [];\n const addressesToFindInSecondary = [];\n\n for (const address of addresses) {\n if (await this.tokenCache.has(this.CACHE_KEY(this.chainId, address))) {\n addressToToken[address.toLowerCase()] = (await this.tokenCache.get(\n this.CACHE_KEY(this.chainId, address)\n ))!;\n symbolToToken[addressToToken[address]!.symbol!] =\n (await this.tokenCache.get(this.CACHE_KEY(this.chainId, address)))!;\n } else {\n addressesToFindInPrimary.push(address);\n }\n }\n\n log.info(\n { addressesToFindInPrimary },\n `Found ${addresses.length - addressesToFindInPrimary.length} out of ${\n addresses.length\n } tokens in local cache. ${\n addressesToFindInPrimary.length > 0\n ? `Checking primary token provider for ${addressesToFindInPrimary.length} tokens`\n : ``\n }\n `\n );\n\n if (addressesToFindInPrimary.length > 0) {\n const primaryTokenAccessor = await this.primaryTokenProvider.getTokens(\n addressesToFindInPrimary\n );\n\n for (const address of addressesToFindInPrimary) {\n const token = primaryTokenAccessor.getTokenByAddress(address);\n\n if (token) {\n addressToToken[address.toLowerCase()] = token;\n symbolToToken[addressToToken[address]!.symbol!] = token;\n await this.tokenCache.set(\n this.CACHE_KEY(this.chainId, address.toLowerCase()),\n addressToToken[address]!\n );\n } else {\n addressesToFindInSecondary.push(address);\n }\n }\n\n log.info(\n { addressesToFindInSecondary },\n `Found ${\n addressesToFindInPrimary.length - addressesToFindInSecondary.length\n } tokens in primary. ${\n this.fallbackTokenProvider\n ? `Checking secondary token provider for ${addressesToFindInSecondary.length} tokens`\n : `No fallback token provider specified. About to return.`\n }`\n );\n }\n\n if (this.fallbackTokenProvider && addressesToFindInSecondary.length > 0) {\n const secondaryTokenAccessor = await this.fallbackTokenProvider.getTokens(\n addressesToFindInSecondary\n );\n\n for (const address of addressesToFindInSecondary) {\n const token = secondaryTokenAccessor.getTokenByAddress(address);\n if (token) {\n addressToToken[address.toLowerCase()] = token;\n symbolToToken[addressToToken[address]!.symbol!] = token;\n await this.tokenCache.set(\n this.CACHE_KEY(this.chainId, address.toLowerCase()),\n addressToToken[address]!\n );\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eip-1559-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/eip-1559-gas-price-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport _ from 'lodash';\n\nimport { log } from '../util/log';\n\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\nexport type RawFeeHistoryResponse = {\n baseFeePerGas: string[];\n gasUsedRatio: number[];\n oldestBlock: string;\n reward: string[];\n};\n\nexport type FeeHistoryResponse = {\n baseFeePerGas: BigNumber[];\n gasUsedRatio: number[];\n oldestBlock: BigNumber;\n reward: BigNumber[];\n};\n\n// We get the Xth percentile of priority fees for transactions successfully included in previous blocks.\nconst DEFAULT_PRIORITY_FEE_PERCENTILE = 50;\n// Infura docs say only past 4 blocks guaranteed to be available: https://infura.io/docs/ethereum#operation/eth_feeHistory\nconst DEFAULT_BLOCKS_TO_LOOK_BACK = 4;\n\n/**\n * Computes a gas estimate using on-chain data from the eth_feeHistory RPC endpoint.\n *\n * Takes the average priority fee from the past `blocksToConsider` blocks, and adds it\n * to the current base fee.\n *\n * @export\n * @class EIP1559GasPriceProvider\n */\nexport class EIP1559GasPriceProvider extends IGasPriceProvider {\n constructor(\n protected provider: JsonRpcProvider,\n private priorityFeePercentile: number = DEFAULT_PRIORITY_FEE_PERCENTILE,\n private blocksToConsider: number = DEFAULT_BLOCKS_TO_LOOK_BACK\n ) {\n super();\n }\n\n public override async getGasPrice(\n _latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<GasPrice> {\n const feeHistoryRaw = (await this.provider.send('eth_feeHistory', [\n /**\n * @fix Use BigNumber.from(this.blocksToConsider).toHexString() after hardhat adds support\n * @see https://github.com/NomicFoundation/hardhat/issues/1585 .___.\n */\n BigNumber.from(this.blocksToConsider).toHexString().replace('0x0', '0x'),\n // If the block number is not specified, we have to send hardcoded 'latest' to infura RPC\n // because Infura node pool is eventually consistent and may not have the latest block from our block number.\n // See https://uniswapteam.slack.com/archives/C023A7JDTJP/p1702485038251449?thread_ts=1702471203.519869&cid=C023A7JDTJP\n requestBlockNumber\n ? BigNumber.from(requestBlockNumber).toHexString().replace('0x0', '0x')\n : 'latest',\n [this.priorityFeePercentile],\n ])) as RawFeeHistoryResponse;\n\n const feeHistory: FeeHistoryResponse = {\n baseFeePerGas: _.map(feeHistoryRaw.baseFeePerGas, (b) =>\n BigNumber.from(b)\n ),\n gasUsedRatio: feeHistoryRaw.gasUsedRatio,\n oldestBlock: BigNumber.from(feeHistoryRaw.oldestBlock),\n reward: _.map(feeHistoryRaw.reward, (b) => BigNumber.from(b[0])),\n };\n\n const nextBlockBaseFeePerGas =\n feeHistory.baseFeePerGas[feeHistory.baseFeePerGas.length - 1]!;\n\n const averagePriorityFeePerGas = _.reduce(\n feeHistory.reward,\n (sum: BigNumber, cur: BigNumber) => sum.add(cur),\n BigNumber.from(0)\n ).div(feeHistory.reward.length);\n\n log.info(\n {\n feeHistory,\n feeHistoryReadable: {\n baseFeePerGas: _.map(feeHistory.baseFeePerGas, (f) => f.toString()),\n oldestBlock: feeHistory.oldestBlock.toString(),\n reward: _.map(feeHistory.reward, (r) => r.toString()),\n },\n nextBlockBaseFeePerGas: nextBlockBaseFeePerGas.toString(),\n averagePriorityFeePerGas: averagePriorityFeePerGas.toString(),\n },\n 'Got fee history from provider and computed gas estimate'\n );\n\n const gasPriceWei = nextBlockBaseFeePerGas.add(averagePriorityFeePerGas);\n\n const blockNumber = feeHistory.oldestBlock.add(this.blocksToConsider);\n\n log.info(\n `Estimated gas price in wei: ${gasPriceWei} as of block ${blockNumber.toString()}`\n );\n\n return { gasPriceWei: gasPriceWei };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eth-estimate-gas-provider.js","sourceRoot":"","sources":["../../../src/providers/eth-estimate-gas-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport {\n GasModelProviderConfig,\n SwapOptions,\n SwapRoute,\n SwapType,\n} from '../routers';\nimport { BEACON_CHAIN_DEPOSIT_ADDRESS, log } from '../util';\nimport {\n calculateGasUsed,\n initSwapRouteFromExisting,\n logGasEstimationVsSimulationMetrics,\n} from '../util/gas-factory-helpers';\n\nimport { IPortionProvider } from './portion-provider';\nimport { ProviderConfig } from './provider';\nimport { SimulationStatus, Simulator } from './simulation-provider';\nimport { IV2PoolProvider } from './v2/pool-provider';\nimport { IV3PoolProvider } from './v3/pool-provider';\nimport { IV4PoolProvider } from './v4/pool-provider';\n\n// We multiply eth estimate gas by this to add a buffer for gas limits\nconst DEFAULT_ESTIMATE_MULTIPLIER = 1.2;\n\nexport class EthEstimateGasSimulator extends Simulator {\n v2PoolProvider: IV2PoolProvider;\n v3PoolProvider: IV3PoolProvider;\n v4PoolProvider: IV4PoolProvider;\n private overrideEstimateMultiplier: { [chainId in ChainId]?: number };\n\n constructor(\n chainId: ChainId,\n provider: JsonRpcProvider,\n v2PoolProvider: IV2PoolProvider,\n v3PoolProvider: IV3PoolProvider,\n v4PoolProvider: IV4PoolProvider,\n portionProvider: IPortionProvider,\n overrideEstimateMultiplier?: { [chainId in ChainId]?: number }\n ) {\n super(provider, portionProvider, chainId);\n this.v2PoolProvider = v2PoolProvider;\n this.v3PoolProvider = v3PoolProvider;\n this.v4PoolProvider = v4PoolProvider;\n this.overrideEstimateMultiplier = overrideEstimateMultiplier ?? {};\n }\n\n async ethEstimateGas(\n fromAddress: string,\n swapOptions: SwapOptions,\n route: SwapRoute,\n providerConfig?: ProviderConfig\n ): Promise<SwapRoute> {\n const currencyIn = route.trade.inputAmount.currency;\n let estimatedGasUsed: BigNumber;\n if (swapOptions.type == SwapType.UNIVERSAL_ROUTER) {\n if (currencyIn.isNative && this.chainId == ChainId.MAINNET) {\n // w/o this gas estimate differs by a lot depending on if user holds enough native balance\n // always estimate gas as if user holds enough balance\n // so that gas estimate is consistent for UniswapX\n fromAddress = BEACON_CHAIN_DEPOSIT_ADDRESS;\n }\n log.info(\n { addr: fromAddress, methodParameters: route.methodParameters },\n 'Simulating using eth_estimateGas on Universal Router'\n );\n try {\n estimatedGasUsed = await this.provider.estimateGas({\n data: route.methodParameters!.calldata,\n to: route.methodParameters!.to,\n from: fromAddress,\n value: BigNumber.from(\n currencyIn.isNative ? route.methodParameters!.value : '0'\n ),\n });\n } catch (e) {\n log.error({ e }, 'Error estimating gas');\n return {\n ...route,\n simulationStatus: SimulationStatus.Failed,\n };\n }\n } else if (swapOptions.type == SwapType.SWAP_ROUTER_02) {\n try {\n estimatedGasUsed = await this.provider.estimateGas({\n data: route.methodParameters!.calldata,\n to: route.methodParameters!.to,\n from: fromAddress,\n value: BigNumber.from(\n currencyIn.isNative ? route.methodParameters!.value : '0'\n ),\n });\n } catch (e) {\n log.error({ e }, 'Error estimating gas');\n return {\n ...route,\n simulationStatus: SimulationStatus.Failed,\n };\n }\n } else {\n throw new Error(`Unsupported swap type ${swapOptions}`);\n }\n\n estimatedGasUsed = this.adjustGasEstimate(estimatedGasUsed);\n log.info(\n {\n methodParameters: route.methodParameters,\n estimatedGasUsed: estimatedGasUsed.toString(),\n },\n 'Simulated using eth_estimateGas on SwapRouter02'\n );\n\n const {\n estimatedGasUsedUSD,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedGasToken,\n quoteGasAdjusted,\n } = await calculateGasUsed(\n route.quote.currency.chainId,\n route,\n estimatedGasUsed,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.provider,\n providerConfig\n );\n\n logGasEstimationVsSimulationMetrics(route, estimatedGasUsed, this.chainId);\n\n return {\n ...initSwapRouteFromExisting(\n route,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.v4PoolProvider,\n this.portionProvider,\n quoteGasAdjusted,\n estimatedGasUsed,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedUSD,\n swapOptions,\n estimatedGasUsedGasToken,\n providerConfig\n ),\n simulationStatus: SimulationStatus.Succeeded,\n };\n }\n\n private adjustGasEstimate(gasLimit: BigNumber): BigNumber {\n const estimateMultiplier =\n this.overrideEstimateMultiplier[this.chainId] ??\n DEFAULT_ESTIMATE_MULTIPLIER;\n\n const adjustedGasEstimate = BigNumber.from(gasLimit)\n .mul(estimateMultiplier * 100)\n .div(100);\n\n return adjustedGasEstimate;\n }\n\n protected async simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n _providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n const inputAmount = swapRoute.trade.inputAmount;\n if (\n inputAmount.currency.isNative ||\n (await this.checkTokenApproved(\n fromAddress,\n inputAmount,\n swapOptions,\n this.provider\n ))\n ) {\n return await this.ethEstimateGas(\n fromAddress,\n swapOptions,\n swapRoute,\n _providerConfig\n );\n } else {\n log.info('Token not approved, skipping simulation');\n return {\n ...swapRoute,\n simulationStatus: SimulationStatus.NotApproved,\n };\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eth-gas-station-info-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/eth-gas-station-info-gas-price-provider.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAqD;AACrD,8DAAgC;AAChC,kDAA0B;AAE1B,qCAAkC;AAElC,6DAAmE;AAiBnE,MAAa,yBAA0B,SAAQ,sCAAiB;IAE9D,YAAY,GAAW;QACrB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,kBAA0B,EAC1B,mBAA4B;QAE5B,MAAM,QAAQ,GAAG,MAAM,IAAA,qBAAK,EAC1B,KAAK,IAAI,EAAE;YACT,OAAO,eAAK,CAAC,GAAG,CAAwB,IAAI,CAAC,GAAG,CAAC,CAAC;QACpD,CAAC,EACD,EAAE,OAAO,EAAE,CAAC,EAAE,CACf,CAAC;QAEF,MAAM,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;QAEpD,IAAI,MAAM,IAAI,GAAG,EAAE;YACjB,SAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,iCAAiC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;YAEtE,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;SAC7D;QAED,SAAG,CAAC,IAAI,CACN,EAAE,gBAAgB,EAAE,EACpB,kEAAkE,CACnE,CAAC;QAEF,gDAAgD;QAChD,MAAM,WAAW,GAAG,qBAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;aACtD,GAAG,CAAC,qBAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;aACvB,GAAG,CAAC,qBAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAElC,SAAG,CAAC,IAAI,CACN,qBAAqB,WAAW,gBAAgB,gBAAgB,CAAC,QAAQ,EAAE,CAC5E,CAAC;QAEF,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;IACtC,CAAC;CACF;AA1CD,8DA0CC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport retry from 'async-retry';\nimport axios from 'axios';\n\nimport { log } from '../util/log';\n\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\n// Gas prices from ethgasstation are in x10 Gwei. Must divide by 10 to use.\nexport type ETHGasStationResponse = {\n fast: number;\n fastest: number;\n safeLow: number;\n average: number;\n block_time: number;\n blockNum: number;\n speed: number;\n safeLowWait: number;\n avgWait: number;\n fastWait: number;\n fastestWait: number;\n};\n\nexport class ETHGasStationInfoProvider extends IGasPriceProvider {\n private url: string;\n constructor(url: string) {\n super();\n this.url = url;\n }\n\n public override async getGasPrice(\n _latestBlockNumber: number,\n _requestBlockNumber?: number\n ): Promise<GasPrice> {\n const response = await retry(\n async () => {\n return axios.get<ETHGasStationResponse>(this.url);\n },\n { retries: 1 }\n );\n\n const { data: gasPriceResponse, status } = response;\n\n if (status != 200) {\n log.error({ response }, `Unabled to get gas price from ${this.url}.`);\n\n throw new Error(`Unable to get gas price from ${this.url}`);\n }\n\n log.info(\n { gasPriceResponse },\n 'Gas price response from API. About to parse \"fast\" to big number'\n );\n\n // Gas prices from ethgasstation are in GweiX10.\n const gasPriceWei = BigNumber.from(gasPriceResponse.fast)\n .div(BigNumber.from(10))\n .mul(BigNumber.from(10).pow(9));\n\n log.info(\n `Gas price in wei: ${gasPriceWei} as of block ${gasPriceResponse.blockNum}`\n );\n\n return { gasPriceWei: gasPriceWei };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-caching-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-caching-pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/v2-sdk';\nimport _ from 'lodash';\n\nimport { log } from '../../util/log';\n\nimport { ICache } from '../cache';\nimport { ProviderConfig } from '../provider';\nimport { RingFewV2PoolAccessor, IRingV2PoolProvider } from './ring-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 RingFewCachingV2PoolProvider implements IRingV2PoolProvider {\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: IRingV2PoolProvider,\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<RingFewV2PoolAccessor> {\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-caching-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-caching-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AAGnD,4EAAuE;AAKvE;;;;;GAKG;AACH,MAAa,gCACX,SAAQ,mDAA2C;IAGnD;;;;;OAKG;IACH,YACE,OAAgB,EAChB,gBAAyC,EACzC,KAAmC;QAEnC,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,4EAiBC","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 { IRingV2SubgraphProvider, RingV2SubgraphPool } from './ring-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 RingFewCachingV2SubgraphProvider\n extends CachingSubgraphProvider<RingV2SubgraphPool>\n implements IRingV2SubgraphProvider\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: IRingV2SubgraphProvider,\n cache: ICache<RingV2SubgraphPool[]>\n ) {\n super(chainId, subgraphProvider, cache, Protocol.V2);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { Pair } from '@fewprotocol/v2-sdk';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\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 IRingV2PoolProvider\n */\nexport interface IRingV2PoolProvider {\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<RingFewV2PoolAccessor>;\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 RingFewV2PoolAccessor = {\n getPool: (tokenA: Token, tokenB: Token) => Pair | undefined;\n getPoolByAddress: (address: string) => Pair | undefined;\n getAllPools: () => Pair[];\n};\n\nexport type RingV2PoolRetryOptions = RetryOptions;\n\nexport class RingV2PoolProvider implements IRingV2PoolProvider {\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 RingV2PoolProvider.\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: RingV2PoolRetryOptions = {\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<RingFewV2PoolAccessor> {\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-quote-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-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/v2-sdk';\n\nimport { RingFewV2Route } 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 RingFewV2AmountQuote = {\n amount: CurrencyAmount;\n quote: BigNumber | null;\n};\n\nexport type RingFewV2RouteWithQuotes = [RingFewV2Route, RingFewV2AmountQuote[]];\n\nexport interface IRingV2QuoteProvider {\n getQuotesManyExactIn(\n amountIns: CurrencyAmount[],\n routes: RingFewV2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: RingFewV2RouteWithQuotes[] }>;\n\n getQuotesManyExactOut(\n amountOuts: CurrencyAmount[],\n routes: RingFewV2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: RingFewV2RouteWithQuotes[] }>;\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 RingV2QuoteProvider implements IRingV2QuoteProvider {\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: RingFewV2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: RingFewV2RouteWithQuotes[] }> {\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: RingFewV2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: RingFewV2RouteWithQuotes[] }> {\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: RingFewV2Route[],\n tradeType: TradeType,\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: RingFewV2RouteWithQuotes[] }> {\n const routesWithQuotes: RingFewV2RouteWithQuotes[] = [];\n\n const debugStrs: string[] = [];\n for (const route of routes) {\n const amountQuotes: RingFewV2AmountQuote[] = [];\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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-static-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-static-subgraph-provider.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAuD;AACvD,gDAA2C;AAC3C,oDAAuB;AAEvB,8CAA4D;AAC5D,8CAAgE;AAChE,wCAAqC;AACrC,sDAyE2B;AAQ3B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA+GI;AAES,QAAA,iCAAiC,GAAmB;IAC/D,CAAC,kBAAO,CAAC,OAAO,CAAC,EAAE;QACjB,oCAA2B,CAAC,kBAAO,CAAC,OAAO,CAAE;QAC7C,gCAAe;QACf,iCAAgB;QAChB,iCAAgB;QAChB,iCAAgB;QAChB,gCAAe;KAChB;IACD,CAAC,kBAAO,CAAC,aAAa,CAAC,EAAE;QACvB,oCAA2B,CAAC,kBAAO,CAAC,aAAa,CAAE;QACnD,uCAAsB;KACvB;IACD,CAAC,kBAAO,CAAC,MAAM,CAAC,EAAE,CAAC,oCAA2B,CAAC,kBAAO,CAAC,MAAM,CAAE,CAAC;IAChE,CAAC,kBAAO,CAAC,OAAO,CAAC,EAAE,CAAC,oCAA2B,CAAC,kBAAO,CAAC,OAAO,CAAE,EAAE,iCAAgB,CAAC;IACpF,6GAA6G;IAC7G,CAAC,kBAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,gCAAuB,CAAC,kBAAO,CAAC,QAAQ,CAAE;QAC1C,8BAAa;QACb,6BAAY;QACZ,8BAAa;QACb,8BAAa;QACb,4BAAW;KACZ;IACD,CAAC,kBAAO,CAAC,YAAY,CAAC,EAAE;QACtB,oCAA2B,CAAC,kBAAO,CAAC,YAAY,CAAE;QAClD,kCAAiB;QACjB,iCAAgB;QAChB,kCAAiB;QACjB,kCAAiB;KAClB;IACD,CAAC,kBAAO,CAAC,eAAe,CAAC,EAAE,EAAE;IAC7B,CAAC,kBAAO,CAAC,gBAAgB,CAAC,EAAE;QAC1B,oCAA2B,CAAC,kBAAO,CAAC,gBAAgB,CAAE;QACtD,oCAAmB;QACnB,oCAAmB;KACpB;IACD,CAAC,kBAAO,CAAC,eAAe,CAAC,EAAE,EAAE;IAC7B,CAAC,kBAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC9B,CAAC,kBAAO,CAAC,OAAO,CAAC,EAAE,CAAC,6BAAY,EAAE,6BAAY,EAAE,+BAAc,CAAC;IAC/D,CAAC,kBAAO,CAAC,cAAc,CAAC,EAAE,EAAE;IAC5B,CAAC,kBAAO,CAAC,IAAI,CAAC,EAAE,CAAC,qBAAI,EAAE,0BAAS,EAAE,0BAAS,EAAE,yBAAQ,CAAC;IACtD,CAAC,kBAAO,CAAC,cAAc,CAAC,EAAE,EAAE;IAC5B,CAAC,kBAAO,CAAC,MAAM,CAAC,EAAE,EAAE;IACpB,CAAC,kBAAO,CAAC,QAAQ,CAAC,EAAE;QAClB,gCAAuB,CAAC,kBAAO,CAAC,QAAQ,CAAC;QACzC,6BAAY;QACZ,8BAAa;QACb,8BAAa;KACd;IACD,CAAC,kBAAO,CAAC,GAAG,CAAC,EAAE;QACb,oCAA2B,CAAC,kBAAO,CAAC,GAAG,CAAE;KAC1C;IACD,CAAC,kBAAO,CAAC,SAAS,CAAC,EAAE;QACnB,gCAAuB,CAAC,kBAAO,CAAC,SAAS,CAAC;QAC1C,0BAAS;QACT,yBAAQ;KACT;IACD,CAAC,kBAAO,CAAC,WAAW,CAAC,EAAE,EAAE;IACzB,CAAC,kBAAO,CAAC,IAAI,CAAC,EAAE,CAAC,oCAA2B,CAAC,kBAAO,CAAC,IAAI,CAAE,EAAE,6BAAY,EAAE,8BAAa,EAAE,8BAAa,CAAC;IACxG,CAAC,kBAAO,CAAC,IAAI,CAAC,EAAE,CAAC,gCAAuB,CAAC,kBAAO,CAAC,IAAI,CAAE,CAAC;IACxD,CAAC,kBAAO,CAAC,YAAY,CAAC,EAAE,CAAC,gCAAuB,CAAC,kBAAO,CAAC,YAAY,CAAE,CAAC;IACxE,CAAC,kBAAO,CAAC,SAAS,CAAC,EAAE,CAAC,gCAAuB,CAAC,kBAAO,CAAC,SAAS,CAAE,CAAC;IAClE,CAAC,kBAAO,CAAC,KAAK,CAAC,EAAE,CAAC,oCAA2B,CAAC,kBAAO,CAAC,KAAK,CAAE,EAAE,+BAAc,CAAC;IAC9E,CAAC,kBAAO,CAAC,MAAM,CAAC,EAAE;QAChB,gCAAuB,CAAC,kBAAO,CAAC,MAAM,CAAE;QACxC,6BAAY;QACZ,4BAAW;KACZ;IACD,CAAC,kBAAO,CAAC,UAAU,CAAC,EAAE;QACpB,gCAAuB,CAAC,kBAAO,CAAC,UAAU,CAAE;QAC5C,gCAAe;QACf,+BAAc;QACd,gCAAe;KAChB;IACD,CAAC,kBAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE;IAC9B,CAAC,kBAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,oCAA2B,CAAC,kBAAO,CAAC,QAAQ,CAAE,EAAE,kCAAiB,CAAC;IACvF,CAAC,kBAAO,CAAC,aAAa,CAAC,EAAE;QACvB,gCAAuB,CAAC,kBAAO,CAAC,aAAa,CAAE;QAC/C,mCAAkB;KACnB;IACD,CAAC,kBAAO,CAAC,YAAY,CAAC,EAAE;QACtB,gCAAuB,CAAC,kBAAO,CAAC,YAAY,CAAE;QAC9C,kCAAiB;KAClB;IACD,CAAC,kBAAO,CAAC,OAAO,CAAC,EAAE,CAAC,gCAAuB,CAAC,kBAAO,CAAC,OAAO,CAAE,EAAE,6BAAY,CAAC;IAC5E,CAAC,kBAAO,CAAC,aAAa,CAAC,EAAE;QACvB,gCAAuB,CAAC,kBAAO,CAAC,aAAa,CAAE;QAC/C,mCAAkB;KACnB;IACD,CAAC,kBAAO,CAAC,aAAa,CAAC,EAAE;QACvB,gCAAuB,CAAC,kBAAO,CAAC,aAAa,CAAE;QAC/C,mCAAkB;KACnB;IACD,CAAC,kBAAO,CAAC,aAAa,CAAC,EAAE;QACvB,gCAAuB,CAAC,kBAAO,CAAC,aAAa,CAAE;QAC/C,mCAAkB;KACnB;CACF,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,MAAa,+BAA+B;IAC1C,YAAoB,OAAgB;QAAhB,YAAO,GAAP,OAAO,CAAS;IAAI,CAAC;IAElC,KAAK,CAAC,QAAQ,CACnB,OAAe,EACf,QAAgB;QAEhB,SAAG,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACxD,MAAM,KAAK,GAAG,yCAAiC,CAAC,IAAI,CAAC,OAAO,CAAE,CAAC;QAE/D,MAAM,SAAS,GAAqB,gBAAC,CAAC,OAAO,CAC3C,KAAK,EACL,CAAC,IAAI,EAAoB,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CACxE,CAAC;QAEF,IAAI,OAAO,IAAI,QAAQ,EAAE;YACvB,SAAS,CAAC,IAAI,CACZ,CAAC,OAAO,EAAE,QAAQ,CAAC,EACnB,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,EACvD,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CACzD,CAAC;SACH;QAED,MAAM,KAAK,GAAqB,IAAA,gBAAC,EAAC,SAAS,CAAC;aACzC,MAAM,CAAC,CAAC,MAAM,EAA4B,EAAE,CAC3C,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAChC;aACA,MAAM,CACL,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CACnB,MAAM,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAC9D;aACA,KAAK,EAAE,CAAC;QAEX,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;QAEzC,MAAM,aAAa,GAAyB,IAAA,gBAAC,EAAC,KAAK,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE;YACxB,MAAM,WAAW,GAAG,aAAI,CAAC,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAEpD,IAAI,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE;gBACnC,OAAO,SAAS,CAAC;aAClB;YACD,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAEhC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC;gBACjD,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC;gBAClB,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YAErB,OAAO;gBACL,EAAE,EAAE,WAAW;gBACf,SAAS,EAAE,KAAK;gBAChB,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,OAAO;iBACnB;gBACD,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,CAAC,OAAO;iBACnB;gBACD,MAAM,EAAE,GAAG;gBACX,OAAO,EAAE,GAAG;gBACZ,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC,CAAC;aACD,OAAO,EAAE;aACT,KAAK,EAAE,CAAC;QAEX,OAAO,aAAa,CAAC;IACvB,CAAC;CACF;AAnED,0EAmEC","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/v2-sdk';\nimport _ from 'lodash';\n\nimport { WRAPPED_NATIVE_CURRENCY } from '../../util/chains';\nimport { FEW_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_DAI_ARBITRUM,\n // eslint-disable-next-line sort-imports\n FEW_DAI_ARB_SEPOLIA,\n FEW_DAI_BASE,\n FEW_DAI_MAINNET,\n FEW_RNG_ARB_SEPOLIA,\n FEW_RNG_MAINNET,\n FEW_USDB_BLAST,\n FEW_USDC_ARBITRUM,\n FEW_USDC_BASE,\n FEW_USDC_MAINNET,\n FEW_USDC_SEPOLIA,\n FEW_USDC_UNICHAIN,\n FEW_USDT_ARBITRUM,\n FEW_USDT_BASE,\n FEW_USDT_HYPER_MAINNET,\n FEW_USDT_MAINNET,\n FEW_WBTC_ARBITRUM,\n FEW_WBTC_MAINNET,\n OP_OPTIMISM,\n SUSD_STORY_ODYSSEY,\n USDB_BLAST_SEPOLIA,\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_SONEIUM,\n USDC_STORY_MAINNET,\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 { IRingV2SubgraphProvider, RingV2SubgraphPool } from './ring-subgraph-provider';\n\ntype ChainTokenList = {\n readonly [chainId in ChainId]: Token[];\n};\n\n/*\nconst BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n [ChainId.HYPER_MAINNET]: [\n WRAPPED_NATIVE_CURRENCY[ChainId.HYPER_MAINNET]!,\n 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]!],\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\nexport const FEW_BASES_TO_CHECK_TRADES_AGAINST: ChainTokenList = {\n [ChainId.MAINNET]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.MAINNET]!,\n FEW_DAI_MAINNET,\n FEW_USDC_MAINNET,\n FEW_USDT_MAINNET,\n FEW_WBTC_MAINNET,\n FEW_RNG_MAINNET,\n ],\n [ChainId.HYPER_MAINNET]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.HYPER_MAINNET]!,\n FEW_USDT_HYPER_MAINNET,\n ],\n [ChainId.GOERLI]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.GOERLI]!],\n [ChainId.SEPOLIA]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.SEPOLIA]!, FEW_USDC_SEPOLIA],\n //v2 not deployed on [optimism, 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 FEW_WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_ONE]!,\n FEW_WBTC_ARBITRUM,\n FEW_DAI_ARBITRUM,\n FEW_USDC_ARBITRUM,\n FEW_USDT_ARBITRUM,\n ],\n [ChainId.ARBITRUM_GOERLI]: [],\n [ChainId.ARBITRUM_SEPOLIA]: [\n FEW_WRAPPED_NATIVE_CURRENCY[ChainId.ARBITRUM_SEPOLIA]!,\n FEW_DAI_ARB_SEPOLIA,\n FEW_RNG_ARB_SEPOLIA,\n ],\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 FEW_WRAPPED_NATIVE_CURRENCY[ChainId.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]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.BASE]!, FEW_DAI_BASE, FEW_USDC_BASE, FEW_USDT_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]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.BLAST]!, FEW_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 [ChainId.UNICHAIN]: [FEW_WRAPPED_NATIVE_CURRENCY[ChainId.UNICHAIN]!, FEW_USDC_UNICHAIN],\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 [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 RingFewStaticV2SubgraphProvider implements IRingV2SubgraphProvider {\n constructor(private chainId: ChainId) { }\n\n public async getPools(\n tokenIn?: Token,\n tokenOut?: Token\n ): Promise<RingV2SubgraphPool[]> {\n log.info('In static subgraph provider for Ring Few V2');\n const bases = FEW_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: RingV2SubgraphPool[] = _(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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-subgraph-provider-with-fallback.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-subgraph-provider-with-fallback.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AACnD,wFAAmF;AAGnF;;;;;;GAMG;AACH,MAAa,sCACX,SAAQ,+DAAiD;IAGzD;;;OAGG;IACH,YAAY,SAAoC;QAC9C,KAAK,CAAC,SAAS,EAAE,qBAAQ,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;CACF;AAXD,wFAWC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { SubgraphProviderWithFallBacks } from '../subgraph-provider-with-fallback';\nimport { IRingV2SubgraphProvider, RingV2SubgraphPool } from './ring-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 RingFewV2SubgraphProviderWithFallBacks\n extends SubgraphProviderWithFallBacks<RingV2SubgraphPool>\n implements IRingV2SubgraphProvider\n{\n /**\n * Creates an instance of V2SubgraphProviderWithFallBacks.\n * @param fallbacks Ordered list of `IRingV2SubgraphProvider` to try to get pools from.\n */\n constructor(fallbacks: IRingV2SubgraphProvider[]) {\n super(fallbacks, Protocol.FEWV2);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-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 RingV2SubgraphPool {\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 IRingV2SubgraphProvider\n */\nexport interface IRingV2SubgraphProvider {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<RingV2SubgraphPool[]>;\n}\n\nexport class RingV2SubgraphProvider implements IRingV2SubgraphProvider {\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<RingV2SubgraphPool[]> {\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: RingV2SubgraphPool[] = 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"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ring-uri-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/fewV2/ring-uri-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,oEAA+D;AAI/D,MAAa,wBACX,SAAQ,2CAAuC;CACV;AAFvC,4DAEuC","sourcesContent":["import { URISubgraphProvider } from '../uri-subgraph-provider';\n\nimport { RingV2SubgraphPool, IRingV2SubgraphProvider } from './ring-subgraph-provider';\n\nexport class FewV2URISubgraphProvider\n extends URISubgraphProvider<RingV2SubgraphPool>\n implements IRingV2SubgraphProvider {}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/gas-price-provider.ts"],"names":[],"mappings":";;;AAMA;;GAEG;AACH,MAAsB,iBAAiB;CAKtC;AALD,8CAKC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\n\nexport type GasPrice = {\n gasPriceWei: BigNumber;\n};\n\n/**\n * Provider for getting gas prices.\n */\nexport abstract class IGasPriceProvider {\n public abstract getGasPrice(\n latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<GasPrice>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/providers/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,+CAA6B;AAC7B,yDAAuC;AACvC,gEAA8C;AAC9C,2DAAyC;AACzC,kDAAgC;AAChC,gEAA8C;AAC9C,8DAA4C;AAC5C,4EAA0D;AAC1D,uDAAqC;AACrC,8DAA4C;AAC5C,uDAAqC;AACrC,+DAA6C;AAC7C,gEAA8C;AAC9C,gEAA8C;AAC9C,4DAA0C;AAC1C,kDAAgC;AAChC,wDAAsC;AACtC,8DAA4C;AAC5C,yDAAuC;AACvC,iEAA+C;AAC/C,8DAA4C;AAC5C,mDAAiC;AACjC,6DAA2C;AAC3C,0DAAwC;AACxC,6DAA2C;AAC3C,iEAA+C;AAC/C,qDAAmC;AACnC,sDAAoC;AACpC,gEAA8C;AAC9C,yDAAuC;AACvC,uEAAqD;AACrD,6DAA2C;AAC3C,qEAAmD;AACnD,yEAAuD;AACvD,6DAA2C;AAC3C,8DAA4C;AAC5C,wEAAsD;AACtD,iEAA+C;AAC/C,+EAA6D;AAC7D,qEAAmD;AACnD,6DAA2C;AAC3C,iEAA+C;AAC/C,qDAAmC;AACnC,gEAA8C;AAC9C,yDAAuC;AACvC,uEAAqD;AACrD,6DAA2C;AAC3C,6DAA2C;AAC3C,iEAA+C;AAC/C,qDAAmC;AACnC,gEAA8C;AAC9C,yDAAuC;AACvC,uEAAqD;AACrD,6DAA2C","sourcesContent":["export * from './cache';\nexport * from './cache-node';\nexport * from './caching-gas-provider';\nexport * from './caching-token-list-provider';\nexport * from './caching-token-provider';\nexport * from './caching/route';\nexport * from './eip-1559-gas-price-provider';\nexport * from './eth-estimate-gas-provider';\nexport * from './eth-gas-station-info-gas-price-provider';\nexport * from './gas-price-provider';\nexport * from './legacy-gas-price-provider';\nexport * from './multicall-provider';\nexport * from './multicall-uniswap-provider';\nexport * from './multicall-ringswap-provider';\nexport * from './on-chain-gas-price-provider';\nexport * from './on-chain-quote-provider';\nexport * from './pool-provider';\nexport * from './simulation-provider';\nexport * from './static-gas-price-provider';\nexport * from './swap-router-provider';\nexport * from './tenderly-simulation-provider';\nexport * from './token-properties-provider';\nexport * from './token-provider';\nexport * from './token-validator-provider';\nexport * from './uri-subgraph-provider';\nexport * from './v2/caching-pool-provider';\nexport * from './v2/caching-subgraph-provider';\nexport * from './v2/pool-provider';\nexport * from './v2/quote-provider';\nexport * from './v2/static-subgraph-provider';\nexport * from './v2/subgraph-provider';\nexport * from './v2/subgraph-provider-with-fallback';\nexport * from './v2/uri-subgraph-provider';\nexport * from './fewV2/ring-caching-pool-provider';\nexport * from './fewV2/ring-caching-subgraph-provider';\nexport * from './fewV2/ring-pool-provider';\nexport * from './fewV2/ring-quote-provider';\nexport * from './fewV2/ring-static-subgraph-provider';\nexport * from './fewV2/ring-subgraph-provider';\nexport * from './fewV2/ring-subgraph-provider-with-fallback';\nexport * from './fewV2/ring-uri-subgraph-provider';\nexport * from './v3/caching-pool-provider';\nexport * from './v3/caching-subgraph-provider';\nexport * from './v3/pool-provider';\nexport * from './v3/static-subgraph-provider';\nexport * from './v3/subgraph-provider';\nexport * from './v3/subgraph-provider-with-fallback';\nexport * from './v3/uri-subgraph-provider';\nexport * from './v4/caching-pool-provider';\nexport * from './v4/caching-subgraph-provider';\nexport * from './v4/pool-provider';\nexport * from './v4/static-subgraph-provider';\nexport * from './v4/subgraph-provider';\nexport * from './v4/subgraph-provider-with-fallback';\nexport * from './v4/uri-subgraph-provider';\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacy-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/legacy-gas-price-provider.ts"],"names":[],"mappings":";;;AAEA,6DAAmE;AAEnE,MAAa,sBAAuB,SAAQ,sCAAiB;IAC3D,YAAsB,QAAyB;QAC7C,KAAK,EAAE,CAAC;QADY,aAAQ,GAAR,QAAQ,CAAiB;IAE/C,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,kBAA0B,EAC1B,mBAA4B;QAE5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QACtD,OAAO;YACL,WAAW;SACZ,CAAC;IACJ,CAAC;CACF;AAdD,wDAcC","sourcesContent":["import { JsonRpcProvider } from '@ethersproject/providers';\n\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\nexport class LegacyGasPriceProvider extends IGasPriceProvider {\n constructor(protected provider: JsonRpcProvider) {\n super();\n }\n\n public override async getGasPrice(\n _latestBlockNumber: number,\n _requestBlockNumber?: number\n ): Promise<GasPrice> {\n const gasPriceWei = await this.provider.getGasPrice();\n return {\n gasPriceWei,\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall-provider.js","sourceRoot":"","sources":["../../../src/providers/multicall-provider.ts"],"names":[],"mappings":";;;AAsDA;;;;;;;GAOG;AACH,MAAsB,kBAAkB;CA+DvC;AA/DD,gDA+DC","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { BigNumber } from '@ethersproject/bignumber';\n\nimport { ProviderConfig } from './provider';\n\nexport type CallSameFunctionOnMultipleContractsParams<\n TFunctionParams,\n TAdditionalConfig = any\n> = {\n addresses: string[];\n contractInterface: Interface;\n functionName: string;\n functionParams?: TFunctionParams;\n providerConfig?: ProviderConfig;\n additionalConfig?: TAdditionalConfig;\n};\n\nexport type CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n TAdditionalConfig = any\n> = {\n address: string;\n contractInterface: Interface;\n functionName: string;\n functionParams: TFunctionParams[];\n providerConfig?: ProviderConfig;\n additionalConfig?: TAdditionalConfig;\n};\n\nexport type CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n TAdditionalConfig = any\n> = {\n address: string;\n contractInterface: Interface;\n functionNames: string[];\n functionParams?: TFunctionParams[];\n providerConfig?: ProviderConfig;\n additionalConfig?: TAdditionalConfig;\n};\n\nexport type SuccessResult<TReturn> = {\n success: true;\n result: TReturn;\n};\n\nexport type FailResult = {\n success: false;\n returnData: string;\n gasUsed?: BigNumber;\n};\n\nexport type Result<TReturn> = SuccessResult<TReturn> | FailResult;\n\n/**\n * Provider for fetching data on chain using multicall contracts.\n *\n * @export\n * @abstract\n * @class IMulticallProvider\n * @template TMulticallConfig\n */\nexport abstract class IMulticallProvider<TMulticallConfig = any> {\n /**\n * Calls the same function on multiple contracts.\n *\n * For example, if you wanted to get the ERC-20 balance of 10 different tokens\n * this can be used to call balance on the 10 contracts in a single multicall.\n *\n * @abstract\n * @template TFunctionParams\n * @template TReturn\n * @param params\n * @returns {*}\n */\n public abstract callSameFunctionOnMultipleContracts<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnMultipleContractsParams<\n TFunctionParams,\n TMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }>;\n\n /**\n * Calls a function on a single contract with different parameters.\n *\n * For example, if you wanted to call the Uniswap V3 Quoter with 10 different\n * swap amounts this can be used to make the calls in a single multicall.\n *\n * @abstract\n * @template TFunctionParams\n * @template TReturn\n * @param params\n * @returns {*}\n */\n public abstract callSameFunctionOnContractWithMultipleParams<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n TMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }>;\n\n public abstract callMultipleFunctionsOnSameContract<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n TMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }>;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall-ringswap-provider.js","sourceRoot":"","sources":["../../../src/providers/multicall-ringswap-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\nimport stats from 'stats-lite';\n\nimport { UniswapInterfaceMulticall__factory } from '../types/v3/factories/UniswapInterfaceMulticall__factory';\nimport { UniswapInterfaceMulticall } from '../types/v3/UniswapInterfaceMulticall';\nimport { RING_UNISWAP_MULTICALL_ADDRESSES } from '../util/addresses';\nimport { log } from '../util/log';\n\nimport {\n CallMultipleFunctionsOnSameContractParams,\n CallSameFunctionOnContractWithMultipleParams,\n CallSameFunctionOnMultipleContractsParams,\n IMulticallProvider,\n Result,\n} from './multicall-provider';\nimport { UniswapMulticallConfig } from './multicall-uniswap-provider';\n\n/**\n * The UniswapMulticall contract has added functionality for limiting the amount of gas\n * that each call within the multicall can consume. This is useful for operations where\n * a call could consume such a large amount of gas that it causes the node to error out\n * with an out of gas error.\n *\n * @export\n * @class RingswapMulticallProvider\n */\nexport class RingswapMulticallProvider extends IMulticallProvider<UniswapMulticallConfig> {\n private multicallContract: UniswapInterfaceMulticall;\n\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n protected gasLimitPerCall = 1_000_000\n ) {\n super();\n const multicallAddress = RING_UNISWAP_MULTICALL_ADDRESSES[this.chainId];\n\n if (!multicallAddress) {\n throw new Error(\n `No address for Uniswap Multicall Contract on chain id: ${chainId}`\n );\n }\n\n this.multicallContract = UniswapInterfaceMulticall__factory.connect(\n multicallAddress,\n this.provider\n );\n }\n\n public async callSameFunctionOnMultipleContracts<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnMultipleContractsParams<TFunctionParams>\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }> {\n const {\n addresses,\n contractInterface,\n functionName,\n functionParams,\n providerConfig,\n } = params;\n\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const fragment = contractInterface.getFunction(functionName);\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParams\n );\n\n const calls = _.map(addresses, (address) => {\n return {\n target: address,\n callData,\n gasLimit: this.gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} across ${addresses.length} addresses`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid calls.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} on address ${addresses[i]}`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results },\n `Results for multicall on ${functionName} across ${addresses.length} addresses as of block ${blockNumber}`\n );\n\n return { blockNumber, results };\n }\n\n public async callSameFunctionOnContractWithMultipleParams<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionName,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n const fragment = contractInterface.getFunction(functionName);\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionParams, (functionParam) => {\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParam\n );\n\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} address ${address} with params ${functionParams[i]}`\n );\n results.push({\n success: false,\n returnData,\n gasUsed,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionName, address },\n `Results for multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n\n public async callMultipleFunctionsOnSameContract<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionNames,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionNames, (functionName, i) => {\n const fragment = contractInterface.getFunction(functionName);\n const param = functionParams ? functionParams[i] : [];\n const callData = contractInterface.encodeFunctionData(fragment, param);\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionNames.length} functions at address ${address} with ${functionParams?.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const fragment = contractInterface.getFunction(functionNames[i]!);\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionNames[i]} with ${\n functionParams ? functionParams[i] : '0'\n } params`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionNames, address },\n `Results for multicall for ${\n functionNames.length\n } functions at address ${address} with ${\n functionParams ? functionParams.length : ' 0'\n } different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multicall-uniswap-provider.js","sourceRoot":"","sources":["../../../src/providers/multicall-uniswap-provider.ts"],"names":[],"mappings":";;;;;;AAGA,oDAAuB;AACvB,4DAA+B;AAE/B,iHAA8G;AAE9G,iDAAgE;AAChE,qCAAkC;AAElC,6DAM8B;AAM9B;;;;;;;;GAQG;AACH,MAAa,wBAAyB,SAAQ,uCAA0C;IAGtF,YACY,OAAgB,EAChB,QAAsB,EACtB,kBAAkB,OAAS;QAErC,KAAK,EAAE,CAAC;QAJE,YAAO,GAAP,OAAO,CAAS;QAChB,aAAQ,GAAR,QAAQ,CAAc;QACtB,oBAAe,GAAf,eAAe,CAAY;QAGrC,MAAM,gBAAgB,GAAG,uCAA2B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEnE,IAAI,CAAC,gBAAgB,EAAE;YACrB,MAAM,IAAI,KAAK,CACb,0DAA0D,OAAO,EAAE,CACpE,CAAC;SACH;QAED,IAAI,CAAC,iBAAiB,GAAG,uEAAkC,CAAC,OAAO,CACjE,gBAAgB,EAChB,IAAI,CAAC,QAAQ,CACd,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAI9C,MAAkE;;QAKlE,MAAM,EACJ,SAAS,EACT,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,cAAc,GACf,GAAG,MAAM,CAAC;QAEX,MAAM,mBAAmB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,mCAAI,SAAS,CAAC;QAErE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAC7D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,kBAAkB,CACnD,QAAQ,EACR,cAAc,CACf,CAAC;QAEF,MAAM,KAAK,GAAG,gBAAC,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACzC,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,QAAQ;gBACR,QAAQ,EAAE,IAAI,CAAC,eAAe;aAC/B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,EACT,0BAA0B,YAAY,WAAW,SAAS,CAAC,MAAM,YAAY,CAC9E,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,GACjD,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE;YACvD,QAAQ,EAAE,mBAAmB;SAC9B,CAAC,CAAC;QAEL,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;YAErD,4DAA4D;YAC5D,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE;gBACtC,SAAG,CAAC,KAAK,CACP,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAC/B,0BAA0B,YAAY,eAAe,SAAS,CAAC,CAAC,CAAC,EAAE,CACpE,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,UAAU;iBACX,CAAC,CAAC;gBACH,SAAS;aACV;YAED,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,iBAAiB,CAAC,oBAAoB,CAC5C,QAAQ,EACR,UAAU,CACW;aACxB,CAAC,CAAC;SACJ;QAED,SAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,EACX,4BAA4B,YAAY,WAAW,SAAS,CAAC,MAAM,0BAA0B,WAAW,EAAE,CAC3G,CAAC;QAEF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;IAEM,KAAK,CAAC,4CAA4C,CAIvD,MAGC;;QAMD,MAAM,EACJ,OAAO,EACP,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,GAAG,MAAM,CAAC;QACX,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAE7D,MAAM,eAAe,GACnB,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,uBAAuB,mCAAI,IAAI,CAAC,eAAe,CAAC;QACpE,MAAM,mBAAmB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,mCAAI,SAAS,CAAC;QAErE,MAAM,KAAK,GAAG,gBAAC,CAAC,GAAG,CAAC,cAAc,EAAE,CAAC,aAAa,EAAE,EAAE;YACpD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,kBAAkB,CACnD,QAAQ,EACR,aAAa,CACd,CAAC;YAEF,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,QAAQ;gBACR,QAAQ,EAAE,eAAe;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,EACT,0BAA0B,YAAY,eAAe,OAAO,SAAS,cAAc,CAAC,MAAM,2BAA2B,CACtH,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,GACjD,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE;YACvD,QAAQ,EAAE,mBAAmB;SAC9B,CAAC,CAAC;QAEL,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;YAE9D,4DAA4D;YAC5D,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE;gBACtC,SAAG,CAAC,KAAK,CACP,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAC/B,0BAA0B,YAAY,YAAY,OAAO,gBAAgB,cAAc,CAAC,CAAC,CAAC,EAAE,CAC7F,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,UAAU;oBACV,OAAO;iBACR,CAAC,CAAC;gBACH,SAAS;aACV;YAED,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,iBAAiB,CAAC,oBAAoB,CAC5C,QAAQ,EACR,UAAU,CACW;aACxB,CAAC,CAAC;SACJ;QAED,SAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,EAClC,6BAA6B,YAAY,eAAe,OAAO,SAAS,cAAc,CAAC,MAAM,kDAAkD,WAAW,EAAE,CAC7J,CAAC;QACF,OAAO;YACL,WAAW;YACX,OAAO;YACP,2BAA2B,EAAE,oBAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAI9C,MAGC;;QAMD,MAAM,EACJ,OAAO,EACP,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,cAAc,GACf,GAAG,MAAM,CAAC;QAEX,MAAM,eAAe,GACnB,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,uBAAuB,mCAAI,IAAI,CAAC,eAAe,CAAC;QACpE,MAAM,mBAAmB,GAAG,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,WAAW,mCAAI,SAAS,CAAC;QAErE,MAAM,KAAK,GAAG,gBAAC,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE;YACrD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;YAC7D,MAAM,KAAK,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACvE,OAAO;gBACL,MAAM,EAAE,OAAO;gBACf,QAAQ;gBACR,QAAQ,EAAE,eAAe;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,SAAG,CAAC,KAAK,CACP,EAAE,KAAK,EAAE,EACT,0BAA0B,aAAa,CAAC,MAAM,yBAAyB,OAAO,SAAS,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,MAAM,2BAA2B,CACzI,CAAC;QAEF,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,gBAAgB,EAAE,GACjD,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE;YACvD,QAAQ,EAAE,mBAAmB;SAC9B,CAAC,CAAC;QAEL,MAAM,OAAO,GAAsB,EAAE,CAAC;QAEtC,MAAM,iBAAiB,GAAa,EAAE,CAAC;QACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,gBAAgB,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAChD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAE,CAAC,CAAC;YAClE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAE,CAAC;YAE9D,4DAA4D;YAC5D,IAAI,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,EAAE;gBACtC,SAAG,CAAC,KAAK,CACP,EAAE,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAAE,EAC/B,0BAA0B,aAAa,CAAC,CAAC,CAAC,SACxC,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GACvC,SAAS,CACV,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC;oBACX,OAAO,EAAE,KAAK;oBACd,UAAU;iBACX,CAAC,CAAC;gBACH,SAAS;aACV;YAED,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE3C,OAAO,CAAC,IAAI,CAAC;gBACX,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,iBAAiB,CAAC,oBAAoB,CAC5C,QAAQ,EACR,UAAU,CACW;aACxB,CAAC,CAAC;SACJ;QAED,SAAG,CAAC,KAAK,CACP,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,EACnC,6BACE,aAAa,CAAC,MAChB,yBAAyB,OAAO,SAC9B,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,IAC3C,kDAAkD,WAAW,EAAE,CAChE,CAAC;QACF,OAAO;YACL,WAAW;YACX,OAAO;YACP,2BAA2B,EAAE,oBAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;SACrE,CAAC;IACJ,CAAC;CACF;AA/RD,4DA+RC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\nimport stats from 'stats-lite';\n\nimport { UniswapInterfaceMulticall__factory } from '../types/v3/factories/UniswapInterfaceMulticall__factory';\nimport { UniswapInterfaceMulticall } from '../types/v3/UniswapInterfaceMulticall';\nimport { UNISWAP_MULTICALL_ADDRESSES } from '../util/addresses';\nimport { log } from '../util/log';\n\nimport {\n CallMultipleFunctionsOnSameContractParams,\n CallSameFunctionOnContractWithMultipleParams,\n CallSameFunctionOnMultipleContractsParams,\n IMulticallProvider,\n Result,\n} from './multicall-provider';\n\nexport type UniswapMulticallConfig = {\n gasLimitPerCallOverride?: number;\n};\n\n/**\n * The UniswapMulticall contract has added functionality for limiting the amount of gas\n * that each call within the multicall can consume. This is useful for operations where\n * a call could consume such a large amount of gas that it causes the node to error out\n * with an out of gas error.\n *\n * @export\n * @class UniswapMulticallProvider\n */\nexport class UniswapMulticallProvider extends IMulticallProvider<UniswapMulticallConfig> {\n private multicallContract: UniswapInterfaceMulticall;\n\n constructor(\n protected chainId: ChainId,\n protected provider: BaseProvider,\n protected gasLimitPerCall = 1_000_000\n ) {\n super();\n const multicallAddress = UNISWAP_MULTICALL_ADDRESSES[this.chainId];\n\n if (!multicallAddress) {\n throw new Error(\n `No address for Uniswap Multicall Contract on chain id: ${chainId}`\n );\n }\n\n this.multicallContract = UniswapInterfaceMulticall__factory.connect(\n multicallAddress,\n this.provider\n );\n }\n\n public async callSameFunctionOnMultipleContracts<\n TFunctionParams extends any[] | undefined,\n TReturn = any\n >(\n params: CallSameFunctionOnMultipleContractsParams<TFunctionParams>\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n }> {\n const {\n addresses,\n contractInterface,\n functionName,\n functionParams,\n providerConfig,\n } = params;\n\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const fragment = contractInterface.getFunction(functionName);\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParams\n );\n\n const calls = _.map(addresses, (address) => {\n return {\n target: address,\n callData,\n gasLimit: this.gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} across ${addresses.length} addresses`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid calls.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} on address ${addresses[i]}`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results },\n `Results for multicall on ${functionName} across ${addresses.length} addresses as of block ${blockNumber}`\n );\n\n return { blockNumber, results };\n }\n\n public async callSameFunctionOnContractWithMultipleParams<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallSameFunctionOnContractWithMultipleParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionName,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n const fragment = contractInterface.getFunction(functionName);\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionParams, (functionParam) => {\n const callData = contractInterface.encodeFunctionData(\n fragment,\n functionParam\n );\n\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionName} address ${address} with params ${functionParams[i]}`\n );\n results.push({\n success: false,\n returnData,\n gasUsed,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionName, address },\n `Results for multicall for ${functionName} at address ${address} with ${functionParams.length} different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n\n public async callMultipleFunctionsOnSameContract<\n TFunctionParams extends any[] | undefined,\n TReturn\n >(\n params: CallMultipleFunctionsOnSameContractParams<\n TFunctionParams,\n UniswapMulticallConfig\n >\n ): Promise<{\n blockNumber: BigNumber;\n results: Result<TReturn>[];\n approxGasUsedPerSuccessCall: number;\n }> {\n const {\n address,\n contractInterface,\n functionNames,\n functionParams,\n additionalConfig,\n providerConfig,\n } = params;\n\n const gasLimitPerCall =\n additionalConfig?.gasLimitPerCallOverride ?? this.gasLimitPerCall;\n const blockNumberOverride = providerConfig?.blockNumber ?? undefined;\n\n const calls = _.map(functionNames, (functionName, i) => {\n const fragment = contractInterface.getFunction(functionName);\n const param = functionParams ? functionParams[i] : [];\n const callData = contractInterface.encodeFunctionData(fragment, param);\n return {\n target: address,\n callData,\n gasLimit: gasLimitPerCall,\n };\n });\n\n log.debug(\n { calls },\n `About to multicall for ${functionNames.length} functions at address ${address} with ${functionParams?.length} different sets of params`\n );\n\n const { blockNumber, returnData: aggregateResults } =\n await this.multicallContract.callStatic.multicall(calls, {\n blockTag: blockNumberOverride,\n });\n\n const results: Result<TReturn>[] = [];\n\n const gasUsedForSuccess: number[] = [];\n for (let i = 0; i < aggregateResults.length; i++) {\n const fragment = contractInterface.getFunction(functionNames[i]!);\n const { success, returnData, gasUsed } = aggregateResults[i]!;\n\n // Return data \"0x\" is sometimes returned for invalid pools.\n if (!success || returnData.length <= 2) {\n log.debug(\n { result: aggregateResults[i] },\n `Invalid result calling ${functionNames[i]} with ${\n functionParams ? functionParams[i] : '0'\n } params`\n );\n results.push({\n success: false,\n returnData,\n });\n continue;\n }\n\n gasUsedForSuccess.push(gasUsed.toNumber());\n\n results.push({\n success: true,\n result: contractInterface.decodeFunctionResult(\n fragment,\n returnData\n ) as unknown as TReturn,\n });\n }\n\n log.debug(\n { results, functionNames, address },\n `Results for multicall for ${\n functionNames.length\n } functions at address ${address} with ${\n functionParams ? functionParams.length : ' 0'\n } different sets of params. Results as of block ${blockNumber}`\n );\n return {\n blockNumber,\n results,\n approxGasUsedPerSuccessCall: stats.percentile(gasUsedForSuccess, 99),\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"on-chain-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/on-chain-gas-price-provider.ts"],"names":[],"mappings":";;;AAAA,oDAAgD;AAEhD,qDAAoD;AAEpD,6DAAmE;AAGnE,MAAM,iCAAiC,GAAG;IACxC,kBAAO,CAAC,OAAO;IACf,kBAAO,CAAC,MAAM;IACd,kBAAO,CAAC,cAAc;IACtB,kBAAO,CAAC,YAAY;IACpB,GAAG,2BAAa;CACjB,CAAC;AAEF;;;;;;GAMG;AACH,MAAa,uBAAwB,SAAQ,sCAAiB;IAC5D,YACY,OAAgB,EAChB,uBAAgD,EAChD,sBAA8C,EAC9C,YAAuB,iCAAiC;QAElE,KAAK,EAAE,CAAC;QALE,YAAO,GAAP,OAAO,CAAS;QAChB,4BAAuB,GAAvB,uBAAuB,CAAyB;QAChD,2BAAsB,GAAtB,sBAAsB,CAAwB;QAC9C,cAAS,GAAT,SAAS,CAA+C;IAGpE,CAAC;IAEe,KAAK,CAAC,WAAW,CAC/B,iBAAyB,EACzB,kBAA2B;QAE3B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YACzC,OAAO,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAC7C,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;SACH;QAED,OAAO,IAAI,CAAC,sBAAsB,CAAC,WAAW,CAC5C,iBAAiB,EACjB,kBAAkB,CACnB,CAAC;IACJ,CAAC;CACF;AA1BD,0DA0BC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\n\nimport { opStackChains } from '../util/l2FeeChains';\nimport { EIP1559GasPriceProvider } from './eip-1559-gas-price-provider';\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\nimport { LegacyGasPriceProvider } from './legacy-gas-price-provider';\n\nconst DEFAULT_EIP_1559_SUPPORTED_CHAINS = [\n ChainId.MAINNET,\n ChainId.GOERLI,\n ChainId.POLYGON_MUMBAI,\n ChainId.ARBITRUM_ONE,\n ...opStackChains,\n];\n\n/**\n * Gets gas prices on chain. If the chain supports EIP-1559 and has the feeHistory API,\n * uses the EIP1559 provider. Otherwise it will use a legacy provider that uses eth_gasPrice\n *\n * @export\n * @class OnChainGasPriceProvider\n */\nexport class OnChainGasPriceProvider extends IGasPriceProvider {\n constructor(\n protected chainId: ChainId,\n protected eip1559GasPriceProvider: EIP1559GasPriceProvider,\n protected legacyGasPriceProvider: LegacyGasPriceProvider,\n protected eipChains: ChainId[] = DEFAULT_EIP_1559_SUPPORTED_CHAINS\n ) {\n super();\n }\n\n public override async getGasPrice(\n latestBlockNumber: number,\n requestBlockNumber?: number\n ): Promise<GasPrice> {\n if (this.eipChains.includes(this.chainId)) {\n return this.eip1559GasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n }\n\n return this.legacyGasPriceProvider.getGasPrice(\n latestBlockNumber,\n requestBlockNumber\n );\n }\n}\n"]}
|