@ring-protocol/smart-order-router 0.5.1 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/main/routers/alpha-router/alpha-router.js +1 -4
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/util/methodParameters.js +1 -3
- package/build/module/routers/alpha-router/alpha-router.js +1 -4
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/methodParameters.js +1 -3
- package/package.json +5 -5
- package/build/main/index.js.map +0 -1
- package/build/main/providers/cache-node.js.map +0 -1
- package/build/main/providers/cache.js.map +0 -1
- package/build/main/providers/caching/route/index.js.map +0 -1
- package/build/main/providers/caching/route/model/cache-mode.js.map +0 -1
- package/build/main/providers/caching/route/model/cached-route.js.map +0 -1
- package/build/main/providers/caching/route/model/cached-routes.js.map +0 -1
- package/build/main/providers/caching/route/model/index.js.map +0 -1
- package/build/main/providers/caching/route/route-caching-provider.js.map +0 -1
- package/build/main/providers/caching-gas-provider.js.map +0 -1
- package/build/main/providers/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/caching-token-list-provider.js.map +0 -1
- package/build/main/providers/caching-token-provider.js.map +0 -1
- package/build/main/providers/eip-1559-gas-price-provider.js.map +0 -1
- package/build/main/providers/eth-estimate-gas-provider.js.map +0 -1
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-pool-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-quote-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/fewV2/ring-subgraph-provider.js.map +0 -1
- package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/gas-price-provider.js.map +0 -1
- package/build/main/providers/index.js.map +0 -1
- package/build/main/providers/legacy-gas-price-provider.js.map +0 -1
- package/build/main/providers/multicall-provider.js.map +0 -1
- package/build/main/providers/multicall-ringswap-provider.js.map +0 -1
- package/build/main/providers/multicall-uniswap-provider.js.map +0 -1
- package/build/main/providers/on-chain-gas-price-provider.js.map +0 -1
- package/build/main/providers/on-chain-quote-provider.js.map +0 -1
- package/build/main/providers/pool-provider.js.map +0 -1
- package/build/main/providers/portion-provider.js.map +0 -1
- package/build/main/providers/provider.js.map +0 -1
- package/build/main/providers/simulation-provider.js.map +0 -1
- package/build/main/providers/static-gas-price-provider.js.map +0 -1
- package/build/main/providers/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/subgraph-provider.js.map +0 -1
- package/build/main/providers/swap-router-provider.js.map +0 -1
- package/build/main/providers/tenderly-simulation-provider.js.map +0 -1
- package/build/main/providers/token-fee-fetcher.js.map +0 -1
- package/build/main/providers/token-properties-provider.js.map +0 -1
- package/build/main/providers/token-provider.js.map +0 -1
- package/build/main/providers/token-validator-provider.js.map +0 -1
- package/build/main/providers/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v2/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/pool-provider.js.map +0 -1
- package/build/main/providers/v2/quote-provider.js.map +0 -1
- package/build/main/providers/v2/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v2/subgraph-provider.js.map +0 -1
- package/build/main/providers/v2/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v3/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/gas-data-provider.js.map +0 -1
- package/build/main/providers/v3/pool-provider.js.map +0 -1
- package/build/main/providers/v3/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v3/subgraph-provider.js.map +0 -1
- package/build/main/providers/v3/uri-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/caching-pool-provider.js.map +0 -1
- package/build/main/providers/v4/caching-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/pool-provider.js.map +0 -1
- package/build/main/providers/v4/static-subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +0 -1
- package/build/main/providers/v4/subgraph-provider.js.map +0 -1
- package/build/main/providers/v4/uri-subgraph-provider.js.map +0 -1
- package/build/main/routers/alpha-router/alpha-router.js.map +0 -1
- package/build/main/routers/alpha-router/config.js.map +0 -1
- package/build/main/routers/alpha-router/entities/index.js.map +0 -1
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +0 -1
- package/build/main/routers/alpha-router/functions/best-swap-route.js.map +0 -1
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +0 -1
- package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +0 -1
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/index.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +0 -1
- package/build/main/routers/alpha-router/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/base-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/model/results/index.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +0 -1
- package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +0 -1
- package/build/main/routers/index.js.map +0 -1
- package/build/main/routers/legacy-router/bases.js.map +0 -1
- package/build/main/routers/legacy-router/index.js.map +0 -1
- package/build/main/routers/legacy-router/legacy-router.js.map +0 -1
- package/build/main/routers/router.js.map +0 -1
- package/build/main/types/other/commons.js.map +0 -1
- package/build/main/types/other/factories/Erc20__factory.js.map +0 -1
- package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +0 -1
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +0 -1
- package/build/main/types/other/factories/ITokenValidator__factory.js.map +0 -1
- package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +0 -1
- package/build/main/types/other/factories/Permit2__factory.js.map +0 -1
- package/build/main/types/other/factories/StateView__factory.js.map +0 -1
- package/build/main/types/other/factories/SwapRouter02__factory.js.map +0 -1
- package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +0 -1
- package/build/main/types/other/factories/V4Quoter__factory.js.map +0 -1
- package/build/main/types/v2/commons.js.map +0 -1
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +0 -1
- package/build/main/types/v3/commons.js.map +0 -1
- package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +0 -1
- package/build/main/types/v3/factories/IQuoterV2__factory.js.map +0 -1
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +0 -1
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +0 -1
- package/build/main/util/addresses.js.map +0 -1
- package/build/main/util/amounts.js.map +0 -1
- package/build/main/util/callData.js.map +0 -1
- package/build/main/util/chains.js.map +0 -1
- package/build/main/util/defaultBlocksToLive.js.map +0 -1
- package/build/main/util/fewAddress.js.map +0 -1
- package/build/main/util/gas-factory-helpers.js.map +0 -1
- package/build/main/util/hooksOptions.js.map +0 -1
- package/build/main/util/index.js.map +0 -1
- package/build/main/util/intent.js.map +0 -1
- package/build/main/util/l2FeeChains.js.map +0 -1
- package/build/main/util/log.js.map +0 -1
- package/build/main/util/methodParameters.js.map +0 -1
- package/build/main/util/metric.js.map +0 -1
- package/build/main/util/mixedRouteFilterOutV4Pools.js.map +0 -1
- package/build/main/util/onchainQuoteProviderConfigs.js.map +0 -1
- package/build/main/util/pool.js.map +0 -1
- package/build/main/util/protocols.js.map +0 -1
- package/build/main/util/routes.js.map +0 -1
- package/build/main/util/serializeRouteIds.js.map +0 -1
- package/build/main/util/simple-perf-tracker.js.map +0 -1
- package/build/main/util/tenderlySimulationErrorBreakDown.js.map +0 -1
- package/build/main/util/unsupported-tokens.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v2-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/v2-sdk';\nimport _ from 'lodash';\n\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ProviderConfig } from '../../../../providers/provider';\nimport { IRingV2PoolProvider } from '../../../../providers/fewV2/ring-pool-provider';\nimport { FEW_WRAPPED_NATIVE_CURRENCY, log } from '../../../../util';\nimport { CurrencyAmount } from '../../../../util/amounts';\nimport {\n calculateL1GasFeesHelper,\n getRingFewV2NativePool,\n} from '../../../../util/gas-factory-helpers';\nimport { RingFewV2RouteWithValidQuote } from '../../entities/route-with-valid-quote';\nimport {\n BuildRingFewV2GasModelFactoryType,\n RingGasModelProviderConfig,\n getRingQuoteThroughNativePool,\n IRingFewV2GasModelFactory,\n IRingGasModel,\n ringUsdGasTokensByChain,\n} from '../ring-gas-model';\n\n// Constant cost for doing any swap regardless of pools.\nexport const BASE_SWAP_COST = BigNumber.from(135000); // 115000, bumped up by 20_000 @eric 7/8/2022\n\n// Constant per extra hop in the route.\nexport const COST_PER_EXTRA_HOP = BigNumber.from(50000); // 20000, bumped up by 30_000 @eric 7/8/2022\n\n/**\n * Computes a gas estimate for a V2 swap using heuristics.\n * Considers number of hops in the route and the typical base cost for a swap.\n *\n * We compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929. We would have to make a request for every swap we wanted to estimate.\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * Note, certain tokens e.g. rebasing/fee-on-transfer, may incur higher gas costs than\n * what we estimate here. This is because they run extra logic on token transfer.\n *\n * @export\n * @class V2HeuristicGasModelFactory\n */\nexport class RingFewV2HeuristicGasModelFactory extends IRingFewV2GasModelFactory {\n private provider: BaseProvider;\n\n constructor(provider: BaseProvider) {\n super();\n this.provider = provider;\n }\n\n public async buildGasModel({\n chainId,\n gasPriceWei,\n poolProvider,\n token,\n l2GasDataProvider,\n providerConfig,\n }: BuildRingFewV2GasModelFactoryType): Promise<IRingGasModel<RingFewV2RouteWithValidQuote>> {\n const l2GasData = l2GasDataProvider\n ? await l2GasDataProvider.getGasData(providerConfig)\n : undefined;\n\n const usdPoolPromise: Promise<Pair> = this.getHighestLiquidityUSDPool(\n chainId,\n poolProvider,\n providerConfig\n );\n\n // Only fetch the native gasToken pool if specified by the config AND the gas token is not the native currency.\n const nativeAndSpecifiedGasTokenPoolPromise =\n providerConfig?.gasToken &&\n !providerConfig?.gasToken.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)\n ? this.getEthPool(\n chainId,\n providerConfig.gasToken,\n poolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n const [usdPool, nativeAndSpecifiedGasTokenPool] = await Promise.all([\n usdPoolPromise,\n nativeAndSpecifiedGasTokenPoolPromise,\n ]);\n\n let ethPool: Pair | null = null;\n if (!token.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n ethPool = await this.getEthPool(\n chainId,\n token,\n poolProvider,\n providerConfig\n );\n }\n\n const usdToken =\n usdPool.token0.address == FEW_WRAPPED_NATIVE_CURRENCY[chainId]!.address\n ? usdPool.token1\n : usdPool.token0;\n\n const calculateL1GasFees = async (\n route: RingFewV2RouteWithValidQuote[]\n ): Promise<{\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n }> => {\n const nativePool = !token.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)\n ? await getRingFewV2NativePool(token, poolProvider, providerConfig)\n : null;\n\n return await calculateL1GasFeesHelper(\n route,\n chainId,\n usdPool,\n token,\n nativePool,\n this.provider,\n l2GasData\n );\n };\n\n return {\n estimateGasCost: (routeWithValidQuote: RingFewV2RouteWithValidQuote) => {\n const { gasCostInEth, gasUse } = this.estimateGas(\n routeWithValidQuote,\n gasPriceWei,\n chainId,\n providerConfig\n );\n\n /** ------ MARK: USD logic -------- */\n const gasCostInTermsOfUSD = getRingQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n usdPool\n );\n\n /** ------ MARK: Conditional logic run if gasToken is specified -------- */\n let gasCostInTermsOfGasToken: CurrencyAmount | undefined = undefined;\n if (nativeAndSpecifiedGasTokenPool) {\n gasCostInTermsOfGasToken = getRingQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n nativeAndSpecifiedGasTokenPool\n );\n }\n // if the gasToken is the native currency, we can just use the gasCostInEth\n else if (\n providerConfig?.gasToken?.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)\n ) {\n gasCostInTermsOfGasToken = gasCostInEth;\n }\n\n /** ------ MARK: return early if quoteToken is wrapped native currency ------- */\n if (token.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n return {\n gasEstimate: gasUse,\n gasCostInToken: gasCostInEth,\n gasCostInUSD: gasCostInTermsOfUSD,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n }\n\n // If the quote token is not WETH, we convert the gas cost to be in terms of the quote token.\n // We do this by getting the highest liquidity <token>/ETH pool.\n if (!ethPool) {\n log.info(\n 'Unable to find ETH pool with the quote token to produce gas adjusted costs. Route will not account for gas.'\n );\n return {\n gasEstimate: gasUse,\n gasCostInToken: CurrencyAmount.fromRawAmount(token, 0),\n gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),\n };\n }\n\n const gasCostInTermsOfQuoteToken = getRingQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n ethPool\n );\n\n return {\n gasEstimate: gasUse,\n gasCostInToken: gasCostInTermsOfQuoteToken,\n gasCostInUSD: gasCostInTermsOfUSD!,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n },\n calculateL1GasFees,\n };\n }\n\n private estimateGas(\n routeWithValidQuote: RingFewV2RouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: RingGasModelProviderConfig\n ) {\n const hops = routeWithValidQuote.route.pairs.length;\n let gasUse = BASE_SWAP_COST.add(COST_PER_EXTRA_HOP.mul(hops - 1));\n\n if (providerConfig?.additionalGasOverhead) {\n gasUse = gasUse.add(providerConfig.additionalGasOverhead);\n }\n\n const totalGasCostWei = gasPriceWei.mul(gasUse);\n\n const weth = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const gasCostInEth = CurrencyAmount.fromRawAmount(\n weth,\n totalGasCostWei.toString()\n );\n\n return { gasCostInEth, gasUse };\n }\n\n private async getEthPool(\n chainId: ChainId,\n token: Token,\n poolProvider: IRingV2PoolProvider,\n providerConfig?: ProviderConfig\n ): Promise<Pair | null> {\n const weth = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const poolAccessor = await poolProvider.getPools(\n [[weth, token]],\n providerConfig\n );\n const pool = poolAccessor.getPool(weth, token);\n\n if (!pool || pool.reserve0.equalTo(0) || pool.reserve1.equalTo(0)) {\n log.error(\n {\n weth,\n token,\n reserve0: pool?.reserve0.toExact(),\n reserve1: pool?.reserve1.toExact(),\n },\n `Could not find a valid WETH pool with ${token.symbol} for computing gas costs.`\n );\n\n return null;\n }\n\n return pool;\n }\n\n private async getHighestLiquidityUSDPool(\n chainId: ChainId,\n poolProvider: IRingV2PoolProvider,\n providerConfig?: ProviderConfig\n ): Promise<Pair> {\n const usdTokens = ringUsdGasTokensByChain[chainId];\n\n if (!usdTokens) {\n throw new Error(\n `Could not find a USD token for computing gas costs on ${chainId}`\n );\n }\n\n const usdPools = _.map<Token, [Token, Token]>(usdTokens, (usdToken) => [\n usdToken,\n FEW_WRAPPED_NATIVE_CURRENCY[chainId]!,\n ]);\n const poolAccessor = await poolProvider.getPools(usdPools, providerConfig);\n const poolsRaw = poolAccessor.getAllPools();\n const pools = _.filter(\n poolsRaw,\n (pool) =>\n pool.reserve0.greaterThan(0) &&\n pool.reserve1.greaterThan(0) &&\n // this case should never happen in production, but when we mock the pool provider it may return non native pairs\n (pool.token0.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!) ||\n pool.token1.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!))\n );\n\n if (pools.length == 0) {\n log.error(\n { pools },\n `Could not find a USD/WETH pool for computing gas costs.`\n );\n throw new Error(`Can't find fwUSD/fwWETH pool for computing gas costs.`);\n }\n\n const maxPool = _.maxBy(pools, (pool) => {\n if (pool.token0.equals(FEW_WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n return parseFloat(pool.reserve0.toSignificant(2));\n } else {\n return parseFloat(pool.reserve1.toSignificant(2));\n }\n }) as Pair;\n\n return maxPool;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gas-costs.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/gas-models/gas-costs.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\n\nimport { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency } from '@fewprotocol/sdk-core';\nimport { AAVE_MAINNET, LIDO_MAINNET } from '../../../providers';\nimport { V3Route, V4Route } from '../../router';\n\n// Cost for crossing an uninitialized tick.\nexport const COST_PER_UNINIT_TICK = BigNumber.from(0);\n\n//l2 execution fee on optimism is roughly the same as mainnet\nexport const BASE_SWAP_COST = (id: ChainId): BigNumber => {\n switch (id) {\n case ChainId.HYPER_MAINNET:\n case ChainId.MAINNET:\n case ChainId.GOERLI:\n case ChainId.SEPOLIA:\n case ChainId.OPTIMISM:\n case ChainId.OPTIMISM_GOERLI:\n case ChainId.OPTIMISM_SEPOLIA:\n case ChainId.BNB:\n case ChainId.AVALANCHE:\n case ChainId.BASE:\n case ChainId.BASE_GOERLI:\n case ChainId.ZORA:\n case ChainId.ZORA_SEPOLIA:\n case ChainId.ROOTSTOCK:\n case ChainId.BLAST:\n case ChainId.BLAST_SEPOLIA:\n case ChainId.ZKSYNC:\n case ChainId.WORLDCHAIN:\n case ChainId.UNICHAIN_SEPOLIA:\n case ChainId.UNICHAIN:\n case ChainId.BASE_SEPOLIA:\n case ChainId.MONAD_TESTNET: // TODO: double check on monad gas\n case ChainId.SONEIUM:\n case ChainId.STORY_ODYSSEY:\n case ChainId.STORY_MAINNET:\n return BigNumber.from(2000);\n case ChainId.ARBITRUM_ONE:\n case ChainId.ARBITRUM_GOERLI:\n case ChainId.ARBITRUM_SEPOLIA:\n return BigNumber.from(5000);\n case ChainId.POLYGON:\n case ChainId.POLYGON_MUMBAI:\n return BigNumber.from(2000);\n\n case ChainId.CELO:\n case ChainId.CELO_ALFAJORES:\n return BigNumber.from(2000);\n\n //TODO determine if sufficient\n case ChainId.GNOSIS:\n return BigNumber.from(2000);\n case ChainId.MOONBEAM:\n return BigNumber.from(2000);\n }\n};\nexport const COST_PER_INIT_TICK = (id: ChainId): BigNumber => {\n switch (id) {\n case ChainId.HYPER_MAINNET:\n case ChainId.MAINNET:\n case ChainId.GOERLI:\n case ChainId.SEPOLIA:\n case ChainId.BNB:\n case ChainId.AVALANCHE:\n return BigNumber.from(31000);\n case ChainId.OPTIMISM:\n case ChainId.OPTIMISM_GOERLI:\n case ChainId.OPTIMISM_SEPOLIA:\n case ChainId.BASE:\n case ChainId.BASE_GOERLI:\n case ChainId.ZORA:\n case ChainId.ZORA_SEPOLIA:\n case ChainId.ROOTSTOCK:\n case ChainId.BLAST:\n case ChainId.ZKSYNC:\n case ChainId.WORLDCHAIN:\n case ChainId.UNICHAIN_SEPOLIA:\n case ChainId.UNICHAIN:\n case ChainId.BASE_SEPOLIA:\n case ChainId.MONAD_TESTNET: // TODO: double check on monad gas\n case ChainId.SONEIUM:\n case ChainId.BLAST_SEPOLIA:\n case ChainId.STORY_ODYSSEY:\n case ChainId.STORY_MAINNET:\n return BigNumber.from(31000);\n case ChainId.ARBITRUM_ONE:\n case ChainId.ARBITRUM_GOERLI:\n case ChainId.ARBITRUM_SEPOLIA:\n return BigNumber.from(31000);\n case ChainId.POLYGON:\n case ChainId.POLYGON_MUMBAI:\n return BigNumber.from(31000);\n case ChainId.CELO:\n case ChainId.CELO_ALFAJORES:\n return BigNumber.from(31000);\n case ChainId.GNOSIS:\n return BigNumber.from(31000);\n case ChainId.MOONBEAM:\n return BigNumber.from(31000);\n }\n};\n\nexport const COST_PER_HOP = (id: ChainId): BigNumber => {\n switch (id) {\n case ChainId.HYPER_MAINNET:\n case ChainId.MAINNET:\n case ChainId.GOERLI:\n case ChainId.SEPOLIA:\n case ChainId.BNB:\n case ChainId.OPTIMISM:\n case ChainId.OPTIMISM_GOERLI:\n case ChainId.OPTIMISM_SEPOLIA:\n case ChainId.AVALANCHE:\n case ChainId.BASE:\n case ChainId.BASE_GOERLI:\n case ChainId.ZORA:\n case ChainId.ZORA_SEPOLIA:\n case ChainId.ROOTSTOCK:\n case ChainId.BLAST:\n case ChainId.ZKSYNC:\n case ChainId.WORLDCHAIN:\n case ChainId.UNICHAIN_SEPOLIA:\n case ChainId.UNICHAIN:\n case ChainId.BASE_SEPOLIA:\n case ChainId.MONAD_TESTNET: // TODO: double check on monad gas\n case ChainId.SONEIUM:\n case ChainId.BLAST_SEPOLIA:\n case ChainId.STORY_ODYSSEY:\n case ChainId.STORY_MAINNET:\n return BigNumber.from(80000);\n case ChainId.ARBITRUM_ONE:\n case ChainId.ARBITRUM_GOERLI:\n case ChainId.ARBITRUM_SEPOLIA:\n return BigNumber.from(80000);\n case ChainId.POLYGON:\n case ChainId.POLYGON_MUMBAI:\n return BigNumber.from(80000);\n case ChainId.CELO:\n case ChainId.CELO_ALFAJORES:\n return BigNumber.from(80000);\n case ChainId.GNOSIS:\n return BigNumber.from(80000);\n case ChainId.MOONBEAM:\n return BigNumber.from(80000);\n }\n};\n\nexport const SINGLE_HOP_OVERHEAD = (_id: ChainId): BigNumber => {\n return BigNumber.from(15000);\n};\n\nexport const TOKEN_OVERHEAD = (\n id: ChainId,\n route: V3Route | V4Route\n): BigNumber => {\n const currencies: Currency[] =\n route.protocol === Protocol.V4 ? route.currencyPath : route.tokenPath;\n let overhead = BigNumber.from(0);\n\n if (id == ChainId.MAINNET) {\n // AAVE's transfer contains expensive governance snapshotting logic. We estimate\n // it at around 150k.\n if (currencies.some((t: Currency) => t.equals(AAVE_MAINNET))) {\n overhead = overhead.add(150000);\n }\n\n // LDO's reaches out to an external token controller which adds a large overhead\n // of around 150k.\n if (currencies.some((t: Currency) => t.equals(LIDO_MAINNET))) {\n overhead = overhead.add(150000);\n }\n }\n\n return overhead;\n};\n\n// TODO: change per chain\nexport const NATIVE_WRAP_OVERHEAD = (id: ChainId): BigNumber => {\n switch (id) {\n default:\n return BigNumber.from(27938);\n }\n};\n\nexport const NATIVE_UNWRAP_OVERHEAD = (id: ChainId): BigNumber => {\n switch (id) {\n default:\n return BigNumber.from(36000);\n }\n};\n\nexport const NATIVE_OVERHEAD = (\n chainId: ChainId,\n amount: Currency,\n quote: Currency\n): BigNumber => {\n if (amount.isNative) {\n // need to wrap eth in\n return NATIVE_WRAP_OVERHEAD(chainId);\n }\n if (quote.isNative) {\n // need to unwrap eth out\n return NATIVE_UNWRAP_OVERHEAD(chainId);\n }\n return BigNumber.from(0);\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"gas-model.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/gas-models/gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport {\n ChainId,\n CurrencyAmount as CurrencyAmountRaw,\n Token,\n} from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport { Pool } from '@fewprotocol/uniswap-v3-sdk';\n\nimport { ProviderConfig } from '../../../providers/provider';\nimport {\n CUSD_CELO,\n CUSD_CELO_ALFAJORES,\n DAI_ARBITRUM,\n DAI_AVAX,\n DAI_BNB,\n DAI_GOERLI,\n DAI_MAINNET,\n DAI_OPTIMISM,\n DAI_OPTIMISM_GOERLI,\n DAI_OPTIMISM_SEPOLIA,\n DAI_POLYGON_MUMBAI,\n DAI_SEPOLIA,\n DAI_UNICHAIN,\n DAI_ZKSYNC,\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_BRIDGED_AVAX,\n USDC_CELO,\n USDC_ETHEREUM_GNOSIS,\n USDC_GOERLI,\n USDC_MAINNET,\n USDC_MOONBEAM,\n USDC_NATIVE_ARBITRUM,\n USDC_NATIVE_AVAX,\n USDC_NATIVE_BASE,\n USDC_NATIVE_CELO,\n USDC_NATIVE_OPTIMISM,\n USDC_NATIVE_POLYGON,\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_UNICHAIN_SEPOLIA,\n USDC_WORLDCHAIN,\n USDC_WORMHOLE_CELO,\n USDC_ZKSYNC,\n USDC_ZORA,\n USDCE_ZKSYNC,\n USDT_ARBITRUM,\n USDT_BNB,\n USDT_GOERLI,\n USDT_HYPER_MAINNET,\n USDT_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n USDT_OPTIMISM_GOERLI,\n USDT_OPTIMISM_SEPOLIA,\n WBTC_GOERLI,\n} from '../../../providers/token-provider';\nimport { IV2PoolProvider } from '../../../providers/v2/pool-provider';\nimport {\n ArbitrumGasData,\n IL2GasDataProvider,\n} from '../../../providers/v3/gas-data-provider';\nimport { WRAPPED_NATIVE_CURRENCY } from '../../../util';\nimport { CurrencyAmount } from '../../../util/amounts';\nimport {\n MixedRouteWithValidQuote,\n RingFewV2RouteWithValidQuote,\n RouteWithValidQuote,\n UniswapFewV3RouteWithValidQuote,\n UniswapFewV4RouteWithValidQuote,\n V2RouteWithValidQuote,\n V3RouteWithValidQuote,\n V4RouteWithValidQuote,\n} from '../entities/route-with-valid-quote';\n\n// When adding new usd gas tokens, ensure the tokens are ordered\n// from tokens with highest decimals to lowest decimals. For example,\n// DAI_AVAX has 18 decimals and comes before USDC_AVAX which has 6 decimals.\nexport const usdGasTokensByChain: { [chainId in ChainId]?: Token[] } = {\n [ChainId.HYPER_MAINNET]: [USDT_HYPER_MAINNET],\n [ChainId.MAINNET]: [DAI_MAINNET, USDC_MAINNET, USDT_MAINNET],\n [ChainId.ARBITRUM_ONE]: [\n DAI_ARBITRUM,\n USDC_ARBITRUM,\n USDC_NATIVE_ARBITRUM,\n USDT_ARBITRUM,\n ],\n [ChainId.OPTIMISM]: [\n DAI_OPTIMISM,\n USDC_OPTIMISM,\n USDC_NATIVE_OPTIMISM,\n USDT_OPTIMISM,\n ],\n [ChainId.OPTIMISM_GOERLI]: [\n DAI_OPTIMISM_GOERLI,\n USDC_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n ],\n [ChainId.OPTIMISM_SEPOLIA]: [\n DAI_OPTIMISM_SEPOLIA,\n USDC_OPTIMISM_SEPOLIA,\n USDT_OPTIMISM_SEPOLIA,\n ],\n [ChainId.ARBITRUM_GOERLI]: [USDC_ARBITRUM_GOERLI],\n [ChainId.ARBITRUM_SEPOLIA]: [USDC_ARBITRUM_SEPOLIA],\n [ChainId.GOERLI]: [DAI_GOERLI, USDC_GOERLI, USDT_GOERLI, WBTC_GOERLI],\n [ChainId.SEPOLIA]: [USDC_SEPOLIA, DAI_SEPOLIA],\n [ChainId.POLYGON]: [USDC_POLYGON, USDC_NATIVE_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [DAI_POLYGON_MUMBAI],\n [ChainId.CELO]: [CUSD_CELO, USDC_CELO, USDC_NATIVE_CELO, USDC_WORMHOLE_CELO],\n [ChainId.CELO_ALFAJORES]: [CUSD_CELO_ALFAJORES],\n [ChainId.GNOSIS]: [USDC_ETHEREUM_GNOSIS],\n [ChainId.MOONBEAM]: [USDC_MOONBEAM],\n [ChainId.BNB]: [USDT_BNB, USDC_BNB, DAI_BNB],\n [ChainId.AVALANCHE]: [\n DAI_AVAX,\n USDC_AVAX,\n USDC_NATIVE_AVAX,\n USDC_BRIDGED_AVAX,\n ],\n [ChainId.BASE]: [USDC_BASE, USDC_NATIVE_BASE],\n [ChainId.BLAST]: [USDB_BLAST],\n [ChainId.ZORA]: [USDC_ZORA],\n [ChainId.ZKSYNC]: [DAI_ZKSYNC, USDCE_ZKSYNC, USDC_ZKSYNC],\n [ChainId.WORLDCHAIN]: [USDC_WORLDCHAIN],\n [ChainId.UNICHAIN_SEPOLIA]: [USDC_UNICHAIN_SEPOLIA],\n [ChainId.MONAD_TESTNET]: [USDT_MONAD_TESTNET],\n [ChainId.BASE_SEPOLIA]: [USDC_BASE_SEPOLIA],\n [ChainId.UNICHAIN]: [DAI_UNICHAIN, USDC_UNICHAIN],\n [ChainId.SONEIUM]: [USDC_SONEIUM],\n};\n\nexport type L1ToL2GasCosts = {\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n};\n\nexport type GasModelProviderConfig = ProviderConfig & {\n /*\n * Any additional overhead to add to the gas estimate\n */\n additionalGasOverhead?: BigNumber;\n\n gasToken?: Token;\n};\n\nexport type BuildOnChainGasModelFactoryType = {\n chainId: ChainId;\n gasPriceWei: BigNumber;\n pools: LiquidityCalculationPools | null;\n amountToken: Token;\n quoteToken: Token;\n v2poolProvider: IV2PoolProvider;\n l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n providerConfig?: GasModelProviderConfig;\n};\n\nexport type BuildV2GasModelFactoryType = {\n chainId: ChainId;\n gasPriceWei: BigNumber;\n poolProvider: IV2PoolProvider;\n token: Token;\n l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n providerConfig?: GasModelProviderConfig;\n};\n\nexport type LiquidityCalculationPools = {\n usdPool: Pool | null;\n nativeAndQuoteTokenV3Pool: Pool | null;\n nativeAndAmountTokenV3Pool: Pool | null;\n nativeAndSpecifiedGasTokenV3Pool: Pool | null;\n};\n\nexport type GasModelType = {\n ringFewV2GasModel?: IGasModel<RingFewV2RouteWithValidQuote>;\n v2GasModel?: IGasModel<V2RouteWithValidQuote>;\n fewV2GasModel?: IGasModel<V2RouteWithValidQuote>;\n v3GasModel: IGasModel<V3RouteWithValidQuote>;\n fewV3GasModel: IGasModel<UniswapFewV3RouteWithValidQuote>;\n v4GasModel: IGasModel<V4RouteWithValidQuote>;\n fewV4GasModel: IGasModel<UniswapFewV4RouteWithValidQuote>;\n mixedRouteGasModel: IGasModel<MixedRouteWithValidQuote>;\n};\n\n/**\n * Contains functions for generating gas estimates for given routes.\n *\n * We generally compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * Generally these models should be optimized to return quickly by performing any\n * long running operations (like fetching external data) outside of the functions defined.\n * This is because the functions in the model are called once for every route and every\n * amount that is considered in the algorithm so it is important to minimize the number of\n * long running operations.\n */\nexport type IGasModel<TRouteWithValidQuote extends RouteWithValidQuote> = {\n estimateGasCost(routeWithValidQuote: TRouteWithValidQuote): {\n gasEstimate: BigNumber;\n gasCostInToken: CurrencyAmount;\n gasCostInUSD: CurrencyAmount;\n gasCostInGasToken?: CurrencyAmount;\n };\n calculateL1GasFees?(routes: TRouteWithValidQuote[]): Promise<L1ToL2GasCosts>;\n};\n\n/**\n * Factory for building gas models that can be used with any route to generate\n * gas estimates.\n *\n * Factory model is used so that any supporting data can be fetched once and\n * returned as part of the model.\n *\n * @export\n * @abstract\n * @class IV2GasModelFactory\n */\nexport abstract class IV2GasModelFactory {\n public abstract buildGasModel({\n chainId,\n gasPriceWei,\n poolProvider,\n token,\n providerConfig,\n }: BuildV2GasModelFactoryType): Promise<IGasModel<V2RouteWithValidQuote>>;\n}\n\n/**\n * Factory for building gas models that can be used with any route to generate\n * gas estimates.\n *\n * Factory model is used so that any supporting data can be fetched once and\n * returned as part of the model.\n *\n * @export\n * @abstract\n * @class IOnChainGasModelFactory\n */\nexport abstract class IOnChainGasModelFactory<\n TRouteWithValidQuote extends RouteWithValidQuote\n> {\n public abstract buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<IGasModel<TRouteWithValidQuote>>;\n\n protected totalInitializedTicksCrossed(\n initializedTicksCrossedList: number[]\n ) {\n let ticksCrossed = 0;\n for (let i = 0; i < initializedTicksCrossedList.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (initializedTicksCrossedList[i]! > 0) {\n // Quoter returns Array<number of calls to crossTick + 1>, so we need to subtract 1 here.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n ticksCrossed += initializedTicksCrossedList[i]! - 1;\n }\n }\n\n return ticksCrossed;\n }\n}\n\n// Determines if native currency is token0\n// Gets the native price of the pool, dependent on 0 or 1\n// quotes across the pool\nexport const getQuoteThroughNativePool = (\n chainId: ChainId,\n nativeTokenAmount: CurrencyAmountRaw<Token>,\n nativeTokenPool: Pool | Pair | null\n): CurrencyAmount => {\n const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId];\n const isToken0 = nativeTokenPool != null ? nativeTokenPool.token0.equals(nativeCurrency) : false;\n // returns mid price in terms of the native currency (the ratio of token/nativeToken)\n const nativeTokenPrice = isToken0\n ? nativeTokenPool != null ? nativeTokenPool.token0Price : null\n : nativeTokenPool != null ? nativeTokenPool.token1Price : null;\n // return gas cost in terms of the non native currency\n return nativeTokenPrice != null ? nativeTokenPrice.quote(nativeTokenAmount) as CurrencyAmount : CurrencyAmount.fromRawAmount(nativeTokenAmount.currency instanceof Token ? nativeTokenAmount.currency : nativeCurrency!, 0);\n // return nativeTokenPrice != null ? nativeTokenPrice.quote(nativeTokenAmount) as CurrencyAmount : CurrencyAmount.fromRawAmount(nativeTokenAmount.token, 0);\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/gas-models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8CAA4B;AAC5B,mDAAiC;AACjC,iEAA+C;AAC/C,8DAA4C;AAC5C,wEAAsD","sourcesContent":["export * from './gas-model';\nexport * from './ring-gas-model';\nexport * from './fewV2/v2-heuristic-gas-model';\nexport * from './v3/v3-heuristic-gas-model';\nexport * from './uniswapFewV3/v3-heuristic-gas-model';\n"]}
|
package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixed-route-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { partitionMixedRouteByProtocol } from '@fewprotocol/router-sdk';\nimport { ChainId } 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';\nimport JSBI from 'jsbi';\n\nimport { TPool } from '@fewprotocol/router-sdk';\nimport { WRAPPED_NATIVE_CURRENCY } from '../../../..';\nimport { log } from '../../../../util';\nimport { CurrencyAmount } from '../../../../util/amounts';\nimport { getV2NativePool } from '../../../../util/gas-factory-helpers';\nimport { MixedRouteWithValidQuote } from '../../entities/route-with-valid-quote';\nimport {\n BASE_SWAP_COST,\n COST_PER_HOP,\n COST_PER_INIT_TICK,\n COST_PER_UNINIT_TICK,\n} from '../gas-costs';\nimport {\n BuildOnChainGasModelFactoryType,\n GasModelProviderConfig,\n getQuoteThroughNativePool,\n IGasModel,\n IOnChainGasModelFactory,\n} from '../gas-model';\nimport {\n BASE_SWAP_COST as BASE_SWAP_COST_V2,\n COST_PER_EXTRA_HOP as COST_PER_EXTRA_HOP_V2,\n} from '../v2/v2-heuristic-gas-model';\n\n/**\n * Computes a gas estimate for a mixed route swap using heuristics.\n * Considers number of hops in the route, number of ticks crossed\n * and the typical base cost for a swap.\n *\n * We get the number of ticks crossed in a swap from the MixedRouteQuoterV1\n * contract.\n *\n * We compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929. We would have to make a request for every swap we wanted to estimate.\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * @export\n * @class MixedRouteHeuristicGasModelFactory\n */\nexport class MixedRouteHeuristicGasModelFactory extends IOnChainGasModelFactory<MixedRouteWithValidQuote> {\n public async buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n quoteToken,\n v2poolProvider: V2poolProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<MixedRouteWithValidQuote>\n > {\n const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId]!;\n const usdPool: V3Pool | null = pools != null ? pools.usdPool : null;\n const usdToken = usdPool != null ? (usdPool.token0.equals(nativeCurrency)\n ? usdPool.token1\n : usdPool.token0) : null;\n\n let nativeV2Pool: Pair | null;\n // Avoid fetching for a (WETH,WETH) pool here, we handle the quoteToken = wrapped native case in estimateGasCost\n if (!quoteToken.equals(nativeCurrency) && V2poolProvider) {\n /// MixedRoutes\n nativeV2Pool = await getV2NativePool(\n quoteToken,\n V2poolProvider,\n providerConfig\n );\n }\n\n const estimateGasCost = (\n routeWithValidQuote: MixedRouteWithValidQuote\n ): {\n gasEstimate: BigNumber;\n gasCostInToken: CurrencyAmount;\n gasCostInUSD: CurrencyAmount;\n gasCostInGasToken?: CurrencyAmount;\n } => {\n const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(\n routeWithValidQuote,\n gasPriceWei,\n chainId,\n providerConfig\n );\n\n /** ------ MARK: USD Logic -------- */\n const gasCostInTermsOfUSD = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n usdPool\n );\n\n /** ------ MARK: Conditional logic run if gasToken is specified -------- */\n const nativeAndSpecifiedGasTokenPool: V3Pool | null =\n pools != null ? pools.nativeAndSpecifiedGasTokenV3Pool : null;\n let gasCostInTermsOfGasToken: CurrencyAmount | undefined = undefined;\n if (nativeAndSpecifiedGasTokenPool) {\n gasCostInTermsOfGasToken = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativeAndSpecifiedGasTokenPool\n );\n }\n // if the gasToken is the native currency, we can just use the totalGasCostNativeCurrency\n else if (providerConfig?.gasToken?.equals(nativeCurrency)) {\n gasCostInTermsOfGasToken = totalGasCostNativeCurrency;\n }\n\n /** ------ MARK: return early if quoteToken is wrapped native currency ------- */\n if (quoteToken.equals(nativeCurrency)) {\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: totalGasCostNativeCurrency,\n gasCostInUSD: gasCostInTermsOfUSD,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n }\n\n /** ------ MARK: Main gas logic in terms of quote token -------- */\n\n // If the quote token is not in the native currency, we convert the gas cost to be in terms of the quote token.\n // We do this by getting the highest liquidity <quoteToken>/<nativeCurrency> pool. eg. <quoteToken>/ETH pool.\n const nativeV3Pool: V3Pool | null = pools != null ? pools.nativeAndQuoteTokenV3Pool : null;\n\n if (!nativeV3Pool && !nativeV2Pool) {\n log.info(\n `Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol} to produce gas adjusted costs. Route will not account for gas.`\n );\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: CurrencyAmount.fromRawAmount(quoteToken, 0),\n gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken!, 0),\n };\n }\n\n /// we will use nativeV2Pool for fallback if nativeV3 does not exist or has 0 liquidity\n /// can use ! here because we return above if v3Pool and v2Pool are null\n const nativePool =\n (!nativeV3Pool || JSBI.equal(nativeV3Pool.liquidity, JSBI.BigInt(0))) &&\n nativeV2Pool\n ? nativeV2Pool\n : nativeV3Pool!;\n\n const gasCostInTermsOfQuoteToken = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativePool\n );\n\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: gasCostInTermsOfQuoteToken,\n gasCostInUSD: gasCostInTermsOfUSD!,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n };\n\n return {\n estimateGasCost: estimateGasCost.bind(this),\n };\n }\n\n private estimateGas(\n routeWithValidQuote: MixedRouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const totalInitializedTicksCrossed = this.totalInitializedTicksCrossed(\n routeWithValidQuote.initializedTicksCrossedList\n );\n\n /**\n * Since we must make a separate call to multicall for each v3 and v2 section, we will have to\n * add the BASE_SWAP_COST to each section.\n */\n let baseGasUseV2Only = BigNumber.from(0);\n let baseGasUseV3Only = BigNumber.from(0);\n let baseGasUse = BigNumber.from(0);\n let routeContainsV4Pool = false;\n\n const route = routeWithValidQuote.route;\n\n const res = partitionMixedRouteByProtocol(route);\n res.map((section: TPool[]) => {\n if (section.every((pool) => pool instanceof V3Pool)) {\n baseGasUseV3Only = baseGasUseV3Only.add(BASE_SWAP_COST(chainId));\n baseGasUseV3Only = baseGasUseV3Only.add(\n COST_PER_HOP(chainId).mul(section.length)\n );\n baseGasUse = baseGasUse.add(baseGasUseV3Only);\n } else if (section.every((pool) => pool instanceof Pair)) {\n baseGasUseV2Only = baseGasUseV2Only.add(BASE_SWAP_COST_V2);\n baseGasUseV2Only = baseGasUseV2Only.add(\n /// same behavior in v2 heuristic gas model factory\n COST_PER_EXTRA_HOP_V2.mul(section.length - 1)\n );\n baseGasUse = baseGasUse.add(baseGasUseV2Only);\n } else if (section.every((pool) => pool instanceof V4Pool)) {\n routeContainsV4Pool = true;\n }\n });\n\n const tickGasUse = COST_PER_INIT_TICK(chainId).mul(\n totalInitializedTicksCrossed\n );\n const uninitializedTickGasUse = COST_PER_UNINIT_TICK.mul(0);\n\n if (routeContainsV4Pool) {\n // If the route contains a V4 pool, we know we are hitting mixed quoter V2, not mixed quoter V1,\n // Hence we already know the v3 and v4 hops part of the quoter gas estimate.\n // We only need to add the base gas use for the v2 part of the route,\n // because mixed quoter doesn't have a way to estimate gas for v2 pools swaps.\n baseGasUse = baseGasUseV2Only.add(routeWithValidQuote.quoterGasEstimate);\n } else {\n // base estimate gas used based on chainId estimates for hops and ticks gas useage\n baseGasUse = baseGasUse.add(tickGasUse).add(uninitializedTickGasUse);\n }\n\n if (providerConfig?.additionalGasOverhead) {\n baseGasUse = baseGasUse.add(providerConfig.additionalGasOverhead);\n }\n\n const baseGasCostWei = gasPriceWei.mul(baseGasUse);\n\n const wrappedCurrency = WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(\n wrappedCurrency,\n baseGasCostWei.toString()\n );\n\n return {\n totalGasCostNativeCurrency,\n totalInitializedTicksCrossed,\n baseGasUse,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ring-gas-model.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/gas-models/ring-gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport {\n ChainId,\n CurrencyAmount as CurrencyAmountRaw,\n Token,\n} from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport { Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport { Pair as RingV2Pair } from '@fewprotocol/v2-sdk';\n\nimport { IRingV2PoolProvider } from '../../../providers/fewV2/ring-pool-provider';\nimport { ProviderConfig } from '../../../providers/provider';\nimport {\n CUSD_CELO,\n CUSD_CELO_ALFAJORES,\n DAI_AVAX,\n DAI_BNB,\n DAI_GOERLI,\n DAI_OPTIMISM,\n DAI_OPTIMISM_GOERLI,\n DAI_OPTIMISM_SEPOLIA,\n DAI_POLYGON_MUMBAI,\n DAI_ZKSYNC,\n FEW_DAI_ARB_SEPOLIA,\n FEW_DAI_ARBITRUM,\n FEW_DAI_MAINNET,\n FEW_DAI_SEPOLIA,\n FEW_UNI_MAINNET,\n FEW_USDB_BLAST,\n FEW_USDC_ARBITRUM,\n FEW_USDC_BASE,\n FEW_USDC_BNB,\n FEW_USDC_MAINNET,\n FEW_USDC_SEPOLIA,\n FEW_USDC_UNICHAIN,\n FEW_USDT_ARBITRUM,\n FEW_USDT_BNB,\n FEW_USDT_HYPER_MAINNET,\n FEW_USDT_MAINNET,\n USDB_BLAST,\n USDC_ARBITRUM_GOERLI,\n USDC_AVAX,\n USDC_BASE_SEPOLIA,\n USDC_BNB,\n USDC_ETHEREUM_GNOSIS,\n USDC_GOERLI,\n USDC_MOONBEAM,\n USDC_OPTIMISM,\n USDC_OPTIMISM_GOERLI,\n USDC_OPTIMISM_SEPOLIA,\n USDC_POLYGON,\n USDC_SONEIUM,\n USDC_WORLDCHAIN,\n USDC_ZKSYNC,\n USDC_ZORA,\n USDCE_ZKSYNC,\n USDT_BNB,\n USDT_GOERLI,\n USDT_HYPER_MAINNET,\n USDT_MONAD_TESTNET,\n USDT_OPTIMISM,\n USDT_OPTIMISM_GOERLI,\n USDT_OPTIMISM_SEPOLIA,\n WBTC_GOERLI,\n} from '../../../providers/token-provider';\nimport {\n ArbitrumGasData,\n IL2GasDataProvider,\n} from '../../../providers/v3/gas-data-provider';\nimport { FEW_WRAPPED_NATIVE_CURRENCY } from '../../../util';\nimport { CurrencyAmount } from '../../../util/amounts';\nimport {\n MixedRouteWithValidQuote,\n RingFewV2RouteWithValidQuote,\n RouteWithValidQuote,\n V3RouteWithValidQuote,\n V4RouteWithValidQuote,\n} from '../entities/route-with-valid-quote';\n\n// When adding new usd gas tokens, ensure the tokens are ordered\n// from tokens with highest decimals to lowest decimals. For example,\n// DAI_AVAX has 18 decimals and comes before USDC_AVAX which has 6 decimals.\nexport const ringUsdGasTokensByChain: { [chainId in ChainId]?: Token[] } = {\n [ChainId.HYPER_MAINNET]: [FEW_USDT_HYPER_MAINNET],\n [ChainId.MAINNET]: [FEW_DAI_MAINNET, FEW_USDC_MAINNET, FEW_USDT_MAINNET, FEW_UNI_MAINNET],\n [ChainId.ARBITRUM_ONE]: [FEW_DAI_ARBITRUM, FEW_USDC_ARBITRUM, FEW_USDT_ARBITRUM],\n [ChainId.OPTIMISM]: [DAI_OPTIMISM, USDC_OPTIMISM, USDT_OPTIMISM],\n [ChainId.OPTIMISM_GOERLI]: [\n DAI_OPTIMISM_GOERLI,\n USDC_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n ],\n [ChainId.OPTIMISM_SEPOLIA]: [\n DAI_OPTIMISM_SEPOLIA,\n USDC_OPTIMISM_SEPOLIA,\n USDT_OPTIMISM_SEPOLIA,\n ],\n [ChainId.ARBITRUM_GOERLI]: [USDC_ARBITRUM_GOERLI],\n [ChainId.ARBITRUM_SEPOLIA]: [FEW_DAI_ARB_SEPOLIA],\n [ChainId.GOERLI]: [DAI_GOERLI, USDC_GOERLI, USDT_GOERLI, WBTC_GOERLI],\n [ChainId.SEPOLIA]: [FEW_DAI_SEPOLIA, FEW_USDC_SEPOLIA],\n [ChainId.POLYGON]: [USDC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [DAI_POLYGON_MUMBAI],\n [ChainId.CELO]: [CUSD_CELO],\n [ChainId.CELO_ALFAJORES]: [CUSD_CELO_ALFAJORES],\n [ChainId.GNOSIS]: [USDC_ETHEREUM_GNOSIS],\n [ChainId.MOONBEAM]: [USDC_MOONBEAM],\n [ChainId.BNB]: [FEW_USDT_BNB, FEW_USDC_BNB],\n [ChainId.AVALANCHE]: [DAI_AVAX, USDC_AVAX],\n [ChainId.BASE]: [FEW_USDC_BASE],\n [ChainId.BLAST]: [FEW_USDB_BLAST],\n [ChainId.ZORA]: [USDC_ZORA],\n [ChainId.ZKSYNC]: [DAI_ZKSYNC, USDCE_ZKSYNC, USDC_ZKSYNC],\n [ChainId.WORLDCHAIN]: [USDC_WORLDCHAIN],\n [ChainId.UNICHAIN_SEPOLIA]: [FEW_DAI_SEPOLIA, FEW_USDC_SEPOLIA],\n [ChainId.MONAD_TESTNET]: [USDT_MONAD_TESTNET],\n [ChainId.BASE_SEPOLIA]: [USDC_BASE_SEPOLIA],\n [ChainId.UNICHAIN]: [FEW_USDC_UNICHAIN],\n [ChainId.SONEIUM]: [USDC_SONEIUM],\n};\n\nexport const onlySupportV2NetworkUsdGasTokensByChain: { [chainId in ChainId]?: Token[] } = {\n [ChainId.HYPER_MAINNET]: [USDT_HYPER_MAINNET],\n [ChainId.MAINNET]: [FEW_DAI_MAINNET, FEW_USDC_MAINNET, FEW_USDT_MAINNET, FEW_UNI_MAINNET],\n [ChainId.ARBITRUM_ONE]: [FEW_DAI_ARBITRUM, FEW_USDC_ARBITRUM, FEW_USDT_ARBITRUM],\n [ChainId.OPTIMISM]: [DAI_OPTIMISM, USDC_OPTIMISM, USDT_OPTIMISM],\n [ChainId.OPTIMISM_GOERLI]: [\n DAI_OPTIMISM_GOERLI,\n USDC_OPTIMISM_GOERLI,\n USDT_OPTIMISM_GOERLI,\n ],\n [ChainId.OPTIMISM_SEPOLIA]: [\n DAI_OPTIMISM_SEPOLIA,\n USDC_OPTIMISM_SEPOLIA,\n USDT_OPTIMISM_SEPOLIA,\n ],\n [ChainId.ARBITRUM_GOERLI]: [USDC_ARBITRUM_GOERLI],\n [ChainId.ARBITRUM_SEPOLIA]: [FEW_DAI_ARB_SEPOLIA],\n [ChainId.GOERLI]: [DAI_GOERLI, USDC_GOERLI, USDT_GOERLI, WBTC_GOERLI],\n [ChainId.SEPOLIA]: [FEW_DAI_SEPOLIA, FEW_USDC_SEPOLIA],\n [ChainId.POLYGON]: [USDC_POLYGON],\n [ChainId.POLYGON_MUMBAI]: [DAI_POLYGON_MUMBAI],\n [ChainId.CELO]: [CUSD_CELO],\n [ChainId.CELO_ALFAJORES]: [CUSD_CELO_ALFAJORES],\n [ChainId.GNOSIS]: [USDC_ETHEREUM_GNOSIS],\n [ChainId.MOONBEAM]: [USDC_MOONBEAM],\n [ChainId.BNB]: [USDT_BNB, USDC_BNB, DAI_BNB],\n [ChainId.AVALANCHE]: [DAI_AVAX, USDC_AVAX],\n [ChainId.BASE]: [FEW_USDC_BASE],\n [ChainId.BLAST]: [USDB_BLAST],\n [ChainId.ZORA]: [USDC_ZORA],\n [ChainId.ZKSYNC]: [DAI_ZKSYNC, USDCE_ZKSYNC, USDC_ZKSYNC],\n [ChainId.WORLDCHAIN]: [USDC_WORLDCHAIN],\n [ChainId.UNICHAIN_SEPOLIA]: [FEW_DAI_SEPOLIA, FEW_USDC_SEPOLIA],\n [ChainId.MONAD_TESTNET]: [USDT_MONAD_TESTNET],\n [ChainId.BASE_SEPOLIA]: [USDC_BASE_SEPOLIA],\n [ChainId.UNICHAIN]: [FEW_USDC_UNICHAIN],\n [ChainId.SONEIUM]: [USDC_SONEIUM],\n};\n\nexport type RingL1ToL2GasCosts = {\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n};\n\nexport type RingGasModelProviderConfig = ProviderConfig & {\n /*\n * Any additional overhead to add to the gas estimate\n */\n additionalGasOverhead?: BigNumber;\n\n gasToken?: Token;\n};\n\nexport type BuildRingOnChainGasModelFactoryType = {\n chainId: ChainId;\n gasPriceWei: BigNumber;\n pools: RingLiquidityCalculationPools;\n amountToken: Token;\n quoteToken: Token;\n ringV2poolProvider: IRingV2PoolProvider;\n l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n providerConfig?: RingGasModelProviderConfig;\n};\n\nexport type BuildRingFewV2GasModelFactoryType = {\n chainId: ChainId;\n gasPriceWei: BigNumber;\n poolProvider: IRingV2PoolProvider;\n token: Token;\n l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n providerConfig?: RingGasModelProviderConfig;\n};\n\nexport type RingLiquidityCalculationPools = {\n usdPool: Pool;\n nativeAndQuoteTokenV3Pool: Pool | null;\n nativeAndAmountTokenV3Pool: Pool | null;\n nativeAndSpecifiedGasTokenV3Pool: Pool | null;\n};\n\nexport type RingGasModelType = {\n ringV2GasModel?: IRingGasModel<RingFewV2RouteWithValidQuote>;\n v3GasModel: IRingGasModel<V3RouteWithValidQuote>;\n v4GasModel: IRingGasModel<V4RouteWithValidQuote>;\n mixedRouteGasModel: IRingGasModel<MixedRouteWithValidQuote>;\n};\n\n/**\n * Contains functions for generating gas estimates for given routes.\n *\n * We generally compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * Generally these models should be optimized to return quickly by performing any\n * long running operations (like fetching external data) outside of the functions defined.\n * This is because the functions in the model are called once for every route and every\n * amount that is considered in the algorithm so it is important to minimize the number of\n * long running operations.\n */\nexport type IRingGasModel<TRouteWithValidQuote extends RouteWithValidQuote> = {\n estimateGasCost(routeWithValidQuote: TRouteWithValidQuote): {\n gasEstimate: BigNumber;\n gasCostInToken: CurrencyAmount;\n gasCostInUSD: CurrencyAmount;\n gasCostInGasToken?: CurrencyAmount;\n };\n calculateL1GasFees?(routes: TRouteWithValidQuote[]): Promise<RingL1ToL2GasCosts>;\n};\n\n/**\n * Factory for building gas models that can be used with any route to generate\n * gas estimates.\n *\n * Factory model is used so that any supporting data can be fetched once and\n * returned as part of the model.\n *\n * @export\n * @abstract\n * @class IRingFewV2GasModelFactory\n */\nexport abstract class IRingFewV2GasModelFactory {\n public abstract buildGasModel({\n chainId,\n gasPriceWei,\n poolProvider,\n token,\n providerConfig,\n }: BuildRingFewV2GasModelFactoryType): Promise<IRingGasModel<RingFewV2RouteWithValidQuote>>;\n}\n\n/**\n * Factory for building gas models that can be used with any route to generate\n * gas estimates.\n *\n * Factory model is used so that any supporting data can be fetched once and\n * returned as part of the model.\n *\n * @export\n * @abstract\n * @class IOnChainRingFewGasModelFactory\n */\nexport abstract class IOnChainRingFewGasModelFactory<\n TRouteWithValidQuote extends RouteWithValidQuote\n> {\n public abstract buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n ringV2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildRingOnChainGasModelFactoryType): Promise<IRingGasModel<TRouteWithValidQuote>>;\n\n protected totalInitializedTicksCrossed(\n initializedTicksCrossedList: number[]\n ) {\n let ticksCrossed = 0;\n for (let i = 0; i < initializedTicksCrossedList.length; i++) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (initializedTicksCrossedList[i]! > 0) {\n // Quoter returns Array<number of calls to crossTick + 1>, so we need to subtract 1 here.\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n ticksCrossed += initializedTicksCrossedList[i]! - 1;\n }\n }\n\n return ticksCrossed;\n }\n}\n\n// Determines if native currency is token0\n// Gets the native price of the pool, dependent on 0 or 1\n// quotes across the pool\nexport const getRingQuoteThroughNativePool = (\n chainId: ChainId,\n nativeTokenAmount: CurrencyAmountRaw<Token>,\n nativeTokenPool: Pool | Pair | RingV2Pair | null\n): CurrencyAmount => {\n // if(!isFewToken(nativeTokenPool.token0) || !isFewToken(nativeTokenPool.token1)) {\n // const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId];\n // const isToken0 = nativeTokenPool.token0.equals(nativeCurrency!.wrapped);\n // // returns mid price in terms of the native currency (the ratio of token/nativeToken)\n // const nativeTokenPrice = isToken0\n // ? nativeTokenPool.token0Price\n // : nativeTokenPool.token1Price;\n\n // return nativeTokenPrice.quote(nativeTokenAmount) as CurrencyAmount;\n // } else {\n // const nativeCurrency = FEW_WRAPPED_NATIVE_CURRENCY[chainId];\n // const isToken0 = nativeTokenPool.token0.equals(nativeCurrency!.wrapped);\n // // returns mid price in terms of the native currency (the ratio of token/nativeToken)\n // const nativeTokenPrice = isToken0\n // ? nativeTokenPool.token0Price\n // : nativeTokenPool.token1Price;\n\n // const FewBaseCurrency = getFewTokenFromOriginalToken(nativeTokenPrice.baseCurrency, chainId)\n // const FewQuoteCurrency = getFewTokenFromOriginalToken(nativeTokenPrice.quoteCurrency, chainId)\n // const fewNativeTokenPrice = new Price(\n // FewBaseCurrency,\n // FewQuoteCurrency,\n // nativeTokenPrice.denominator,\n // nativeTokenPrice.numerator\n // );\n\n // // return gas cost in terms of the non native currency\n // return fewNativeTokenPrice.quote(nativeTokenAmount) as CurrencyAmount;\n // }\n const nativeCurrency = FEW_WRAPPED_NATIVE_CURRENCY[chainId];\n const isToken0 = nativeTokenPool != null ? nativeTokenPool.token0.equals(nativeCurrency!.wrapped) : false;\n // returns mid price in terms of the native currency (the ratio of token/nativeToken)\n const nativeTokenPrice = isToken0\n ? nativeTokenPool != null ? nativeTokenPool.token0Price : null\n : nativeTokenPool != null ? nativeTokenPool.token1Price : null;\n // return gas cost in terms of the non native currency\n return nativeTokenPrice != null ? nativeTokenPrice.quote(nativeTokenAmount) as CurrencyAmount : CurrencyAmount.fromRawAmount(nativeTokenAmount.currency instanceof Token ? nativeTokenAmount.currency : nativeCurrency!, 0);\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tick-based-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId, Percent, Price } from '@fewprotocol/sdk-core';\nimport { Pool } from '@fewprotocol/uniswap-v3-sdk';\nimport { CurrencyAmount, FEW_WRAPPED_NATIVE_CURRENCY, log, WRAPPED_NATIVE_CURRENCY } from '../../../util';\nimport { calculateL1GasFeesHelper } from '../../../util/gas-factory-helpers';\nimport { UniswapFewV3RouteWithValidQuote, UniswapFewV4RouteWithValidQuote, V3RouteWithValidQuote, V4RouteWithValidQuote } from '../entities';\nimport {\n BASE_SWAP_COST,\n COST_PER_HOP,\n COST_PER_INIT_TICK,\n COST_PER_UNINIT_TICK,\n SINGLE_HOP_OVERHEAD,\n TOKEN_OVERHEAD,\n} from './gas-costs';\nimport {\n BuildOnChainGasModelFactoryType,\n GasModelProviderConfig,\n getQuoteThroughNativePool,\n IGasModel,\n IOnChainGasModelFactory,\n} from './gas-model';\nimport { getRingQuoteThroughNativePool } from './ring-gas-model';\n\nexport abstract class TickBasedHeuristicGasModelFactory<\n TRouteWithValidQuote extends\n V3RouteWithValidQuote\n | UniswapFewV3RouteWithValidQuote\n | V4RouteWithValidQuote\n | UniswapFewV4RouteWithValidQuote\n> extends IOnChainGasModelFactory<TRouteWithValidQuote> {\n protected provider: BaseProvider;\n\n protected constructor(provider: BaseProvider) {\n super();\n this.provider = provider;\n }\n\n protected async buildGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<TRouteWithValidQuote>\n > {\n const l2GasData = l2GasDataProvider\n ? await l2GasDataProvider.getGasData(providerConfig)\n : undefined;\n\n const usdPool: Pool | null = pools != null ? pools.usdPool : null;\n\n const calculateL1GasFees = async (\n route: TRouteWithValidQuote[]\n ): Promise<{\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n }> => {\n return await calculateL1GasFeesHelper(\n route,\n chainId,\n usdPool,\n quoteToken,\n pools != null ? pools.nativeAndQuoteTokenV3Pool : null,\n this.provider,\n l2GasData,\n providerConfig\n );\n };\n\n const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId]!;\n let nativeAmountPool: Pool | null = null;\n if (!amountToken.equals(nativeCurrency)) {\n nativeAmountPool = pools != null ? pools.nativeAndAmountTokenV3Pool : null;\n }\n\n const usdToken = usdPool != null ? (usdPool.token0.equals(nativeCurrency)\n ? usdPool.token1\n : usdPool.token0) : null;\n\n const estimateGasCost = (\n routeWithValidQuote: TRouteWithValidQuote\n ): {\n gasEstimate: BigNumber;\n gasCostInToken: CurrencyAmount;\n gasCostInUSD: CurrencyAmount;\n gasCostInGasToken?: CurrencyAmount;\n } => {\n const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(\n routeWithValidQuote,\n gasPriceWei,\n chainId,\n providerConfig\n );\n\n /** ------ MARK: USD logic -------- */\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n const gasCostInTermsOfUSD = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n usdPool\n );\n\n /** ------ MARK: Conditional logic run if gasToken is specified -------- */\n const nativeAndSpecifiedGasTokenPool: Pool | null =\n pools != null ? pools.nativeAndSpecifiedGasTokenV3Pool : null;\n let gasCostInTermsOfGasToken: CurrencyAmount | undefined = undefined;\n // we don't want to fetch the gasToken pool if the gasToken is the native currency\n if (nativeAndSpecifiedGasTokenPool) {\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n gasCostInTermsOfGasToken = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativeAndSpecifiedGasTokenPool\n );\n }\n // if the gasToken is the native currency, we can just use the totalGasCostNativeCurrency\n else if (providerConfig?.gasToken?.equals(nativeCurrency)) {\n gasCostInTermsOfGasToken = totalGasCostNativeCurrency;\n }\n\n /** ------ MARK: return early if quoteToken is wrapped native currency ------- */\n if (quoteToken.equals(nativeCurrency)) {\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: totalGasCostNativeCurrency,\n gasCostInUSD: gasCostInTermsOfUSD,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n }\n\n /** ------ MARK: Main gas logic in terms of quote token -------- */\n\n // Since the quote token is not in the native currency, we convert the gas cost to be in terms of the quote token.\n // We do this by getting the highest liquidity <quoteToken>/<nativeCurrency> pool. eg. <quoteToken>/ETH pool.\n const nativeAndQuoteTokenPool: Pool | null =\n pools != null ? pools.nativeAndQuoteTokenV3Pool : null;\n\n let gasCostInTermsOfQuoteToken: CurrencyAmount | null = null;\n if (nativeAndQuoteTokenPool) {\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n gasCostInTermsOfQuoteToken = getQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativeAndQuoteTokenPool\n );\n }\n // We may have a nativeAmountPool, but not a nativePool\n else {\n log.info(\n `Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol} to produce gas adjusted costs. Using amountToken to calculate gas costs.`\n );\n }\n\n /** ------ MARK: (V3 and V4 ONLY) Logic for calculating synthetic gas cost in terms of amount token -------- */\n // TODO: evaluate effectiveness and potentially refactor\n\n // Highest liquidity pool for the non quote token / ETH\n // A pool with the non quote token / ETH should not be required and errors should be handled separately\n if (nativeAmountPool) {\n // get current execution price (amountToken / quoteToken)\n const executionPrice = new Price(\n routeWithValidQuote.amount.currency,\n routeWithValidQuote.quote.currency,\n routeWithValidQuote.amount.quotient,\n routeWithValidQuote.quote.quotient\n );\n\n const inputIsToken0 =\n nativeAmountPool.token0.address == nativeCurrency.address;\n // ratio of input / native\n const nativeAndAmountTokenPrice = inputIsToken0\n ? nativeAmountPool.token0Price\n : nativeAmountPool.token1Price;\n\n const gasCostInTermsOfAmountToken = nativeAndAmountTokenPrice.quote(\n totalGasCostNativeCurrency\n ) as CurrencyAmount;\n\n // Convert gasCostInTermsOfAmountToken to quote token using execution price\n let syntheticGasCostInTermsOfQuoteToken: CurrencyAmount | null;\n try {\n syntheticGasCostInTermsOfQuoteToken = executionPrice.quote(\n gasCostInTermsOfAmountToken\n );\n } catch (err) {\n if (\n err instanceof RangeError &&\n err.message.includes('Division by zero')\n ) {\n // If the quote fails (division by zero), set syntheticGasCostInTermsOfQuoteToken to null\n syntheticGasCostInTermsOfQuoteToken = null;\n } else {\n // any other error, throw\n throw err;\n }\n }\n\n // Note that the syntheticGasCost being lessThan the original quoted value is not always strictly better\n // e.g. the scenario where the amountToken/ETH pool is very illiquid as well and returns an extremely small number\n // however, it is better to have the gasEstimation be almost 0 than almost infinity, as the user will still receive a quote\n // Only use syntheticGasCostInTermsOfQuoteToken if it's within 30% of the original gasCostInTermsOfQuoteToken as a safeguard.\n if (\n syntheticGasCostInTermsOfQuoteToken !== null &&\n (gasCostInTermsOfQuoteToken === null ||\n (syntheticGasCostInTermsOfQuoteToken.lessThan(\n gasCostInTermsOfQuoteToken.asFraction\n ) &&\n gasCostInTermsOfQuoteToken\n .subtract(syntheticGasCostInTermsOfQuoteToken)\n .lessThan(\n gasCostInTermsOfQuoteToken.multiply(new Percent(30, 100))\n .asFraction\n )))\n ) {\n log.info(\n {\n nativeAndAmountTokenPrice:\n nativeAndAmountTokenPrice.toSignificant(6),\n gasCostInTermsOfQuoteToken: gasCostInTermsOfQuoteToken\n ? gasCostInTermsOfQuoteToken.toExact()\n : 0,\n gasCostInTermsOfAmountToken:\n gasCostInTermsOfAmountToken.toExact(),\n executionPrice: executionPrice.toSignificant(6),\n syntheticGasCostInTermsOfQuoteToken:\n syntheticGasCostInTermsOfQuoteToken?.toSignificant(6),\n },\n 'New gasCostInTermsOfQuoteToken calculated with synthetic quote token price is less than original'\n );\n\n gasCostInTermsOfQuoteToken = syntheticGasCostInTermsOfQuoteToken;\n }\n }\n\n // If gasCostInTermsOfQuoteToken is null, both attempts to calculate gasCostInTermsOfQuoteToken failed (nativePool and amountNativePool)\n if (gasCostInTermsOfQuoteToken === null && usdToken != null) {\n log.info(\n `Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol}, or amount Token, ${amountToken.symbol} to produce gas adjusted costs. Route will not account for gas.`\n );\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: CurrencyAmount.fromRawAmount(quoteToken, 0),\n gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),\n };\n }\n\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: gasCostInTermsOfQuoteToken ?? CurrencyAmount.fromRawAmount(quoteToken, 0),\n gasCostInUSD: gasCostInTermsOfUSD!,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n };\n\n return {\n estimateGasCost: estimateGasCost.bind(this),\n calculateL1GasFees,\n };\n }\n\n protected async buildFewGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<TRouteWithValidQuote>\n > {\n const l2GasData = l2GasDataProvider\n ? await l2GasDataProvider.getGasData(providerConfig)\n : undefined;\n\n const usdPool: Pool | null = pools != null ? pools.usdPool : null;\n\n const calculateL1GasFees = async (\n route: TRouteWithValidQuote[]\n ): Promise<{\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n }> => {\n return await calculateL1GasFeesHelper(\n route,\n chainId,\n usdPool,\n quoteToken,\n pools != null ? pools.nativeAndQuoteTokenV3Pool : null,\n this.provider,\n l2GasData,\n providerConfig\n );\n };\n\n const nativeCurrency = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!;\n let nativeAmountPool: Pool | null = null;\n if (!amountToken.equals(nativeCurrency)) {\n nativeAmountPool = pools != null ? pools.nativeAndAmountTokenV3Pool : null;\n }\n\n const usdToken = usdPool != null ? (usdPool.token0.equals(nativeCurrency)\n ? usdPool.token1\n : usdPool.token0) : null;\n\n const estimateGasCost = (\n routeWithValidQuote: TRouteWithValidQuote\n ): {\n gasEstimate: BigNumber;\n gasCostInToken: CurrencyAmount;\n gasCostInUSD: CurrencyAmount;\n gasCostInGasToken?: CurrencyAmount;\n } => {\n const { totalGasCostNativeCurrency, baseGasUse } = this.estimateFewGas(\n routeWithValidQuote,\n gasPriceWei,\n chainId,\n providerConfig\n );\n\n /** ------ MARK: USD logic -------- */\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n const gasCostInTermsOfUSD = getRingQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n usdPool\n );\n\n /** ------ MARK: Conditional logic run if gasToken is specified -------- */\n const nativeAndSpecifiedGasTokenPool: Pool | null =\n pools != null ? pools.nativeAndSpecifiedGasTokenV3Pool : null;\n let gasCostInTermsOfGasToken: CurrencyAmount | undefined = undefined;\n // we don't want to fetch the gasToken pool if the gasToken is the native currency\n if (nativeAndSpecifiedGasTokenPool) {\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n gasCostInTermsOfGasToken = getRingQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativeAndSpecifiedGasTokenPool\n );\n }\n // if the gasToken is the native currency, we can just use the totalGasCostNativeCurrency\n else if (providerConfig?.gasToken?.equals(nativeCurrency)) {\n gasCostInTermsOfGasToken = totalGasCostNativeCurrency;\n }\n\n /** ------ MARK: return early if quoteToken is wrapped native currency ------- */\n if (quoteToken.equals(nativeCurrency)) {\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: totalGasCostNativeCurrency,\n gasCostInUSD: gasCostInTermsOfUSD,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n }\n\n /** ------ MARK: Main gas logic in terms of quote token -------- */\n\n // Since the quote token is not in the native currency, we convert the gas cost to be in terms of the quote token.\n // We do this by getting the highest liquidity <quoteToken>/<nativeCurrency> pool. eg. <quoteToken>/ETH pool.\n const nativeAndQuoteTokenPool: Pool | null =\n pools != null ? pools.nativeAndQuoteTokenV3Pool : null;\n\n let gasCostInTermsOfQuoteToken: CurrencyAmount | null = null;\n if (nativeAndQuoteTokenPool) {\n // We only need to go through V2 and V3 USD pools for now,\n // because v4 pools don't have deep liquidity yet.\n // If one day, we see v3 usd pools have much deeper liquidity than v2/v3 usd pools, then we will add v4 pools for gas cost\n gasCostInTermsOfQuoteToken = getRingQuoteThroughNativePool(\n chainId,\n totalGasCostNativeCurrency,\n nativeAndQuoteTokenPool\n );\n }\n // We may have a nativeAmountPool, but not a nativePool\n else {\n log.info(\n `Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol} to produce gas adjusted costs. Using amountToken to calculate gas costs.`\n );\n }\n\n /** ------ MARK: (V3 and V4 ONLY) Logic for calculating synthetic gas cost in terms of amount token -------- */\n // TODO: evaluate effectiveness and potentially refactor\n\n // Highest liquidity pool for the non quote token / ETH\n // A pool with the non quote token / ETH should not be required and errors should be handled separately\n if (nativeAmountPool) {\n // get current execution price (amountToken / quoteToken)\n const executionPrice = new Price(\n routeWithValidQuote.amount.currency,\n routeWithValidQuote.quote.currency,\n routeWithValidQuote.amount.quotient,\n routeWithValidQuote.quote.quotient\n );\n\n const inputIsToken0 =\n nativeAmountPool.token0.address == nativeCurrency.address;\n // ratio of input / native\n const nativeAndAmountTokenPrice = inputIsToken0\n ? nativeAmountPool.token0Price\n : nativeAmountPool.token1Price;\n\n const gasCostInTermsOfAmountToken = nativeAndAmountTokenPrice.quote(\n totalGasCostNativeCurrency\n ) as CurrencyAmount;\n\n // Convert gasCostInTermsOfAmountToken to quote token using execution price\n let syntheticGasCostInTermsOfQuoteToken: CurrencyAmount | null;\n try {\n syntheticGasCostInTermsOfQuoteToken = executionPrice.quote(\n gasCostInTermsOfAmountToken\n );\n } catch (err) {\n if (\n err instanceof RangeError &&\n err.message.includes('Division by zero')\n ) {\n // If the quote fails (division by zero), set syntheticGasCostInTermsOfQuoteToken to null\n syntheticGasCostInTermsOfQuoteToken = null;\n } else {\n // any other error, throw\n throw err;\n }\n }\n\n // Note that the syntheticGasCost being lessThan the original quoted value is not always strictly better\n // e.g. the scenario where the amountToken/ETH pool is very illiquid as well and returns an extremely small number\n // however, it is better to have the gasEstimation be almost 0 than almost infinity, as the user will still receive a quote\n // Only use syntheticGasCostInTermsOfQuoteToken if it's within 30% of the original gasCostInTermsOfQuoteToken as a safeguard.\n if (\n syntheticGasCostInTermsOfQuoteToken !== null &&\n (gasCostInTermsOfQuoteToken === null ||\n (syntheticGasCostInTermsOfQuoteToken.lessThan(\n gasCostInTermsOfQuoteToken.asFraction\n ) &&\n gasCostInTermsOfQuoteToken\n .subtract(syntheticGasCostInTermsOfQuoteToken)\n .lessThan(\n gasCostInTermsOfQuoteToken.multiply(new Percent(30, 100))\n .asFraction\n )))\n ) {\n log.info(\n {\n nativeAndAmountTokenPrice:\n nativeAndAmountTokenPrice.toSignificant(6),\n gasCostInTermsOfQuoteToken: gasCostInTermsOfQuoteToken\n ? gasCostInTermsOfQuoteToken.toExact()\n : 0,\n gasCostInTermsOfAmountToken:\n gasCostInTermsOfAmountToken.toExact(),\n executionPrice: executionPrice.toSignificant(6),\n syntheticGasCostInTermsOfQuoteToken:\n syntheticGasCostInTermsOfQuoteToken?.toSignificant(6),\n },\n 'New gasCostInTermsOfQuoteToken calculated with synthetic quote token price is less than original'\n );\n\n gasCostInTermsOfQuoteToken = syntheticGasCostInTermsOfQuoteToken;\n }\n }\n\n // If gasCostInTermsOfQuoteToken is null, both attempts to calculate gasCostInTermsOfQuoteToken failed (nativePool and amountNativePool)\n if (gasCostInTermsOfQuoteToken === null && usdToken != null) {\n log.info(\n `Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol}, or amount Token, ${amountToken.symbol} to produce gas adjusted costs. Route will not account for gas.`\n );\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: CurrencyAmount.fromRawAmount(quoteToken, 0),\n gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),\n };\n }\n\n return {\n gasEstimate: baseGasUse,\n gasCostInToken: gasCostInTermsOfQuoteToken ?? CurrencyAmount.fromRawAmount(quoteToken, 0),\n gasCostInUSD: gasCostInTermsOfUSD!,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n };\n\n return {\n estimateGasCost: estimateGasCost.bind(this),\n calculateL1GasFees,\n };\n }\n\n protected estimateGas(\n routeWithValidQuote: TRouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const totalInitializedTicksCrossed = this.totalInitializedTicksCrossed(\n routeWithValidQuote.initializedTicksCrossedList\n );\n const totalHops = BigNumber.from(routeWithValidQuote.route.pools.length);\n\n let hopsGasUse = COST_PER_HOP(chainId).mul(totalHops);\n\n // We have observed that this algorithm tends to underestimate single hop swaps.\n // We add a buffer in the case of a single hop swap.\n if (totalHops.eq(1)) {\n hopsGasUse = hopsGasUse.add(SINGLE_HOP_OVERHEAD(chainId));\n }\n\n // Some tokens have extremely expensive transferFrom functions, which causes\n // us to underestimate them by a large amount. For known tokens, we apply an\n // adjustment.\n const tokenOverhead = TOKEN_OVERHEAD(chainId, routeWithValidQuote.route);\n\n const tickGasUse = COST_PER_INIT_TICK(chainId).mul(\n totalInitializedTicksCrossed\n );\n const uninitializedTickGasUse = COST_PER_UNINIT_TICK.mul(0);\n\n /*\n // Eventually we can just use the quoter gas estimate for the base gas use\n // It will be more accurate than doing the offchain gas estimate like below\n // It will become more critical when we are going to support v4 hookful routing,\n // where we have no idea how much gas the hook(s) will cost.\n // const baseGasUse = routeWithValidQuote.quoterGasEstimate\n */\n\n // base estimate gas used based on chainId estimates for hops and ticks gas useage\n const baseGasUse = BASE_SWAP_COST(chainId)\n .add(hopsGasUse)\n .add(tokenOverhead)\n .add(tickGasUse)\n .add(uninitializedTickGasUse)\n .add(providerConfig?.additionalGasOverhead ?? BigNumber.from(0));\n\n const baseGasCostWei = gasPriceWei.mul(baseGasUse);\n\n const wrappedCurrency = WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(\n wrappedCurrency,\n baseGasCostWei.toString()\n );\n\n return {\n totalGasCostNativeCurrency,\n totalInitializedTicksCrossed,\n baseGasUse,\n };\n }\n\n protected estimateFewGas(\n routeWithValidQuote: TRouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const totalInitializedTicksCrossed = this.totalInitializedTicksCrossed(\n routeWithValidQuote.initializedTicksCrossedList\n );\n const totalHops = BigNumber.from(routeWithValidQuote.route.pools.length);\n\n let hopsGasUse = COST_PER_HOP(chainId).mul(totalHops);\n\n // We have observed that this algorithm tends to underestimate single hop swaps.\n // We add a buffer in the case of a single hop swap.\n if (totalHops.eq(1)) {\n hopsGasUse = hopsGasUse.add(SINGLE_HOP_OVERHEAD(chainId));\n }\n\n // Some tokens have extremely expensive transferFrom functions, which causes\n // us to underestimate them by a large amount. For known tokens, we apply an\n // adjustment.\n const tokenOverhead = TOKEN_OVERHEAD(chainId, routeWithValidQuote.route);\n\n const tickGasUse = COST_PER_INIT_TICK(chainId).mul(\n totalInitializedTicksCrossed\n );\n const uninitializedTickGasUse = COST_PER_UNINIT_TICK.mul(0);\n\n /*\n // Eventually we can just use the quoter gas estimate for the base gas use\n // It will be more accurate than doing the offchain gas estimate like below\n // It will become more critical when we are going to support v4 hookful routing,\n // where we have no idea how much gas the hook(s) will cost.\n // const baseGasUse = routeWithValidQuote.quoterGasEstimate\n */\n\n // base estimate gas used based on chainId estimates for hops and ticks gas useage\n const baseGasUse = BASE_SWAP_COST(chainId)\n .add(hopsGasUse)\n .add(tokenOverhead)\n .add(tickGasUse)\n .add(uninitializedTickGasUse)\n .add(providerConfig?.additionalGasOverhead ?? BigNumber.from(0));\n\n const baseGasCostWei = gasPriceWei.mul(baseGasUse);\n\n const wrappedCurrency = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(\n wrappedCurrency,\n baseGasCostWei.toString()\n );\n\n return {\n totalGasCostNativeCurrency,\n totalInitializedTicksCrossed,\n baseGasUse,\n };\n }\n}\n"]}
|
package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v3-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.ts"],"names":[],"mappings":";;;AAIA,sFAAsF;AAEtF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,oCAAqC,SAAQ,kEAAkE;IAC1H,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAEe,KAAK,CAAC,aAAa,CAAC,EAClC,OAAO,EACP,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,GACkB;QAGhC,OAAO,MAAM,KAAK,CAAC,wBAAwB,CAAC;YAC1C,OAAO;YACP,WAAW;YACX,KAAK;YACL,WAAW;YACX,UAAU;YACV,cAAc;YACd,iBAAiB;YACjB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;CACF;AA5BD,oFA4BC","sourcesContent":["import { UniswapFewV3RouteWithValidQuote } from '../../entities/route-with-valid-quote';\nimport { BuildOnChainGasModelFactoryType, IGasModel } from '../gas-model';\n\nimport { BaseProvider } from '@ethersproject/providers';\nimport { TickBasedHeuristicGasModelFactory } from '../tick-based-heuristic-gas-model';\n\n/**\n * Computes a gas estimate for a V3 swap using heuristics.\n * Considers number of hops in the route, number of ticks crossed\n * and the typical base cost for a swap.\n *\n * We get the number of ticks crossed in a swap from the QuoterV2\n * contract.\n *\n * We compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929. We would have to make a request for every swap we wanted to estimate.\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * @export\n * @class UniswapFewV3HeuristicGasModelFactory\n */\nexport class UniswapFewV3HeuristicGasModelFactory extends TickBasedHeuristicGasModelFactory<UniswapFewV3RouteWithValidQuote> {\n constructor(provider: BaseProvider) {\n super(provider);\n }\n\n public override async buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<UniswapFewV3RouteWithValidQuote>\n > {\n return await super.buildFewGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n });\n }\n}\n"]}
|
package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v4-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.ts"],"names":[],"mappings":";;;AAAA,wDAAqD;AAErD,2CAA+E;AAQ/E,sFAAsF;AAItF,MAAa,oCACX,SAAQ,kEAAkE;IAG1E,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,GACkB;QAGhC,OAAO,MAAM,KAAK,CAAC,wBAAwB,CAAC;YAC1C,OAAO;YACP,WAAW;YACX,KAAK;YACL,WAAW;YACX,UAAU;YACV,cAAc;YACd,iBAAiB;YACjB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAEkB,WAAW,CAC5B,mBAAoD,EACpD,WAAsB,EACtB,OAAgB,EAChB,cAAuC;;QAEvC,MAAM,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CACpE,mBAAmB,CAAC,2BAA2B,CAChD,CAAC;QAEF,MAAM,UAAU,GAAG,mBAAmB,CAAC,iBAAiB;YACtD,mHAAmH;aAClH,GAAG,CAAC,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,qBAAqB,mCAAI,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,eAAe,GAAG,kCAA2B,CAAC,OAAO,CAAE,CAAC;QAE9D,MAAM,0BAA0B,GAAG,qBAAc,CAAC,aAAa,CAC7D,eAAe,EACf,cAAc,CAAC,QAAQ,EAAE,CAC1B,CAAC;QAEF,OAAO;YACL,0BAA0B;YAC1B,4BAA4B;YAC5B,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AA7DD,oFA6DC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { CurrencyAmount, FEW_WRAPPED_NATIVE_CURRENCY } from '../../../../util';\nimport { UniswapFewV4RouteWithValidQuote } from '../../entities';\nimport {\n BuildOnChainGasModelFactoryType,\n GasModelProviderConfig,\n IGasModel,\n IOnChainGasModelFactory,\n} from '../gas-model';\nimport { TickBasedHeuristicGasModelFactory } from '../tick-based-heuristic-gas-model';\n\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nexport class UniswapFewV4HeuristicGasModelFactory\n extends TickBasedHeuristicGasModelFactory<UniswapFewV4RouteWithValidQuote>\n implements IOnChainGasModelFactory<UniswapFewV4RouteWithValidQuote>\n{\n constructor(provider: BaseProvider) {\n super(provider);\n }\n\n public async buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<UniswapFewV4RouteWithValidQuote>\n > {\n return await super.buildFewGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n });\n }\n\n protected override estimateGas(\n routeWithValidQuote: UniswapFewV4RouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const totalInitializedTicksCrossed = this.totalInitializedTicksCrossed(\n routeWithValidQuote.initializedTicksCrossedList\n );\n\n const baseGasUse = routeWithValidQuote.quoterGasEstimate\n // we still need the gas override for native wrap/unwrap, because quoter doesn't simulate on universal router level\n .add(providerConfig?.additionalGasOverhead ?? BigNumber.from(0));\n\n const baseGasCostWei = gasPriceWei.mul(baseGasUse);\n\n const wrappedCurrency = FEW_WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(\n wrappedCurrency,\n baseGasCostWei.toString()\n );\n\n return {\n totalGasCostNativeCurrency,\n totalInitializedTicksCrossed,\n baseGasUse,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v2-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport _ from 'lodash';\n\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ProviderConfig } from '../../../../providers/provider';\nimport { IV2PoolProvider } from '../../../../providers/v2/pool-provider';\nimport { log, WRAPPED_NATIVE_CURRENCY } from '../../../../util';\nimport { CurrencyAmount } from '../../../../util/amounts';\nimport {\n calculateL1GasFeesHelper,\n getV2NativePool,\n} from '../../../../util/gas-factory-helpers';\nimport { V2RouteWithValidQuote } from '../../entities/route-with-valid-quote';\nimport {\n BuildV2GasModelFactoryType,\n GasModelProviderConfig,\n getQuoteThroughNativePool,\n IGasModel,\n IV2GasModelFactory,\n usdGasTokensByChain,\n} from '../gas-model';\n\n// Constant cost for doing any swap regardless of pools.\nexport const BASE_SWAP_COST = BigNumber.from(135000); // 115000, bumped up by 20_000 @eric 7/8/2022\n\n// Constant per extra hop in the route.\nexport const COST_PER_EXTRA_HOP = BigNumber.from(50000); // 20000, bumped up by 30_000 @eric 7/8/2022\n\n/**\n * Computes a gas estimate for a V2 swap using heuristics.\n * Considers number of hops in the route and the typical base cost for a swap.\n *\n * We compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929. We would have to make a request for every swap we wanted to estimate.\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * Note, certain tokens e.g. rebasing/fee-on-transfer, may incur higher gas costs than\n * what we estimate here. This is because they run extra logic on token transfer.\n *\n * @export\n * @class V2HeuristicGasModelFactory\n */\nexport class V2HeuristicGasModelFactory extends IV2GasModelFactory {\n private provider: BaseProvider;\n\n constructor(provider: BaseProvider) {\n super();\n this.provider = provider;\n }\n\n public async buildGasModel({\n chainId,\n gasPriceWei,\n poolProvider,\n token,\n l2GasDataProvider,\n providerConfig,\n }: BuildV2GasModelFactoryType): Promise<IGasModel<V2RouteWithValidQuote>> {\n const l2GasData = l2GasDataProvider\n ? await l2GasDataProvider.getGasData(providerConfig)\n : undefined;\n\n const usdPoolPromise: Promise<Pair> = this.getHighestLiquidityUSDPool(\n chainId,\n poolProvider,\n providerConfig\n );\n\n // Only fetch the native gasToken pool if specified by the config AND the gas token is not the native currency.\n const nativeAndSpecifiedGasTokenPoolPromise =\n providerConfig?.gasToken &&\n !providerConfig?.gasToken.equals(WRAPPED_NATIVE_CURRENCY[chainId]!)\n ? this.getEthPool(\n chainId,\n providerConfig.gasToken,\n poolProvider,\n providerConfig\n )\n : Promise.resolve(null);\n\n const [usdPool, nativeAndSpecifiedGasTokenPool] = await Promise.all([\n usdPoolPromise,\n nativeAndSpecifiedGasTokenPoolPromise,\n ]);\n\n let ethPool: Pair | null = null;\n if (!token.equals(WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n ethPool = await this.getEthPool(\n chainId,\n token,\n poolProvider,\n providerConfig\n );\n }\n\n const usdToken =\n usdPool.token0.address == WRAPPED_NATIVE_CURRENCY[chainId]!.address\n ? usdPool.token1\n : usdPool.token0;\n\n const calculateL1GasFees = async (\n route: V2RouteWithValidQuote[]\n ): Promise<{\n gasUsedL1: BigNumber;\n gasUsedL1OnL2: BigNumber;\n gasCostL1USD: CurrencyAmount;\n gasCostL1QuoteToken: CurrencyAmount;\n }> => {\n const nativePool = !token.equals(WRAPPED_NATIVE_CURRENCY[chainId])\n ? await getV2NativePool(token, poolProvider, providerConfig)\n : null;\n\n return await calculateL1GasFeesHelper(\n route,\n chainId,\n usdPool,\n token,\n nativePool,\n this.provider,\n l2GasData\n );\n };\n\n return {\n estimateGasCost: (routeWithValidQuote: V2RouteWithValidQuote) => {\n const { gasCostInEth, gasUse } = this.estimateGas(\n routeWithValidQuote,\n gasPriceWei,\n chainId,\n providerConfig\n );\n\n /** ------ MARK: USD logic -------- */\n const gasCostInTermsOfUSD = getQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n usdPool\n );\n\n /** ------ MARK: Conditional logic run if gasToken is specified -------- */\n let gasCostInTermsOfGasToken: CurrencyAmount | undefined = undefined;\n if (nativeAndSpecifiedGasTokenPool) {\n gasCostInTermsOfGasToken = getQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n nativeAndSpecifiedGasTokenPool\n );\n }\n // if the gasToken is the native currency, we can just use the gasCostInEth\n else if (\n providerConfig?.gasToken?.equals(WRAPPED_NATIVE_CURRENCY[chainId]!)\n ) {\n gasCostInTermsOfGasToken = gasCostInEth;\n }\n\n /** ------ MARK: return early if quoteToken is wrapped native currency ------- */\n if (token.equals(WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n return {\n gasEstimate: gasUse,\n gasCostInToken: gasCostInEth,\n gasCostInUSD: gasCostInTermsOfUSD,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n }\n\n // If the quote token is not WETH, we convert the gas cost to be in terms of the quote token.\n // We do this by getting the highest liquidity <token>/ETH pool.\n if (!ethPool) {\n log.info(\n 'Unable to find ETH pool with the quote token to produce gas adjusted costs. Route will not account for gas.'\n );\n return {\n gasEstimate: gasUse,\n gasCostInToken: CurrencyAmount.fromRawAmount(token, 0),\n gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),\n };\n }\n\n const gasCostInTermsOfQuoteToken = getQuoteThroughNativePool(\n chainId,\n gasCostInEth,\n ethPool\n );\n\n return {\n gasEstimate: gasUse,\n gasCostInToken: gasCostInTermsOfQuoteToken,\n gasCostInUSD: gasCostInTermsOfUSD!,\n gasCostInGasToken: gasCostInTermsOfGasToken,\n };\n },\n calculateL1GasFees,\n };\n }\n\n private estimateGas(\n routeWithValidQuote: V2RouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const hops = routeWithValidQuote.route.pairs.length;\n let gasUse = BASE_SWAP_COST.add(COST_PER_EXTRA_HOP.mul(hops - 1));\n\n if (providerConfig?.additionalGasOverhead) {\n gasUse = gasUse.add(providerConfig.additionalGasOverhead);\n }\n\n const totalGasCostWei = gasPriceWei.mul(gasUse);\n\n const weth = WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const gasCostInEth = CurrencyAmount.fromRawAmount(\n weth,\n totalGasCostWei.toString()\n );\n\n return { gasCostInEth, gasUse };\n }\n\n private async getEthPool(\n chainId: ChainId,\n token: Token,\n poolProvider: IV2PoolProvider,\n providerConfig?: ProviderConfig\n ): Promise<Pair | null> {\n const weth = WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const poolAccessor = await poolProvider.getPools(\n [[weth, token]],\n providerConfig\n );\n const pool = poolAccessor.getPool(weth, token);\n\n if (!pool || pool.reserve0.equalTo(0) || pool.reserve1.equalTo(0)) {\n log.error(\n {\n weth,\n token,\n reserve0: pool?.reserve0.toExact(),\n reserve1: pool?.reserve1.toExact(),\n },\n `Could not find a valid WETH pool with ${token.symbol} for computing gas costs.`\n );\n\n return null;\n }\n\n return pool;\n }\n\n private async getHighestLiquidityUSDPool(\n chainId: ChainId,\n poolProvider: IV2PoolProvider,\n providerConfig?: ProviderConfig\n ): Promise<Pair> {\n const usdTokens = usdGasTokensByChain[chainId];\n\n if (!usdTokens) {\n throw new Error(\n `Could not find a USD token for computing gas costs on ${chainId}`\n );\n }\n\n const usdPools = _.map<Token, [Token, Token]>(usdTokens, (usdToken) => [\n usdToken,\n WRAPPED_NATIVE_CURRENCY[chainId]!,\n ]);\n const poolAccessor = await poolProvider.getPools(usdPools, providerConfig);\n const poolsRaw = poolAccessor.getAllPools();\n const pools = _.filter(\n poolsRaw,\n (pool) =>\n pool.reserve0.greaterThan(0) &&\n pool.reserve1.greaterThan(0) &&\n // this case should never happen in production, but when we mock the pool provider it may return non native pairs\n (pool.token0.equals(WRAPPED_NATIVE_CURRENCY[chainId]!) ||\n pool.token1.equals(WRAPPED_NATIVE_CURRENCY[chainId]!))\n );\n\n if (pools.length == 0) {\n log.error(\n { pools },\n `Could not find a USD/WETH pool for computing gas costs.`\n );\n throw new Error(`Can't find USD/WETH pool for computing gas costs.`);\n }\n\n const maxPool = _.maxBy(pools, (pool) => {\n if (pool.token0.equals(WRAPPED_NATIVE_CURRENCY[chainId]!)) {\n return parseFloat(pool.reserve0.toSignificant(2));\n } else {\n return parseFloat(pool.reserve1.toSignificant(2));\n }\n }) as Pair;\n\n return maxPool;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v3-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.ts"],"names":[],"mappings":";;;AAIA,sFAAsF;AAEtF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,0BAA2B,SAAQ,kEAAwD;IACtG,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAEe,KAAK,CAAC,aAAa,CAAC,EAClC,OAAO,EACP,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,GACkB;QAGhC,OAAO,MAAM,KAAK,CAAC,qBAAqB,CAAC;YACvC,OAAO;YACP,WAAW;YACX,KAAK;YACL,WAAW;YACX,UAAU;YACV,cAAc;YACd,iBAAiB;YACjB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;CACF;AA5BD,gEA4BC","sourcesContent":["import { V3RouteWithValidQuote } from '../../entities/route-with-valid-quote';\nimport { BuildOnChainGasModelFactoryType, IGasModel } from '../gas-model';\n\nimport { BaseProvider } from '@ethersproject/providers';\nimport { TickBasedHeuristicGasModelFactory } from '../tick-based-heuristic-gas-model';\n\n/**\n * Computes a gas estimate for a V3 swap using heuristics.\n * Considers number of hops in the route, number of ticks crossed\n * and the typical base cost for a swap.\n *\n * We get the number of ticks crossed in a swap from the QuoterV2\n * contract.\n *\n * We compute gas estimates off-chain because\n * 1/ Calling eth_estimateGas for a swaps requires the caller to have\n * the full balance token being swapped, and approvals.\n * 2/ Tracking gas used using a wrapper contract is not accurate with Multicall\n * due to EIP-2929. We would have to make a request for every swap we wanted to estimate.\n * 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.\n *\n * @export\n * @class V3HeuristicGasModelFactory\n */\nexport class V3HeuristicGasModelFactory extends TickBasedHeuristicGasModelFactory<V3RouteWithValidQuote> {\n constructor(provider: BaseProvider) {\n super(provider);\n }\n\n public override async buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<V3RouteWithValidQuote>\n > {\n return await super.buildGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"v4-heuristic-gas-model.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.ts"],"names":[],"mappings":";;;AAAA,wDAAqD;AAErD,2CAA2E;AAQ3E,sFAAsF;AAItF,MAAa,0BACX,SAAQ,kEAAwD;IAGhE,YAAY,QAAsB;QAChC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAClB,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,EACzB,OAAO,EACP,WAAW,EACX,KAAK,EACL,WAAW,EACX,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,cAAc,GACkB;QAGhC,OAAO,MAAM,KAAK,CAAC,qBAAqB,CAAC;YACvC,OAAO;YACP,WAAW;YACX,KAAK;YACL,WAAW;YACX,UAAU;YACV,cAAc;YACd,iBAAiB;YACjB,cAAc;SACf,CAAC,CAAC;IACL,CAAC;IAEkB,WAAW,CAC5B,mBAA0C,EAC1C,WAAsB,EACtB,OAAgB,EAChB,cAAuC;;QAEvC,MAAM,4BAA4B,GAAG,IAAI,CAAC,4BAA4B,CACpE,mBAAmB,CAAC,2BAA2B,CAChD,CAAC;QAEF,MAAM,UAAU,GAAG,mBAAmB,CAAC,iBAAiB;YACtD,mHAAmH;aAClH,GAAG,CAAC,MAAA,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,qBAAqB,mCAAI,qBAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnE,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAEnD,MAAM,eAAe,GAAG,8BAAuB,CAAC,OAAO,CAAE,CAAC;QAE1D,MAAM,0BAA0B,GAAG,qBAAc,CAAC,aAAa,CAC7D,eAAe,EACf,cAAc,CAAC,QAAQ,EAAE,CAC1B,CAAC;QAEF,OAAO;YACL,0BAA0B;YAC1B,4BAA4B;YAC5B,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AA7DD,gEA6DC","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { CurrencyAmount, WRAPPED_NATIVE_CURRENCY } from '../../../../util';\nimport { V4RouteWithValidQuote } from '../../entities';\nimport {\n BuildOnChainGasModelFactoryType,\n GasModelProviderConfig,\n IGasModel,\n IOnChainGasModelFactory,\n} from '../gas-model';\nimport { TickBasedHeuristicGasModelFactory } from '../tick-based-heuristic-gas-model';\n\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nexport class V4HeuristicGasModelFactory\n extends TickBasedHeuristicGasModelFactory<V4RouteWithValidQuote>\n implements IOnChainGasModelFactory<V4RouteWithValidQuote>\n{\n constructor(provider: BaseProvider) {\n super(provider);\n }\n\n public async buildGasModel({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n }: BuildOnChainGasModelFactoryType): Promise<\n IGasModel<V4RouteWithValidQuote>\n > {\n return await super.buildGasModelInternal({\n chainId,\n gasPriceWei,\n pools,\n amountToken,\n quoteToken,\n v2poolProvider,\n l2GasDataProvider,\n providerConfig,\n });\n }\n\n protected override estimateGas(\n routeWithValidQuote: V4RouteWithValidQuote,\n gasPriceWei: BigNumber,\n chainId: ChainId,\n providerConfig?: GasModelProviderConfig\n ) {\n const totalInitializedTicksCrossed = this.totalInitializedTicksCrossed(\n routeWithValidQuote.initializedTicksCrossedList\n );\n\n const baseGasUse = routeWithValidQuote.quoterGasEstimate\n // we still need the gas override for native wrap/unwrap, because quoter doesn't simulate on universal router level\n .add(providerConfig?.additionalGasOverhead ?? BigNumber.from(0));\n\n const baseGasCostWei = gasPriceWei.mul(baseGasUse);\n\n const wrappedCurrency = WRAPPED_NATIVE_CURRENCY[chainId]!;\n\n const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(\n wrappedCurrency,\n baseGasCostWei.toString()\n );\n\n return {\n totalGasCostNativeCurrency,\n totalInitializedTicksCrossed,\n baseGasUse,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/routers/alpha-router/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,6CAA2B;AAC3B,+CAA6B;AAC7B,4CAA0B","sourcesContent":["export * from './alpha-router';\nexport * from './entities';\nexport * from './gas-models';\nexport * from './quoters';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"base-quoter.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/base-quoter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport {\n ITokenListProvider,\n ITokenProvider,\n ITokenValidatorProvider,\n TokenValidationResult,\n} from '../../../providers';\nimport {\n CurrencyAmount,\n log,\n metric,\n MetricLoggerUnit,\n poolToString,\n} from '../../../util';\nimport { SupportedRoutes } from '../../router';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { RouteWithValidQuote } from '../entities/route-with-valid-quote';\nimport {\n CandidatePoolsBySelectionCriteria,\n CrossLiquidityCandidatePools,\n RingFewV2CandidatePools,\n SupportedCandidatePools,\n V2CandidatePools,\n V3CandidatePools,\n V4CandidatePools,\n} from '../functions/get-candidate-pools';\nimport { IGasModel } from '../gas-models';\n\nimport { TPool } from '@fewprotocol/router-sdk';\nimport { GetQuotesResult, GetRoutesResult } from './model/results';\n\n/**\n * Interface for a Quoter.\n * Defines the base dependencies, helper methods and interface for how to fetch quotes.\n *\n * @abstract\n * @template CandidatePools\n * @template Route\n */\nexport abstract class BaseQuoter<\n CandidatePools extends\n | SupportedCandidatePools\n | [\n V4CandidatePools | undefined,\n V3CandidatePools | undefined,\n V2CandidatePools | undefined,\n RingFewV2CandidatePools | undefined,\n CrossLiquidityCandidatePools\n ],\n Route extends SupportedRoutes,\n TCurrency extends Currency\n> {\n protected tokenProvider: ITokenProvider;\n protected chainId: ChainId;\n protected protocol: Protocol;\n protected blockedTokenListProvider?: ITokenListProvider;\n protected tokenValidatorProvider?: ITokenValidatorProvider;\n\n constructor(\n tokenProvider: ITokenProvider,\n chainId: ChainId,\n protocol: Protocol,\n blockedTokenListProvider?: ITokenListProvider,\n tokenValidatorProvider?: ITokenValidatorProvider\n ) {\n this.tokenProvider = tokenProvider;\n this.chainId = chainId;\n this.protocol = protocol;\n this.blockedTokenListProvider = blockedTokenListProvider;\n this.tokenValidatorProvider = tokenValidatorProvider;\n }\n\n /**\n * Protected method in charge of fetching the routes for the tokenIn/tokenOut pair.\n *\n * @protected\n * @abstract\n * @param tokenIn The token that the user wants to provide\n * @param tokenOut The token that the usaw wants to receive\n * @param candidatePools the candidate pools that are used to generate the routes\n * @param tradeType The type of quote the user wants. He could want to provide exactly X tokenIn or receive exactly X tokenOut\n * @param routingConfig\n * @returns Promise<GetRoutesResult<Route>>\n */\n protected abstract getRoutes(\n tokenIn: TCurrency,\n tokenOut: TCurrency,\n candidatePools: CandidatePools,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig\n ): Promise<GetRoutesResult<Route>>;\n\n /**\n * Public method that will fetch quotes for the combination of every route and every amount.\n *\n * @param routes the list of route that can be used to fetch a quote.\n * @param amounts the list of amounts to query for EACH route.\n * @param percents the percentage of each amount.\n * @param quoteToken\n * @param tradeType\n * @param routingConfig\n * @param candidatePools the candidate pools that were used to generate the routes\n * @param gasModel the gasModel to be used for estimating gas cost\n * @param gasPriceWei instead of passing gasModel, gasPriceWei is used to generate a gasModel\n * @returns Promise<GetQuotesResult<Route>>\n */\n abstract getQuotes(\n routes: Route[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteToken: TCurrency,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n candidatePools?: CandidatePoolsBySelectionCriteria,\n gasModel?: IGasModel<RouteWithValidQuote>,\n gasPriceWei?: BigNumber\n ): Promise<GetQuotesResult>;\n\n /**\n * Public method which would first get the routes and then get the quotes.\n *\n * @param tokenIn The token that the user wants to provide\n * @param tokenOut The token that the usaw wants to receive\n * @param amounts the list of amounts to query for EACH route.\n * @param percents the percentage of each amount.\n * @param quoteToken\n * @param candidatePools\n * @param tradeType\n * @param routingConfig\n * @param gasModel the gasModel to be used for estimating gas cost\n * @param gasPriceWei instead of passing gasModel, gasPriceWei is used to generate a gasModel\n */\n public getRoutesThenQuotes(\n tokenIn: TCurrency,\n tokenOut: TCurrency,\n amount: CurrencyAmount,\n amounts: CurrencyAmount[],\n percents: number[],\n quoteToken: TCurrency,\n candidatePools: CandidatePools,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n gasModel?: IGasModel<RouteWithValidQuote>,\n gasPriceWei?: BigNumber\n ): Promise<GetQuotesResult> {\n return this.getRoutes(\n tokenIn,\n tokenOut,\n candidatePools,\n tradeType,\n routingConfig\n ).then((routesResult) => {\n if (routesResult.routes.length == 1) {\n metric.putMetric(\n `${this.protocol}QuoterSingleRoute`,\n 1,\n MetricLoggerUnit.Count\n );\n percents = [100];\n amounts = [amount];\n }\n\n if (routesResult.routes.length > 0) {\n metric.putMetric(\n `${this.protocol}QuoterRoutesFound`,\n routesResult.routes.length,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(\n `${this.protocol}QuoterNoRoutesFound`,\n routesResult.routes.length,\n MetricLoggerUnit.Count\n );\n }\n\n // console.log(routesResult.routes.map((route) => route), 'routesResult.routes');\n return this.getQuotes(\n routesResult.routes,\n amounts,\n percents,\n quoteToken,\n tradeType,\n routingConfig,\n routesResult.candidatePools,\n gasModel,\n gasPriceWei\n );\n });\n }\n\n protected async applyTokenValidatorToPools<T extends TPool>(\n pools: T[],\n isInvalidFn: (\n token: Currency,\n tokenValidation: TokenValidationResult | undefined\n ) => boolean\n ): Promise<T[]> {\n if (!this.tokenValidatorProvider) {\n return pools;\n }\n\n log.info(`Running token validator on ${pools.length} pools`);\n\n const tokens = _.flatMap(pools, (pool) => [pool.token0, pool.token1]);\n\n const tokenValidationResults =\n await this.tokenValidatorProvider.validateTokens(\n tokens.map((token) => token.wrapped)\n );\n\n const poolsFiltered = _.filter(pools, (pool: T) => {\n const token0Validation = tokenValidationResults.getValidationByToken(\n pool.token0.wrapped\n );\n const token1Validation = tokenValidationResults.getValidationByToken(\n pool.token1.wrapped\n );\n\n const token0Invalid = isInvalidFn(pool.token0, token0Validation);\n const token1Invalid = isInvalidFn(pool.token1, token1Validation);\n\n if (token0Invalid || token1Invalid) {\n log.info(\n `Dropping pool ${poolToString(pool)} because token is invalid. ${\n pool.token0.symbol\n }: ${token0Validation}, ${pool.token1.symbol}: ${token1Validation}`\n );\n }\n\n return !token0Invalid && !token1Invalid;\n });\n\n return poolsFiltered;\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"few-v2-quoter.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/few-v2-quoter.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport {\n IRingV2PoolProvider,\n IRingV2QuoteProvider,\n IRingV2SubgraphProvider,\n ITokenListProvider,\n ITokenProvider,\n ITokenValidatorProvider,\n TokenValidationResult,\n} from '../../../providers';\nimport {\n ArbitrumGasData,\n IL2GasDataProvider,\n} from '../../../providers/v3/gas-data-provider';\nimport {\n CurrencyAmount,\n log,\n metric,\n MetricLoggerUnit,\n routeToString,\n} from '../../../util';\nimport { RingFewV2Route } from '../../router';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { RingFewV2RouteWithValidQuote } from '../entities';\nimport { computeAllRingFewV2Routes } from '../functions/compute-all-routes';\nimport {\n CandidatePoolsBySelectionCriteria,\n RingFewV2CandidatePools,\n} from '../functions/get-candidate-pools';\nimport { IRingFewV2GasModelFactory, IGasModel } from '../gas-models';\nimport { NATIVE_OVERHEAD } from '../gas-models/gas-costs';\n\nimport { BaseQuoter } from './base-quoter';\nimport { GetQuotesResult } from './model/results/get-quotes-result';\nimport { GetRoutesResult } from './model/results/get-routes-result';\n\nexport class RingFewV2Quoter extends BaseQuoter<RingFewV2CandidatePools, RingFewV2Route, Token> {\n protected v2SubgraphProvider: IRingV2SubgraphProvider;\n protected v2PoolProvider: IRingV2PoolProvider;\n protected v2QuoteProvider: IRingV2QuoteProvider;\n protected v2GasModelFactory: IRingFewV2GasModelFactory;\n protected l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>;\n\n constructor(\n v2SubgraphProvider: IRingV2SubgraphProvider,\n v2PoolProvider: IRingV2PoolProvider,\n v2QuoteProvider: IRingV2QuoteProvider,\n v2GasModelFactory: IRingFewV2GasModelFactory,\n tokenProvider: ITokenProvider,\n chainId: ChainId,\n blockedTokenListProvider?: ITokenListProvider,\n tokenValidatorProvider?: ITokenValidatorProvider,\n l2GasDataProvider?: IL2GasDataProvider<ArbitrumGasData>\n ) {\n super(\n tokenProvider,\n chainId,\n Protocol.FEWV2,\n blockedTokenListProvider,\n tokenValidatorProvider\n );\n this.v2SubgraphProvider = v2SubgraphProvider;\n this.v2PoolProvider = v2PoolProvider;\n this.v2QuoteProvider = v2QuoteProvider;\n this.v2GasModelFactory = v2GasModelFactory;\n this.l2GasDataProvider = l2GasDataProvider;\n }\n\n protected async getRoutes(\n tokenIn: Token,\n tokenOut: Token,\n v2CandidatePools: RingFewV2CandidatePools,\n _tradeType: TradeType,\n routingConfig: AlphaRouterConfig\n ): Promise<GetRoutesResult<RingFewV2Route>> {\n const beforeGetRoutes = Date.now();\n // Fetch all the pools that we will consider routing via. There are thousands\n // of pools, so we filter them to a set of candidate pools that we expect will\n // result in good prices.\n const { poolAccessor, candidatePools } = v2CandidatePools;\n const poolsRaw = poolAccessor.getAllPools();\n\n // Drop any pools that contain tokens that can not be transferred according to the token validator.\n const pools = await this.applyTokenValidatorToPools(\n poolsRaw,\n (\n token: Currency,\n tokenValidation: TokenValidationResult | undefined\n ): boolean => {\n // If there is no available validation result we assume the token is fine.\n if (!tokenValidation) {\n return false;\n }\n\n // Only filters out *intermediate* pools that involve tokens that we detect\n // cant be transferred. This prevents us trying to route through tokens that may\n // not be transferrable, but allows users to still swap those tokens if they\n // specify.\n if (\n tokenValidation == TokenValidationResult.STF &&\n (token.equals(tokenIn) || token.equals(tokenOut))\n ) {\n return false;\n }\n\n return tokenValidation == TokenValidationResult.STF;\n }\n );\n\n // Given all our candidate pools, compute all the possible ways to route from tokenIn to tokenOut.\n const { maxSwapsPerPath } = routingConfig;\n const routes = computeAllRingFewV2Routes(\n tokenIn,\n tokenOut,\n pools,\n maxSwapsPerPath\n );\n\n metric.putMetric(\n 'V2GetRoutesLoad',\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n `V2GetRoutesLoad_Chain${this.chainId}`,\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routes,\n candidatePools,\n };\n }\n\n public override async getQuotes(\n routes: RingFewV2Route[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteToken: Token,\n tradeType: TradeType,\n _routingConfig: AlphaRouterConfig,\n candidatePools?: CandidatePoolsBySelectionCriteria,\n _gasModel?: IGasModel<RingFewV2RouteWithValidQuote>,\n gasPriceWei?: BigNumber\n ): Promise<GetQuotesResult> {\n const beforeGetQuotes = Date.now();\n log.info('Starting to get FEWV2 quotes');\n if (gasPriceWei === undefined) {\n throw new Error('GasPriceWei for V2Routes is required to getQuotes');\n }\n // throw if we have no amounts or if there are different tokens in the amounts\n if (\n amounts.length == 0 ||\n !amounts.every((amount) => amount.currency.equals(amounts[0]!.currency))\n ) {\n throw new Error(\n 'Amounts must have at least one amount and must be same token'\n );\n }\n // safe to force unwrap here because we throw if there are no amounts\n const amountToken = amounts[0]!.currency;\n const gasToken = _routingConfig.gasToken\n ? (\n await this.tokenProvider.getTokens([_routingConfig.gasToken])\n ).getTokenByAddress(_routingConfig.gasToken)\n : undefined;\n\n if (routes.length == 0) {\n return { routesWithValidQuotes: [], candidatePools };\n }\n\n // For all our routes, and all the fractional amounts, fetch quotes on-chain.\n const quoteFn =\n tradeType == TradeType.EXACT_INPUT\n ? this.v2QuoteProvider.getQuotesManyExactIn.bind(this.v2QuoteProvider)\n : this.v2QuoteProvider.getQuotesManyExactOut.bind(this.v2QuoteProvider);\n\n const beforeQuotes = Date.now();\n\n log.info(\n `Getting quotes for FEWV2 for ${routes.length} routes with ${amounts.length} amounts per route.`\n );\n const { routesWithQuotes } = await quoteFn(amounts, routes, _routingConfig);\n\n const v2GasModel = await this.v2GasModelFactory.buildGasModel({\n chainId: this.chainId,\n gasPriceWei,\n poolProvider: this.v2PoolProvider,\n token: quoteToken,\n l2GasDataProvider: this.l2GasDataProvider,\n providerConfig: {\n ..._routingConfig,\n additionalGasOverhead: NATIVE_OVERHEAD(\n this.chainId,\n amountToken,\n quoteToken\n ),\n gasToken,\n },\n });\n\n metric.putMetric(\n 'V2QuotesLoad',\n Date.now() - beforeQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n 'RingFewV2QuotesFetched',\n _(routesWithQuotes)\n .map(([, quotes]) => quotes.length)\n .sum(),\n MetricLoggerUnit.Count\n );\n\n const routesWithValidQuotes = [];\n\n for (const routeWithQuote of routesWithQuotes) {\n const [route, quotes] = routeWithQuote;\n\n for (let i = 0; i < quotes.length; i++) {\n const percent = percents[i]!;\n const amountQuote = quotes[i]!;\n const { quote, amount } = amountQuote;\n\n if (!quote) {\n log.debug(\n {\n route: routeToString(route),\n amountQuote,\n },\n 'Dropping a null FEWV2 quote for route.'\n );\n continue;\n }\n\n const routeWithValidQuote = new RingFewV2RouteWithValidQuote({\n route,\n rawQuote: quote,\n amount,\n percent,\n gasModel: v2GasModel,\n quoteToken,\n tradeType,\n fewV2PoolProvider: this.v2PoolProvider,\n });\n\n routesWithValidQuotes.push(routeWithValidQuote);\n }\n }\n\n metric.putMetric(\n 'RingFewV2GetQuotesLoad',\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routesWithValidQuotes,\n candidatePools,\n };\n }\n\n public async refreshRoutesThenGetQuotes(\n tokenIn: Token,\n tokenOut: Token,\n routes: RingFewV2Route[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n gasPriceWei?: BigNumber\n ): Promise<GetQuotesResult> {\n const tokenPairs: [Token, Token][] = [];\n routes.forEach((route) =>\n route.pairs.forEach((pair) => tokenPairs.push([pair.token0, pair.token1]))\n );\n\n return this.v2PoolProvider\n .getPools(tokenPairs, routingConfig)\n .then((poolAccesor) => {\n const routes = computeAllRingFewV2Routes(\n tokenIn,\n tokenOut,\n poolAccesor.getAllPools(),\n routingConfig.maxSwapsPerPath\n );\n\n return this.getQuotes(\n routes,\n amounts,\n percents,\n quoteToken,\n tradeType,\n routingConfig,\n undefined,\n undefined,\n gasPriceWei\n );\n });\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,gDAA8B;AAC9B,iDAA+B;AAC/B,2CAAyB;AACzB,8CAA4B;AAC5B,8CAA4B","sourcesContent":["export * from './base-quoter';\nexport * from './mixed-quoter';\nexport * from './model/';\nexport * from './v2-quoter';\nexport * from './v3-quoter';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mixed-quoter.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/mixed-quoter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport {\n IOnChainQuoteProvider,\n ITokenListProvider,\n ITokenProvider,\n ITokenValidatorProvider,\n IV2PoolProvider,\n IV2SubgraphProvider,\n IV3PoolProvider,\n IV3SubgraphProvider,\n IV4PoolProvider,\n IV4SubgraphProvider,\n TokenValidationResult,\n} from '../../../providers';\nimport {\n CurrencyAmount,\n log,\n metric,\n MetricLoggerUnit,\n routeToString,\n} from '../../../util';\nimport { MixedRoute } from '../../router';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { MixedRouteWithValidQuote } from '../entities';\nimport { computeAllMixedRoutes } from '../functions/compute-all-routes';\nimport {\n CandidatePoolsBySelectionCriteria,\n CrossLiquidityCandidatePools,\n getMixedRouteCandidatePools,\n RingFewV2CandidatePools,\n V2CandidatePools,\n V3CandidatePools,\n V4CandidatePools,\n} from '../functions/get-candidate-pools';\nimport { IGasModel } from '../gas-models';\n\nimport { UniversalRouterVersion } from '@fewprotocol/universal-router-sdk';\nimport { mixedRouteFilterOutV4Pools } from '../../../util/mixedRouteFilterOutV4Pools';\nimport { BaseQuoter } from './base-quoter';\nimport { GetQuotesResult, GetRoutesResult } from './model';\n\nexport class MixedQuoter extends BaseQuoter<\n [\n V4CandidatePools | undefined,\n V3CandidatePools | undefined,\n V2CandidatePools | undefined,\n RingFewV2CandidatePools | undefined,\n CrossLiquidityCandidatePools\n ],\n MixedRoute,\n Currency\n> {\n protected v4SubgraphProvider: IV4SubgraphProvider;\n protected v4PoolProvider: IV4PoolProvider;\n protected v3SubgraphProvider: IV3SubgraphProvider;\n protected v3PoolProvider: IV3PoolProvider;\n protected v2SubgraphProvider: IV2SubgraphProvider;\n protected v2PoolProvider: IV2PoolProvider;\n protected onChainQuoteProvider: IOnChainQuoteProvider;\n\n constructor(\n v4SubgraphProvider: IV4SubgraphProvider,\n v4PoolProvider: IV4PoolProvider,\n v3SubgraphProvider: IV3SubgraphProvider,\n v3PoolProvider: IV3PoolProvider,\n v2SubgraphProvider: IV2SubgraphProvider,\n v2PoolProvider: IV2PoolProvider,\n onChainQuoteProvider: IOnChainQuoteProvider,\n tokenProvider: ITokenProvider,\n chainId: ChainId,\n blockedTokenListProvider?: ITokenListProvider,\n tokenValidatorProvider?: ITokenValidatorProvider\n ) {\n super(\n tokenProvider,\n chainId,\n Protocol.MIXED,\n blockedTokenListProvider,\n tokenValidatorProvider\n );\n this.v4SubgraphProvider = v4SubgraphProvider;\n this.v4PoolProvider = v4PoolProvider;\n this.v3SubgraphProvider = v3SubgraphProvider;\n this.v3PoolProvider = v3PoolProvider;\n this.v2SubgraphProvider = v2SubgraphProvider;\n this.v2PoolProvider = v2PoolProvider;\n this.onChainQuoteProvider = onChainQuoteProvider;\n }\n\n protected async getRoutes(\n currencyIn: Currency,\n currencyOut: Currency,\n v4v3v2candidatePools: [\n V4CandidatePools | undefined,\n V3CandidatePools | undefined,\n V2CandidatePools | undefined,\n RingFewV2CandidatePools | undefined,\n CrossLiquidityCandidatePools\n ],\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig\n ): Promise<GetRoutesResult<MixedRoute>> {\n const beforeGetRoutes = Date.now();\n\n if (tradeType != TradeType.EXACT_INPUT) {\n throw new Error('Mixed route quotes are not supported for EXACT_OUTPUT');\n }\n\n const [\n v4CandidatePools,\n v3CandidatePools,\n v2CandidatePools,\n ringFewV2CandidatePools,\n crossLiquidityPools,\n ] = v4v3v2candidatePools;\n\n // just for fixing lint \n log.info(\n 'ringFewV2CandidatePools',\n ringFewV2CandidatePools?.candidatePools\n );\n\n const {\n V2poolAccessor,\n V3poolAccessor,\n V4poolAccessor,\n candidatePools: mixedRouteCandidatePools,\n } = await getMixedRouteCandidatePools({\n v4CandidatePools,\n v3CandidatePools,\n v2CandidatePools,\n crossLiquidityPools,\n tokenProvider: this.tokenProvider,\n v4PoolProvider: this.v4PoolProvider,\n v3poolProvider: this.v3PoolProvider,\n v2poolProvider: this.v2PoolProvider,\n routingConfig,\n chainId: this.chainId,\n });\n\n const V4poolsRaw = V4poolAccessor.getAllPools();\n const V3poolsRaw = V3poolAccessor.getAllPools();\n const V2poolsRaw = V2poolAccessor.getAllPools();\n\n const poolsRaw = [];\n if (!routingConfig.excludedProtocolsFromMixed?.includes(Protocol.V4)) {\n poolsRaw.push(...V4poolsRaw);\n }\n if (!routingConfig.excludedProtocolsFromMixed?.includes(Protocol.V3)) {\n poolsRaw.push(...V3poolsRaw);\n }\n if (!routingConfig.excludedProtocolsFromMixed?.includes(Protocol.V2)) {\n poolsRaw.push(...V2poolsRaw);\n }\n\n const candidatePools = mixedRouteCandidatePools;\n\n // Drop any pools that contain fee on transfer tokens (not supported by v3) or have issues with being transferred.\n const pools = await this.applyTokenValidatorToPools(\n poolsRaw,\n (\n token: Currency,\n tokenValidation: TokenValidationResult | undefined\n ): boolean => {\n // If there is no available validation result we assume the token is fine.\n if (!tokenValidation) {\n return false;\n }\n\n // Only filters out *intermediate* pools that involve tokens that we detect\n // cant be transferred. This prevents us trying to route through tokens that may\n // not be transferrable, but allows users to still swap those tokens if they\n // specify.\n //\n if (\n tokenValidation == TokenValidationResult.STF &&\n (token.equals(currencyIn) || token.equals(currencyOut))\n ) {\n return false;\n }\n\n return (\n tokenValidation == TokenValidationResult.FOT ||\n tokenValidation == TokenValidationResult.STF\n );\n }\n );\n\n const { maxSwapsPerPath } = routingConfig;\n\n let routes = computeAllMixedRoutes(\n currencyIn,\n currencyOut,\n pools,\n maxSwapsPerPath,\n routingConfig.shouldEnableMixedRouteEthWeth,\n routingConfig.hooksOptions\n );\n\n if (\n routingConfig.universalRouterVersion === UniversalRouterVersion.V1_2 ||\n !routingConfig.protocols?.includes(Protocol.V4)\n ) {\n routes = mixedRouteFilterOutV4Pools(routes);\n }\n\n metric.putMetric(\n 'MixedGetRoutesLoad',\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n `MixedGetRoutesLoad_Chain${this.chainId}`,\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routes: routes,\n candidatePools,\n };\n }\n\n public override async getQuotes(\n routes: MixedRoute[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteCurrency: Currency,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n candidatePools?: CandidatePoolsBySelectionCriteria,\n gasModel?: IGasModel<MixedRouteWithValidQuote>\n ): Promise<GetQuotesResult> {\n const beforeGetQuotes = Date.now();\n log.info('Starting to get mixed quotes');\n if (gasModel === undefined) {\n throw new Error(\n 'GasModel for MixedRouteWithValidQuote is required to getQuotes'\n );\n }\n if (routes.length == 0) {\n return { routesWithValidQuotes: [], candidatePools };\n }\n\n // For all our routes, and all the fractional amounts, fetch quotes on-chain.\n const quoteFn = this.onChainQuoteProvider.getQuotesManyExactIn.bind(\n this.onChainQuoteProvider\n );\n\n const beforeQuotes = Date.now();\n log.info(\n `Getting quotes for mixed for ${routes.length} routes with ${amounts.length} amounts per route.`\n );\n\n const { routesWithQuotes } = await quoteFn<MixedRoute>(\n amounts,\n routes,\n routingConfig\n );\n\n metric.putMetric(\n 'MixedQuotesLoad',\n Date.now() - beforeQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n 'MixedQuotesFetched',\n _(routesWithQuotes)\n .map(([, quotes]) => quotes.length)\n .sum(),\n MetricLoggerUnit.Count\n );\n\n const routesWithValidQuotes = [];\n\n for (const routeWithQuote of routesWithQuotes) {\n const [route, quotes] = routeWithQuote;\n\n for (let i = 0; i < quotes.length; i++) {\n const percent = percents[i]!;\n const amountQuote = quotes[i]!;\n const {\n quote,\n amount,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n gasEstimate,\n } = amountQuote;\n\n if (\n !quote ||\n !sqrtPriceX96AfterList ||\n !initializedTicksCrossedList ||\n !gasEstimate\n ) {\n log.debug(\n {\n route: routeToString(route),\n amountQuote,\n },\n 'Dropping a null mixed quote for route.'\n );\n continue;\n }\n\n const routeWithValidQuote = new MixedRouteWithValidQuote({\n route,\n rawQuote: quote,\n amount,\n percent,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n quoterGasEstimate: gasEstimate,\n mixedRouteGasModel: gasModel,\n quoteToken: quoteCurrency.wrapped,\n tradeType,\n v4PoolProvider: this.v4PoolProvider,\n v3PoolProvider: this.v3PoolProvider,\n v2PoolProvider: this.v2PoolProvider,\n });\n\n routesWithValidQuotes.push(routeWithValidQuote);\n }\n }\n\n metric.putMetric(\n 'MixedGetQuotesLoad',\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routesWithValidQuotes,\n candidatePools,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/routers/alpha-router/quoters/model/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B","sourcesContent":["export * from './results';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-quotes-result.js","sourceRoot":"","sources":["../../../../../../../src/routers/alpha-router/quoters/model/results/get-quotes-result.ts"],"names":[],"mappings":"","sourcesContent":["import { RouteWithValidQuote } from '../../../entities';\nimport { CandidatePoolsBySelectionCriteria } from '../../../functions/get-candidate-pools';\n\nexport interface GetQuotesResult {\n routesWithValidQuotes: RouteWithValidQuote[];\n candidatePools?: CandidatePoolsBySelectionCriteria;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-routes-result.js","sourceRoot":"","sources":["../../../../../../../src/routers/alpha-router/quoters/model/results/get-routes-result.ts"],"names":[],"mappings":"","sourcesContent":["import { SupportedRoutes } from '../../../../router';\nimport { CandidatePoolsBySelectionCriteria } from '../../../functions/get-candidate-pools';\n\nexport interface GetRoutesResult<Route extends SupportedRoutes> {\n routes: Route[];\n candidatePools: CandidatePoolsBySelectionCriteria;\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/routers/alpha-router/quoters/model/results/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,sDAAoC;AACpC,sDAAoC","sourcesContent":["export * from './get-quotes-result';\nexport * from './get-routes-result';\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-few-v3-quoter.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/uniswap-few-v3-quoter.ts"],"names":[],"mappings":";;;;;;AAAA,wDAAmD;AACnD,oDAA4E;AAC5E,oDAAuB;AAEvB,kDAQ4B;AAC5B,wCAMuB;AAGvB,0CAA8D;AAC9D,wEAA+E;AAO/E,+CAA2C;AAI3C,MAAa,kBAAmB,SAAQ,wBAA4C;IAKlF,YACE,kBAAuC,EACvC,cAA+B,EAC/B,oBAA2C,EAC3C,aAA6B,EAC7B,OAAgB,EAChB,wBAA6C,EAC7C,sBAAgD;QAEhD,KAAK,CACH,aAAa,EACb,OAAO,EACP,qBAAQ,CAAC,EAAE,EACX,wBAAwB,EACxB,sBAAsB,CACvB,CAAC;QACF,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,oBAAoB,GAAG,oBAAoB,CAAC;IACnD,CAAC;IAES,KAAK,CAAC,SAAS,CACvB,OAAc,EACd,QAAe,EACf,gBAAkC,EAClC,UAAqB,EACrB,aAAgC;QAEhC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,6EAA6E;QAC7E,8EAA8E;QAC9E,yBAAyB;QACzB,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,GAAG,gBAAgB,CAAC;QAC1D,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,EAAE,CAAC;QAE5C,kHAAkH;QAClH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,0BAA0B,CACjD,QAAQ,EACR,CACE,KAAe,EACf,eAAkD,EACzC,EAAE;YACX,0EAA0E;YAC1E,IAAI,CAAC,eAAe,EAAE;gBACpB,OAAO,KAAK,CAAC;aACd;YAED,2EAA2E;YAC3E,gFAAgF;YAChF,4EAA4E;YAC5E,WAAW;YACX,EAAE;YACF,IACE,eAAe,IAAI,iCAAqB,CAAC,GAAG;gBAC5C,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EACjD;gBACA,OAAO,KAAK,CAAC;aACd;YAED,OAAO,CACL,eAAe,IAAI,iCAAqB,CAAC,GAAG;gBAC5C,eAAe,IAAI,iCAAqB,CAAC,GAAG,CAC7C,CAAC;QACJ,CAAC,CACF,CAAC;QAEF,kGAAkG;QAClG,MAAM,EAAE,eAAe,EAAE,GAAG,aAAa,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAA,iDAA4B,EACzC,OAAO,EACP,QAAQ,EACR,KAAK,EACL,eAAe,CAChB,CAAC;QAEF,aAAM,CAAC,SAAS,CACd,iBAAiB,EACjB,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAC5B,uBAAgB,CAAC,YAAY,CAC9B,CAAC;QAEF,aAAM,CAAC,SAAS,CACd,wBAAwB,IAAI,CAAC,OAAO,EAAE,EACtC,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAC5B,uBAAgB,CAAC,YAAY,CAC9B,CAAC;QAEF,OAAO;YACL,MAAM;YACN,cAAc;SACf,CAAC;IACJ,CAAC;IAEe,KAAK,CAAC,SAAS,CAC7B,MAAiB,EACjB,OAAyB,EACzB,QAAkB,EAClB,UAAiB,EACjB,SAAoB,EACpB,aAAgC,EAChC,cAAkD,EAClD,QAAqD;QAErD,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,UAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAEtC,IAAI,QAAQ,KAAK,SAAS,EAAE;YAC1B,MAAM,IAAI,KAAK,CACb,uEAAuE,CACxE,CAAC;SACH;QAED,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE;YACtB,OAAO,EAAE,qBAAqB,EAAE,EAAE,EAAE,cAAc,EAAE,CAAC;SACtD;QAED,6EAA6E;QAC7E,MAAM,OAAO,GACX,SAAS,IAAI,oBAAS,CAAC,WAAW;YAChC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,oBAAoB,CAAC,IAAI,CACjD,IAAI,CAAC,oBAAoB,CAC1B;YACH,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,IAAI,CAClD,IAAI,CAAC,oBAAoB,CAC1B,CAAC;QAER,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,UAAG,CAAC,IAAI,CACN,6BAA6B,MAAM,CAAC,MAAM,gBAAgB,OAAO,CAAC,MAAM,qBAAqB,CAC9F,CAAC;QAEF,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,OAAO,CACxC,OAAO,EACP,MAAM,EACN,aAAa,CACd,CAAC;QAEF,aAAM,CAAC,SAAS,CACd,cAAc,EACd,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY,EACzB,uBAAgB,CAAC,YAAY,CAC9B,CAAC;QAEF,aAAM,CAAC,SAAS,CACd,6BAA6B,EAC7B,IAAA,gBAAC,EAAC,gBAAgB,CAAC;aAChB,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;aAClC,GAAG,EAAE,EACR,uBAAgB,CAAC,KAAK,CACvB,CAAC;QAEF,MAAM,qBAAqB,GAAG,EAAE,CAAC;QAEjC,KAAK,MAAM,cAAc,IAAI,gBAAgB,EAAE;YAC7C,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,cAAc,CAAC;YAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAE,CAAC;gBAC7B,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;gBAC/B,MAAM,EACJ,KAAK,EACL,MAAM,EACN,qBAAqB,EACrB,2BAA2B,EAC3B,WAAW,GACZ,GAAG,WAAW,CAAC;gBAEhB,IACE,CAAC,KAAK;oBACN,CAAC,qBAAqB;oBACtB,CAAC,2BAA2B;oBAC5B,CAAC,WAAW,EACZ;oBACA,UAAG,CAAC,KAAK,CACP;wBACE,KAAK,EAAE,IAAA,oBAAa,EAAC,KAAK,CAAC;wBAC3B,WAAW;qBACZ,EACD,qCAAqC,CACtC,CAAC;oBACF,SAAS;iBACV;gBAED,MAAM,mBAAmB,GAAG,IAAI,0CAA+B,CAAC;oBAC9D,KAAK;oBACL,QAAQ,EAAE,KAAK;oBACf,MAAM;oBACN,OAAO;oBACP,qBAAqB;oBACrB,2BAA2B;oBAC3B,iBAAiB,EAAE,WAAW;oBAC9B,QAAQ;oBACR,UAAU;oBACV,SAAS;oBACT,cAAc,EAAE,IAAI,CAAC,cAAc;iBACpC,CAAC,CAAC;gBAEH,qBAAqB,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;aACjD;SACF;QAED,aAAM,CAAC,SAAS,CACd,iBAAiB,EACjB,IAAI,CAAC,GAAG,EAAE,GAAG,eAAe,EAC5B,uBAAgB,CAAC,YAAY,CAC9B,CAAC;QAEF,OAAO;YACL,qBAAqB;YACrB,cAAc;SACf,CAAC;IACJ,CAAC;CACF;AAzND,gDAyNC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport {\n IOnChainQuoteProvider,\n ITokenListProvider,\n ITokenProvider,\n ITokenValidatorProvider,\n IV3PoolProvider,\n IV3SubgraphProvider,\n TokenValidationResult,\n} from '../../../providers';\nimport {\n CurrencyAmount,\n log,\n metric,\n MetricLoggerUnit,\n routeToString,\n} from '../../../util';\nimport { V3Route } from '../../router';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { UniswapFewV3RouteWithValidQuote } from '../entities';\nimport { computeAllUniswapFewV3Routes } from '../functions/compute-all-routes';\nimport {\n CandidatePoolsBySelectionCriteria,\n V3CandidatePools,\n} from '../functions/get-candidate-pools';\nimport { IGasModel } from '../gas-models';\n\nimport { BaseQuoter } from './base-quoter';\nimport { GetQuotesResult } from './model/results/get-quotes-result';\nimport { GetRoutesResult } from './model/results/get-routes-result';\n\nexport class UniswapFewV3Quoter extends BaseQuoter<V3CandidatePools, V3Route, Token> {\n protected v3SubgraphProvider: IV3SubgraphProvider;\n protected v3PoolProvider: IV3PoolProvider;\n protected onChainQuoteProvider: IOnChainQuoteProvider;\n\n constructor(\n v3SubgraphProvider: IV3SubgraphProvider,\n v3PoolProvider: IV3PoolProvider,\n onChainQuoteProvider: IOnChainQuoteProvider,\n tokenProvider: ITokenProvider,\n chainId: ChainId,\n blockedTokenListProvider?: ITokenListProvider,\n tokenValidatorProvider?: ITokenValidatorProvider\n ) {\n super(\n tokenProvider,\n chainId,\n Protocol.V3,\n blockedTokenListProvider,\n tokenValidatorProvider\n );\n this.v3SubgraphProvider = v3SubgraphProvider;\n this.v3PoolProvider = v3PoolProvider;\n this.onChainQuoteProvider = onChainQuoteProvider;\n }\n\n protected async getRoutes(\n tokenIn: Token,\n tokenOut: Token,\n v3CandidatePools: V3CandidatePools,\n _tradeType: TradeType,\n routingConfig: AlphaRouterConfig\n ): Promise<GetRoutesResult<V3Route>> {\n const beforeGetRoutes = Date.now();\n // Fetch all the pools that we will consider routing via. There are thousands\n // of pools, so we filter them to a set of candidate pools that we expect will\n // result in good prices.\n const { poolAccessor, candidatePools } = v3CandidatePools;\n const poolsRaw = poolAccessor.getAllPools();\n\n // Drop any pools that contain fee on transfer tokens (not supported by v3) or have issues with being transferred.\n const pools = await this.applyTokenValidatorToPools(\n poolsRaw,\n (\n token: Currency,\n tokenValidation: TokenValidationResult | undefined\n ): boolean => {\n // If there is no available validation result we assume the token is fine.\n if (!tokenValidation) {\n return false;\n }\n\n // Only filters out *intermediate* pools that involve tokens that we detect\n // cant be transferred. This prevents us trying to route through tokens that may\n // not be transferrable, but allows users to still swap those tokens if they\n // specify.\n //\n if (\n tokenValidation == TokenValidationResult.STF &&\n (token.equals(tokenIn) || token.equals(tokenOut))\n ) {\n return false;\n }\n\n return (\n tokenValidation == TokenValidationResult.FOT ||\n tokenValidation == TokenValidationResult.STF\n );\n }\n );\n\n // Given all our candidate pools, compute all the possible ways to route from tokenIn to tokenOut.\n const { maxSwapsPerPath } = routingConfig;\n const routes = computeAllUniswapFewV3Routes(\n tokenIn,\n tokenOut,\n pools,\n maxSwapsPerPath\n );\n\n metric.putMetric(\n 'V3GetRoutesLoad',\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n `V3GetRoutesLoad_Chain${this.chainId}`,\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routes,\n candidatePools,\n };\n }\n\n public override async getQuotes(\n routes: V3Route[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteToken: Token,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n candidatePools?: CandidatePoolsBySelectionCriteria,\n gasModel?: IGasModel<UniswapFewV3RouteWithValidQuote>\n ): Promise<GetQuotesResult> {\n const beforeGetQuotes = Date.now();\n log.info('Starting to get V3 quotes');\n\n if (gasModel === undefined) {\n throw new Error(\n 'GasModel for UniswapFewV3RouteWithValidQuote is required to getQuotes'\n );\n }\n\n if (routes.length == 0) {\n return { routesWithValidQuotes: [], candidatePools };\n }\n\n // For all our routes, and all the fractional amounts, fetch quotes on-chain.\n const quoteFn =\n tradeType == TradeType.EXACT_INPUT\n ? this.onChainQuoteProvider.getQuotesManyExactIn.bind(\n this.onChainQuoteProvider\n )\n : this.onChainQuoteProvider.getQuotesManyExactOut.bind(\n this.onChainQuoteProvider\n );\n\n const beforeQuotes = Date.now();\n log.info(\n `Getting quotes for V3 for ${routes.length} routes with ${amounts.length} amounts per route.`\n );\n\n const { routesWithQuotes } = await quoteFn<V3Route>(\n amounts,\n routes,\n routingConfig\n );\n\n metric.putMetric(\n 'V3QuotesLoad',\n Date.now() - beforeQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n 'Uniswap Few V3QuotesFetched',\n _(routesWithQuotes)\n .map(([, quotes]) => quotes.length)\n .sum(),\n MetricLoggerUnit.Count\n );\n\n const routesWithValidQuotes = [];\n\n for (const routeWithQuote of routesWithQuotes) {\n const [route, quotes] = routeWithQuote;\n\n for (let i = 0; i < quotes.length; i++) {\n const percent = percents[i]!;\n const amountQuote = quotes[i]!;\n const {\n quote,\n amount,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n gasEstimate,\n } = amountQuote;\n\n if (\n !quote ||\n !sqrtPriceX96AfterList ||\n !initializedTicksCrossedList ||\n !gasEstimate\n ) {\n log.debug(\n {\n route: routeToString(route),\n amountQuote,\n },\n 'Dropping a null V3 quote for route.'\n );\n continue;\n }\n\n const routeWithValidQuote = new UniswapFewV3RouteWithValidQuote({\n route,\n rawQuote: quote,\n amount,\n percent,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n quoterGasEstimate: gasEstimate,\n gasModel,\n quoteToken,\n tradeType,\n v3PoolProvider: this.v3PoolProvider,\n });\n\n routesWithValidQuotes.push(routeWithValidQuote);\n }\n }\n\n metric.putMetric(\n 'V3GetQuotesLoad',\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routesWithValidQuotes,\n candidatePools,\n };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"uniswap-few-v4-quoter.js","sourceRoot":"","sources":["../../../../../src/routers/alpha-router/quoters/uniswap-few-v4-quoter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, TradeType } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport {\n IOnChainQuoteProvider,\n ITokenListProvider,\n ITokenProvider,\n ITokenValidatorProvider,\n IV4PoolProvider,\n IV4SubgraphProvider,\n TokenValidationResult,\n} from '../../../providers';\nimport {\n CurrencyAmount,\n log,\n metric,\n MetricLoggerUnit,\n routeToString,\n} from '../../../util';\nimport { V4Route } from '../../router';\nimport { AlphaRouterConfig } from '../alpha-router';\nimport { RouteWithValidQuote, UniswapFewV4RouteWithValidQuote } from '../entities';\nimport { computeAllUniswapFewV4Routes } from '../functions/compute-all-routes';\nimport {\n CandidatePoolsBySelectionCriteria,\n V4CandidatePools,\n} from '../functions/get-candidate-pools';\nimport { IGasModel } from '../gas-models';\n\nimport { BaseQuoter } from './base-quoter';\nimport { GetQuotesResult, GetRoutesResult } from './model';\n\nexport class UniswapFewV4Quoter extends BaseQuoter<V4CandidatePools, V4Route, Currency> {\n protected v4SubgraphProvider: IV4SubgraphProvider;\n protected v4PoolProvider: IV4PoolProvider;\n protected onChainQuoteProvider: IOnChainQuoteProvider;\n\n constructor(\n v4SubgraphProvider: IV4SubgraphProvider,\n v4PoolProvider: IV4PoolProvider,\n onChainQuoteProvider: IOnChainQuoteProvider,\n tokenProvider: ITokenProvider,\n chainId: ChainId,\n blockedTokenListProvider?: ITokenListProvider,\n tokenValidatorProvider?: ITokenValidatorProvider\n ) {\n super(\n tokenProvider,\n chainId,\n Protocol.V4,\n blockedTokenListProvider,\n tokenValidatorProvider\n );\n this.v4SubgraphProvider = v4SubgraphProvider;\n this.v4PoolProvider = v4PoolProvider;\n this.onChainQuoteProvider = onChainQuoteProvider;\n }\n\n protected async getRoutes(\n currencyIn: Currency,\n currencyOut: Currency,\n v4CandidatePools: V4CandidatePools,\n _tradeType: TradeType,\n routingConfig: AlphaRouterConfig\n ): Promise<GetRoutesResult<V4Route>> {\n const beforeGetRoutes = Date.now();\n // Fetch all the pools that we will consider routing via. There are thousands\n // of pools, so we filter them to a set of candidate pools that we expect will\n // result in good prices.\n const { poolAccessor, candidatePools } = v4CandidatePools;\n const poolsRaw = poolAccessor.getAllPools();\n\n // Drop any pools that contain fee on transfer tokens (not supported by v4) or have issues with being transferred.\n const pools = await this.applyTokenValidatorToPools(\n poolsRaw,\n (\n token: Currency,\n tokenValidation: TokenValidationResult | undefined\n ): boolean => {\n // If there is no available validation result we assume the token is fine.\n if (!tokenValidation) {\n return false;\n }\n\n // Only filters out *intermediate* pools that involve tokens that we detect\n // cant be transferred. This prevents us trying to route through tokens that may\n // not be transferrable, but allows users to still swap those tokens if they\n // specify.\n //\n if (\n tokenValidation == TokenValidationResult.STF &&\n (token.equals(currencyIn) || token.equals(currencyOut))\n ) {\n return false;\n }\n\n return (\n tokenValidation == TokenValidationResult.FOT ||\n tokenValidation == TokenValidationResult.STF\n );\n }\n );\n\n // Given all our candidate pools, compute all the possible ways to route from currencyIn to tokenOut.\n const { maxSwapsPerPath } = routingConfig;\n const routes = computeAllUniswapFewV4Routes(\n currencyIn,\n currencyOut,\n pools,\n maxSwapsPerPath,\n routingConfig.hooksOptions\n );\n\n metric.putMetric(\n 'V4GetRoutesLoad',\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n `V4GetRoutesLoad_Chain${this.chainId}`,\n Date.now() - beforeGetRoutes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routes,\n candidatePools,\n };\n }\n\n public override async getQuotes(\n routes: V4Route[],\n amounts: CurrencyAmount[],\n percents: number[],\n quoteCurrency: Currency,\n tradeType: TradeType,\n routingConfig: AlphaRouterConfig,\n candidatePools?: CandidatePoolsBySelectionCriteria,\n gasModel?: IGasModel<RouteWithValidQuote>\n ): Promise<GetQuotesResult> {\n const beforeGetQuotes = Date.now();\n log.info('Starting to get V4 quotes');\n\n if (gasModel === undefined) {\n throw new Error(\n 'GasModel for V4RouteWithValidQuote is required to getQuotes'\n );\n }\n\n if (routes.length == 0) {\n return { routesWithValidQuotes: [], candidatePools };\n }\n\n // For all our routes, and all the fractional amounts, fetch quotes on-chain.\n const quoteFn =\n tradeType == TradeType.EXACT_INPUT\n ? this.onChainQuoteProvider.getQuotesManyExactIn.bind(\n this.onChainQuoteProvider\n )\n : this.onChainQuoteProvider.getQuotesManyExactOut.bind(\n this.onChainQuoteProvider\n );\n\n const beforeQuotes = Date.now();\n log.info(\n `Getting quotes for V4 for ${routes.length} routes with ${amounts.length} amounts per route.`\n );\n\n const { routesWithQuotes } = await quoteFn<V4Route>(\n amounts,\n routes,\n routingConfig\n );\n\n metric.putMetric(\n 'V4QuotesLoad',\n Date.now() - beforeQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n metric.putMetric(\n 'V4QuotesFetched',\n _(routesWithQuotes)\n .map(([, quotes]) => quotes.length)\n .sum(),\n MetricLoggerUnit.Count\n );\n\n const routesWithValidQuotes = [];\n\n for (const routeWithQuote of routesWithQuotes) {\n const [route, quotes] = routeWithQuote;\n\n for (let i = 0; i < quotes.length; i++) {\n const percent = percents[i]!;\n const amountQuote = quotes[i]!;\n const {\n quote,\n amount,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n gasEstimate,\n } = amountQuote;\n\n if (\n !quote ||\n !sqrtPriceX96AfterList ||\n !initializedTicksCrossedList ||\n !gasEstimate\n ) {\n log.debug(\n {\n route: routeToString(route),\n amountQuote,\n },\n 'Dropping a null V4 quote for route.'\n );\n continue;\n }\n\n const routeWithValidQuote = new UniswapFewV4RouteWithValidQuote({\n route,\n rawQuote: quote,\n amount,\n percent,\n sqrtPriceX96AfterList,\n initializedTicksCrossedList,\n quoterGasEstimate: gasEstimate,\n gasModel,\n // TODO: ROUTE-306 make it unwrapped, once v4 gas model supports native quote currency\n // For now it's ok to keep it wrapped,\n // because the quote is the fairly accurate quote from the native currency routing\n quoteToken: quoteCurrency.wrapped,\n tradeType,\n v4PoolProvider: this.v4PoolProvider,\n });\n\n routesWithValidQuotes.push(routeWithValidQuote);\n }\n }\n\n metric.putMetric(\n 'V4GetQuotesLoad',\n Date.now() - beforeGetQuotes,\n MetricLoggerUnit.Milliseconds\n );\n\n return {\n routesWithValidQuotes,\n candidatePools,\n };\n }\n}\n"]}
|