@ring-protocol/smart-order-router 0.5.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/main/index.js.map +1 -0
- package/build/main/providers/cache-node.js.map +1 -0
- package/build/main/providers/cache.js.map +1 -0
- package/build/main/providers/caching/route/index.js.map +1 -0
- package/build/main/providers/caching/route/model/cache-mode.js.map +1 -0
- package/build/main/providers/caching/route/model/cached-route.js.map +1 -0
- package/build/main/providers/caching/route/model/cached-routes.js.map +1 -0
- package/build/main/providers/caching/route/model/index.js.map +1 -0
- package/build/main/providers/caching/route/route-caching-provider.js.map +1 -0
- package/build/main/providers/caching-gas-provider.js.map +1 -0
- package/build/main/providers/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/caching-token-list-provider.js.map +1 -0
- package/build/main/providers/caching-token-provider.js.map +1 -0
- package/build/main/providers/eip-1559-gas-price-provider.js.map +1 -0
- package/build/main/providers/eth-estimate-gas-provider.js.map +1 -0
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-caching-pool-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-pool-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-quote-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-static-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/fewV2/ring-subgraph-provider.js.map +1 -0
- package/build/main/providers/fewV2/ring-uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/gas-price-provider.js.map +1 -0
- package/build/main/providers/index.js.map +1 -0
- package/build/main/providers/legacy-gas-price-provider.js.map +1 -0
- package/build/main/providers/multicall-provider.js.map +1 -0
- package/build/main/providers/multicall-ringswap-provider.js.map +1 -0
- package/build/main/providers/multicall-uniswap-provider.js.map +1 -0
- package/build/main/providers/on-chain-gas-price-provider.js.map +1 -0
- package/build/main/providers/on-chain-quote-provider.d.ts +4 -4
- package/build/main/providers/on-chain-quote-provider.js +35 -37
- package/build/main/providers/on-chain-quote-provider.js.map +1 -0
- package/build/main/providers/pool-provider.js.map +1 -0
- package/build/main/providers/portion-provider.js.map +1 -0
- package/build/main/providers/provider.js.map +1 -0
- package/build/main/providers/simulation-provider.js.map +1 -0
- package/build/main/providers/static-gas-price-provider.js.map +1 -0
- package/build/main/providers/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/subgraph-provider.js.map +1 -0
- package/build/main/providers/swap-router-provider.js.map +1 -0
- package/build/main/providers/tenderly-simulation-provider.js.map +1 -0
- package/build/main/providers/token-fee-fetcher.js.map +1 -0
- package/build/main/providers/token-properties-provider.js.map +1 -0
- package/build/main/providers/token-provider.js.map +1 -0
- package/build/main/providers/token-validator-provider.js.map +1 -0
- package/build/main/providers/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v2/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/pool-provider.js.map +1 -0
- package/build/main/providers/v2/quote-provider.js.map +1 -0
- package/build/main/providers/v2/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v2/subgraph-provider.js.map +1 -0
- package/build/main/providers/v2/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v3/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/gas-data-provider.js.map +1 -0
- package/build/main/providers/v3/pool-provider.js.map +1 -0
- package/build/main/providers/v3/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v3/subgraph-provider.js.map +1 -0
- package/build/main/providers/v3/uri-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/caching-pool-provider.js.map +1 -0
- package/build/main/providers/v4/caching-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/pool-provider.js.map +1 -0
- package/build/main/providers/v4/static-subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/subgraph-provider-with-fallback.js.map +1 -0
- package/build/main/providers/v4/subgraph-provider.js.map +1 -0
- package/build/main/providers/v4/uri-subgraph-provider.js.map +1 -0
- package/build/main/routers/alpha-router/alpha-router.d.ts +9 -0
- package/build/main/routers/alpha-router/alpha-router.js +4 -1
- package/build/main/routers/alpha-router/alpha-router.js.map +1 -0
- package/build/main/routers/alpha-router/config.js.map +1 -0
- package/build/main/routers/alpha-router/entities/index.js.map +1 -0
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js.map +1 -0
- package/build/main/routers/alpha-router/functions/best-swap-route.js.map +1 -0
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js.map +1 -0
- package/build/main/routers/alpha-router/functions/compute-all-routes.js.map +1 -0
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/fewV2/v2-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/gas-costs.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/index.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/ring-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/tick-based-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/uniswapFewV3/v3-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/uniswapFewV4/v4-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/gas-models/v4/v4-heuristic-gas-model.js.map +1 -0
- package/build/main/routers/alpha-router/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/base-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/few-v2-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/model/results/index.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/uniswap-few-v3-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/uniswap-few-v4-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v2-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v3-quoter.js.map +1 -0
- package/build/main/routers/alpha-router/quoters/v4-quoter.js.map +1 -0
- package/build/main/routers/index.js.map +1 -0
- package/build/main/routers/legacy-router/bases.js.map +1 -0
- package/build/main/routers/legacy-router/index.js.map +1 -0
- package/build/main/routers/legacy-router/legacy-router.js.map +1 -0
- package/build/main/routers/router.js.map +1 -0
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/types/other/commons.js.map +1 -0
- package/build/main/types/other/factories/Erc20__factory.js.map +1 -0
- package/build/main/types/other/factories/GasDataArbitrum__factory.js.map +1 -0
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js.map +1 -0
- package/build/main/types/other/factories/ITokenValidator__factory.js.map +1 -0
- package/build/main/types/other/factories/MixedRouteQuoterV2__factory.js.map +1 -0
- package/build/main/types/other/factories/Permit2__factory.js.map +1 -0
- package/build/main/types/other/factories/StateView__factory.js.map +1 -0
- package/build/main/types/other/factories/SwapRouter02__factory.js.map +1 -0
- package/build/main/types/other/factories/TokenFeeDetector__factory.js.map +1 -0
- package/build/main/types/other/factories/V4Quoter__factory.js.map +1 -0
- package/build/main/types/v2/commons.js.map +1 -0
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js.map +1 -0
- package/build/main/types/v3/commons.js.map +1 -0
- package/build/main/types/v3/factories/IERC20Metadata__factory.js.map +1 -0
- package/build/main/types/v3/factories/IQuoterV2__factory.js.map +1 -0
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js.map +1 -0
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js.map +1 -0
- package/build/main/util/addresses.js.map +1 -0
- package/build/main/util/amounts.js.map +1 -0
- package/build/main/util/callData.js.map +1 -0
- package/build/main/util/chains.js.map +1 -0
- package/build/main/util/defaultBlocksToLive.js.map +1 -0
- package/build/main/util/fewAddress.js.map +1 -0
- package/build/main/util/gas-factory-helpers.js.map +1 -0
- package/build/main/util/hooksOptions.js.map +1 -0
- package/build/main/util/index.js.map +1 -0
- package/build/main/util/intent.js.map +1 -0
- package/build/main/util/l2FeeChains.js.map +1 -0
- package/build/main/util/log.js.map +1 -0
- package/build/main/util/methodParameters.js +3 -1
- package/build/main/util/methodParameters.js.map +1 -0
- package/build/main/util/metric.js.map +1 -0
- package/build/main/util/mixedRouteFilterOutV4Pools.js.map +1 -0
- package/build/main/util/onchainQuoteProviderConfigs.js.map +1 -0
- package/build/main/util/pool.js.map +1 -0
- package/build/main/util/protocols.js.map +1 -0
- package/build/main/util/routes.js.map +1 -0
- package/build/main/util/serializeRouteIds.js.map +1 -0
- package/build/main/util/simple-perf-tracker.js.map +1 -0
- package/build/main/util/tenderlySimulationErrorBreakDown.js.map +1 -0
- package/build/main/util/unsupported-tokens.js.map +1 -0
- package/build/module/providers/on-chain-quote-provider.d.ts +4 -4
- package/build/module/providers/on-chain-quote-provider.js +35 -37
- package/build/module/routers/alpha-router/alpha-router.d.ts +9 -0
- package/build/module/routers/alpha-router/alpha-router.js +4 -1
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/util/methodParameters.js +3 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"portion-provider.js","sourceRoot":"","sources":["../../../src/providers/portion-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ZERO } from '@fewprotocol/router-sdk';\nimport { Fraction, TradeType } from '@fewprotocol/sdk-core';\n\nimport {\n RouteWithValidQuote,\n SwapOptions,\n SwapOptionsUniversalRouter,\n SwapType,\n} from '../routers';\nimport { CurrencyAmount } from '../util';\n\nimport { ProviderConfig } from './provider';\n\nexport interface IPortionProvider {\n /**\n * Get the portion amount for the given token out amount.\n * portion amount is always calculated against the token out amount.\n *\n * @param tokenOutAmount the token out amount, either the quote for exact in, or the swapper requested amount for exact out\n * @param tradeType the trade type, exact in or exact out\n * @param externalTransferFailed fees charged on token transfers where the to or from address is NOT the uniswap V2 pair address\n * @param feeTakenOnTransfer double fee taken on transfer as part of universal router custody\n * @param swapConfig swap config, containing the portion related data\n */\n getPortionAmount(\n tokenOutAmount: CurrencyAmount,\n tradeType: TradeType,\n externalTransferFailed?: boolean,\n feeTakenOnTransfer?: boolean,\n swapConfig?: SwapOptions\n ): CurrencyAmount | undefined;\n\n /**\n * Get the portion quote amount for the given portion amount.\n * Only applicable for exact out. For exact out, will return zero amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quote token in amount for exact out.\n * @param amount swapper request amount for exact out.\n * @param portionAmount the portion amount\n */\n getPortionQuoteAmount(\n tradeType: TradeType,\n quote: CurrencyAmount,\n amount: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined;\n\n /**\n * In-place update the route quote amount with the portion amount deducted.\n * This method is only applicable for exact in.\n * For exact out, the portion amount gets added into the swapper requested amount at the beginning of\n * `AlphaRouter.route(...)` method.\n *\n * For exact in, the portion amount gets subtracted from the quote amount at the end of\n * get best swap route.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param routeWithQuotes the route with quotes\n * @param swapConfig swap config, containing the portion related data\n * @param providerConfig provider config, for the FOT fee related data\n */\n getRouteWithQuotePortionAdjusted(\n tradeType: TradeType,\n routeWithQuotes: RouteWithValidQuote[],\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): RouteWithValidQuote[];\n\n /**\n * Get the quote gas adjusted amount for exact in and exact out.\n * For exact in, quote amount is the same as the best swap quote.\n * For exact out, quote amount is the best swap quote minus the portion quote token amount.\n * The reason is SOR adds the portion amount into the exact out swapper requested amount.\n * SOR needs to estimate the equivalent portion quote token amount, and have quote amount subtract portion quote token amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quote the best swap quote\n * @param portionQuoteAmount the portion quote token amount\n */\n getQuote(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount;\n\n /**\n * Get the quote gas adjusted amount for exact in and exact out.\n * For exact in, quote gas adjusted amount is the same as the best swap quote gas adjusted amount.\n * For exact out, quote gas adjusted amount is the best swap quote gas adjusted amount minus the portion quote token amount.\n * The reason is SOR adds the portion amount into the exact out swapper requested amount.\n * SOR needs to estimate the equivalent portion quote token amount, and have quote gas adjusted amount subtract portion quote token amount.\n *\n * @param tradeType the trade type, exact in or exact out\n * @param quoteGasAdjusted the best swap quote gas adjusted amount\n * @param portionQuoteAmount the portion quote token amount\n */\n getQuoteGasAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount;\n\n /**\n * Get the quote gas and portion adjusted amount for exact in and exact out.\n * For exact in, quote gas and portion adjusted amount is the best swap quote gas adjusted amount minus the portion amount.\n * The reason is because quote gas and portion adjusted amount for exact in does not know anything about portion.\n * For exact out, quote gas and portion adjusted amount is the best swap quote gas adjusted amount.\n * The reason is because quote gas and portion adjusted amount for exact out has already added the portion quote token amount.\n *\n * @param tradeType\n * @param quoteGasAdjusted\n * @param portionAmount\n */\n getQuoteGasAndPortionAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined;\n}\n\nexport class PortionProvider implements IPortionProvider {\n getPortionAmount(\n tokenOutAmount: CurrencyAmount,\n tradeType: TradeType,\n externalTransferFailed?: boolean,\n feeTakenOnTransfer?: boolean,\n swapConfig?: SwapOptions\n ): CurrencyAmount | undefined {\n if (\n externalTransferFailed ||\n feeTakenOnTransfer ||\n swapConfig?.type !== SwapType.UNIVERSAL_ROUTER\n ) {\n return undefined;\n }\n\n const swapConfigUniversalRouter = swapConfig as SwapOptionsUniversalRouter;\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n if (\n swapConfigUniversalRouter.fee &&\n swapConfigUniversalRouter.fee.fee.greaterThan(ZERO)\n ) {\n return tokenOutAmount.multiply(swapConfigUniversalRouter.fee.fee);\n }\n\n return undefined;\n case TradeType.EXACT_OUTPUT:\n if (\n swapConfigUniversalRouter.flatFee &&\n swapConfigUniversalRouter.flatFee.amount > BigNumber.from(0)\n ) {\n return CurrencyAmount.fromRawAmount(\n tokenOutAmount.currency,\n swapConfigUniversalRouter.flatFee.amount.toString()\n );\n }\n\n return undefined;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getPortionQuoteAmount(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionAdjustedAmount: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined {\n if (!portionAmount) {\n return undefined;\n }\n\n // this method can only be called for exact out\n // for exact in, there is no need to compute the portion quote amount, since portion is always against token out amount\n if (tradeType !== TradeType.EXACT_OUTPUT) {\n return undefined;\n }\n\n // 1. then we know portion amount and portion adjusted exact out amount,\n // we can get a ratio\n // i.e. portionToPortionAdjustedAmountRatio = portionAmountToken / portionAdjustedAmount\n const portionToPortionAdjustedAmountRatio = new Fraction(\n portionAmount.quotient,\n portionAdjustedAmount.quotient\n );\n // 2. we have the portionAmountToken / portionAdjustedAmount ratio\n // then we can estimate the portion amount for quote, i.e. what is the estimated token in amount deducted for the portion\n // this amount will be portionQuoteAmountToken = portionAmountToken / portionAdjustedAmount * quote\n // CAVEAT: we prefer to use the quote currency amount OVER quote gas adjusted currency amount for the formula\n // because the portion amount calculated from the exact out has no way to account for the gas units.\n return CurrencyAmount.fromRawAmount(\n quote.currency,\n portionToPortionAdjustedAmountRatio.multiply(quote).quotient\n );\n }\n\n getRouteWithQuotePortionAdjusted(\n tradeType: TradeType,\n routeWithQuotes: RouteWithValidQuote[],\n swapConfig?: SwapOptions,\n providerConfig?: ProviderConfig\n ): RouteWithValidQuote[] {\n // the route with quote portion adjustment is only needed for exact in routes with quotes\n // because the route with quotes does not know the output amount needs to subtract the portion amount\n if (tradeType !== TradeType.EXACT_INPUT) {\n return routeWithQuotes;\n }\n\n // the route with quote portion adjustment is only needed for universal router\n // for swap router 02, it doesn't have portion-related commands\n if (swapConfig?.type !== SwapType.UNIVERSAL_ROUTER) {\n return routeWithQuotes;\n }\n\n return routeWithQuotes.map((routeWithQuote) => {\n const portionAmount = this.getPortionAmount(\n routeWithQuote.quote,\n tradeType,\n providerConfig?.externalTransferFailed,\n providerConfig?.feeTakenOnTransfer,\n swapConfig\n );\n\n // This is a sub-optimal solution agreed among the teams to work around the exact in\n // portion amount issue for universal router.\n // The most optimal solution is to update router-sdk https://github.com/Uniswap/router-sdk/blob/main/src/entities/trade.ts#L215\n // `minimumAmountOut` to include portionBips as well, `public minimumAmountOut(slippageTolerance: Percent, amountOut = this.outputAmount, portionBips: Percent)\n // but this will require a new release of router-sdk, and bump router-sdk versions in across downstream dependencies across the stack.\n // We opt to use this sub-optimal solution for now, and revisit the optimal solution in the future.\n // Since SOR subtracts portion amount from EACH route output amount (note the routeWithQuote.quote above),\n // SOR will have as accurate ouput amount per route as possible, which helps with the final `minimumAmountOut`\n if (portionAmount) {\n routeWithQuote.quote = routeWithQuote.quote.subtract(portionAmount);\n }\n\n return routeWithQuote;\n });\n }\n\n getQuote(\n tradeType: TradeType,\n quote: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount {\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quote;\n case TradeType.EXACT_OUTPUT:\n return portionQuoteAmount ? quote.subtract(portionQuoteAmount) : quote;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getQuoteGasAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionQuoteAmount?: CurrencyAmount\n ): CurrencyAmount {\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quoteGasAdjusted;\n case TradeType.EXACT_OUTPUT:\n return portionQuoteAmount\n ? quoteGasAdjusted.subtract(portionQuoteAmount)\n : quoteGasAdjusted;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n\n getQuoteGasAndPortionAdjusted(\n tradeType: TradeType,\n quoteGasAdjusted: CurrencyAmount,\n portionAmount?: CurrencyAmount\n ): CurrencyAmount | undefined {\n if (!portionAmount) {\n return undefined;\n }\n\n switch (tradeType) {\n case TradeType.EXACT_INPUT:\n return quoteGasAdjusted.subtract(portionAmount);\n case TradeType.EXACT_OUTPUT:\n return quoteGasAdjusted;\n default:\n throw new Error(`Unknown trade type ${tradeType}`);\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../../src/providers/provider.ts"],"names":[],"mappings":"","sourcesContent":["import { UniversalRouterVersion } from '@fewprotocol/universal-router-sdk';\n\nexport type ProviderConfig = {\n /**\n * The block number to use when getting data on-chain.\n */\n blockNumber?: number | Promise<number>;\n /*\n * Debug flag to test some codepaths\n */\n debugRouting?: boolean;\n /**\n * Flag for token properties provider to enable fetching fee-on-transfer tokens.\n */\n enableFeeOnTransferFeeFetching?: boolean;\n /**\n * Tenderly natively support save simulation failures if failed,\n * we need this as a pass-through flag to enable/disable this feature.\n */\n saveTenderlySimulationIfFailed?: boolean;\n /**\n * Flag to indicate whether to use the CachedRoutes in optimistic mode.\n * Optimistic mode means that we will allow blocksToLive greater than 1.\n */\n optimisticCachedRoutes?: boolean;\n /**\n * FOT fees charged on token transfers where the to or from address is NOT the uniswap V2 pair address\n */\n externalTransferFailed?: boolean;\n /**\n * double FOT fee taken on transfer as part of universal router custody\n */\n feeTakenOnTransfer?: boolean;\n /**\n * The version of the universal router to use.\n */\n universalRouterVersion?: UniversalRouterVersion;\n};\n\nexport type LocalCacheEntry<T> = {\n entry: T;\n blockNumber: number;\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"simulation-provider.js","sourceRoot":"","sources":["../../../src/providers/simulation-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { JsonRpcProvider } from '@ethersproject/providers';\nimport { ChainId, TradeType } from '@fewprotocol/sdk-core';\nimport { BigNumber } from 'ethers/lib/ethers';\n\nimport {\n GasModelProviderConfig,\n SwapOptions,\n SwapRoute,\n SwapType,\n} from '../routers';\nimport { Erc20__factory } from '../types/other/factories/Erc20__factory';\nimport { Permit2__factory } from '../types/other/factories/Permit2__factory';\nimport { CurrencyAmount, log, SWAP_ROUTER_02_ADDRESSES } from '../util';\n\nimport { permit2Address } from '@uniswap/permit2-sdk';\nimport { IPortionProvider } from './portion-provider';\n\nexport type SimulationResult = {\n transaction: {\n hash: string;\n gas_used: number;\n gas: number;\n error_message: string;\n };\n simulation: { state_overrides: Record<string, unknown> };\n};\n\nexport enum SimulationStatus {\n NotSupported = 0,\n Failed = 1,\n Succeeded = 2,\n InsufficientBalance = 3,\n NotApproved = 4,\n SystemDown = 5,\n SlippageTooLow = 6,\n TransferFromFailed = 7,\n}\n\n/**\n * Provider for dry running transactions.\n *\n * @export\n * @class Simulator\n */\nexport abstract class Simulator {\n protected provider: JsonRpcProvider;\n protected portionProvider: IPortionProvider;\n\n /**\n * Returns a new SwapRoute with simulated gas estimates\n * @returns SwapRoute\n */\n constructor(\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n protected chainId: ChainId\n ) {\n this.provider = provider;\n this.portionProvider = portionProvider;\n }\n\n public async simulate(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n amount: CurrencyAmount,\n quote: CurrencyAmount,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n const neededBalance =\n swapRoute.trade.tradeType == TradeType.EXACT_INPUT ? amount : quote;\n if (\n // we assume we always have enough eth mainnet balance because we use beacon address later\n (neededBalance.currency.isNative && this.chainId == ChainId.MAINNET) ||\n (await this.userHasSufficientBalance(\n fromAddress,\n swapRoute.trade.tradeType,\n amount,\n quote\n ))\n ) {\n log.info(\n 'User has sufficient balance to simulate. Simulating transaction.'\n );\n try {\n return this.simulateTransaction(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n } catch (e) {\n log.error({ e }, 'Error simulating transaction');\n return {\n ...swapRoute,\n simulationStatus: SimulationStatus.Failed,\n };\n }\n } else {\n log.error('User does not have sufficient balance to simulate.');\n return {\n ...swapRoute,\n simulationStatus: SimulationStatus.InsufficientBalance,\n };\n }\n }\n\n protected abstract simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute>;\n\n protected async userHasSufficientBalance(\n fromAddress: string,\n tradeType: TradeType,\n amount: CurrencyAmount,\n quote: CurrencyAmount\n ): Promise<boolean> {\n try {\n const neededBalance = tradeType == TradeType.EXACT_INPUT ? amount : quote;\n let balance;\n if (neededBalance.currency.isNative) {\n balance = await this.provider.getBalance(fromAddress);\n } else {\n const tokenContract = Erc20__factory.connect(\n neededBalance.currency.address,\n this.provider\n );\n balance = await tokenContract.balanceOf(fromAddress);\n }\n\n const hasBalance = balance.gte(\n BigNumber.from(neededBalance.quotient.toString())\n );\n log.info(\n {\n fromAddress,\n balance: balance.toString(),\n neededBalance: neededBalance.quotient.toString(),\n neededAddress: neededBalance.wrapped.currency.address,\n hasBalance,\n },\n 'Result of balance check for simulation'\n );\n return hasBalance;\n } catch (e) {\n log.error(e, 'Error while checking user balance');\n return false;\n }\n }\n\n protected async checkTokenApproved(\n fromAddress: string,\n inputAmount: CurrencyAmount,\n swapOptions: SwapOptions,\n provider: JsonRpcProvider\n ): Promise<boolean> {\n // Check token has approved Permit2 more than expected amount.\n const tokenContract = Erc20__factory.connect(\n inputAmount.currency.wrapped.address,\n provider\n );\n\n if (swapOptions.type == SwapType.UNIVERSAL_ROUTER) {\n const permit2Allowance = await tokenContract.allowance(\n fromAddress,\n permit2Address(this.chainId)\n );\n\n // If a permit has been provided we don't need to check if UR has already been allowed.\n if (swapOptions.inputTokenPermit) {\n log.info(\n {\n permitAllowance: permit2Allowance.toString(),\n inputAmount: inputAmount.quotient.toString(),\n },\n 'Permit was provided for simulation on UR, checking that Permit2 has been approved.'\n );\n return permit2Allowance.gte(\n BigNumber.from(inputAmount.quotient.toString())\n );\n }\n\n // Check UR has been approved from Permit2.\n const permit2Contract = Permit2__factory.connect(\n permit2Address(this.chainId),\n provider\n );\n\n const { amount: universalRouterAllowance, expiration: tokenExpiration } =\n await permit2Contract.allowance(\n fromAddress,\n inputAmount.currency.wrapped.address,\n SWAP_ROUTER_02_ADDRESSES(this.chainId)\n );\n\n const nowTimestampS = Math.round(Date.now() / 1000);\n const inputAmountBN = BigNumber.from(inputAmount.quotient.toString());\n\n const permit2Approved = permit2Allowance.gte(inputAmountBN);\n const universalRouterApproved =\n universalRouterAllowance.gte(inputAmountBN);\n const expirationValid = tokenExpiration > nowTimestampS;\n log.info(\n {\n permitAllowance: permit2Allowance.toString(),\n tokenAllowance: universalRouterAllowance.toString(),\n tokenExpirationS: tokenExpiration,\n nowTimestampS,\n inputAmount: inputAmount.quotient.toString(),\n permit2Approved,\n universalRouterApproved,\n expirationValid,\n },\n `Simulating on UR, Permit2 approved: ${permit2Approved}, UR approved: ${universalRouterApproved}, Expiraton valid: ${expirationValid}.`\n );\n return permit2Approved && universalRouterApproved && expirationValid;\n } else if (swapOptions.type == SwapType.SWAP_ROUTER_02) {\n if (swapOptions.inputTokenPermit) {\n log.info(\n {\n inputAmount: inputAmount.quotient.toString(),\n },\n 'Simulating on SwapRouter02 info - Permit was provided for simulation. Not checking allowances.'\n );\n return true;\n }\n\n const allowance = await tokenContract.allowance(\n fromAddress,\n SWAP_ROUTER_02_ADDRESSES(this.chainId)\n );\n const hasAllowance = allowance.gte(\n BigNumber.from(inputAmount.quotient.toString())\n );\n log.info(\n {\n hasAllowance,\n allowance: allowance.toString(),\n inputAmount: inputAmount.quotient.toString(),\n },\n `Simulating on SwapRouter02 - Has allowance: ${hasAllowance}`\n );\n // Return true if token allowance is greater than input amount\n return hasAllowance;\n }\n\n throw new Error(`Unsupported swap type ${swapOptions}`);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-gas-price-provider.js","sourceRoot":"","sources":["../../../src/providers/static-gas-price-provider.ts"],"names":[],"mappings":";;;AAKA,MAAa,sBAAsB;IACjC,YAAoB,WAAsB;QAAtB,gBAAW,GAAX,WAAW,CAAW;IAAG,CAAC;IAE9C,KAAK,CAAC,WAAW,CACf,kBAA0B,EAC1B,mBAA4B;QAE5B,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;CACF;AATD,wDASC","sourcesContent":["// eslint-disable-next-line no-restricted-imports\nimport { BigNumber } from 'ethers';\n\nimport { GasPrice, IGasPriceProvider } from './gas-price-provider';\n\nexport class StaticGasPriceProvider implements IGasPriceProvider {\n constructor(private gasPriceWei: BigNumber) {}\n\n async getGasPrice(\n _latestBlockNumber: number,\n _requestBlockNumber?: number\n ): Promise<GasPrice> {\n return { gasPriceWei: this.gasPriceWei };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph-provider-with-fallback.js","sourceRoot":"","sources":["../../../src/providers/subgraph-provider-with-fallback.ts"],"names":[],"mappings":";;;AAGA,kCAA8B;AAI9B,MAAsB,6BAA6B;IAIjD,YACU,SAA6C,EAC7C,QAAkB;QADlB,cAAS,GAAT,SAAS,CAAoC;QAC7C,aAAQ,GAAR,QAAQ,CAAU;IACzB,CAAC;IAEG,KAAK,CAAC,QAAQ,CACnB,UAAkB,EAClB,WAAmB,EACnB,cAA+B;QAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC;YACpC,IAAI;gBACF,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,QAAQ,CACnC,UAAU,EACV,WAAW,EACX,cAAc,CACf,CAAC;gBACF,OAAO,KAAK,CAAC;aACd;YAAC,OAAO,GAAG,EAAE;gBACZ,UAAG,CAAC,IAAI,CACN,oCAAoC,IAAI,CAAC,QAAQ,mBAAmB,CAAC,EAAE,CACxE,CAAC;aACH;SACF;QAED,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;CACF;AAhCD,sEAgCC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { Token } from '@fewprotocol/sdk-core';\nimport { SubgraphPool } from '../routers/alpha-router/functions/get-candidate-pools';\nimport { log } from '../util';\nimport { ProviderConfig } from './provider';\nimport { ISubgraphProvider } from './subgraph-provider';\n\nexport abstract class SubgraphProviderWithFallBacks<\n TSubgraphPool extends SubgraphPool\n> implements ISubgraphProvider<TSubgraphPool>\n{\n protected constructor(\n private fallbacks: ISubgraphProvider<TSubgraphPool>[],\n private protocol: Protocol\n ) {}\n\n public async getPools(\n currencyIn?: Token,\n currencyOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]> {\n for (let i = 0; i < this.fallbacks.length; i++) {\n const provider = this.fallbacks[i]!;\n try {\n const pools = await provider.getPools(\n currencyIn,\n currencyOut,\n providerConfig\n );\n return pools;\n } catch (err) {\n log.info(\n `Failed to get subgraph pools for ${this.protocol} from fallback #${i}`\n );\n }\n }\n\n throw new Error('Failed to get subgraph pools from any providers');\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph-provider.js","sourceRoot":"","sources":["../../../src/providers/subgraph-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, Token } from '@fewprotocol/sdk-core';\nimport retry from 'async-retry';\nimport Timeout from 'await-timeout';\nimport { gql, GraphQLClient } from 'graphql-request';\nimport _ from 'lodash';\n\nimport { SubgraphPool } from '../routers/alpha-router/functions/get-candidate-pools';\nimport { log, metric } from '../util';\n\nimport { ProviderConfig } from './provider';\n\nexport interface ISubgraphProvider<TSubgraphPool extends SubgraphPool> {\n getPools(\n tokenIn?: Token,\n tokenOut?: Token,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]>;\n}\n\nconst PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.\n\nexport type V3V4SubgraphPool = {\n id: string;\n feeTier: string;\n liquidity: string;\n token0: {\n id: string;\n };\n token1: {\n id: string;\n };\n tvlETH: number;\n tvlUSD: number;\n};\n\nexport type V3V4RawSubgraphPool = {\n id: string;\n feeTier: string;\n liquidity: string;\n token0: {\n symbol: string;\n id: string;\n };\n token1: {\n symbol: string;\n id: string;\n };\n totalValueLockedUSD: string;\n totalValueLockedETH: string;\n totalValueLockedUSDUntracked: string;\n};\n\nexport abstract class SubgraphProvider<\n TRawSubgraphPool extends V3V4RawSubgraphPool,\n TSubgraphPool extends V3V4SubgraphPool\n> {\n private client: GraphQLClient;\n\n constructor(\n private protocol: Protocol,\n private chainId: ChainId,\n private retries = 2,\n private timeout = 30000,\n private rollback = true,\n private trackedEthThreshold = 0.01,\n private untrackedUsdThreshold = Number.MAX_VALUE,\n private subgraphUrl?: string\n ) {\n this.protocol = protocol;\n if (!this.subgraphUrl) {\n throw new Error(`No subgraph url for chain id: ${this.chainId}`);\n }\n this.client = new GraphQLClient(this.subgraphUrl);\n }\n\n public async getPools(\n _currencyIn?: Currency,\n _currencyOut?: Currency,\n providerConfig?: ProviderConfig\n ): Promise<TSubgraphPool[]> {\n const beforeAll = Date.now();\n let blockNumber = providerConfig?.blockNumber\n ? await providerConfig.blockNumber\n : undefined;\n\n const query = gql`\n ${this.subgraphQuery(blockNumber)}\n `;\n\n let pools: TRawSubgraphPool[] = [];\n\n log.info(\n `Getting ${\n this.protocol\n } pools from the subgraph with page size ${PAGE_SIZE}${\n providerConfig?.blockNumber\n ? ` as of block ${providerConfig?.blockNumber}`\n : ''\n }.`\n );\n\n let retries = 0;\n\n await retry(\n async () => {\n const timeout = new Timeout();\n\n const getPools = async (): Promise<TRawSubgraphPool[]> => {\n let lastId = '';\n let pools: TRawSubgraphPool[] = [];\n let poolsPage: TRawSubgraphPool[] = [];\n\n // metrics variables\n let totalPages = 0;\n\n do {\n totalPages += 1;\n\n const poolsResult = await this.client.request<{\n pools: TRawSubgraphPool[];\n }>(query, {\n pageSize: PAGE_SIZE,\n id: lastId,\n });\n\n poolsPage = poolsResult.pools;\n\n pools = pools.concat(poolsPage);\n\n lastId = pools[pools.length - 1]!.id;\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.paginate.pageSize`,\n poolsPage.length\n );\n } while (poolsPage.length > 0);\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.paginate`,\n totalPages\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.pools.length`,\n pools.length\n );\n\n return pools;\n };\n\n try {\n const getPoolsPromise = getPools();\n const timerPromise = timeout.set(this.timeout).then(() => {\n throw new Error(\n `Timed out getting pools from subgraph: ${this.timeout}`\n );\n });\n pools = await Promise.race([getPoolsPromise, timerPromise]);\n return;\n } catch (err) {\n log.error({ err }, `Error fetching ${this.protocol} Subgraph Pools.`);\n throw err;\n } finally {\n timeout.clear();\n }\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n retries += 1;\n if (\n this.rollback &&\n blockNumber &&\n _.includes(err.message, 'indexed up to')\n ) {\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.indexError`,\n 1\n );\n blockNumber = blockNumber - 10;\n log.info(\n `Detected subgraph indexing error. Rolled back block number to: ${blockNumber}`\n );\n }\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.timeout`,\n 1\n );\n pools = [];\n log.info(\n { err },\n `Failed to get pools from subgraph. Retry attempt: ${retry}`\n );\n },\n }\n );\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.retries`,\n retries\n );\n\n const untrackedPools = pools.filter(\n (pool) =>\n parseInt(pool.liquidity) > 0 ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold ||\n parseFloat(pool.totalValueLockedUSDUntracked) >\n this.untrackedUsdThreshold\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.untracked.length`,\n untrackedPools.length\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.untracked.percent`,\n (untrackedPools.length / pools.length) * 100\n );\n\n const beforeFilter = Date.now();\n let poolsSanitized: TSubgraphPool[] = [];\n if (this.protocol === Protocol.V3) {\n // Special treatment for all V3 pools in order to reduce latency due to thousands of pools with very low TVL locked\n // - Include \"parseFloat(pool.totalValueLockedETH) === 0\" as in certain occasions we have no way of calculating derivedETH so this is 0\n poolsSanitized = pools\n .filter(\n (pool) =>\n (parseInt(pool.liquidity) > 0 &&\n parseFloat(pool.totalValueLockedETH) === 0) ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold\n )\n .map((pool) => {\n return this.mapSubgraphPool(pool);\n });\n } else {\n poolsSanitized = pools\n .filter(\n (pool) =>\n parseInt(pool.liquidity) > 0 ||\n parseFloat(pool.totalValueLockedETH) > this.trackedEthThreshold\n )\n .map((pool) => {\n return this.mapSubgraphPool(pool);\n });\n }\n\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.latency`,\n Date.now() - beforeFilter\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.length`,\n poolsSanitized.length\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.filter.percent`,\n (poolsSanitized.length / pools.length) * 100\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools`,\n 1\n );\n metric.putMetric(\n `${this.protocol}SubgraphProvider.chain_${this.chainId}.getPools.latency`,\n Date.now() - beforeAll\n );\n\n log.info(\n `Got ${pools.length} ${this.protocol} pools from the subgraph. ${poolsSanitized.length} after filtering`\n );\n\n return poolsSanitized;\n }\n\n protected abstract subgraphQuery(blockNumber?: number): string;\n\n protected abstract mapSubgraphPool(\n rawSubgraphPool: TRawSubgraphPool\n ): TSubgraphPool;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"swap-router-provider.js","sourceRoot":"","sources":["../../../src/providers/swap-router-provider.ts"],"names":[],"mappings":";;;AAGA,0FAAuF;AACvF,kCAAwD;AA6BxD,MAAa,kBAAkB;IAC7B,YACY,kBAAsC,EACtC,OAAgB;QADhB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,YAAO,GAAP,OAAO,CAAS;IACzB,CAAC;IAEG,KAAK,CAAC,eAAe,CAC1B,aAAuC,EACvC,cAAwC;;QAExC,MAAM,cAAc,GAAuB;YACzC;gBACE,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACtC,aAAa,CAAC,QAAQ,CAAC,QAAQ,EAAE;aAClC;YACD;gBACE,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO;gBACvC,cAAc,CAAC,QAAQ,CAAC,QAAQ,EAAE;aACnC;SACF,CAAC;QAEF,MAAM,EAAE,GACN,MAAM,IAAI,CAAC,kBAAkB,CAAC,4CAA4C,CAGxE;YACA,OAAO,EAAE,IAAA,+BAAwB,EAAC,IAAI,CAAC,OAAO,CAAC;YAC/C,iBAAiB,EAAE,6CAAqB,CAAC,eAAe,EAAE;YAC1D,YAAY,EAAE,iBAAiB;YAC/B,cAAc;SACf,CAAC,CAAC;QAEL,IAAI,CAAC,CAAA,MAAA,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAA,IAAI,CAAC,CAAA,MAAA,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,0CAAE,OAAO,CAAA,EAAE;YACtD,UAAG,CAAC,IAAI,CACN,EAAE,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,EACvB,wEAAwE,CACzE,CAAC;YACF,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;SACH;QAED,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,GAAG,EAAE,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,GAAG,EAAE,CAAC,OAAQ,CAAC,CAAC,CAAC,CAAC;QAEpD,OAAO;YACL,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC;YACnC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,CAAC;SACtC,CAAC;IACJ,CAAC;CACF;AAlDD,gDAkDC","sourcesContent":["import { ApprovalTypes } from '@fewprotocol/router-sdk';\nimport { ChainId, Currency, CurrencyAmount } from '@fewprotocol/sdk-core';\n\nimport { SwapRouter02__factory } from '../types/other/factories/SwapRouter02__factory';\nimport { log, SWAP_ROUTER_02_ADDRESSES } from '../util';\n\nimport { IMulticallProvider } from './multicall-provider';\n\ntype TokenApprovalTypes = {\n approvalTokenIn: ApprovalTypes;\n approvalTokenOut: ApprovalTypes;\n};\n\n/**\n * Provider for accessing the SwapRouter02 Contract .\n *\n * @export\n * @interface IRouterProvider\n */\nexport interface ISwapRouterProvider {\n /**\n * Get the approval method needed for each token. Throws an error if either query fails.\n *\n * @param tokenInAmount The Currency Amount of tokenIn needed by the user\n * @param tokenOutAmount The Currency Amount of tokenOut needed by the user\n * @returns the Approval Types for each token.\n */\n getApprovalType(\n tokenInAmount: CurrencyAmount<Currency>,\n tokenOutAmount: CurrencyAmount<Currency>\n ): Promise<TokenApprovalTypes>;\n}\n\nexport class SwapRouterProvider implements ISwapRouterProvider {\n constructor(\n protected multicall2Provider: IMulticallProvider,\n protected chainId: ChainId\n ) {}\n\n public async getApprovalType(\n tokenInAmount: CurrencyAmount<Currency>,\n tokenOutAmount: CurrencyAmount<Currency>\n ): Promise<TokenApprovalTypes> {\n const functionParams: [string, string][] = [\n [\n tokenInAmount.currency.wrapped.address,\n tokenInAmount.quotient.toString(),\n ],\n [\n tokenOutAmount.currency.wrapped.address,\n tokenOutAmount.quotient.toString(),\n ],\n ];\n\n const tx =\n await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, string],\n [ApprovalTypes]\n >({\n address: SWAP_ROUTER_02_ADDRESSES(this.chainId),\n contractInterface: SwapRouter02__factory.createInterface(),\n functionName: 'getApprovalType',\n functionParams,\n });\n\n if (!tx.results[0]?.success || !tx.results[1]?.success) {\n log.info(\n { results: tx.results },\n 'Failed to get approval type from swap router for token in or token out'\n );\n throw new Error(\n 'Failed to get approval type from swap router for token in or token out'\n );\n }\n\n const { result: approvalTokenIn } = tx.results![0];\n const { result: approvalTokenOut } = tx.results![1];\n\n return {\n approvalTokenIn: approvalTokenIn[0],\n approvalTokenOut: approvalTokenOut[0],\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenderly-simulation-provider.js","sourceRoot":"","sources":["../../../src/providers/tenderly-simulation-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { MaxUint256 } from '@ethersproject/constants';\nimport { JsonRpcProvider } from '@ethersproject/providers';\nimport { permit2Address } from '@uniswap/permit2-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\nimport { UNIVERSAL_ROUTER_ADDRESS } from '@fewprotocol/universal-router-sdk';\nimport axios, { AxiosRequestConfig } from 'axios';\nimport { BigNumber } from 'ethers/lib/ethers';\n\nimport {\n GasModelProviderConfig,\n metric,\n MetricLoggerUnit,\n SwapOptions,\n SwapRoute,\n SwapType,\n} from '../routers';\nimport { Erc20__factory } from '../types/other/factories/Erc20__factory';\nimport { Permit2__factory } from '../types/other/factories/Permit2__factory';\nimport {\n BEACON_CHAIN_DEPOSIT_ADDRESS,\n log,\n MAX_UINT160,\n SWAP_ROUTER_02_ADDRESSES,\n} from '../util';\nimport { APPROVE_TOKEN_FOR_TRANSFER } from '../util/callData';\nimport {\n calculateGasUsed,\n initSwapRouteFromExisting,\n logGasEstimationVsSimulationMetrics,\n} from '../util/gas-factory-helpers';\n\nimport { breakDownTenderlySimulationError } from '../util/tenderlySimulationErrorBreakDown';\nimport { EthEstimateGasSimulator } from './eth-estimate-gas-provider';\nimport { IPortionProvider } from './portion-provider';\nimport {\n SimulationResult,\n SimulationStatus,\n Simulator,\n} from './simulation-provider';\nimport { IV2PoolProvider } from './v2/pool-provider';\nimport { IV3PoolProvider } from './v3/pool-provider';\nimport { IV4PoolProvider } from './v4/pool-provider';\n\nexport type TenderlyResponseUniversalRouter = {\n config: {\n url: string;\n method: string;\n data: string;\n };\n simulation_results: [SimulationResult, SimulationResult, SimulationResult];\n};\n\nexport type TenderlyResponseSwapRouter02 = {\n config: {\n url: string;\n method: string;\n data: string;\n };\n simulation_results: [SimulationResult, SimulationResult];\n};\n\nexport type GasBody = {\n gas: string;\n gasUsed: string;\n};\n\n// Standard JSON RPC error response https://www.jsonrpc.org/specification#error_object\nexport type JsonRpcError = {\n error: {\n code: number;\n message: string;\n data: string;\n };\n};\n\n// export type TenderlyResponseEstimateGasBundle = {\n// id: number;\n// jsonrpc: string;\n// result: Array<JsonRpcError | GasBody>;\n// };\n\nenum TenderlySimulationType {\n QUICK = 'quick',\n FULL = 'full',\n ABI = 'abi',\n}\n\ntype TenderlySimulationRequest = {\n network_id: ChainId;\n estimate_gas: boolean;\n input: string;\n to: string;\n value: string;\n from: string;\n simulation_type: TenderlySimulationType;\n block_number?: number;\n save_if_fails?: boolean;\n};\n\ntype TenderlySimulationBody = {\n simulations: TenderlySimulationRequest[];\n estimate_gas: boolean;\n};\n\ntype EthJsonRpcRequestBody = {\n from: string;\n to: string;\n data: string;\n};\n\ntype blockNumber =\n | number\n | string\n | 'latest'\n | 'pending'\n | 'earliest'\n | 'finalized'\n | 'safe';\n\ntype TenderlyNodeEstimateGasBundleBody = {\n id: number;\n jsonrpc: string;\n method: string;\n params: Array<Array<EthJsonRpcRequestBody> | blockNumber>;\n};\n\nconst TENDERLY_BATCH_SIMULATE_API = (\n tenderlyBaseUrl: string,\n tenderlyUser: string,\n tenderlyProject: string\n) =>\n `${tenderlyBaseUrl}/api/v1/account/${tenderlyUser}/project/${tenderlyProject}/simulate-batch`;\n\nconst TENDERLY_NODE_API = (chainId: ChainId, tenderlyNodeApiKey: string) => {\n switch (chainId) {\n case ChainId.MAINNET:\n return `https://mainnet.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.BASE:\n return `https://base.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.ARBITRUM_ONE:\n return `https://arbitrum.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.OPTIMISM:\n return `https://optimism.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.POLYGON:\n return `https://polygon.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.AVALANCHE:\n return `https://avalanche.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.BLAST:\n return `https://blast.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.WORLDCHAIN:\n return `https://worldchain-mainnet.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.UNICHAIN:\n return `https://unichain.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n case ChainId.SONEIUM:\n return `https://soneium.gateway.tenderly.co/${tenderlyNodeApiKey}`;\n default:\n throw new Error(\n `ChainId ${chainId} does not correspond to a tenderly node endpoint`\n );\n }\n};\n\nexport const TENDERLY_NOT_SUPPORTED_CHAINS = [\n ChainId.CELO,\n ChainId.CELO_ALFAJORES,\n ChainId.ZKSYNC,\n // tenderly node RPC supports BNB and ZORA upon request, we will make them available\n ChainId.BNB,\n ChainId.ZORA,\n ChainId.MONAD_TESTNET,\n];\n\n// We multiply tenderly gas limit by this to overestimate gas limit\nconst DEFAULT_ESTIMATE_MULTIPLIER = 1.3;\n\nexport class FallbackTenderlySimulator extends Simulator {\n private tenderlySimulator: TenderlySimulator;\n private ethEstimateGasSimulator: EthEstimateGasSimulator;\n constructor(\n chainId: ChainId,\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n tenderlySimulator: TenderlySimulator,\n ethEstimateGasSimulator: EthEstimateGasSimulator\n ) {\n super(provider, portionProvider, chainId);\n this.tenderlySimulator = tenderlySimulator;\n this.ethEstimateGasSimulator = ethEstimateGasSimulator;\n }\n\n protected async simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n // Make call to eth estimate gas if possible\n // For erc20s, we must check if the token allowance is sufficient\n const inputAmount = swapRoute.trade.inputAmount;\n\n if (\n inputAmount.currency.isNative ||\n (await this.checkTokenApproved(\n fromAddress,\n inputAmount,\n swapOptions,\n this.provider\n ))\n ) {\n log.info(\n 'Simulating with eth_estimateGas since token is native or approved.'\n );\n\n try {\n const swapRouteWithGasEstimate =\n await this.ethEstimateGasSimulator.ethEstimateGas(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n return swapRouteWithGasEstimate;\n } catch (err) {\n log.info({ err: err }, 'Error simulating using eth_estimateGas');\n // If it fails, we should still try to simulate using Tenderly\n // return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n }\n\n try {\n return await this.tenderlySimulator.simulateTransaction(\n fromAddress,\n swapOptions,\n swapRoute,\n providerConfig\n );\n } catch (err) {\n log.error({ err: err }, 'Failed to simulate via Tenderly');\n\n if (err instanceof Error && err.message.includes('timeout')) {\n metric.putMetric(\n 'TenderlySimulationTimeouts',\n 1,\n MetricLoggerUnit.Count\n );\n }\n return { ...swapRoute, simulationStatus: SimulationStatus.SystemDown };\n }\n }\n}\n\nexport class TenderlySimulator extends Simulator {\n private tenderlyBaseUrl: string;\n private tenderlyUser: string;\n private tenderlyProject: string;\n private tenderlyAccessKey: string;\n private tenderlyNodeApiKey: string;\n private v2PoolProvider: IV2PoolProvider;\n private v3PoolProvider: IV3PoolProvider;\n private v4PoolProvider: IV4PoolProvider;\n private overrideEstimateMultiplier: { [chainId in ChainId]?: number };\n private tenderlyRequestTimeout?: number;\n private tenderlyNodeApiMigrationPercent?: number;\n private tenderlyNodeApiEnabledChains?: ChainId[] = [];\n\n constructor(\n chainId: ChainId,\n tenderlyBaseUrl: string,\n tenderlyUser: string,\n tenderlyProject: string,\n tenderlyAccessKey: string,\n tenderlyNodeApiKey: string,\n v2PoolProvider: IV2PoolProvider,\n v3PoolProvider: IV3PoolProvider,\n v4PoolProvider: IV4PoolProvider,\n provider: JsonRpcProvider,\n portionProvider: IPortionProvider,\n overrideEstimateMultiplier?: { [chainId in ChainId]?: number },\n tenderlyRequestTimeout?: number,\n tenderlyNodeApiMigrationPercent?: number,\n tenderlyNodeApiEnabledChains?: ChainId[]\n ) {\n super(provider, portionProvider, chainId);\n this.tenderlyBaseUrl = tenderlyBaseUrl;\n this.tenderlyUser = tenderlyUser;\n this.tenderlyProject = tenderlyProject;\n this.tenderlyAccessKey = tenderlyAccessKey;\n this.tenderlyNodeApiKey = tenderlyNodeApiKey;\n this.v2PoolProvider = v2PoolProvider;\n this.v3PoolProvider = v3PoolProvider;\n this.v4PoolProvider = v4PoolProvider;\n this.overrideEstimateMultiplier = overrideEstimateMultiplier ?? {};\n this.tenderlyRequestTimeout = tenderlyRequestTimeout;\n this.tenderlyNodeApiMigrationPercent = tenderlyNodeApiMigrationPercent;\n this.tenderlyNodeApiEnabledChains = tenderlyNodeApiEnabledChains;\n }\n\n public async simulateTransaction(\n fromAddress: string,\n swapOptions: SwapOptions,\n swapRoute: SwapRoute,\n providerConfig?: GasModelProviderConfig\n ): Promise<SwapRoute> {\n const currencyIn = swapRoute.trade.inputAmount.currency;\n const tokenIn = currencyIn.wrapped;\n const currencyOut = swapRoute.trade.outputAmount.currency;\n const tokenOut = currencyOut.wrapped;\n const chainId = this.chainId;\n\n if (TENDERLY_NOT_SUPPORTED_CHAINS.includes(chainId)) {\n const msg = `${TENDERLY_NOT_SUPPORTED_CHAINS.toString()} not supported by Tenderly!`;\n log.info(msg);\n return { ...swapRoute, simulationStatus: SimulationStatus.NotSupported };\n }\n\n if (!swapRoute.methodParameters) {\n const msg = 'No calldata provided to simulate transaction';\n log.info(msg);\n throw new Error(msg);\n }\n\n const { calldata } = swapRoute.methodParameters;\n\n log.info(\n {\n calldata: swapRoute.methodParameters.calldata,\n fromAddress: fromAddress,\n chainId: chainId,\n tokenInAddress: tokenIn.address,\n router: swapOptions.type,\n },\n 'Simulating transaction on Tenderly'\n );\n\n const blockNumber = await providerConfig?.blockNumber;\n let estimatedGasUsed: BigNumber;\n const estimateMultiplier =\n this.overrideEstimateMultiplier[chainId] ?? DEFAULT_ESTIMATE_MULTIPLIER;\n\n if (swapOptions.type == SwapType.UNIVERSAL_ROUTER) {\n // simulating from beacon chain deposit address that should always hold **enough balance**\n if (currencyIn.isNative && this.chainId == ChainId.MAINNET) {\n fromAddress = BEACON_CHAIN_DEPOSIT_ADDRESS;\n }\n // Do initial onboarding approval of Permit2.\n const erc20Interface = Erc20__factory.createInterface();\n const approvePermit2Calldata = erc20Interface.encodeFunctionData(\n 'approve',\n [permit2Address(this.chainId), MaxUint256]\n );\n\n // We are unsure if the users calldata contains a permit or not. We just\n // max approve the Universal Router from Permit2 instead, which will cover both cases.\n const permit2Interface = Permit2__factory.createInterface();\n const approveUniversalRouterCallData =\n permit2Interface.encodeFunctionData('approve', [\n tokenIn.address,\n UNIVERSAL_ROUTER_ADDRESS(swapOptions.version, this.chainId),\n MAX_UINT160,\n Math.floor(new Date().getTime() / 1000) + 10000000,\n ]);\n\n const approvePermit2: TenderlySimulationRequest = {\n network_id: chainId,\n estimate_gas: true,\n input: approvePermit2Calldata,\n to: tokenIn.address,\n value: '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const approveUniversalRouter: TenderlySimulationRequest = {\n network_id: chainId,\n estimate_gas: true,\n input: approveUniversalRouterCallData,\n to: permit2Address(this.chainId),\n value: '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const swap: TenderlySimulationRequest = {\n network_id: chainId,\n input: calldata,\n estimate_gas: true,\n to: UNIVERSAL_ROUTER_ADDRESS(swapOptions.version, this.chainId),\n value: currencyIn.isNative ? swapRoute.methodParameters.value : '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n save_if_fails: providerConfig?.saveTenderlySimulationIfFailed,\n };\n\n const body: TenderlySimulationBody = {\n simulations: [approvePermit2, approveUniversalRouter, swap],\n estimate_gas: true,\n };\n const opts: AxiosRequestConfig = {\n headers: {\n 'X-Access-Key': this.tenderlyAccessKey,\n },\n timeout: this.tenderlyRequestTimeout,\n };\n const url = TENDERLY_BATCH_SIMULATE_API(\n this.tenderlyBaseUrl,\n this.tenderlyUser,\n this.tenderlyProject\n );\n\n metric.putMetric(\n 'TenderlySimulationUniversalRouterRequests',\n 1,\n MetricLoggerUnit.Count\n );\n\n const before = Date.now();\n\n if (\n Math.random() * 100 < (this.tenderlyNodeApiMigrationPercent ?? 0) &&\n (this.tenderlyNodeApiEnabledChains ?? []).find(\n (chainId) => chainId === this.chainId\n )\n ) {\n const { data: resp, status: httpStatus } =\n await this.requestNodeSimulation(\n approvePermit2,\n approveUniversalRouter,\n swap\n );\n // We will maintain the original metrics TenderlySimulationUniversalRouterLatencies and TenderlySimulationUniversalRouterResponseStatus\n // so that they don't provide the existing tenderly dashboard as well as simulation alerts\n // In the meanwhile, we also add tenderly node metrics to distinguish from the tenderly api metrics\n // Once we migrate to node endpoint 100%, original metrics TenderlySimulationUniversalRouterLatencies and TenderlySimulationUniversalRouterResponseStatus\n // will work as is\n metric.putMetric(\n 'TenderlySimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyNodeSimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n `TenderlySimulationUniversalRouterResponseStatus${httpStatus}`,\n 1,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `TenderlyNodeSimulationUniversalRouterResponseStatus${httpStatus}`,\n 1,\n MetricLoggerUnit.Count\n );\n // technically, we can also early return SimulationStatus.SystemDown when http status is not 200.\n // in reality, when tenderly is down for whatever reason, i see it always throw during axios http request\n // so that it hits the catch block in https://github.com/Uniswap/smart-order-router/blob/8bfec299001d3204483f761f57a38be04512a948/src/providers/tenderly-simulation-provider.ts#L226\n // which is where we want to actually return SimulationStatus.SystemDown\n // in other words, I've never see a TenderlySimulationUniversalRouterResponseStatus metric with a non-200 status\n // if there's downtime, it won't log metric at https://github.com/Uniswap/smart-order-router/blob/8bfec299001d3204483f761f57a38be04512a948/src/providers/tenderly-simulation-provider.ts#L434\n\n // Validate tenderly response body\n if (\n !resp ||\n !resp.result ||\n resp.result.length < 3 ||\n (resp.result[2] as JsonRpcError).error\n ) {\n log.error(\n { resp },\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}.`\n );\n\n if (\n resp &&\n resp.result &&\n resp.result.length >= 3 &&\n (resp.result[2] as JsonRpcError).error &&\n (resp.result[2] as JsonRpcError).error.data\n ) {\n return {\n ...swapRoute,\n simulationStatus: breakDownTenderlySimulationError(\n tokenIn,\n tokenOut,\n (resp.result[2] as JsonRpcError).error.data\n ),\n };\n }\n\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n Number((resp.result[2] as GasBody).gas) * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approvePermit2GasUsed: (resp.result[0] as GasBody).gasUsed,\n approveUniversalRouterGasUsed: (resp.result[1] as GasBody).gasUsed,\n swapGasUsed: (resp.result[2] as GasBody).gasUsed,\n approvePermit2Gas: (resp.result[0] as GasBody).gas,\n approveUniversalRouterGas: (resp.result[1] as GasBody).gas,\n swapGas: (resp.result[2] as GasBody).gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approvals + Swap via Tenderly node endpoint for Universal Router. Gas used.'\n );\n } else {\n const resp = (\n await axios.post<TenderlyResponseUniversalRouter>(url, body, opts)\n ).data;\n\n metric.putMetric(\n 'TenderlySimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyApiSimulationUniversalRouterLatencies',\n Date.now() - before,\n MetricLoggerUnit.Milliseconds\n );\n\n // Validate tenderly response body\n if (\n !resp ||\n resp.simulation_results.length < 3 ||\n !resp.simulation_results[2].transaction ||\n resp.simulation_results[2].transaction.error_message\n ) {\n this.logTenderlyErrorResponse(resp);\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n resp.simulation_results[2].transaction.gas * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approvePermit2GasUsed:\n resp.simulation_results[0].transaction.gas_used,\n approveUniversalRouterGasUsed:\n resp.simulation_results[1].transaction.gas_used,\n swapGasUsed: resp.simulation_results[2].transaction.gas_used,\n approvePermit2Gas: resp.simulation_results[0].transaction.gas,\n approveUniversalRouterGas:\n resp.simulation_results[1].transaction.gas,\n swapGas: resp.simulation_results[2].transaction.gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approvals + Swap via Tenderly Api endpoint for Universal Router. Gas used.'\n );\n\n log.info(\n {\n body,\n swapSimulation: resp.simulation_results[2].simulation,\n swapTransaction: resp.simulation_results[2].transaction,\n },\n 'Successful Tenderly Api endpoint Swap Simulation for Universal Router'\n );\n }\n } else if (swapOptions.type == SwapType.SWAP_ROUTER_02) {\n const approve: TenderlySimulationRequest = {\n network_id: chainId,\n input: APPROVE_TOKEN_FOR_TRANSFER,\n estimate_gas: true,\n to: tokenIn.address,\n value: '0',\n from: fromAddress,\n simulation_type: TenderlySimulationType.QUICK,\n };\n\n const swap: TenderlySimulationRequest = {\n network_id: chainId,\n input: calldata,\n to: SWAP_ROUTER_02_ADDRESSES(chainId),\n estimate_gas: true,\n value: currencyIn.isNative ? swapRoute.methodParameters.value : '0',\n from: fromAddress,\n block_number: blockNumber,\n simulation_type: TenderlySimulationType.QUICK,\n };\n\n const body = { simulations: [approve, swap] };\n const opts: AxiosRequestConfig = {\n headers: {\n 'X-Access-Key': this.tenderlyAccessKey,\n },\n timeout: this.tenderlyRequestTimeout,\n };\n\n const url = TENDERLY_BATCH_SIMULATE_API(\n this.tenderlyBaseUrl,\n this.tenderlyUser,\n this.tenderlyProject\n );\n\n metric.putMetric(\n 'TenderlySimulationSwapRouter02Requests',\n 1,\n MetricLoggerUnit.Count\n );\n\n const before = Date.now();\n\n const resp = (\n await axios.post<TenderlyResponseSwapRouter02>(url, body, opts)\n ).data;\n\n const latencies = Date.now() - before;\n log.info(\n `Tenderly simulation swap router02 request body: ${body}, having latencies ${latencies} in milliseconds.`\n );\n metric.putMetric(\n 'TenderlySimulationSwapRouter02Latencies',\n latencies,\n MetricLoggerUnit.Milliseconds\n );\n\n // Validate tenderly response body\n if (\n !resp ||\n resp.simulation_results.length < 2 ||\n !resp.simulation_results[1].transaction ||\n resp.simulation_results[1].transaction.error_message\n ) {\n const msg = `Failed to Simulate Via Tenderly!: ${resp.simulation_results[1].transaction.error_message}`;\n log.info(\n { err: resp.simulation_results[1].transaction.error_message },\n msg\n );\n return { ...swapRoute, simulationStatus: SimulationStatus.Failed };\n }\n\n // Parse the gas used in the simulation response object, and then pad it so that we overestimate.\n estimatedGasUsed = BigNumber.from(\n (\n resp.simulation_results[1].transaction.gas * estimateMultiplier\n ).toFixed(0)\n );\n\n log.info(\n {\n body,\n approveGasUsed: resp.simulation_results[0].transaction.gas_used,\n swapGasUsed: resp.simulation_results[1].transaction.gas_used,\n approveGas: resp.simulation_results[0].transaction.gas,\n swapGas: resp.simulation_results[1].transaction.gas,\n swapWithMultiplier: estimatedGasUsed.toString(),\n },\n 'Successfully Simulated Approval + Swap via Tenderly for SwapRouter02. Gas used.'\n );\n\n log.info(\n {\n body,\n swapTransaction: resp.simulation_results[1].transaction,\n swapSimulation: resp.simulation_results[1].simulation,\n },\n 'Successful Tenderly Swap Simulation for SwapRouter02'\n );\n } else {\n throw new Error(`Unsupported swap type: ${swapOptions}`);\n }\n\n const {\n estimatedGasUsedUSD,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedGasToken,\n quoteGasAdjusted,\n } = await calculateGasUsed(\n chainId,\n swapRoute,\n estimatedGasUsed,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.provider,\n providerConfig\n );\n\n logGasEstimationVsSimulationMetrics(swapRoute, estimatedGasUsed, chainId);\n\n return {\n ...initSwapRouteFromExisting(\n swapRoute,\n this.v2PoolProvider,\n this.v3PoolProvider,\n this.v4PoolProvider,\n this.portionProvider,\n quoteGasAdjusted,\n estimatedGasUsed,\n estimatedGasUsedQuoteToken,\n estimatedGasUsedUSD,\n swapOptions,\n estimatedGasUsedGasToken,\n providerConfig\n ),\n simulationStatus: SimulationStatus.Succeeded,\n };\n }\n\n private logTenderlyErrorResponse(resp: TenderlyResponseUniversalRouter) {\n log.info(\n {\n resp,\n },\n 'Failed to Simulate on Tenderly'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 1\n ? resp.simulation_results[0].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #1 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 1\n ? resp.simulation_results[0].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #1 Simulation'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 2\n ? resp.simulation_results[1].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #2 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 2\n ? resp.simulation_results[1].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #2 Simulation'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 3\n ? resp.simulation_results[2].transaction\n : {},\n },\n 'Failed to Simulate on Tenderly #3 Transaction'\n );\n log.info(\n {\n err:\n resp.simulation_results.length >= 3\n ? resp.simulation_results[2].simulation\n : {},\n },\n 'Failed to Simulate on Tenderly #3 Simulation'\n );\n }\n\n private async requestNodeSimulation(\n approvePermit2: TenderlySimulationRequest,\n approveUniversalRouter: TenderlySimulationRequest,\n swap: TenderlySimulationRequest\n ): Promise<{ data: any; status: number }> {\n const nodeEndpoint = TENDERLY_NODE_API(\n this.chainId,\n this.tenderlyNodeApiKey\n );\n // TODO: ROUTE-362 - Revisit tenderly node simulation hardcode latest block number\n // https://linear.app/uniswap/issue/ROUTE-362/revisit-tenderly-node-simulation-hardcode-latest-block-number\n const blockNumber = // swap.block_number\n // ? BigNumber.from(swap.block_number).toHexString().replace('0x0', '0x')\n 'latest';\n const body: TenderlyNodeEstimateGasBundleBody = {\n id: 1,\n jsonrpc: '2.0',\n method: 'tenderly_estimateGasBundle',\n params: [\n [\n {\n from: approvePermit2.from,\n to: approvePermit2.to,\n data: approvePermit2.input,\n },\n {\n from: approveUniversalRouter.from,\n to: approveUniversalRouter.to,\n data: approveUniversalRouter.input,\n },\n { from: swap.from, to: swap.to, data: swap.input },\n ],\n blockNumber,\n ],\n };\n\n const opts: AxiosRequestConfig = {\n timeout: this.tenderlyRequestTimeout,\n };\n\n const before = Date.now();\n\n try {\n // For now, we don't timeout tenderly node endpoint, but we should before we live switch to node endpoint\n const { data: resp, status: httpStatus } = (\n await axios.post<TenderlyResponseSwapRouter02>(nodeEndpoint, body, opts)\n );\n\n const latencies = Date.now() - before;\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleLatencies',\n latencies,\n MetricLoggerUnit.Milliseconds\n );\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n if (httpStatus !== 200) {\n log.error(\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}. HTTP Status: ${httpStatus}`,\n { resp }\n );\n return { data: resp.simulation_results[1], status: httpStatus };\n }\n\n return { data: resp.simulation_results[1], status: httpStatus };\n } catch (err) {\n log.error(\n { err },\n `Failed to invoke Tenderly Node Endpoint for gas estimation bundle ${JSON.stringify(\n body,\n null,\n 2\n )}. Error: ${err}`\n );\n\n metric.putMetric(\n 'TenderlyNodeGasEstimateBundleFailure',\n 1,\n MetricLoggerUnit.Count\n );\n\n // we will have to re-throw the error, so that simulation-provider can catch the error, and return simulation status = failed\n throw err;\n }\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-fee-fetcher.js","sourceRoot":"","sources":["../../../src/providers/token-fee-fetcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { BaseProvider } from '@ethersproject/providers';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport { TokenFeeDetector__factory } from '../types/other/factories/TokenFeeDetector__factory';\nimport { TokenFeeDetector } from '../types/other/TokenFeeDetector';\nimport {\n log,\n metric,\n MetricLoggerUnit,\n WRAPPED_NATIVE_CURRENCY,\n} from '../util';\n\nimport { ProviderConfig } from './provider';\n\nconst DEFAULT_TOKEN_BUY_FEE_BPS = BigNumber.from(0);\nconst DEFAULT_TOKEN_SELL_FEE_BPS = BigNumber.from(0);\n\n// on detector failure, assume no fee\nexport const DEFAULT_TOKEN_FEE_RESULT = {\n buyFeeBps: DEFAULT_TOKEN_BUY_FEE_BPS,\n sellFeeBps: DEFAULT_TOKEN_SELL_FEE_BPS,\n};\n\ntype Address = string;\n\nexport type TokenFeeResult = {\n buyFeeBps?: BigNumber;\n sellFeeBps?: BigNumber;\n feeTakenOnTransfer?: boolean;\n externalTransferFailed?: boolean;\n sellReverted?: boolean;\n};\nexport type TokenFeeMap = Record<Address, TokenFeeResult>;\n\n// address at which the FeeDetector lens is deployed\nconst FEE_DETECTOR_ADDRESS = (chainId: ChainId) => {\n switch (chainId) {\n case ChainId.MAINNET:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.OPTIMISM:\n return '0x95aDC98A949dCD94645A8cD56830D86e4Cf34Eff';\n case ChainId.BNB:\n return '0xCF6220e4496B091a6b391D48e770f1FbaC63E740';\n case ChainId.POLYGON:\n return '0xC988e19819a63C0e487c6Ad8d6668Ac773923BF2';\n case ChainId.BASE:\n return '0xCF6220e4496B091a6b391D48e770f1FbaC63E740';\n case ChainId.ARBITRUM_ONE:\n return '0x37324D81e318260DC4f0fCb68035028eFdE6F50e';\n case ChainId.CELO:\n return '0x8eEa35913DdeD795001562f9bA5b282d3ac04B60';\n case ChainId.AVALANCHE:\n return '0x8269d47c4910B8c87789aA0eC128C11A8614dfC8';\n case ChainId.WORLDCHAIN:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.UNICHAIN_SEPOLIA:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.UNICHAIN:\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n case ChainId.SONEIUM:\n return '0x7A5299822b2cD9aC9A9f67756Aa2d62140e9A66f';\n default:\n // just default to mainnet contract\n return '0xbc708B192552e19A088b4C4B8772aEeA83bCf760';\n }\n};\n\n// Amount has to be big enough to avoid rounding errors, but small enough that\n// most v2 pools will have at least this many token units\n// 100000 is the smallest number that avoids rounding errors in bps terms\n// 10000 was not sufficient due to rounding errors for rebase token (e.g. stETH)\nconst AMOUNT_TO_FLASH_BORROW = '100000';\n// 1M gas limit per validate call, should cover most swap cases\nconst GAS_LIMIT_PER_VALIDATE = 1_000_000;\n\nexport interface ITokenFeeFetcher {\n fetchFees(\n addresses: Address[],\n providerConfig?: ProviderConfig\n ): Promise<TokenFeeMap>;\n}\n\nexport class OnChainTokenFeeFetcher implements ITokenFeeFetcher {\n private BASE_TOKEN: string;\n private readonly contract: TokenFeeDetector;\n\n constructor(\n private chainId: ChainId,\n rpcProvider: BaseProvider,\n private tokenFeeAddress = FEE_DETECTOR_ADDRESS(chainId),\n private gasLimitPerCall = GAS_LIMIT_PER_VALIDATE,\n private amountToFlashBorrow = AMOUNT_TO_FLASH_BORROW\n ) {\n this.BASE_TOKEN = WRAPPED_NATIVE_CURRENCY[this.chainId]?.address;\n this.contract = TokenFeeDetector__factory.connect(\n this.tokenFeeAddress,\n rpcProvider\n );\n }\n\n public async fetchFees(\n addresses: Address[],\n providerConfig?: ProviderConfig\n ): Promise<TokenFeeMap> {\n const tokenToResult: TokenFeeMap = {};\n\n const addressesWithoutBaseToken = addresses.filter(\n (address) => address.toLowerCase() !== this.BASE_TOKEN.toLowerCase()\n );\n const functionParams = addressesWithoutBaseToken.map((address) => [\n address,\n this.BASE_TOKEN,\n this.amountToFlashBorrow,\n ]) as [string, string, string][];\n\n const results = await Promise.all(\n functionParams.map(async ([address, baseToken, amountToBorrow]) => {\n try {\n // We use the validate function instead of batchValidate to avoid poison pill problem.\n // One token that consumes too much gas could cause the entire batch to fail.\n const feeResult = await this.contract.callStatic.validate(\n address,\n baseToken,\n amountToBorrow,\n {\n gasLimit: this.gasLimitPerCall,\n blockTag: providerConfig?.blockNumber,\n }\n );\n\n metric.putMetric(\n 'TokenFeeFetcherFetchFeesSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n return { address, ...feeResult };\n } catch (err) {\n log.error(\n { err },\n `Error calling validate on-chain for token ${address}`\n );\n\n metric.putMetric(\n 'TokenFeeFetcherFetchFeesFailure',\n 1,\n MetricLoggerUnit.Count\n );\n\n // in case of FOT token fee fetch failure, we return null\n // so that they won't get returned from the token-fee-fetcher\n // and thus no fee will be applied, and the cache won't cache on FOT tokens with failed fee fetching\n return {\n address,\n buyFeeBps: undefined,\n sellFeeBps: undefined,\n feeTakenOnTransfer: false,\n externalTransferFailed: false,\n sellReverted: false,\n };\n }\n })\n );\n\n results.forEach(\n ({\n address,\n buyFeeBps,\n sellFeeBps,\n feeTakenOnTransfer,\n externalTransferFailed,\n sellReverted,\n }) => {\n if (buyFeeBps || sellFeeBps) {\n tokenToResult[address] = {\n buyFeeBps,\n sellFeeBps,\n feeTakenOnTransfer,\n externalTransferFailed,\n sellReverted,\n };\n }\n }\n );\n\n return tokenToResult;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-properties-provider.js","sourceRoot":"","sources":["../../../src/providers/token-properties-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Currency } from '@fewprotocol/sdk-core';\n\nimport { getAddressLowerCase, log, metric, MetricLoggerUnit } from '../util';\n\nimport { ICache } from './cache';\nimport { ProviderConfig } from './provider';\nimport {\n DEFAULT_TOKEN_FEE_RESULT,\n ITokenFeeFetcher,\n TokenFeeMap,\n TokenFeeResult,\n} from './token-fee-fetcher';\nimport {\n DEFAULT_ALLOWLIST,\n TokenValidationResult,\n} from './token-validator-provider';\n\nexport const DEFAULT_TOKEN_PROPERTIES_RESULT: TokenPropertiesResult = {\n tokenFeeResult: DEFAULT_TOKEN_FEE_RESULT,\n};\nexport const POSITIVE_CACHE_ENTRY_TTL = 1200; // 20 minutes in seconds\nexport const NEGATIVE_CACHE_ENTRY_TTL = 1200; // 20 minutes in seconds\n\ntype Address = string;\nexport type TokenPropertiesResult = {\n tokenFeeResult?: TokenFeeResult;\n tokenValidationResult?: TokenValidationResult;\n};\nexport type TokenPropertiesMap = Record<Address, TokenPropertiesResult>;\n\nexport interface ITokenPropertiesProvider {\n getTokensProperties(\n currencies: Currency[],\n providerConfig?: ProviderConfig\n ): Promise<TokenPropertiesMap>;\n}\n\nexport class TokenPropertiesProvider implements ITokenPropertiesProvider {\n private CACHE_KEY = (chainId: ChainId, address: string) =>\n `token-properties-${chainId}-${address}`;\n\n constructor(\n private chainId: ChainId,\n private tokenPropertiesCache: ICache<TokenPropertiesResult>,\n private tokenFeeFetcher: ITokenFeeFetcher,\n private allowList = DEFAULT_ALLOWLIST,\n private positiveCacheEntryTTL = POSITIVE_CACHE_ENTRY_TTL,\n private negativeCacheEntryTTL = NEGATIVE_CACHE_ENTRY_TTL\n ) {}\n\n public async getTokensProperties(\n currencies: Currency[],\n providerConfig?: ProviderConfig\n ): Promise<TokenPropertiesMap> {\n const tokenToResult: TokenPropertiesMap = {};\n\n if (!providerConfig?.enableFeeOnTransferFeeFetching) {\n return tokenToResult;\n }\n\n const addressesToFetchFeesOnchain: string[] = [];\n const addressesRaw = this.buildAddressesRaw(currencies);\n const addressesCacheKeys = this.buildAddressesCacheKeys(currencies);\n\n const tokenProperties = await this.tokenPropertiesCache.batchGet(\n addressesCacheKeys\n );\n\n // Check if we have cached token validation results for any tokens.\n for (const address of addressesRaw) {\n const cachedValue =\n tokenProperties[this.CACHE_KEY(this.chainId, address.toLowerCase())];\n if (cachedValue) {\n metric.putMetric(\n 'TokenPropertiesProviderBatchGetCacheHit',\n 1,\n MetricLoggerUnit.Count\n );\n const tokenFee = cachedValue.tokenFeeResult;\n const tokenFeeResultExists: BigNumber | undefined =\n tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps);\n\n if (tokenFeeResultExists) {\n metric.putMetric(\n `TokenPropertiesProviderCacheHitTokenFeeResultExists${tokenFeeResultExists}`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n metric.putMetric(\n `TokenPropertiesProviderCacheHitTokenFeeResultNotExists`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n tokenToResult[address] = cachedValue;\n } else if (this.allowList.has(address)) {\n tokenToResult[address] = {\n tokenValidationResult: TokenValidationResult.UNKN,\n };\n } else {\n addressesToFetchFeesOnchain.push(address);\n }\n }\n\n if (addressesToFetchFeesOnchain.length > 0) {\n let tokenFeeMap: TokenFeeMap = {};\n\n try {\n tokenFeeMap = await this.tokenFeeFetcher.fetchFees(\n addressesToFetchFeesOnchain,\n providerConfig\n );\n } catch (err) {\n log.error(\n { err },\n `Error fetching fees for tokens ${addressesToFetchFeesOnchain}`\n );\n }\n\n await Promise.all(\n addressesToFetchFeesOnchain.map((address) => {\n const tokenFee = tokenFeeMap[address];\n const tokenFeeResultExists: BigNumber | undefined =\n tokenFee && (tokenFee.buyFeeBps || tokenFee.sellFeeBps);\n\n if (tokenFeeResultExists) {\n // we will leverage the metric to log the token fee result, if it exists\n // the idea is that the token fee should not differ by too much across tokens,\n // so that we can accurately log the token fee for a particular quote request (without breaching metrics dimensionality limit)\n // in the form of metrics.\n // if we log as logging, given prod traffic volume, the logging volume will be high.\n metric.putMetric(\n `TokenPropertiesProviderTokenFeeResultCacheMissExists${tokenFeeResultExists}`,\n 1,\n MetricLoggerUnit.Count\n );\n\n const tokenPropertiesResult = {\n tokenFeeResult: tokenFee,\n tokenValidationResult: TokenValidationResult.FOT,\n };\n tokenToResult[address] = tokenPropertiesResult;\n\n metric.putMetric(\n 'TokenPropertiesProviderBatchGetCacheMiss',\n 1,\n MetricLoggerUnit.Count\n );\n\n // update cache concurrently\n // at this point, we are confident that the tokens are FOT, so we can hardcode the validation result\n return this.tokenPropertiesCache.set(\n this.CACHE_KEY(this.chainId, address),\n tokenPropertiesResult,\n this.positiveCacheEntryTTL\n );\n } else {\n metric.putMetric(\n `TokenPropertiesProviderTokenFeeResultCacheMissNotExists`,\n 1,\n MetricLoggerUnit.Count\n );\n\n const tokenPropertiesResult = {\n tokenFeeResult: undefined,\n tokenValidationResult: undefined,\n };\n tokenToResult[address] = tokenPropertiesResult;\n\n return this.tokenPropertiesCache.set(\n this.CACHE_KEY(this.chainId, address),\n tokenPropertiesResult,\n this.negativeCacheEntryTTL\n );\n }\n })\n );\n }\n\n return tokenToResult;\n }\n\n private buildAddressesRaw(currencies: Currency[]): Set<string> {\n const addressesRaw = new Set<string>();\n\n for (const currency of currencies) {\n const address = getAddressLowerCase(currency);\n if (!addressesRaw.has(address)) {\n addressesRaw.add(address);\n }\n }\n\n return addressesRaw;\n }\n\n private buildAddressesCacheKeys(currencies: Currency[]): Set<string> {\n const addressesCacheKeys = new Set<string>();\n\n for (const currency of currencies) {\n const addressCacheKey = this.CACHE_KEY(\n this.chainId,\n getAddressLowerCase(currency)\n );\n if (!addressesCacheKeys.has(addressCacheKey)) {\n addressesCacheKeys.add(addressCacheKey);\n }\n }\n\n return addressesCacheKeys;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-provider.js","sourceRoot":"","sources":["../../../src/providers/token-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { Interface } from '@ethersproject/abi';\nimport { BigNumber } from '@ethersproject/bignumber';\nimport { parseBytes32String } from '@ethersproject/strings';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { IERC20Metadata__factory } from '../types/v3/factories/IERC20Metadata__factory';\nimport { log, WRAPPED_NATIVE_CURRENCY } from '../util';\n\nimport { IMulticallProvider, Result } from './multicall-provider';\nimport { ProviderConfig } from './provider';\n\n/**\n * Provider for getting token data.\n *\n * @export\n * @interface ITokenProvider\n */\nexport interface ITokenProvider {\n /**\n * Gets the token at each address. Any addresses that are not valid ERC-20 are ignored.\n *\n * @param addresses The token addresses to get.\n * @param [providerConfig] The provider config.\n * @returns A token accessor with methods for accessing the tokens.\n */\n getTokens(\n addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<TokenAccessor>;\n}\n\nexport type TokenAccessor = {\n getTokenByAddress(address: string): Token | undefined;\n getTokenBySymbol(symbol: string): Token | undefined;\n getAllTokens: () => Token[];\n};\n\n// Some well known tokens on each chain for seeding cache / testing.\nexport const USDT_HYPER_MAINNET = new Token(\n ChainId.HYPER_MAINNET,\n '0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb',\n 6,\n 'USDT',\n 'Tether USD'\n);\n\nexport const FEW_USDT_HYPER_MAINNET = new Token(\n ChainId.HYPER_MAINNET,\n '0x7576dd9a2775bFd789616d9eA7A2af21d06782D0',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport const USDC_MAINNET = new Token(\n ChainId.MAINNET,\n '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_MAINNET = new Token(\n ChainId.MAINNET,\n '0xdAC17F958D2ee523a2206206994597C13D831ec7',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x6B175474E89094C44Da98b954EedeAC495271d0F',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const AMPL_MAINNET = new Token(\n ChainId.MAINNET,\n '0xD46bA6D942050d489DBd938a2C909A5d5039A161',\n 9,\n 'AMPL',\n 'AMPL'\n);\nexport const FEI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x956F47F50A910163D8BF957Cf5846D573E7f87CA',\n 18,\n 'FEI',\n 'Fei USD'\n);\nexport const UNI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x1f9840a85d5af5bf1d1762f925bdaddc4201f984',\n 18,\n 'UNI',\n 'Uniswap'\n);\n\nexport const AAVE_MAINNET = new Token(\n ChainId.MAINNET,\n '0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9',\n 18,\n 'AAVE',\n 'Aave Token'\n);\n\nexport const LIDO_MAINNET = new Token(\n ChainId.MAINNET,\n '0x5A98FcBEA516Cf06857215779Fd812CA3beF1B32',\n 18,\n 'LDO',\n 'Lido DAO Token'\n);\n\nexport const WSTETH_MAINNET = new Token(\n ChainId.MAINNET,\n '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0',\n 18,\n 'wstETH',\n 'Wrapped liquid staked Ether'\n);\n\nexport const USDC_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0xA7a151d60Bbd522d3611C2dB3F1F972Ee9904B3e',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_NATIVE_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x1c7d4b196cb0c7b01d743fbc6116a902379c7238',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const DAI_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x7AF17A48a6336F7dc1beF9D485139f7B6f4FB5C8',\n 18,\n 'DAI',\n 'DAI Token'\n);\nexport const USDC_GOERLI = new Token(\n ChainId.GOERLI,\n '0x07865c6e87b9f70255377e024ace6630c1eaa37f',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_GOERLI = new Token(\n ChainId.GOERLI,\n '0xe583769738b6dd4e7caf8451050d1948be717679',\n 18,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_GOERLI = new Token(\n ChainId.GOERLI,\n '0xa0a5ad2296b38bd3e3eb59aaeaf1589e8d9a29a9',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_GOERLI = new Token(\n ChainId.GOERLI,\n '0x11fe4b6ae13d2a6055c8d9cf65c55bac32b5d844',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const UNI_GOERLI = new Token(\n ChainId.GOERLI,\n '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984',\n 18,\n 'UNI',\n 'Uni token'\n);\n\nexport const USDC_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x7F5c764cBc14f9669B88837ca1490cCa17c31607',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x94b008aA00579c1307B0EF2c499aD98a8ce58e58',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x68f180fcCe6836688e9084f035309E29Bf0A2095',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\nexport const OP_OPTIMISM = new Token(\n ChainId.OPTIMISM,\n '0x4200000000000000000000000000000000000042',\n 18,\n 'OP',\n 'Optimism'\n);\n\nexport const USDC_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0x7E07E15D2a87A24492740D16f5bdF58c16db0c4E',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0x853eb4bA5D0Ba2B77a0A5329Fd2110d5CE149ECE',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0xe0a592353e81a94Db6E3226fD4A99F881751776a',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM_GOERLI = new Token(\n ChainId.OPTIMISM_GOERLI,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0x7E07E15D2a87A24492740D16f5bdF58c16db0c4E',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0x853eb4bA5D0Ba2B77a0A5329Fd2110d5CE149ECE',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0xe0a592353e81a94Db6E3226fD4A99F881751776a',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_OPTIMISM_SEPOLIA = new Token(\n ChainId.OPTIMISM_SEPOLIA,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n 6,\n 'USDC',\n 'USD//C'\n);\nexport const USDT_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const WBTC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const DAI_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const ARB_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x912CE59144191C1204E64559FE8253a0e49E6548',\n 18,\n 'ARB',\n 'Arbitrum'\n);\n\nexport const DAI_ARBITRUM_GOERLI = new Token(\n ChainId.ARBITRUM_GOERLI,\n '0x0000000000000000000000000000000000000000', // TODO: add address\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const DAI_ARBITRUM_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0xc3826E277485c33F3D99C9e0CBbf8449513210EE',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\n// Bridged version of official Goerli USDC\nexport const USDC_ARBITRUM_GOERLI = new Token(\n ChainId.ARBITRUM_GOERLI,\n '0x8FB1E3fC51F3b789dED7557E680551d93Ea9d892',\n 6,\n 'USDC',\n 'USD//C'\n);\n\n// Bridged version of official Sepolia USDC\nexport const USDC_ARBITRUM_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',\n 6,\n 'USDC',\n 'USD//C'\n);\n\n//polygon tokens\nexport const WMATIC_POLYGON = new Token(\n ChainId.POLYGON,\n '0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270',\n 18,\n 'WMATIC',\n 'Wrapped MATIC'\n);\n\nexport const WETH_POLYGON = new Token(\n ChainId.POLYGON,\n '0x7ceb23fd6bc0add59e62ac25578270cff1b9f619',\n 18,\n 'WETH',\n 'Wrapped Ether'\n);\n\nexport const USDC_POLYGON = new Token(\n ChainId.POLYGON,\n '0x2791bca1f2de4661ed88a30c99a7a9449aa84174',\n 6,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_POLYGON = new Token(\n ChainId.POLYGON,\n '0x3c499c542cef5e3811e1192ce70d8cc03d5c3359',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const DAI_POLYGON = new Token(\n ChainId.POLYGON,\n '0x8f3Cf7ad23Cd3CaDbD9735AFf958023239c6A063',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const DAI_BASE_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0xE6F6e27c0BF1a4841E3F09d03D7D31Da8eAd0a27',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\n//polygon mumbai tokens\nexport const WMATIC_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0x9c3C9283D3e44854697Cd22D3Faa240Cfb032889',\n 18,\n 'WMATIC',\n 'Wrapped MATIC'\n);\n\nexport const USDC_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0xe11a86849d99f524cac3e7a0ec1241828e332c62',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const DAI_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0x001b3b4d0f3714ca98ba10f6042daebf0b1b7b6f',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const WETH_POLYGON_MUMBAI = new Token(\n ChainId.POLYGON_MUMBAI,\n '0xa6fa4fb5f76172d178d61b04b0ecd319c5d1c0aa',\n 18,\n 'WETH',\n 'Wrapped Ether'\n);\n\n// BNB chain Tokens\nexport const BTC_BNB = new Token(\n ChainId.BNB,\n '0x7130d2A12B9BCbFAe4f2634d864A1Ee1Ce3Ead9c',\n 18,\n 'BTCB',\n 'Binance BTC'\n);\n\nexport const BUSD_BNB = new Token(\n ChainId.BNB,\n '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56',\n 18,\n 'BUSD',\n 'BUSD'\n);\n\nexport const DAI_BNB = new Token(\n ChainId.BNB,\n '0x1AF3F329e8BE154074D8769D1FFa4eE058B1DBc3',\n 18,\n 'DAI',\n 'DAI'\n);\n\nexport const ETH_BNB = new Token(\n ChainId.BNB,\n '0x2170Ed0880ac9A755fd29B2688956BD959F933F8',\n 18,\n 'ETH',\n 'ETH'\n);\n\nexport const USDC_BNB = new Token(\n ChainId.BNB,\n '0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d',\n 18,\n 'USDC',\n 'USDC'\n);\n\nexport const USDT_BNB = new Token(\n ChainId.BNB,\n '0x55d398326f99059fF775485246999027B3197955',\n 18,\n 'USDT',\n 'USDT'\n);\n\n// Celo Tokens\nexport const CELO = new Token(\n ChainId.CELO,\n '0x471EcE3750Da237f93B8E339c536989b8978a438',\n 18,\n 'CELO',\n 'Celo native asset'\n);\n\nexport const DAI_CELO = new Token(\n ChainId.CELO,\n '0xE4fE50cdD716522A56204352f00AA110F731932d',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const CUSD_CELO = new Token(\n ChainId.CELO,\n '0x765DE816845861e75A25fCA122bb6898B8B1282a',\n 18,\n 'CUSD',\n 'Celo Dollar Stablecoin'\n);\nexport const USDC_CELO = new Token(\n ChainId.CELO,\n '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n 18,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_WORMHOLE_CELO = new Token(\n ChainId.CELO,\n '0x37f750B7cC259A2f741AF45294f6a16572CF5cAd',\n 18,\n 'USDC',\n 'USD//C.e'\n);\nexport const USDC_NATIVE_CELO = new Token(\n ChainId.CELO,\n '0x765DE816845861e75A25fCA122bb6898B8B1282a',\n 18,\n 'USDC',\n 'USD//C'\n);\n\nexport const CEUR_CELO = new Token(\n ChainId.CELO,\n '0xD8763CBa276a3738E6DE85b4b3bF5FDed6D6cA73',\n 18,\n 'CEUR',\n 'Celo Euro Stablecoin'\n);\n\n// Celo Alfajores Tokens\nexport const CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0xF194afDf50B03e69Bd7D057c1Aa9e10c9954E4C9',\n 18,\n 'CELO',\n 'Celo native asset'\n);\nexport const DAI_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x7d91E51C8F218f7140188A155f5C75388630B6a8',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const CUSD_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x874069Fa1Eb16D44d622F2e0Ca25eeA172369bC1',\n 18,\n 'CUSD',\n 'Celo Dollar Stablecoin'\n);\n\nexport const CEUR_CELO_ALFAJORES = new Token(\n ChainId.CELO_ALFAJORES,\n '0x10c892A6EC43a53E45D0B916B4b7D383B1b78C0F',\n 18,\n 'CEUR',\n 'Celo Euro Stablecoin'\n);\n\n// Avalanche Tokens\nexport const DAI_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xd586E7F844cEa2F87f50152665BCbc2C279D8d70',\n 18,\n 'DAI.e',\n 'DAI.e Token'\n);\n\nexport const USDC_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_BRIDGED_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664',\n 6,\n 'USDC',\n 'USDC Token'\n);\nexport const USDC_NATIVE_AVAX = new Token(\n ChainId.AVALANCHE,\n '0xb97ef9ef8734c71904d8002f8b6bc66dd9c48a6e',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\n// Base Tokens\nexport const USDC_BASE = new Token(\n ChainId.BASE,\n '0xd9aAEc86B65D86f6A7B5B1b0c42FFA531710b6CA',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\nexport const USDC_NATIVE_BASE = new Token(\n ChainId.BASE,\n '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\nexport const VIRTUAL_BASE = new Token(\n ChainId.BASE,\n '0x0b3e328455c4059EEb9e3f84b5543F74E24e7E1b',\n 18,\n 'VIRTUAL',\n 'Virtual Protocol'\n);\n\n// Base Goerli Tokens\nexport const USDC_BASE_GOERLI = new Token(\n ChainId.BASE_GOERLI,\n '0x853154e2A5604E5C74a2546E2871Ad44932eB92C',\n 6,\n 'USDbC',\n 'USD Base Coin'\n);\n\n// Gnosis Tokens\nexport const USDC_ETHEREUM_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0xddafbb505ad214d7b80b1f830fccc89b60fb7a83',\n 6,\n 'USDC',\n 'USDC from Ethereum on Gnosis'\n);\n\nexport const WXDAI_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',\n 18,\n 'WXDAI',\n 'Wrapped XDAI on Gnosis'\n);\n\nexport const WBTC_GNOSIS = new Token(\n ChainId.GNOSIS,\n '0x8e5bbbb09ed1ebde8674cda39a0c169401db4252',\n 8,\n 'WBTC',\n 'Wrapped BTC from Ethereum on Gnosis'\n);\n\n// Moonbeam Tokens\nexport const USDC_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b',\n 6,\n 'USDC',\n 'USD Coin bridged using Multichain'\n);\n\nexport const WGLMR_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0xAcc15dC74880C9944775448304B263D191c6077F',\n 18,\n 'WGLMR',\n 'Wrapped GLMR'\n);\n\nexport const DAI_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x818ec0A7Fe18Ff94269904fCED6AE3DaE6d6dC0b',\n 6,\n 'DAI',\n 'Dai on moonbeam bridged using Multichain'\n);\n\nexport const WBTC_MOONBEAM = new Token(\n ChainId.MOONBEAM,\n '0x922D641a426DcFFaeF11680e5358F34d97d112E1',\n 8,\n 'WBTC',\n 'Wrapped BTC bridged using Multichain'\n);\n\n// Blast Tokens\nexport const USDB_BLAST = new Token(\n ChainId.BLAST,\n '0x4300000000000000000000000000000000000003',\n 18,\n 'USDB',\n 'USD Blast'\n);\n\nexport const USDB_BLAST_SEPOLIA = new Token(\n ChainId.BLAST_SEPOLIA,\n '0x4200000000000000000000000000000000000022',\n 18,\n 'USDB',\n 'USD Blast'\n);\n\nexport const FEW_USDB_BLAST_SEPOLIA = new Token(\n ChainId.BLAST_SEPOLIA,\n '0x4D2c669Cf7DC804641Cd4Dec3CD73daB5575c3Da',\n 18,\n 'fwUSDB',\n 'Few Wrapped USDB'\n);\n\nexport const SUSD_STORY_ODYSSEY = new Token(\n ChainId.STORY_ODYSSEY,\n '0xC0F6E387aC0B324Ec18EAcf22EE7271207dCE3d5',\n 18,\n 'SUSD',\n 'Story USD'\n)\n\nexport const FEW_SUSD_STORY_ODYSSEY = new Token(\n ChainId.STORY_ODYSSEY,\n '0xb76452d2e299ee782b30D5EE5b50c7D3c7e6446B',\n 18,\n 'fwSUSD',\n 'Few Wrapped Story USD'\n);\n\nexport const USDC_STORY_MAINNET = new Token(\n ChainId.STORY_MAINNET,\n '0xF1815bd50389c46847f0Bda824eC8da914045D14',\n 6,\n 'USDC',\n 'USD//C'\n);\n\nexport const FEW_USDC_STORY_MAINNET = new Token(\n ChainId.STORY_MAINNET,\n '0x402dD950dD789E5C109363c9c6Fde21c847ab57e',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\n\nexport const USDC_ZORA = new Token(\n ChainId.ZORA,\n '0xCccCCccc7021b32EBb4e8C08314bD62F7c653EC4',\n 6,\n 'USDzC',\n 'USD Coin (Bridged from Ethereum)'\n);\n\nexport const USDC_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4',\n 6,\n 'USDC',\n 'USDC'\n);\n\nexport const USDCE_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x3355df6D4c9C3035724Fd0e3914dE96A5a83aaf4',\n 6,\n 'USDC.e',\n 'Bridged USDC (zkSync)'\n);\n\nexport const DAI_ZKSYNC = new Token(\n ChainId.ZKSYNC,\n '0x4B9eb6c0b6ea15176BBF62841C6B2A8a398cb656',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x79A02482A880bCE3F13e09Da970dC34db4CD24d1',\n 6,\n 'USDC.e',\n 'Bridged USDC (world-chain-mainnet)'\n);\n\nexport const USDT_MONAD_TESTNET = new Token(\n ChainId.MONAD_TESTNET,\n '0xfBC2D240A5eD44231AcA3A9e9066bc4b33f01149',\n 6,\n 'USDT',\n 'USDT'\n);\n\nexport const WLD_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x2cFc85d8E48F8EAB294be644d9E25C3030863003',\n 18,\n 'WLD',\n 'Worldcoin'\n);\n\nexport const WBTC_WORLDCHAIN = new Token(\n ChainId.WORLDCHAIN,\n '0x03C7054BCB39f7b2e5B2c7AcB37583e32D70Cfa3',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\n\nexport const USDC_UNICHAIN_SEPOLIA = new Token(\n ChainId.UNICHAIN_SEPOLIA,\n '0x31d0220469e10c4E71834a79b1f276d740d3768F',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\nexport const USDC_BASE_SEPOLIA = new Token(\n ChainId.BASE_SEPOLIA,\n '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n 6,\n 'USDC',\n 'USDC Token'\n);\n\nexport const USDC_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n // TODO: validate USDC address is final / validated\n '0x078D782b760474a361dDA0AF3839290b0EF57AD6',\n 6,\n 'USDC',\n 'USD Token'\n);\n\nexport const DAI_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n '0x20CAb320A855b39F724131C69424240519573f81',\n 18,\n 'DAI',\n 'Dai Stablecoin'\n);\n\nexport const USDC_SONEIUM = new Token(\n ChainId.SONEIUM,\n '0xbA9986D2381edf1DA03B0B9c1f8b00dc4AacC369',\n 6,\n 'USDCE',\n 'Soneium Bridged USDC Soneium'\n);\n\n\n// few token\nexport const FEW_USDC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x0492560fa7cfd6a85e50d8be3f77318994f8f429',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\n\nexport const FEW_USDT_MAINNET = new Token(\n ChainId.MAINNET,\n '0xef87f4608e601e8564800265aee1c1ffadf73283',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport const FEW_UNI_MAINNET = new Token(\n ChainId.MAINNET,\n '0xe8e1f50392bd61d0f8f48e8e7af51d3b8a52090a',\n 18,\n 'fwUNI',\n 'Few Wrapped Uniswap'\n);\n\nexport const FEW_WBTC_MAINNET = new Token(\n ChainId.MAINNET,\n '0x2078f336Fdd260f708BEc4a20c82b063274E1b23',\n 8,\n 'fwWBTC',\n 'Few Wrapped Wrapped BTC'\n);\nexport const FEW_RNG_MAINNET = new Token(\n ChainId.MAINNET,\n '0x647C31e149b71D90852Ca10a3bBC40931b55C959',\n 18,\n 'fwRNG',\n 'Few Wrapped Ring Exchange'\n);\nexport const FEW_DAI_MAINNET = new Token(\n ChainId.MAINNET,\n '0x8a6fe57c08c84e0f4ee97aae68a62e820a37d259',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\n\nexport const FEW_RNG_ARB_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0x9410675e251Cc4E6E42eF338085873a079d44634',\n 18,\n 'fwRNG',\n 'Few Wrapped Ring Exchange'\n);\n\nexport const FEW_USDC_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x76AC72683C5b7F22C6B5Ed85B5B1511702464F7e',\n 18,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_DAI_SEPOLIA = new Token(\n ChainId.SEPOLIA,\n '0x09D8486e42Aa76229a563bFa0f07CA301aCd29C9',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDC_UNICHAIN = new Token(\n ChainId.UNICHAIN,\n '0x88daE9d30E95C608c3FA3dAc26636Be59Ab2c488',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_USDT_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x49539A32510a4d1706eB1852Cc6a7Db6677dDc1b',\n 6,\n 'USDT',\n 'Tether USD'\n);\nexport const FEW_USDC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x21719B213646627698c8A5ADa5A6cf2Eb82C540a',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD Coin'\n);\nexport const FEW_DAI_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x925dc2b62CD41a6318cC481752279b0a6D02D1D4',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_WBTC_ARBITRUM = new Token(\n ChainId.ARBITRUM_ONE,\n '0x0c5EC8a8AE241091A5AcB8fFaA165895E0A9aEc7',\n 8,\n 'WBTC',\n 'Wrapped BTC'\n);\nexport const FEW_DAI_ARB_SEPOLIA = new Token(\n ChainId.ARBITRUM_SEPOLIA,\n '0xED43C9E67e04aD647563C53d4136f9F668402017',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDC_BASE = new Token(\n ChainId.BASE,\n '0x3f03d40b28c773649ab75ef6f4853e7f79dc9286',\n 6,\n 'fwUSDC',\n 'Few Wrapped USD Coin'\n);\nexport const FEW_DAI_BASE = new Token(\n ChainId.BASE,\n '0x8d9fd481ee2f5a1dd70ab5e4fc72715a293d62c3',\n 18,\n 'fwDAI',\n 'Few Wrapped Dai Stablecoin'\n);\nexport const FEW_USDT_BASE = new Token(\n ChainId.BASE,\n '0x6177eeccfbb3d4e0cc41b4e9de40a2daed236722',\n 6,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\nexport const FEW_USDB_BLAST = new Token(\n ChainId.BLAST,\n '0x866f2C06B83Df2ed7Ca9C2D044940E7CD55a06d6',\n 18,\n 'fwUSDB',\n 'Few Wrapped USDB'\n);\nexport const FEW_USDC_BNB = new Token(\n ChainId.BNB,\n '0xACD988Db88EF410ac0415bB2e47794C0C27B6B10',\n 18,\n 'fwUSDC',\n 'Few Wrapped USD//C'\n);\nexport const FEW_USDT_BNB = new Token(\n ChainId.BNB,\n '0x95b5aEfbcC9e6E462f21E0847e2d90b89b7Cd028',\n 18,\n 'fwUSDT',\n 'Few Wrapped Tether USD'\n);\n\nexport class TokenProvider implements ITokenProvider {\n constructor(\n private chainId: ChainId,\n protected multicall2Provider: IMulticallProvider\n ) { }\n\n private async getTokenSymbol(\n addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<{\n result: {\n blockNumber: BigNumber;\n results: Result<[string]>[];\n };\n isBytes32: boolean;\n }> {\n let result;\n let isBytes32 = false;\n\n try {\n result =\n await this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [string]\n >({\n addresses,\n contractInterface: IERC20Metadata__factory.createInterface(),\n functionName: 'symbol',\n providerConfig,\n });\n } catch (error) {\n log.error(\n { addresses },\n `TokenProvider.getTokenSymbol[string] failed with error ${error}. Trying with bytes32.`\n );\n\n const bytes32Interface = new Interface([\n {\n inputs: [],\n name: 'symbol',\n outputs: [\n {\n internalType: 'bytes32',\n name: '',\n type: 'bytes32',\n },\n ],\n stateMutability: 'view',\n type: 'function',\n },\n ]);\n\n try {\n result =\n await this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [string]\n >({\n addresses,\n contractInterface: bytes32Interface,\n functionName: 'symbol',\n providerConfig,\n });\n isBytes32 = true;\n } catch (error) {\n log.fatal(\n { addresses },\n `TokenProvider.getTokenSymbol[bytes32] failed with error ${error}.`\n );\n\n throw new Error(\n '[TokenProvider.getTokenSymbol] Impossible to fetch token symbol.'\n );\n }\n }\n\n return { result, isBytes32 };\n }\n\n private async getTokenDecimals(\n addresses: string[],\n providerConfig?: ProviderConfig\n ) {\n return this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n [number]\n >({\n addresses,\n contractInterface: IERC20Metadata__factory.createInterface(),\n functionName: 'decimals',\n providerConfig,\n });\n }\n\n public async getTokens(\n _addresses: string[],\n providerConfig?: ProviderConfig\n ): Promise<TokenAccessor> {\n const addressToToken: { [address: string]: Token } = {};\n const symbolToToken: { [symbol: string]: Token } = {};\n\n const addresses = _(_addresses)\n .map((address) => address.toLowerCase())\n .uniq()\n .value();\n\n if (addresses.length > 0) {\n const [symbolsResult, decimalsResult] = await Promise.all([\n this.getTokenSymbol(addresses, providerConfig),\n this.getTokenDecimals(addresses, providerConfig),\n ]);\n\n const isBytes32 = symbolsResult.isBytes32;\n const { results: symbols } = symbolsResult.result;\n const { results: decimals } = decimalsResult;\n\n for (let i = 0; i < addresses.length; i++) {\n const address = addresses[i]!;\n\n const symbolResult = symbols[i];\n const decimalResult = decimals[i];\n\n if (!symbolResult?.success || !decimalResult?.success) {\n log.info(\n {\n symbolResult,\n decimalResult,\n },\n `Dropping token with address ${address} as symbol or decimal are invalid`\n );\n continue;\n }\n\n let symbol;\n\n try {\n symbol = isBytes32\n ? parseBytes32String(symbolResult.result[0]!)\n : symbolResult.result[0]!;\n } catch (error) {\n if (\n error instanceof Error &&\n error.message.includes(\n 'invalid bytes32 string - no null terminator'\n )\n ) {\n log.error(\n {\n symbolResult,\n error,\n address,\n },\n `invalid bytes32 string - no null terminator`\n );\n }\n\n throw error;\n }\n const decimal = decimalResult.result[0]!;\n\n addressToToken[address.toLowerCase()] = new Token(\n this.chainId,\n address,\n decimal,\n symbol\n );\n symbolToToken[symbol.toLowerCase()] =\n addressToToken[address.toLowerCase()]!;\n }\n\n log.info(\n `Got token symbol and decimals for ${Object.values(addressToToken).length\n } out of ${addresses.length} tokens on-chain ${providerConfig ? `as of: ${providerConfig?.blockNumber}` : ''\n }`\n );\n }\n\n return {\n getTokenByAddress: (address: string): Token | undefined => {\n return addressToToken[address.toLowerCase()];\n },\n getTokenBySymbol: (symbol: string): Token | undefined => {\n return symbolToToken[symbol.toLowerCase()];\n },\n getAllTokens: (): Token[] => {\n return Object.values(addressToToken);\n },\n };\n }\n}\n\nexport const DAI_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return DAI_MAINNET;\n case ChainId.GOERLI:\n return DAI_GOERLI;\n case ChainId.SEPOLIA:\n return DAI_SEPOLIA;\n case ChainId.OPTIMISM:\n return DAI_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return DAI_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return DAI_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return DAI_ARBITRUM;\n case ChainId.ARBITRUM_GOERLI:\n return DAI_ARBITRUM_GOERLI;\n case ChainId.ARBITRUM_SEPOLIA:\n return DAI_ARBITRUM_SEPOLIA;\n case ChainId.POLYGON:\n return DAI_POLYGON;\n case ChainId.POLYGON_MUMBAI:\n return DAI_POLYGON_MUMBAI;\n case ChainId.CELO:\n return DAI_CELO;\n case ChainId.CELO_ALFAJORES:\n return DAI_CELO_ALFAJORES;\n case ChainId.MOONBEAM:\n return DAI_MOONBEAM;\n case ChainId.BNB:\n return DAI_BNB;\n case ChainId.AVALANCHE:\n return DAI_AVAX;\n case ChainId.ZKSYNC:\n return DAI_ZKSYNC;\n case ChainId.UNICHAIN:\n return DAI_UNICHAIN;\n case ChainId.BASE_SEPOLIA:\n return DAI_BASE_SEPOLIA;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const USDT_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return USDT_MAINNET;\n case ChainId.GOERLI:\n return USDT_GOERLI;\n case ChainId.OPTIMISM:\n return USDT_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return USDT_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return USDT_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return USDT_ARBITRUM;\n case ChainId.BNB:\n return USDT_BNB;\n case ChainId.MONAD_TESTNET:\n return USDT_MONAD_TESTNET;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const USDC_ON = (chainId: ChainId): Token => {\n switch (chainId) {\n case ChainId.MAINNET:\n return USDC_MAINNET;\n case ChainId.GOERLI:\n return USDC_GOERLI;\n case ChainId.SEPOLIA:\n return USDC_SEPOLIA;\n case ChainId.OPTIMISM:\n return USDC_OPTIMISM;\n case ChainId.OPTIMISM_GOERLI:\n return USDC_OPTIMISM_GOERLI;\n case ChainId.OPTIMISM_SEPOLIA:\n return USDC_OPTIMISM_SEPOLIA;\n case ChainId.ARBITRUM_ONE:\n return USDC_ARBITRUM;\n case ChainId.ARBITRUM_GOERLI:\n return USDC_ARBITRUM_GOERLI;\n case ChainId.ARBITRUM_SEPOLIA:\n return USDC_ARBITRUM_SEPOLIA;\n case ChainId.POLYGON:\n return USDC_POLYGON;\n case ChainId.POLYGON_MUMBAI:\n return USDC_POLYGON_MUMBAI;\n case ChainId.GNOSIS:\n return USDC_ETHEREUM_GNOSIS;\n case ChainId.MOONBEAM:\n return USDC_MOONBEAM;\n case ChainId.BNB:\n return USDC_BNB;\n case ChainId.AVALANCHE:\n return USDC_AVAX;\n case ChainId.BASE:\n return USDC_BASE;\n case ChainId.BASE_GOERLI:\n return USDC_BASE_GOERLI;\n case ChainId.ZORA:\n return USDC_ZORA;\n case ChainId.ZKSYNC:\n return USDCE_ZKSYNC;\n case ChainId.WORLDCHAIN:\n return USDC_WORLDCHAIN;\n case ChainId.UNICHAIN_SEPOLIA:\n return USDC_UNICHAIN_SEPOLIA;\n case ChainId.BASE_SEPOLIA:\n return USDC_BASE_SEPOLIA;\n case ChainId.UNICHAIN:\n return USDC_UNICHAIN;\n case ChainId.SONEIUM:\n return USDC_SONEIUM;\n default:\n throw new Error(`Chain id: ${chainId} not supported`);\n }\n};\n\nexport const WNATIVE_ON = (chainId: ChainId): Token => {\n return WRAPPED_NATIVE_CURRENCY[chainId];\n};\n\nexport const V4_SEPOLIA_TEST_A = new Token(\n ChainId.SEPOLIA,\n '0x0275C79896215a790dD57F436E1103D4179213be',\n 18,\n 'A',\n 'MockA'\n);\n\nexport const V4_SEPOLIA_TEST_B = new Token(\n ChainId.SEPOLIA,\n '0x1a6990c77cfbba398beb230dd918e28aab71eec2',\n 18,\n 'B',\n 'MockB'\n);\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-validator-provider.js","sourceRoot":"","sources":["../../../src/providers/token-validator-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport _ from 'lodash';\n\nimport { ITokenValidator__factory } from '../types/other/factories/ITokenValidator__factory';\nimport {\n log,\n metric,\n MetricLoggerUnit,\n WRAPPED_NATIVE_CURRENCY,\n} from '../util';\n\nimport { ICache } from './cache';\nimport { IMulticallProvider } from './multicall-provider';\nimport { ProviderConfig } from './provider';\n\nexport const DEFAULT_ALLOWLIST = new Set<string>([\n // RYOSHI. Does not allow transfers between contracts so fails validation.\n '0x777E2ae845272a2F540ebf6a3D03734A5a8f618e'.toLowerCase(),\n]);\n\nexport enum TokenValidationResult {\n UNKN = 0,\n FOT = 1,\n STF = 2,\n}\n\nexport interface TokenValidationResults {\n getValidationByToken(token: Token): TokenValidationResult | undefined;\n}\n\nconst TOKEN_VALIDATOR_ADDRESS = '0xb5ee1690b7dcc7859771148d0889be838fe108e0';\nconst AMOUNT_TO_FLASH_BORROW = '1000';\nconst GAS_LIMIT_PER_VALIDATE = 1_000_000;\n\n/**\n * Provider for getting token data.\n *\n * @export\n * @interface ITokenValidatorProvider\n */\nexport interface ITokenValidatorProvider {\n /**\n * Gets the token at each address. Any addresses that are not valid ERC-20 are ignored.\n *\n * @param addresses The token addresses to get.\n * @param [providerConfig] The provider config.\n * @returns A token accessor with methods for accessing the tokens.\n */\n validateTokens(\n tokens: Token[],\n providerConfig?: ProviderConfig\n ): Promise<TokenValidationResults>;\n}\n\nexport class TokenValidatorProvider implements ITokenValidatorProvider {\n private CACHE_KEY = (chainId: ChainId, address: string) =>\n `token-${chainId}-${address}`;\n\n private BASES: string[];\n\n constructor(\n protected chainId: ChainId,\n protected multicall2Provider: IMulticallProvider,\n private tokenValidationCache: ICache<TokenValidationResult>,\n private tokenValidatorAddress = TOKEN_VALIDATOR_ADDRESS,\n private gasLimitPerCall = GAS_LIMIT_PER_VALIDATE,\n private amountToFlashBorrow = AMOUNT_TO_FLASH_BORROW,\n private allowList = DEFAULT_ALLOWLIST\n ) {\n this.BASES = [WRAPPED_NATIVE_CURRENCY[this.chainId]!.address];\n }\n\n public async validateTokens(\n tokens: Token[],\n providerConfig?: ProviderConfig\n ): Promise<TokenValidationResults> {\n const tokenAddressToToken = _.keyBy(tokens, 'address');\n const addressesRaw = _(tokens)\n .map((token) => token.address)\n .uniq()\n .value();\n\n const addresses: string[] = [];\n const tokenToResult: { [tokenAddress: string]: TokenValidationResult } = {};\n\n // Check if we have cached token validation results for any tokens.\n for (const address of addressesRaw) {\n if (\n await this.tokenValidationCache.has(\n this.CACHE_KEY(this.chainId, address)\n )\n ) {\n tokenToResult[address.toLowerCase()] =\n (await this.tokenValidationCache.get(\n this.CACHE_KEY(this.chainId, address)\n ))!;\n\n metric.putMetric(\n `TokenValidatorProviderValidateCacheHitResult${\n tokenToResult[address.toLowerCase()]\n }`,\n 1,\n MetricLoggerUnit.Count\n );\n } else {\n addresses.push(address);\n }\n }\n\n log.info(\n `Got token validation results for ${\n addressesRaw.length - addresses.length\n } tokens from cache. Getting ${addresses.length} on-chain.`\n );\n\n const functionParams = _(addresses)\n .map((address) => [address, this.BASES, this.amountToFlashBorrow])\n .value() as [string, string[], string][];\n\n // We use the validate function instead of batchValidate to avoid poison pill problem.\n // One token that consumes too much gas could cause the entire batch to fail.\n const multicallResult =\n await this.multicall2Provider.callSameFunctionOnContractWithMultipleParams<\n [string, string[], string], // address, base token addresses, amount to borrow\n [number]\n >({\n address: this.tokenValidatorAddress,\n contractInterface: ITokenValidator__factory.createInterface(),\n functionName: 'validate',\n functionParams: functionParams,\n providerConfig,\n additionalConfig: {\n gasLimitPerCallOverride: this.gasLimitPerCall,\n },\n });\n\n for (let i = 0; i < multicallResult.results.length; i++) {\n const resultWrapper = multicallResult.results[i]!;\n const tokenAddress = addresses[i]!;\n const token = tokenAddressToToken[tokenAddress]!;\n\n if (this.allowList.has(token.address.toLowerCase())) {\n tokenToResult[token.address.toLowerCase()] = TokenValidationResult.UNKN;\n\n await this.tokenValidationCache.set(\n this.CACHE_KEY(this.chainId, token.address.toLowerCase()),\n tokenToResult[token.address.toLowerCase()]!\n );\n\n continue;\n }\n\n // Could happen if the tokens transfer consumes too much gas so we revert. Just\n // drop the token in that case.\n if (!resultWrapper.success) {\n metric.putMetric(\n 'TokenValidatorProviderValidateFailed',\n 1,\n MetricLoggerUnit.Count\n );\n\n log.error(\n { result: resultWrapper },\n `Failed to validate token ${token.symbol}`\n );\n\n continue;\n }\n\n metric.putMetric(\n 'TokenValidatorProviderValidateSuccess',\n 1,\n MetricLoggerUnit.Count\n );\n\n const validationResult = resultWrapper.result[0]!;\n\n tokenToResult[token.address.toLowerCase()] =\n validationResult as TokenValidationResult;\n\n await this.tokenValidationCache.set(\n this.CACHE_KEY(this.chainId, token.address.toLowerCase()),\n tokenToResult[token.address.toLowerCase()]!\n );\n\n metric.putMetric(\n `TokenValidatorProviderValidateCacheMissResult${validationResult}`,\n 1,\n MetricLoggerUnit.Count\n );\n }\n\n return {\n getValidationByToken: (token: Token) =>\n tokenToResult[token.address.toLowerCase()],\n };\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uri-subgraph-provider.js","sourceRoot":"","sources":["../../../src/providers/uri-subgraph-provider.ts"],"names":[],"mappings":";;;;;;AACA,8DAAgC;AAChC,kEAAoC;AACpC,kDAA0B;AAE1B,qCAAkC;AAMlC;;;;;;;;GAQG;AACH,MAAa,mBAAmB;IAG9B,YACU,OAAgB,EAChB,GAAW,EACX,UAAU,IAAI,EACd,UAAU,CAAC;QAHX,YAAO,GAAP,OAAO,CAAS;QAChB,QAAG,GAAH,GAAG,CAAQ;QACX,YAAO,GAAP,OAAO,CAAO;QACd,YAAO,GAAP,OAAO,CAAI;IAClB,CAAC;IAEG,KAAK,CAAC,QAAQ;QACnB,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EACjB,wCAAwC,IAAI,CAAC,GAAG,EAAE,CACnD,CAAC;QAEF,IAAI,QAAQ,GAAoB,EAAE,CAAC;QAEnC,MAAM,IAAA,qBAAK,EACT,KAAK,IAAI,EAAE;YACT,MAAM,OAAO,GAAG,IAAI,uBAAO,EAAE,CAAC;YAC9B,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE;gBACvD,MAAM,IAAI,KAAK,CACb,0CAA0C,IAAI,CAAC,OAAO,EAAE,CACzD,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC;YAEb,qCAAqC;YACrC,IAAI;gBACF,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;aACpE;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,GAAG,CAAC;aACX;oBAAS;gBACR,OAAO,CAAC,KAAK,EAAE,CAAC;aACjB;YACD,oCAAoC;YAEpC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC;YAE/C,IAAI,MAAM,IAAI,GAAG,EAAE;gBACjB,SAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,EAAE,6BAA6B,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC;gBAElE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;aACzD;YAED,MAAM,KAAK,GAAG,WAA8B,CAAC;YAE7C,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,OAAO,EAAE,EACtC,qCAAqC,KAAK,CAAC,MAAM,EAAE,CACpD,CAAC;YAEF,QAAQ,GAAG,KAAK,CAAC;QACnB,CAAC,EACD;YACE,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;gBACtB,SAAG,CAAC,IAAI,CACN,EAAE,GAAG,EAAE,EACP,gCAAgC,IAAI,CAAC,GAAG,oBAAoB,KAAK,EAAE,CACpE,CAAC;YACJ,CAAC;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AArED,kDAqEC","sourcesContent":["import { ChainId } from '@fewprotocol/sdk-core';\nimport retry from 'async-retry';\nimport Timeout from 'await-timeout';\nimport axios from 'axios';\n\nimport { log } from '../util/log';\n\nimport { V2SubgraphPool } from './v2/subgraph-provider';\nimport { RingV2SubgraphPool } from './fewV2/ring-subgraph-provider';\nimport { V3SubgraphPool } from './v3/subgraph-provider';\n\n/**\n * Gets subgraph pools from a URI. The URI shoudl contain a JSON\n * stringified array of V2SubgraphPool objects or V3SubgraphPool\n * objects.\n *\n * @export\n * @class URISubgraphProvider\n * @template TSubgraphPool\n */\nexport class URISubgraphProvider<\n TSubgraphPool extends RingV2SubgraphPool | V2SubgraphPool | V3SubgraphPool\n> {\n constructor(\n private chainId: ChainId,\n private uri: string,\n private timeout = 6000,\n private retries = 2\n ) {}\n\n public async getPools(): Promise<TSubgraphPool[]> {\n log.info(\n { uri: this.uri },\n `About to get subgraph pools from URI ${this.uri}`\n );\n\n let allPools: TSubgraphPool[] = [];\n\n await retry(\n async () => {\n const timeout = new Timeout();\n const timerPromise = timeout.set(this.timeout).then(() => {\n throw new Error(\n `Timed out getting pools from subgraph: ${this.timeout}`\n );\n });\n\n let response;\n\n /* eslint-disable no-useless-catch */\n try {\n response = await Promise.race([axios.get(this.uri), timerPromise]);\n } catch (err) {\n throw err;\n } finally {\n timeout.clear();\n }\n /* eslint-enable no-useless-catch */\n\n const { data: poolsBuffer, status } = response;\n\n if (status != 200) {\n log.error({ response }, `Unabled to get pools from ${this.uri}.`);\n\n throw new Error(`Unable to get pools from ${this.uri}`);\n }\n\n const pools = poolsBuffer as TSubgraphPool[];\n\n log.info(\n { uri: this.uri, chain: this.chainId },\n `Got subgraph pools from uri. Num: ${pools.length}`\n );\n\n allPools = pools;\n },\n {\n retries: this.retries,\n onRetry: (err, retry) => {\n log.info(\n { err },\n `Failed to get pools from uri ${this.uri}. Retry attempt: ${retry}`\n );\n },\n }\n );\n\n return allPools;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/caching-pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport _ from 'lodash';\n\nimport { log } from '../../util/log';\n\nimport { ICache } from './../cache';\nimport { ProviderConfig } from './../provider';\nimport { IV2PoolProvider, V2PoolAccessor } from './pool-provider';\n\n/**\n * Provider for getting V2 pools, with functionality for caching the results per block.\n *\n * @export\n * @class CachingV2PoolProvider\n */\nexport class CachingV2PoolProvider implements IV2PoolProvider {\n private POOL_KEY = (chainId: ChainId, address: string) =>\n `pool-${chainId}-${address}`;\n\n /**\n * Creates an instance of CachingV3PoolProvider.\n * @param chainId The chain id to use.\n * @param poolProvider The provider to use to get the pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n protected chainId: ChainId,\n protected poolProvider: IV2PoolProvider,\n // Cache is block aware. For V2 pools we need to use the current blocks reserves values since\n // we compute quotes off-chain.\n // If no block is specified in the call to getPools we just return whatever is in the cache.\n private cache: ICache<{ pair: Pair; block?: number }>\n ) {}\n\n public async getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor> {\n const poolAddressSet: Set<string> = new Set<string>();\n const poolsToGetTokenPairs: Array<[Token, Token]> = [];\n const poolsToGetAddresses: string[] = [];\n const poolAddressToPool: { [poolAddress: string]: Pair } = {};\n\n const blockNumber = await providerConfig?.blockNumber;\n\n for (const [tokenA, tokenB] of tokenPairs) {\n const { poolAddress, token0, token1 } = this.getPoolAddress(\n tokenA,\n tokenB\n );\n\n if (poolAddressSet.has(poolAddress)) {\n continue;\n }\n\n poolAddressSet.add(poolAddress);\n\n const cachedPool = await this.cache.get(\n this.POOL_KEY(this.chainId, poolAddress)\n );\n\n if (cachedPool) {\n // If a block was specified by the caller, ensure that the result in our cache matches the\n // expected block number. If a block number is not specified, just return whatever is in the\n // cache.\n if (!blockNumber || (blockNumber && cachedPool.block == blockNumber)) {\n poolAddressToPool[poolAddress] = cachedPool.pair;\n continue;\n }\n }\n\n poolsToGetTokenPairs.push([token0, token1]);\n poolsToGetAddresses.push(poolAddress);\n }\n\n log.info(\n {\n poolsFound: _.map(\n Object.values(poolAddressToPool),\n (p) => p.token0.symbol + ' ' + p.token1.symbol\n ),\n poolsToGetTokenPairs: _.map(\n poolsToGetTokenPairs,\n (t) => t[0].symbol + ' ' + t[1].symbol\n ),\n },\n `Found ${\n Object.keys(poolAddressToPool).length\n } V2 pools already in local cache for block ${blockNumber}. About to get reserves for ${\n poolsToGetTokenPairs.length\n } pools.`\n );\n\n if (poolsToGetAddresses.length > 0) {\n const poolAccessor = await this.poolProvider.getPools(\n poolsToGetTokenPairs,\n {\n ...providerConfig,\n enableFeeOnTransferFeeFetching: true,\n }\n );\n for (const address of poolsToGetAddresses) {\n const pool = poolAccessor.getPoolByAddress(address);\n if (pool) {\n poolAddressToPool[address] = pool;\n // We don't want to wait for this caching to complete before returning the pools.\n this.cache.set(this.POOL_KEY(this.chainId, address), {\n pair: pool,\n block: blockNumber,\n });\n }\n }\n }\n\n return {\n getPool: (tokenA: Token, tokenB: Token): Pair | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB);\n return poolAddressToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pair | undefined =>\n poolAddressToPool[address],\n getAllPools: (): Pair[] => Object.values(poolAddressToPool),\n };\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token } {\n return this.poolProvider.getPoolAddress(tokenA, tokenB);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caching-subgraph-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/caching-subgraph-provider.ts"],"names":[],"mappings":";;;AAAA,wDAAmD;AAGnD,4EAAuE;AAKvE;;;;;GAKG;AACH,MAAa,yBACX,SAAQ,mDAAuC;IAG/C;;;;;OAKG;IACH,YACE,OAAgB,EAChB,gBAAqC,EACrC,KAA+B;QAE/B,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,qBAAQ,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;CACF;AAjBD,8DAiBC","sourcesContent":["import { Protocol } from '@fewprotocol/router-sdk';\nimport { ChainId } from '@fewprotocol/sdk-core';\n\nimport { CachingSubgraphProvider } from '../caching-subgraph-provider';\n\nimport { ICache } from './../cache';\nimport { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';\n\n/**\n * Provider for getting V2 pools, with functionality for caching the results.\n *\n * @export\n * @class CachingV2SubgraphProvider\n */\nexport class CachingV2SubgraphProvider\n extends CachingSubgraphProvider<V2SubgraphPool>\n implements IV2SubgraphProvider\n{\n /**\n * Creates an instance of CachingV2SubgraphProvider.\n * @param chainId The chain id to use.\n * @param subgraphProvider The provider to use to get the subgraph pools when not in the cache.\n * @param cache Cache instance to hold cached pools.\n */\n constructor(\n chainId: ChainId,\n subgraphProvider: IV2SubgraphProvider,\n cache: ICache<V2SubgraphPool[]>\n ) {\n super(chainId, subgraphProvider, cache, Protocol.V2);\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pool-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/pool-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { ChainId, Token } from '@fewprotocol/sdk-core';\nimport { Pair } from '@fewprotocol/uniswap-v2-sdk';\nimport retry, { Options as RetryOptions } from 'async-retry';\nimport _ from 'lodash';\n\nimport { IUniswapV2Pair__factory } from '../../types/v2/factories/IUniswapV2Pair__factory';\nimport {\n CurrencyAmount,\n ID_TO_NETWORK_NAME,\n metric,\n MetricLoggerUnit,\n} from '../../util';\nimport { log } from '../../util/log';\nimport { poolToString } from '../../util/routes';\nimport { IMulticallProvider, Result } from '../multicall-provider';\nimport { ProviderConfig } from '../provider';\nimport { ITokenPropertiesProvider } from '../token-properties-provider';\nimport { TokenValidationResult } from '../token-validator-provider';\n\ntype IReserves = {\n reserve0: BigNumber;\n reserve1: BigNumber;\n blockTimestampLast: number;\n};\n\n/**\n * Provider for getting V2 pools.\n *\n * @export\n * @interface IV2PoolProvider\n */\nexport interface IV2PoolProvider {\n /**\n * Gets the pools for the specified token pairs.\n *\n * @param tokenPairs The token pairs to get.\n * @param [providerConfig] The provider config.\n * @returns A pool accessor with methods for accessing the pools.\n */\n getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor>;\n\n /**\n * Gets the pool address for the specified token pair.\n *\n * @param tokenA Token A in the pool.\n * @param tokenB Token B in the pool.\n * @returns The pool address and the two tokens.\n */\n getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token };\n}\n\nexport type V2PoolAccessor = {\n getPool: (tokenA: Token, tokenB: Token) => Pair | undefined;\n getPoolByAddress: (address: string) => Pair | undefined;\n getAllPools: () => Pair[];\n};\n\nexport type V2PoolRetryOptions = RetryOptions;\n\nexport class V2PoolProvider implements IV2PoolProvider {\n // Computing pool addresses is slow as it requires hashing, encoding etc.\n // Addresses never change so can always be cached.\n private POOL_ADDRESS_CACHE: { [key: string]: string } = {};\n\n /**\n * Creates an instance of V2PoolProvider.\n * @param chainId The chain id to use.\n * @param multicall2Provider The multicall provider to use to get the pools.\n * @param tokenPropertiesProvider The token properties provider to use to get token properties.\n * @param retryOptions The retry options for each call to the multicall.\n */\n constructor(\n protected chainId: ChainId,\n protected multicall2Provider: IMulticallProvider,\n protected tokenPropertiesProvider: ITokenPropertiesProvider,\n protected retryOptions: V2PoolRetryOptions = {\n retries: 2,\n minTimeout: 50,\n maxTimeout: 500,\n }\n ) {}\n\n public async getPools(\n tokenPairs: [Token, Token][],\n providerConfig?: ProviderConfig\n ): Promise<V2PoolAccessor> {\n const poolAddressSet: Set<string> = new Set<string>();\n const sortedTokenPairs: Array<[Token, Token]> = [];\n const sortedPoolAddresses: string[] = [];\n\n for (const tokenPair of tokenPairs) {\n const [tokenA, tokenB] = tokenPair;\n\n const { poolAddress, token0, token1 } = this.getPoolAddress(\n tokenA,\n tokenB\n );\n\n if (poolAddressSet.has(poolAddress)) {\n continue;\n }\n\n poolAddressSet.add(poolAddress);\n sortedTokenPairs.push([token0, token1]);\n sortedPoolAddresses.push(poolAddress);\n }\n\n log.debug(\n `getPools called with ${tokenPairs.length} token pairs. Deduped down to ${poolAddressSet.size}`\n );\n\n metric.putMetric('V2_RPC_POOL_RPC_CALL', 1, MetricLoggerUnit.None);\n metric.putMetric(\n 'V2GetReservesBatchSize',\n sortedPoolAddresses.length,\n MetricLoggerUnit.Count\n );\n metric.putMetric(\n `V2GetReservesBatchSize_${ID_TO_NETWORK_NAME(this.chainId)}`,\n sortedPoolAddresses.length,\n MetricLoggerUnit.Count\n );\n\n const [reservesResults, tokenPropertiesMap] = await Promise.all([\n (async () => {\n const beforeReserves = Date.now();\n const result = await this.getPoolsData<IReserves>(\n sortedPoolAddresses,\n 'getReserves',\n providerConfig\n );\n metric.putMetric(\n 'V2GetReservesLatency',\n Date.now() - beforeReserves,\n MetricLoggerUnit.Milliseconds\n );\n return result;\n })(),\n (async () => {\n const beforeTokenProperties = Date.now();\n const result = await this.tokenPropertiesProvider.getTokensProperties(\n this.flatten(tokenPairs),\n providerConfig\n );\n metric.putMetric(\n 'V2GetTokenPropertiesLatency',\n Date.now() - beforeTokenProperties,\n MetricLoggerUnit.Milliseconds\n );\n return result;\n })(),\n ]);\n\n log.info(\n `Got reserves for ${poolAddressSet.size} pools ${\n providerConfig?.blockNumber\n ? `as of block: ${await providerConfig?.blockNumber}.`\n : ``\n }`\n );\n\n const poolAddressToPool: { [poolAddress: string]: Pair } = {};\n\n const invalidPools: [Token, Token][] = [];\n\n for (let i = 0; i < sortedPoolAddresses.length; i++) {\n const reservesResult = reservesResults[i]!;\n\n if (!reservesResult?.success) {\n const [token0, token1] = sortedTokenPairs[i]!;\n invalidPools.push([token0, token1]);\n\n continue;\n }\n\n let [token0, token1] = sortedTokenPairs[i]!;\n if (\n tokenPropertiesMap[token0.address.toLowerCase()]\n ?.tokenValidationResult === TokenValidationResult.FOT\n ) {\n token0 = new Token(\n token0.chainId,\n token0.address,\n token0.decimals,\n token0.symbol,\n token0.name,\n true, // at this point we know it's valid token address\n tokenPropertiesMap[\n token0.address.toLowerCase()\n ]?.tokenFeeResult?.buyFeeBps,\n tokenPropertiesMap[\n token0.address.toLowerCase()\n ]?.tokenFeeResult?.sellFeeBps\n );\n }\n\n if (\n tokenPropertiesMap[token1.address.toLowerCase()]\n ?.tokenValidationResult === TokenValidationResult.FOT\n ) {\n token1 = new Token(\n token1.chainId,\n token1.address,\n token1.decimals,\n token1.symbol,\n token1.name,\n true, // at this point we know it's valid token address\n tokenPropertiesMap[\n token1.address.toLowerCase()\n ]?.tokenFeeResult?.buyFeeBps,\n tokenPropertiesMap[\n token1.address.toLowerCase()\n ]?.tokenFeeResult?.sellFeeBps\n );\n }\n\n const { reserve0, reserve1 } = reservesResult.result;\n\n const pool = new Pair(\n CurrencyAmount.fromRawAmount(token0, reserve0.toString()),\n CurrencyAmount.fromRawAmount(token1, reserve1.toString())\n );\n\n const poolAddress = sortedPoolAddresses[i]!;\n\n poolAddressToPool[poolAddress] = pool;\n }\n\n if (invalidPools.length > 0) {\n log.info(\n {\n invalidPools: _.map(\n invalidPools,\n ([token0, token1]) => `${token0.symbol}/${token1.symbol}`\n ),\n },\n `${invalidPools.length} pools invalid after checking their slot0 and liquidity results. Dropping.`\n );\n }\n\n const poolStrs = _.map(Object.values(poolAddressToPool), poolToString);\n\n log.debug({ poolStrs }, `Found ${poolStrs.length} valid pools`);\n\n return {\n getPool: (tokenA: Token, tokenB: Token): Pair | undefined => {\n const { poolAddress } = this.getPoolAddress(tokenA, tokenB);\n return poolAddressToPool[poolAddress];\n },\n getPoolByAddress: (address: string): Pair | undefined =>\n poolAddressToPool[address],\n getAllPools: (): Pair[] => Object.values(poolAddressToPool),\n };\n }\n\n public getPoolAddress(\n tokenA: Token,\n tokenB: Token\n ): { poolAddress: string; token0: Token; token1: Token } {\n const [token0, token1] = tokenA.sortsBefore(tokenB)\n ? [tokenA, tokenB]\n : [tokenB, tokenA];\n\n const cacheKey = `${this.chainId}/${token0.address}/${token1.address}`;\n\n const cachedAddress = this.POOL_ADDRESS_CACHE[cacheKey];\n\n if (cachedAddress) {\n return { poolAddress: cachedAddress, token0, token1 };\n }\n\n const poolAddress = Pair.getAddress(token0, token1);\n\n this.POOL_ADDRESS_CACHE[cacheKey] = poolAddress;\n\n return { poolAddress, token0, token1 };\n }\n\n private async getPoolsData<TReturn>(\n poolAddresses: string[],\n functionName: string,\n providerConfig?: ProviderConfig\n ): Promise<Result<TReturn>[]> {\n const { results, blockNumber } = await retry(async () => {\n return this.multicall2Provider.callSameFunctionOnMultipleContracts<\n undefined,\n TReturn\n >({\n addresses: poolAddresses,\n contractInterface: IUniswapV2Pair__factory.createInterface(),\n functionName: functionName,\n providerConfig,\n });\n }, this.retryOptions);\n\n log.debug(`Pool data fetched as of block ${blockNumber}`);\n\n return results;\n }\n\n // We are using ES2017. ES2019 has native flatMap support\n private flatten(tokenPairs: Array<[Token, Token]>): Token[] {\n const tokens = new Array<Token>();\n\n for (const [tokenA, tokenB] of tokenPairs) {\n tokens.push(tokenA);\n tokens.push(tokenB);\n }\n\n return tokens;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quote-provider.js","sourceRoot":"","sources":["../../../../src/providers/v2/quote-provider.ts"],"names":[],"mappings":"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","sourcesContent":["import { BigNumber } from '@ethersproject/bignumber';\nimport { TradeType } from '@fewprotocol/sdk-core';\nimport {\n InsufficientInputAmountError,\n InsufficientReservesError,\n} from '@fewprotocol/uniswap-v2-sdk';\n\nimport { V2Route } from '../../routers/router';\nimport { CurrencyAmount } from '../../util/amounts';\nimport { log } from '../../util/log';\nimport { routeToString } from '../../util/routes';\nimport { ProviderConfig } from '../provider';\n\n// Quotes can be null (e.g. pool did not have enough liquidity).\nexport type V2AmountQuote = {\n amount: CurrencyAmount;\n quote: BigNumber | null;\n};\n\nexport type V2RouteWithQuotes = [V2Route, V2AmountQuote[]];\n\nexport interface IV2QuoteProvider {\n getQuotesManyExactIn(\n amountIns: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }>;\n\n getQuotesManyExactOut(\n amountOuts: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }>;\n}\n\n/**\n * Computes quotes for V2 off-chain. Quotes are computed using the balances\n * of the pools within each route provided.\n *\n * @export\n * @class V2QuoteProvider\n */\nexport class V2QuoteProvider implements IV2QuoteProvider {\n /* eslint-disable @typescript-eslint/no-empty-function */\n constructor() {}\n\n /* eslint-enable @typescript-eslint/no-empty-function */\n\n public async getQuotesManyExactIn(\n amountIns: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n return this.getQuotes(\n amountIns,\n routes,\n TradeType.EXACT_INPUT,\n providerConfig\n );\n }\n\n public async getQuotesManyExactOut(\n amountOuts: CurrencyAmount[],\n routes: V2Route[],\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n return this.getQuotes(\n amountOuts,\n routes,\n TradeType.EXACT_OUTPUT,\n providerConfig\n );\n }\n\n private async getQuotes(\n amounts: CurrencyAmount[],\n routes: V2Route[],\n tradeType: TradeType,\n providerConfig: ProviderConfig\n ): Promise<{ routesWithQuotes: V2RouteWithQuotes[] }> {\n const routesWithQuotes: V2RouteWithQuotes[] = [];\n\n const debugStrs: string[] = [];\n for (const route of routes) {\n const amountQuotes: V2AmountQuote[] = [];\n\n let insufficientInputAmountErrorCount = 0;\n let insufficientReservesErrorCount = 0;\n for (const amount of amounts) {\n try {\n if (tradeType == TradeType.EXACT_INPUT) {\n let outputAmount = amount.wrapped;\n\n for (const pair of route.pairs) {\n [outputAmount] = pair.getOutputAmount(\n outputAmount,\n providerConfig.enableFeeOnTransferFeeFetching === true\n );\n }\n\n amountQuotes.push({\n amount,\n quote: BigNumber.from(outputAmount.quotient.toString()),\n });\n } else {\n let inputAmount = amount.wrapped;\n\n for (let i = route.pairs.length - 1; i >= 0; i--) {\n const pair = route.pairs[i]!;\n [inputAmount] = pair.getInputAmount(\n inputAmount,\n providerConfig.enableFeeOnTransferFeeFetching === true\n );\n }\n\n amountQuotes.push({\n amount,\n quote: BigNumber.from(inputAmount.quotient.toString()),\n });\n }\n } catch (err) {\n // Can fail to get quotes, e.g. throws InsufficientReservesError or InsufficientInputAmountError.\n if (err instanceof InsufficientInputAmountError) {\n insufficientInputAmountErrorCount =\n insufficientInputAmountErrorCount + 1;\n amountQuotes.push({ amount, quote: null });\n } else if (err instanceof InsufficientReservesError) {\n insufficientReservesErrorCount = insufficientReservesErrorCount + 1;\n amountQuotes.push({ amount, quote: null });\n } else {\n throw err;\n }\n }\n }\n\n if (\n insufficientInputAmountErrorCount > 0 ||\n insufficientReservesErrorCount > 0\n ) {\n debugStrs.push(\n `${[\n routeToString(route),\n ]} Input: ${insufficientInputAmountErrorCount} Reserves: ${insufficientReservesErrorCount} }`\n );\n }\n\n routesWithQuotes.push([route, amountQuotes]);\n }\n\n if (debugStrs.length > 0) {\n log.info({ debugStrs }, `Failed quotes for V2 routes`);\n }\n\n return {\n routesWithQuotes,\n };\n }\n}\n"]}
|