v-swap-smart-order-router 3.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +255 -0
- package/LICENSE +674 -0
- package/README.md +248 -0
- package/build/main/index.d.ts +3 -0
- package/build/main/index.js +20 -0
- package/build/main/providers/cache-node.d.ts +9 -0
- package/build/main/providers/cache-node.js +19 -0
- package/build/main/providers/cache.d.ts +13 -0
- package/build/main/providers/cache.js +3 -0
- package/build/main/providers/caching/route/index.d.ts +2 -0
- package/build/main/providers/caching/route/index.js +19 -0
- package/build/main/providers/caching/route/model/cache-mode.d.ts +16 -0
- package/build/main/providers/caching/route/model/cache-mode.js +21 -0
- package/build/main/providers/caching/route/model/cached-route.d.ts +26 -0
- package/build/main/providers/caching/route/model/cached-route.js +30 -0
- package/build/main/providers/caching/route/model/cached-routes.d.ts +63 -0
- package/build/main/providers/caching/route/model/cached-routes.js +73 -0
- package/build/main/providers/caching/route/model/index.d.ts +3 -0
- package/build/main/providers/caching/route/model/index.js +20 -0
- package/build/main/providers/caching/route/route-caching-provider.d.ts +91 -0
- package/build/main/providers/caching/route/route-caching-provider.js +65 -0
- package/build/main/providers/caching-gas-provider.d.ts +23 -0
- package/build/main/providers/caching-gas-provider.js +37 -0
- package/build/main/providers/caching-token-list-provider.d.ts +40 -0
- package/build/main/providers/caching-token-list-provider.js +123 -0
- package/build/main/providers/caching-token-provider.d.ts +25 -0
- package/build/main/providers/caching-token-provider.js +202 -0
- package/build/main/providers/eip-1559-gas-price-provider.d.ts +31 -0
- package/build/main/providers/eip-1559-gas-price-provider.js +66 -0
- package/build/main/providers/eth-estimate-gas-provider.d.ts +16 -0
- package/build/main/providers/eth-estimate-gas-provider.js +74 -0
- package/build/main/providers/eth-gas-station-info-gas-price-provider.d.ts +19 -0
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js +37 -0
- package/build/main/providers/gas-price-provider.d.ts +10 -0
- package/build/main/providers/gas-price-provider.js +10 -0
- package/build/main/providers/index.d.ts +37 -0
- package/build/main/providers/index.js +54 -0
- package/build/main/providers/legacy-gas-price-provider.d.ts +7 -0
- package/build/main/providers/legacy-gas-price-provider.js +20 -0
- package/build/main/providers/multicall-provider.d.ts +82 -0
- package/build/main/providers/multicall-provider.js +15 -0
- package/build/main/providers/multicall-uniswap-provider.d.ts +37 -0
- package/build/main/providers/multicall-uniswap-provider.js +163 -0
- package/build/main/providers/on-chain-gas-price-provider.d.ts +19 -0
- package/build/main/providers/on-chain-gas-price-provider.js +38 -0
- package/build/main/providers/on-chain-quote-provider.d.ts +221 -0
- package/build/main/providers/on-chain-quote-provider.js +523 -0
- package/build/main/providers/provider.d.ts +10 -0
- package/build/main/providers/provider.js +3 -0
- package/build/main/providers/simulation-provider.d.ts +42 -0
- package/build/main/providers/simulation-provider.js +130 -0
- package/build/main/providers/static-gas-price-provider.d.ts +7 -0
- package/build/main/providers/static-gas-price-provider.js +13 -0
- package/build/main/providers/swap-router-provider.d.ts +31 -0
- package/build/main/providers/swap-router-provider.js +42 -0
- package/build/main/providers/tenderly-simulation-provider.d.ts +45 -0
- package/build/main/providers/tenderly-simulation-provider.js +254 -0
- package/build/main/providers/token-provider.d.ts +114 -0
- package/build/main/providers/token-provider.js +297 -0
- package/build/main/providers/token-validator-provider.d.ts +42 -0
- package/build/main/providers/token-validator-provider.js +95 -0
- package/build/main/providers/uri-subgraph-provider.d.ts +20 -0
- package/build/main/providers/uri-subgraph-provider.js +65 -0
- package/build/main/providers/v2/caching-pool-provider.d.ts +34 -0
- package/build/main/providers/v2/caching-pool-provider.js +88 -0
- package/build/main/providers/v2/caching-subgraph-provider.d.ts +23 -0
- package/build/main/providers/v2/caching-subgraph-provider.js +34 -0
- package/build/main/providers/v2/pool-provider.d.ts +60 -0
- package/build/main/providers/v2/pool-provider.js +110 -0
- package/build/main/providers/v2/quote-provider.d.ts +33 -0
- package/build/main/providers/v2/quote-provider.js +91 -0
- package/build/main/providers/v2/static-subgraph-provider.d.ts +20 -0
- package/build/main/providers/v2/static-subgraph-provider.js +103 -0
- package/build/main/providers/v2/subgraph-provider-with-fallback.d.ts +19 -0
- package/build/main/providers/v2/subgraph-provider-with-fallback.js +35 -0
- package/build/main/providers/v2/subgraph-provider.d.ts +34 -0
- package/build/main/providers/v2/subgraph-provider.js +135 -0
- package/build/main/providers/v2/uri-subgraph-provider.d.ts +4 -0
- package/build/main/providers/v2/uri-subgraph-provider.js +8 -0
- package/build/main/providers/v3/caching-pool-provider.d.ts +33 -0
- package/build/main/providers/v3/caching-pool-provider.js +77 -0
- package/build/main/providers/v3/caching-subgraph-provider.d.ts +23 -0
- package/build/main/providers/v3/caching-subgraph-provider.js +34 -0
- package/build/main/providers/v3/gas-data-provider.d.ts +57 -0
- package/build/main/providers/v3/gas-data-provider.js +66 -0
- package/build/main/providers/v3/pool-provider.d.ts +61 -0
- package/build/main/providers/v3/pool-provider.js +123 -0
- package/build/main/providers/v3/static-subgraph-provider.d.ts +21 -0
- package/build/main/providers/v3/static-subgraph-provider.js +203 -0
- package/build/main/providers/v3/subgraph-provider-with-fallback.d.ts +15 -0
- package/build/main/providers/v3/subgraph-provider-with-fallback.js +31 -0
- package/build/main/providers/v3/subgraph-provider.d.ts +37 -0
- package/build/main/providers/v3/subgraph-provider.js +145 -0
- package/build/main/providers/v3/uri-subgraph-provider.d.ts +4 -0
- package/build/main/providers/v3/uri-subgraph-provider.js +8 -0
- package/build/main/routers/alpha-router/alpha-router.d.ts +267 -0
- package/build/main/routers/alpha-router/alpha-router.js +825 -0
- package/build/main/routers/alpha-router/config.d.ts +4 -0
- package/build/main/routers/alpha-router/config.js +93 -0
- package/build/main/routers/alpha-router/entities/index.d.ts +1 -0
- package/build/main/routers/alpha-router/entities/index.js +18 -0
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.d.ts +163 -0
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js +143 -0
- package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +19 -0
- package/build/main/routers/alpha-router/functions/best-swap-route.js +364 -0
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.d.ts +3 -0
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js +18 -0
- package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
- package/build/main/routers/alpha-router/functions/compute-all-routes.js +72 -0
- package/build/main/routers/alpha-router/functions/get-candidate-pools.d.ts +78 -0
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js +761 -0
- package/build/main/routers/alpha-router/gas-models/gas-model.d.ts +83 -0
- package/build/main/routers/alpha-router/gas-models/gas-model.js +68 -0
- package/build/main/routers/alpha-router/gas-models/index.d.ts +2 -0
- package/build/main/routers/alpha-router/gas-models/index.js +19 -0
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.d.ts +25 -0
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +175 -0
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.d.ts +29 -0
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +167 -0
- package/build/main/routers/alpha-router/gas-models/v3/gas-costs.d.ts +6 -0
- package/build/main/routers/alpha-router/gas-models/v3/gas-costs.js +110 -0
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.d.ts +31 -0
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +288 -0
- package/build/main/routers/alpha-router/index.d.ts +4 -0
- package/build/main/routers/alpha-router/index.js +21 -0
- package/build/main/routers/alpha-router/quoters/base-quoter.d.ts +68 -0
- package/build/main/routers/alpha-router/quoters/base-quoter.js +61 -0
- package/build/main/routers/alpha-router/quoters/index.d.ts +5 -0
- package/build/main/routers/alpha-router/quoters/index.js +22 -0
- package/build/main/routers/alpha-router/quoters/mixed-quoter.d.ts +20 -0
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js +130 -0
- package/build/main/routers/alpha-router/quoters/model/index.d.ts +1 -0
- package/build/main/routers/alpha-router/quoters/model/index.js +18 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.d.ts +6 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-quotes-result.js +3 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.d.ts +6 -0
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.js +3 -0
- package/build/main/routers/alpha-router/quoters/model/results/index.d.ts +2 -0
- package/build/main/routers/alpha-router/quoters/model/results/index.js +19 -0
- package/build/main/routers/alpha-router/quoters/v2-quoter.d.ts +21 -0
- package/build/main/routers/alpha-router/quoters/v2-quoter.js +122 -0
- package/build/main/routers/alpha-router/quoters/v3-quoter.d.ts +19 -0
- package/build/main/routers/alpha-router/quoters/v3-quoter.js +125 -0
- package/build/main/routers/index.d.ts +4 -0
- package/build/main/routers/index.js +21 -0
- package/build/main/routers/legacy-router/bases.d.ts +136 -0
- package/build/main/routers/legacy-router/bases.js +87 -0
- package/build/main/routers/legacy-router/index.d.ts +1 -0
- package/build/main/routers/legacy-router/index.js +18 -0
- package/build/main/routers/legacy-router/legacy-router.d.ts +42 -0
- package/build/main/routers/legacy-router/legacy-router.js +289 -0
- package/build/main/routers/router.d.ts +165 -0
- package/build/main/routers/router.js +52 -0
- package/build/main/tsconfig.tsbuildinfo +1 -0
- package/build/main/types/other/commons.d.ts +16 -0
- package/build/main/types/other/commons.js +6 -0
- package/build/main/types/other/factories/Erc20__factory.d.ts +45 -0
- package/build/main/types/other/factories/Erc20__factory.js +240 -0
- package/build/main/types/other/factories/GasDataArbitrum__factory.d.ts +18 -0
- package/build/main/types/other/factories/GasDataArbitrum__factory.js +58 -0
- package/build/main/types/other/factories/GasPriceOracle__factory.d.ts +46 -0
- package/build/main/types/other/factories/GasPriceOracle__factory.js +316 -0
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.d.ts +41 -0
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js +156 -0
- package/build/main/types/other/factories/ITokenValidator__factory.d.ts +22 -0
- package/build/main/types/other/factories/ITokenValidator__factory.js +78 -0
- package/build/main/types/other/factories/Permit2__factory.d.ts +87 -0
- package/build/main/types/other/factories/Permit2__factory.js +936 -0
- package/build/main/types/other/factories/SwapRouter02__factory.d.ts +67 -0
- package/build/main/types/other/factories/SwapRouter02__factory.js +1098 -0
- package/build/main/types/v2/commons.d.ts +16 -0
- package/build/main/types/v2/commons.js +6 -0
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.d.ts +35 -0
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js +671 -0
- package/build/main/types/v3/commons.d.ts +16 -0
- package/build/main/types/v3/commons.js +6 -0
- package/build/main/types/v3/factories/IERC20Metadata__factory.d.ts +35 -0
- package/build/main/types/v3/factories/IERC20Metadata__factory.js +242 -0
- package/build/main/types/v3/factories/IQuoterV2__factory.d.ts +41 -0
- package/build/main/types/v3/factories/IQuoterV2__factory.js +220 -0
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.d.ts +22 -0
- package/build/main/types/v3/factories/IUniswapV3PoolState__factory.js +266 -0
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.d.ts +61 -0
- package/build/main/types/v3/factories/UniswapInterfaceMulticall__factory.js +127 -0
- package/build/main/util/addresses.d.ts +26 -0
- package/build/main/util/addresses.js +73 -0
- package/build/main/util/amounts.d.ts +8 -0
- package/build/main/util/amounts.js +51 -0
- package/build/main/util/callData.d.ts +1 -0
- package/build/main/util/callData.js +6 -0
- package/build/main/util/chains.d.ts +77 -0
- package/build/main/util/chains.js +564 -0
- package/build/main/util/gas-factory-helpers.d.ts +24 -0
- package/build/main/util/gas-factory-helpers.js +308 -0
- package/build/main/util/index.d.ts +7 -0
- package/build/main/util/index.js +24 -0
- package/build/main/util/log.d.ts +3 -0
- package/build/main/util/log.js +97 -0
- package/build/main/util/methodParameters.d.ts +5 -0
- package/build/main/util/methodParameters.js +108 -0
- package/build/main/util/metric.d.ts +48 -0
- package/build/main/util/metric.js +59 -0
- package/build/main/util/protocols.d.ts +2 -0
- package/build/main/util/protocols.js +18 -0
- package/build/main/util/routes.d.ts +8 -0
- package/build/main/util/routes.js +60 -0
- package/build/main/util/unsupported-tokens.d.ts +37 -0
- package/build/main/util/unsupported-tokens.js +1119 -0
- package/build/module/index.d.ts +3 -0
- package/build/module/index.js +4 -0
- package/build/module/providers/cache-node.d.ts +9 -0
- package/build/module/providers/cache-node.js +15 -0
- package/build/module/providers/cache.d.ts +13 -0
- package/build/module/providers/cache.js +2 -0
- package/build/module/providers/caching/route/index.d.ts +2 -0
- package/build/module/providers/caching/route/index.js +3 -0
- package/build/module/providers/caching/route/model/cache-mode.d.ts +16 -0
- package/build/module/providers/caching/route/model/cache-mode.js +18 -0
- package/build/module/providers/caching/route/model/cached-route.d.ts +26 -0
- package/build/module/providers/caching/route/model/cached-route.js +26 -0
- package/build/module/providers/caching/route/model/cached-routes.d.ts +63 -0
- package/build/module/providers/caching/route/model/cached-routes.js +66 -0
- package/build/module/providers/caching/route/model/index.d.ts +3 -0
- package/build/module/providers/caching/route/model/index.js +4 -0
- package/build/module/providers/caching/route/route-caching-provider.d.ts +91 -0
- package/build/module/providers/caching/route/route-caching-provider.js +61 -0
- package/build/module/providers/caching-gas-provider.d.ts +23 -0
- package/build/module/providers/caching-gas-provider.js +33 -0
- package/build/module/providers/caching-token-list-provider.d.ts +40 -0
- package/build/module/providers/caching-token-list-provider.js +116 -0
- package/build/module/providers/caching-token-provider.d.ts +25 -0
- package/build/module/providers/caching-token-provider.js +195 -0
- package/build/module/providers/eip-1559-gas-price-provider.d.ts +31 -0
- package/build/module/providers/eip-1559-gas-price-provider.js +59 -0
- package/build/module/providers/eth-estimate-gas-provider.d.ts +16 -0
- package/build/module/providers/eth-estimate-gas-provider.js +82 -0
- package/build/module/providers/eth-gas-station-info-gas-price-provider.d.ts +19 -0
- package/build/module/providers/eth-gas-station-info-gas-price-provider.js +30 -0
- package/build/module/providers/gas-price-provider.d.ts +10 -0
- package/build/module/providers/gas-price-provider.js +6 -0
- package/build/module/providers/index.d.ts +37 -0
- package/build/module/providers/index.js +38 -0
- package/build/module/providers/legacy-gas-price-provider.d.ts +7 -0
- package/build/module/providers/legacy-gas-price-provider.js +16 -0
- package/build/module/providers/multicall-provider.d.ts +82 -0
- package/build/module/providers/multicall-provider.js +11 -0
- package/build/module/providers/multicall-uniswap-provider.d.ts +37 -0
- package/build/module/providers/multicall-uniswap-provider.js +156 -0
- package/build/module/providers/on-chain-gas-price-provider.d.ts +19 -0
- package/build/module/providers/on-chain-gas-price-provider.js +34 -0
- package/build/module/providers/on-chain-quote-provider.d.ts +221 -0
- package/build/module/providers/on-chain-quote-provider.js +517 -0
- package/build/module/providers/provider.d.ts +10 -0
- package/build/module/providers/provider.js +2 -0
- package/build/module/providers/simulation-provider.d.ts +42 -0
- package/build/module/providers/simulation-provider.js +132 -0
- package/build/module/providers/static-gas-price-provider.d.ts +7 -0
- package/build/module/providers/static-gas-price-provider.js +9 -0
- package/build/module/providers/swap-router-provider.d.ts +31 -0
- package/build/module/providers/swap-router-provider.js +38 -0
- package/build/module/providers/tenderly-simulation-provider.d.ts +45 -0
- package/build/module/providers/tenderly-simulation-provider.js +249 -0
- package/build/module/providers/token-provider.d.ts +114 -0
- package/build/module/providers/token-provider.js +285 -0
- package/build/module/providers/token-validator-provider.d.ts +42 -0
- package/build/module/providers/token-validator-provider.js +88 -0
- package/build/module/providers/uri-subgraph-provider.d.ts +20 -0
- package/build/module/providers/uri-subgraph-provider.js +58 -0
- package/build/module/providers/v2/caching-pool-provider.d.ts +34 -0
- package/build/module/providers/v2/caching-pool-provider.js +81 -0
- package/build/module/providers/v2/caching-subgraph-provider.d.ts +23 -0
- package/build/module/providers/v2/caching-subgraph-provider.js +30 -0
- package/build/module/providers/v2/pool-provider.d.ts +60 -0
- package/build/module/providers/v2/pool-provider.js +103 -0
- package/build/module/providers/v2/quote-provider.d.ts +33 -0
- package/build/module/providers/v2/quote-provider.js +87 -0
- package/build/module/providers/v2/static-subgraph-provider.d.ts +20 -0
- package/build/module/providers/v2/static-subgraph-provider.js +96 -0
- package/build/module/providers/v2/subgraph-provider-with-fallback.d.ts +19 -0
- package/build/module/providers/v2/subgraph-provider-with-fallback.js +31 -0
- package/build/module/providers/v2/subgraph-provider.d.ts +34 -0
- package/build/module/providers/v2/subgraph-provider.js +136 -0
- package/build/module/providers/v2/uri-subgraph-provider.d.ts +4 -0
- package/build/module/providers/v2/uri-subgraph-provider.js +4 -0
- package/build/module/providers/v3/caching-pool-provider.d.ts +33 -0
- package/build/module/providers/v3/caching-pool-provider.js +70 -0
- package/build/module/providers/v3/caching-subgraph-provider.d.ts +23 -0
- package/build/module/providers/v3/caching-subgraph-provider.js +30 -0
- package/build/module/providers/v3/gas-data-provider.d.ts +57 -0
- package/build/module/providers/v3/gas-data-provider.js +61 -0
- package/build/module/providers/v3/pool-provider.d.ts +61 -0
- package/build/module/providers/v3/pool-provider.js +116 -0
- package/build/module/providers/v3/static-subgraph-provider.d.ts +21 -0
- package/build/module/providers/v3/static-subgraph-provider.js +200 -0
- package/build/module/providers/v3/subgraph-provider-with-fallback.d.ts +15 -0
- package/build/module/providers/v3/subgraph-provider-with-fallback.js +27 -0
- package/build/module/providers/v3/subgraph-provider.d.ts +37 -0
- package/build/module/providers/v3/subgraph-provider.js +132 -0
- package/build/module/providers/v3/uri-subgraph-provider.d.ts +4 -0
- package/build/module/providers/v3/uri-subgraph-provider.js +4 -0
- package/build/module/routers/alpha-router/alpha-router.d.ts +267 -0
- package/build/module/routers/alpha-router/alpha-router.js +823 -0
- package/build/module/routers/alpha-router/config.d.ts +4 -0
- package/build/module/routers/alpha-router/config.js +89 -0
- package/build/module/routers/alpha-router/entities/index.d.ts +1 -0
- package/build/module/routers/alpha-router/entities/index.js +2 -0
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.d.ts +163 -0
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.js +134 -0
- package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +19 -0
- package/build/module/routers/alpha-router/functions/best-swap-route.js +356 -0
- package/build/module/routers/alpha-router/functions/calculate-ratio-amount-in.d.ts +3 -0
- package/build/module/routers/alpha-router/functions/calculate-ratio-amount-in.js +14 -0
- package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +8 -0
- package/build/module/routers/alpha-router/functions/compute-all-routes.js +65 -0
- package/build/module/routers/alpha-router/functions/get-candidate-pools.d.ts +78 -0
- package/build/module/routers/alpha-router/functions/get-candidate-pools.js +776 -0
- package/build/module/routers/alpha-router/gas-models/gas-model.d.ts +83 -0
- package/build/module/routers/alpha-router/gas-models/gas-model.js +67 -0
- package/build/module/routers/alpha-router/gas-models/index.d.ts +2 -0
- package/build/module/routers/alpha-router/gas-models/index.js +3 -0
- package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.d.ts +25 -0
- package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +168 -0
- package/build/module/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.d.ts +29 -0
- package/build/module/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +160 -0
- package/build/module/routers/alpha-router/gas-models/v3/gas-costs.d.ts +6 -0
- package/build/module/routers/alpha-router/gas-models/v3/gas-costs.js +104 -0
- package/build/module/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.d.ts +31 -0
- package/build/module/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +281 -0
- package/build/module/routers/alpha-router/index.d.ts +4 -0
- package/build/module/routers/alpha-router/index.js +5 -0
- package/build/module/routers/alpha-router/quoters/base-quoter.d.ts +68 -0
- package/build/module/routers/alpha-router/quoters/base-quoter.js +54 -0
- package/build/module/routers/alpha-router/quoters/index.d.ts +5 -0
- package/build/module/routers/alpha-router/quoters/index.js +6 -0
- package/build/module/routers/alpha-router/quoters/mixed-quoter.d.ts +20 -0
- package/build/module/routers/alpha-router/quoters/mixed-quoter.js +123 -0
- package/build/module/routers/alpha-router/quoters/model/index.d.ts +1 -0
- package/build/module/routers/alpha-router/quoters/model/index.js +2 -0
- package/build/module/routers/alpha-router/quoters/model/results/get-quotes-result.d.ts +6 -0
- package/build/module/routers/alpha-router/quoters/model/results/get-quotes-result.js +2 -0
- package/build/module/routers/alpha-router/quoters/model/results/get-routes-result.d.ts +6 -0
- package/build/module/routers/alpha-router/quoters/model/results/get-routes-result.js +2 -0
- package/build/module/routers/alpha-router/quoters/model/results/index.d.ts +2 -0
- package/build/module/routers/alpha-router/quoters/model/results/index.js +3 -0
- package/build/module/routers/alpha-router/quoters/v2-quoter.d.ts +21 -0
- package/build/module/routers/alpha-router/quoters/v2-quoter.js +115 -0
- package/build/module/routers/alpha-router/quoters/v3-quoter.d.ts +19 -0
- package/build/module/routers/alpha-router/quoters/v3-quoter.js +118 -0
- package/build/module/routers/index.d.ts +4 -0
- package/build/module/routers/index.js +5 -0
- package/build/module/routers/legacy-router/bases.d.ts +136 -0
- package/build/module/routers/legacy-router/bases.js +93 -0
- package/build/module/routers/legacy-router/index.d.ts +1 -0
- package/build/module/routers/legacy-router/index.js +2 -0
- package/build/module/routers/legacy-router/legacy-router.d.ts +42 -0
- package/build/module/routers/legacy-router/legacy-router.js +290 -0
- package/build/module/routers/router.d.ts +165 -0
- package/build/module/routers/router.js +44 -0
- package/build/module/tsconfig.module.tsbuildinfo +1 -0
- package/build/module/types/other/commons.d.ts +16 -0
- package/build/module/types/other/commons.js +5 -0
- package/build/module/types/other/factories/Erc20__factory.d.ts +45 -0
- package/build/module/types/other/factories/Erc20__factory.js +236 -0
- package/build/module/types/other/factories/GasDataArbitrum__factory.d.ts +18 -0
- package/build/module/types/other/factories/GasDataArbitrum__factory.js +54 -0
- package/build/module/types/other/factories/GasPriceOracle__factory.d.ts +46 -0
- package/build/module/types/other/factories/GasPriceOracle__factory.js +312 -0
- package/build/module/types/other/factories/IMixedRouteQuoterV1__factory.d.ts +41 -0
- package/build/module/types/other/factories/IMixedRouteQuoterV1__factory.js +152 -0
- package/build/module/types/other/factories/ITokenValidator__factory.d.ts +22 -0
- package/build/module/types/other/factories/ITokenValidator__factory.js +74 -0
- package/build/module/types/other/factories/Permit2__factory.d.ts +87 -0
- package/build/module/types/other/factories/Permit2__factory.js +932 -0
- package/build/module/types/other/factories/SwapRouter02__factory.d.ts +67 -0
- package/build/module/types/other/factories/SwapRouter02__factory.js +1094 -0
- package/build/module/types/v2/commons.d.ts +16 -0
- package/build/module/types/v2/commons.js +5 -0
- package/build/module/types/v2/factories/IUniswapV2Pair__factory.d.ts +35 -0
- package/build/module/types/v2/factories/IUniswapV2Pair__factory.js +667 -0
- package/build/module/types/v3/commons.d.ts +16 -0
- package/build/module/types/v3/commons.js +5 -0
- package/build/module/types/v3/factories/IERC20Metadata__factory.d.ts +35 -0
- package/build/module/types/v3/factories/IERC20Metadata__factory.js +238 -0
- package/build/module/types/v3/factories/IQuoterV2__factory.d.ts +41 -0
- package/build/module/types/v3/factories/IQuoterV2__factory.js +216 -0
- package/build/module/types/v3/factories/IUniswapV3PoolState__factory.d.ts +22 -0
- package/build/module/types/v3/factories/IUniswapV3PoolState__factory.js +262 -0
- package/build/module/types/v3/factories/UniswapInterfaceMulticall__factory.d.ts +61 -0
- package/build/module/types/v3/factories/UniswapInterfaceMulticall__factory.js +123 -0
- package/build/module/util/addresses.d.ts +26 -0
- package/build/module/util/addresses.js +98 -0
- package/build/module/util/amounts.d.ts +8 -0
- package/build/module/util/amounts.js +41 -0
- package/build/module/util/callData.d.ts +1 -0
- package/build/module/util/callData.js +3 -0
- package/build/module/util/chains.d.ts +77 -0
- package/build/module/util/chains.js +556 -0
- package/build/module/util/gas-factory-helpers.d.ts +24 -0
- package/build/module/util/gas-factory-helpers.js +291 -0
- package/build/module/util/index.d.ts +7 -0
- package/build/module/util/index.js +8 -0
- package/build/module/util/log.d.ts +3 -0
- package/build/module/util/log.js +93 -0
- package/build/module/util/methodParameters.d.ts +5 -0
- package/build/module/util/methodParameters.js +106 -0
- package/build/module/util/metric.d.ts +48 -0
- package/build/module/util/metric.js +53 -0
- package/build/module/util/protocols.d.ts +2 -0
- package/build/module/util/protocols.js +14 -0
- package/build/module/util/routes.d.ts +8 -0
- package/build/module/util/routes.js +50 -0
- package/build/module/util/unsupported-tokens.d.ts +37 -0
- package/build/module/util/unsupported-tokens.js +1116 -0
- package/package.json +119 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
import { ChainId } from '../../../..';
|
|
3
|
+
// Cost for crossing an uninitialized tick.
|
|
4
|
+
export const COST_PER_UNINIT_TICK = BigNumber.from(0);
|
|
5
|
+
//l2 execution fee on optimism is roughly the same as mainnet
|
|
6
|
+
export const BASE_SWAP_COST = (id) => {
|
|
7
|
+
switch (id) {
|
|
8
|
+
case ChainId.MAINNET:
|
|
9
|
+
case ChainId.ROPSTEN:
|
|
10
|
+
case ChainId.RINKEBY:
|
|
11
|
+
case ChainId.GÖRLI:
|
|
12
|
+
case ChainId.OPTIMISM:
|
|
13
|
+
case ChainId.OPTIMISM_GOERLI:
|
|
14
|
+
case ChainId.OPTIMISTIC_KOVAN:
|
|
15
|
+
case ChainId.BSC:
|
|
16
|
+
case ChainId.KOVAN:
|
|
17
|
+
return BigNumber.from(2000);
|
|
18
|
+
case ChainId.ARBITRUM_ONE:
|
|
19
|
+
case ChainId.ARBITRUM_RINKEBY:
|
|
20
|
+
case ChainId.ARBITRUM_GOERLI:
|
|
21
|
+
return BigNumber.from(5000);
|
|
22
|
+
case ChainId.POLYGON:
|
|
23
|
+
case ChainId.POLYGON_MUMBAI:
|
|
24
|
+
return BigNumber.from(2000);
|
|
25
|
+
case ChainId.CELO:
|
|
26
|
+
case ChainId.CELO_ALFAJORES:
|
|
27
|
+
return BigNumber.from(2000);
|
|
28
|
+
//TODO determine if sufficient
|
|
29
|
+
case ChainId.GNOSIS:
|
|
30
|
+
return BigNumber.from(2000);
|
|
31
|
+
case ChainId.MOONBEAM:
|
|
32
|
+
return BigNumber.from(2000);
|
|
33
|
+
case ChainId.CFX:
|
|
34
|
+
return BigNumber.from(4000);
|
|
35
|
+
case ChainId.CFX_TEST:
|
|
36
|
+
return BigNumber.from(4000);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
export const COST_PER_INIT_TICK = (id) => {
|
|
40
|
+
switch (id) {
|
|
41
|
+
case ChainId.MAINNET:
|
|
42
|
+
case ChainId.ROPSTEN:
|
|
43
|
+
case ChainId.RINKEBY:
|
|
44
|
+
case ChainId.GÖRLI:
|
|
45
|
+
case ChainId.BSC:
|
|
46
|
+
case ChainId.KOVAN:
|
|
47
|
+
return BigNumber.from(31000);
|
|
48
|
+
case ChainId.OPTIMISM:
|
|
49
|
+
case ChainId.OPTIMISM_GOERLI:
|
|
50
|
+
case ChainId.OPTIMISTIC_KOVAN:
|
|
51
|
+
return BigNumber.from(31000);
|
|
52
|
+
case ChainId.ARBITRUM_ONE:
|
|
53
|
+
case ChainId.ARBITRUM_RINKEBY:
|
|
54
|
+
case ChainId.ARBITRUM_GOERLI:
|
|
55
|
+
return BigNumber.from(31000);
|
|
56
|
+
case ChainId.POLYGON:
|
|
57
|
+
case ChainId.POLYGON_MUMBAI:
|
|
58
|
+
return BigNumber.from(31000);
|
|
59
|
+
case ChainId.CELO:
|
|
60
|
+
case ChainId.CELO_ALFAJORES:
|
|
61
|
+
return BigNumber.from(31000);
|
|
62
|
+
case ChainId.GNOSIS:
|
|
63
|
+
return BigNumber.from(31000);
|
|
64
|
+
case ChainId.MOONBEAM:
|
|
65
|
+
return BigNumber.from(31000);
|
|
66
|
+
case ChainId.CFX:
|
|
67
|
+
return BigNumber.from(62000);
|
|
68
|
+
case ChainId.CFX_TEST:
|
|
69
|
+
return BigNumber.from(62000);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
export const COST_PER_HOP = (id) => {
|
|
73
|
+
switch (id) {
|
|
74
|
+
case ChainId.MAINNET:
|
|
75
|
+
case ChainId.ROPSTEN:
|
|
76
|
+
case ChainId.RINKEBY:
|
|
77
|
+
case ChainId.GÖRLI:
|
|
78
|
+
case ChainId.KOVAN:
|
|
79
|
+
case ChainId.BSC:
|
|
80
|
+
case ChainId.OPTIMISM:
|
|
81
|
+
case ChainId.OPTIMISM_GOERLI:
|
|
82
|
+
case ChainId.OPTIMISTIC_KOVAN:
|
|
83
|
+
return BigNumber.from(80000);
|
|
84
|
+
case ChainId.ARBITRUM_ONE:
|
|
85
|
+
case ChainId.ARBITRUM_RINKEBY:
|
|
86
|
+
case ChainId.ARBITRUM_GOERLI:
|
|
87
|
+
return BigNumber.from(80000);
|
|
88
|
+
case ChainId.POLYGON:
|
|
89
|
+
case ChainId.POLYGON_MUMBAI:
|
|
90
|
+
return BigNumber.from(80000);
|
|
91
|
+
case ChainId.CELO:
|
|
92
|
+
case ChainId.CELO_ALFAJORES:
|
|
93
|
+
return BigNumber.from(80000);
|
|
94
|
+
case ChainId.GNOSIS:
|
|
95
|
+
return BigNumber.from(80000);
|
|
96
|
+
case ChainId.MOONBEAM:
|
|
97
|
+
return BigNumber.from(80000);
|
|
98
|
+
case ChainId.CFX:
|
|
99
|
+
return BigNumber.from(160000);
|
|
100
|
+
case ChainId.CFX_TEST:
|
|
101
|
+
return BigNumber.from(160000);
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FzLWNvc3RzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3JvdXRlcnMvYWxwaGEtcm91dGVyL2dhcy1tb2RlbHMvdjMvZ2FzLWNvc3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUVyRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXRDLDJDQUEyQztBQUMzQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBRXRELDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxFQUFXLEVBQWEsRUFBRTtJQUN2RCxRQUFRLEVBQUUsRUFBRTtRQUNWLEtBQUssT0FBTyxDQUFDLE9BQU8sQ0FBQztRQUNyQixLQUFLLE9BQU8sQ0FBQyxPQUFPLENBQUM7UUFDckIsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3JCLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuQixLQUFLLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDdEIsS0FBSyxPQUFPLENBQUMsZUFBZSxDQUFDO1FBQzdCLEtBQUssT0FBTyxDQUFDLGdCQUFnQixDQUFDO1FBQzlCLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNqQixLQUFLLE9BQU8sQ0FBQyxLQUFLO1lBQ2hCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM5QixLQUFLLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDMUIsS0FBSyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFDOUIsS0FBSyxPQUFPLENBQUMsZUFBZTtZQUMxQixPQUFPLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsS0FBSyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBQ3JC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
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { V3RouteWithValidQuote } from '../../entities/route-with-valid-quote';
|
|
2
|
+
import { BuildOnChainGasModelFactoryType, IGasModel, IOnChainGasModelFactory } from '../gas-model';
|
|
3
|
+
/**
|
|
4
|
+
* Computes a gas estimate for a V3 swap using heuristics.
|
|
5
|
+
* Considers number of hops in the route, number of ticks crossed
|
|
6
|
+
* and the typical base cost for a swap.
|
|
7
|
+
*
|
|
8
|
+
* We get the number of ticks crossed in a swap from the QuoterV2
|
|
9
|
+
* contract.
|
|
10
|
+
*
|
|
11
|
+
* We compute gas estimates off-chain because
|
|
12
|
+
* 1/ Calling eth_estimateGas for a swaps requires the caller to have
|
|
13
|
+
* the full balance token being swapped, and approvals.
|
|
14
|
+
* 2/ Tracking gas used using a wrapper contract is not accurate with Multicall
|
|
15
|
+
* due to EIP-2929. We would have to make a request for every swap we wanted to estimate.
|
|
16
|
+
* 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.
|
|
17
|
+
*
|
|
18
|
+
* @export
|
|
19
|
+
* @class V3HeuristicGasModelFactory
|
|
20
|
+
*/
|
|
21
|
+
export declare class V3HeuristicGasModelFactory extends IOnChainGasModelFactory {
|
|
22
|
+
constructor();
|
|
23
|
+
buildGasModel({ chainId, gasPriceWei, v3poolProvider: poolProvider, amountToken, quoteToken, l2GasDataProvider, }: BuildOnChainGasModelFactoryType): Promise<IGasModel<V3RouteWithValidQuote>>;
|
|
24
|
+
private estimateGas;
|
|
25
|
+
/**
|
|
26
|
+
* To avoid having a call to optimism's L1 security fee contract for every route and amount combination,
|
|
27
|
+
* we replicate the gas cost accounting here.
|
|
28
|
+
*/
|
|
29
|
+
private calculateOptimismToL1SecurityFee;
|
|
30
|
+
private calculateArbitrumToL1SecurityFee;
|
|
31
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
import { Percent, Price, TradeType } from '@uniswap/sdk-core';
|
|
3
|
+
import _ from 'lodash';
|
|
4
|
+
import { SwapType, WRAPPED_NATIVE_CURRENCY, } from '../../../..';
|
|
5
|
+
import { ChainId } from '../../../../util';
|
|
6
|
+
import { CurrencyAmount } from '../../../../util/amounts';
|
|
7
|
+
import { getHighestLiquidityV3NativePool, getHighestLiquidityV3USDPool, getL2ToL1GasUsed, } from '../../../../util/gas-factory-helpers';
|
|
8
|
+
import { log } from '../../../../util/log';
|
|
9
|
+
import { buildSwapMethodParameters, buildTrade, } from '../../../../util/methodParameters';
|
|
10
|
+
import { IOnChainGasModelFactory, } from '../gas-model';
|
|
11
|
+
import { BASE_SWAP_COST, COST_PER_HOP, COST_PER_INIT_TICK, COST_PER_UNINIT_TICK, } from './gas-costs';
|
|
12
|
+
/**
|
|
13
|
+
* Computes a gas estimate for a V3 swap using heuristics.
|
|
14
|
+
* Considers number of hops in the route, number of ticks crossed
|
|
15
|
+
* and the typical base cost for a swap.
|
|
16
|
+
*
|
|
17
|
+
* We get the number of ticks crossed in a swap from the QuoterV2
|
|
18
|
+
* contract.
|
|
19
|
+
*
|
|
20
|
+
* We compute gas estimates off-chain because
|
|
21
|
+
* 1/ Calling eth_estimateGas for a swaps requires the caller to have
|
|
22
|
+
* the full balance token being swapped, and approvals.
|
|
23
|
+
* 2/ Tracking gas used using a wrapper contract is not accurate with Multicall
|
|
24
|
+
* due to EIP-2929. We would have to make a request for every swap we wanted to estimate.
|
|
25
|
+
* 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.
|
|
26
|
+
*
|
|
27
|
+
* @export
|
|
28
|
+
* @class V3HeuristicGasModelFactory
|
|
29
|
+
*/
|
|
30
|
+
export class V3HeuristicGasModelFactory extends IOnChainGasModelFactory {
|
|
31
|
+
constructor() {
|
|
32
|
+
super();
|
|
33
|
+
}
|
|
34
|
+
async buildGasModel({ chainId, gasPriceWei, v3poolProvider: poolProvider, amountToken, quoteToken, l2GasDataProvider, }) {
|
|
35
|
+
const l2GasData = l2GasDataProvider
|
|
36
|
+
? await l2GasDataProvider.getGasData()
|
|
37
|
+
: undefined;
|
|
38
|
+
const usdPool = await getHighestLiquidityV3USDPool(chainId, poolProvider);
|
|
39
|
+
const calculateL1GasFees = async (route) => {
|
|
40
|
+
const swapOptions = {
|
|
41
|
+
type: SwapType.UNIVERSAL_ROUTER,
|
|
42
|
+
recipient: '0x0000000000000000000000000000000000000001',
|
|
43
|
+
deadlineOrPreviousBlockhash: 100,
|
|
44
|
+
slippageTolerance: new Percent(5, 10000),
|
|
45
|
+
};
|
|
46
|
+
let l1Used = BigNumber.from(0);
|
|
47
|
+
let l1FeeInWei = BigNumber.from(0);
|
|
48
|
+
if (chainId == ChainId.OPTIMISM ||
|
|
49
|
+
chainId == ChainId.OPTIMISTIC_KOVAN ||
|
|
50
|
+
chainId == ChainId.OPTIMISM_GOERLI) {
|
|
51
|
+
[l1Used, l1FeeInWei] = this.calculateOptimismToL1SecurityFee(route, swapOptions, l2GasData);
|
|
52
|
+
}
|
|
53
|
+
else if (chainId == ChainId.ARBITRUM_ONE ||
|
|
54
|
+
chainId == ChainId.ARBITRUM_RINKEBY ||
|
|
55
|
+
chainId == ChainId.ARBITRUM_GOERLI) {
|
|
56
|
+
[l1Used, l1FeeInWei] = this.calculateArbitrumToL1SecurityFee(route, swapOptions, l2GasData);
|
|
57
|
+
}
|
|
58
|
+
// wrap fee to native currency
|
|
59
|
+
const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
60
|
+
const costNativeCurrency = CurrencyAmount.fromRawAmount(nativeCurrency, l1FeeInWei.toString());
|
|
61
|
+
// convert fee into usd
|
|
62
|
+
const nativeTokenPrice = usdPool.token0.address == nativeCurrency.address
|
|
63
|
+
? usdPool.token0Price
|
|
64
|
+
: usdPool.token1Price;
|
|
65
|
+
const gasCostL1USD = nativeTokenPrice.quote(costNativeCurrency);
|
|
66
|
+
let gasCostL1QuoteToken = costNativeCurrency;
|
|
67
|
+
// if the inputted token is not in the native currency, quote a native/quote token pool to get the gas cost in terms of the quote token
|
|
68
|
+
if (!quoteToken.equals(nativeCurrency)) {
|
|
69
|
+
const nativePool = await getHighestLiquidityV3NativePool(quoteToken, poolProvider);
|
|
70
|
+
if (!nativePool) {
|
|
71
|
+
log.info('Could not find a pool to convert the cost into the quote token');
|
|
72
|
+
gasCostL1QuoteToken = CurrencyAmount.fromRawAmount(quoteToken, 0);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const nativeTokenPrice = nativePool.token0.address == nativeCurrency.address
|
|
76
|
+
? nativePool.token0Price
|
|
77
|
+
: nativePool.token1Price;
|
|
78
|
+
gasCostL1QuoteToken = nativeTokenPrice.quote(costNativeCurrency);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// gasUsedL1 is the gas units used calculated from the bytes of the calldata
|
|
82
|
+
// gasCostL1USD and gasCostL1QuoteToken is the cost of gas in each of those tokens
|
|
83
|
+
return {
|
|
84
|
+
gasUsedL1: l1Used,
|
|
85
|
+
gasCostL1USD,
|
|
86
|
+
gasCostL1QuoteToken,
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
// If our quote token is WETH, we don't need to convert our gas use to be in terms
|
|
90
|
+
// of the quote token in order to produce a gas adjusted amount.
|
|
91
|
+
// We do return a gas use in USD however, so we still convert to usd.
|
|
92
|
+
const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
93
|
+
if (quoteToken.equals(nativeCurrency)) {
|
|
94
|
+
const estimateGasCost = (routeWithValidQuote) => {
|
|
95
|
+
const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
96
|
+
const token0 = usdPool.token0.address == nativeCurrency.address;
|
|
97
|
+
const nativeTokenPrice = token0
|
|
98
|
+
? usdPool.token0Price
|
|
99
|
+
: usdPool.token1Price;
|
|
100
|
+
const gasCostInTermsOfUSD = nativeTokenPrice.quote(totalGasCostNativeCurrency);
|
|
101
|
+
return {
|
|
102
|
+
gasEstimate: baseGasUse,
|
|
103
|
+
gasCostInToken: totalGasCostNativeCurrency,
|
|
104
|
+
gasCostInUSD: gasCostInTermsOfUSD,
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
return {
|
|
108
|
+
estimateGasCost,
|
|
109
|
+
calculateL1GasFees,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// If the quote token is not in the native currency, we convert the gas cost to be in terms of the quote token.
|
|
113
|
+
// We do this by getting the highest liquidity <quoteToken>/<nativeCurrency> pool. eg. <quoteToken>/ETH pool.
|
|
114
|
+
const nativePool = await getHighestLiquidityV3NativePool(quoteToken, poolProvider);
|
|
115
|
+
let nativeAmountPool = null;
|
|
116
|
+
if (!amountToken.equals(nativeCurrency)) {
|
|
117
|
+
nativeAmountPool = await getHighestLiquidityV3NativePool(amountToken, poolProvider);
|
|
118
|
+
}
|
|
119
|
+
const usdToken = usdPool.token0.address == nativeCurrency.address
|
|
120
|
+
? usdPool.token1
|
|
121
|
+
: usdPool.token0;
|
|
122
|
+
const estimateGasCost = (routeWithValidQuote) => {
|
|
123
|
+
const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
124
|
+
let gasCostInTermsOfQuoteToken = null;
|
|
125
|
+
if (nativePool) {
|
|
126
|
+
const token0 = nativePool.token0.address == nativeCurrency.address;
|
|
127
|
+
// returns mid price in terms of the native currency (the ratio of quoteToken/nativeToken)
|
|
128
|
+
const nativeTokenPrice = token0
|
|
129
|
+
? nativePool.token0Price
|
|
130
|
+
: nativePool.token1Price;
|
|
131
|
+
try {
|
|
132
|
+
// native token is base currency
|
|
133
|
+
gasCostInTermsOfQuoteToken = nativeTokenPrice.quote(totalGasCostNativeCurrency);
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
log.info({
|
|
137
|
+
nativeTokenPriceBase: nativeTokenPrice.baseCurrency,
|
|
138
|
+
nativeTokenPriceQuote: nativeTokenPrice.quoteCurrency,
|
|
139
|
+
gasCostInEth: totalGasCostNativeCurrency.currency,
|
|
140
|
+
}, 'Debug eth price token issue');
|
|
141
|
+
throw err;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// we have a nativeAmountPool, but not a nativePool
|
|
145
|
+
else {
|
|
146
|
+
log.info(`Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol} to produce gas adjusted costs. Using amountToken to calculate gas costs.`);
|
|
147
|
+
}
|
|
148
|
+
// Highest liquidity pool for the non quote token / ETH
|
|
149
|
+
// A pool with the non quote token / ETH should not be required and errors should be handled separately
|
|
150
|
+
if (nativeAmountPool) {
|
|
151
|
+
// get current execution price (amountToken / quoteToken)
|
|
152
|
+
const executionPrice = new Price(routeWithValidQuote.amount.currency, routeWithValidQuote.quote.currency, routeWithValidQuote.amount.quotient, routeWithValidQuote.quote.quotient);
|
|
153
|
+
const inputIsToken0 = nativeAmountPool.token0.address == nativeCurrency.address;
|
|
154
|
+
// ratio of input / native
|
|
155
|
+
const nativeAmountTokenPrice = inputIsToken0
|
|
156
|
+
? nativeAmountPool.token0Price
|
|
157
|
+
: nativeAmountPool.token1Price;
|
|
158
|
+
const gasCostInTermsOfAmountToken = nativeAmountTokenPrice.quote(totalGasCostNativeCurrency);
|
|
159
|
+
// Convert gasCostInTermsOfAmountToken to quote token using execution price
|
|
160
|
+
const syntheticGasCostInTermsOfQuoteToken = executionPrice.quote(gasCostInTermsOfAmountToken);
|
|
161
|
+
// Note that the syntheticGasCost being lessThan the original quoted value is not always strictly better
|
|
162
|
+
// e.g. the scenario where the amountToken/ETH pool is very illiquid as well and returns an extremely small number
|
|
163
|
+
// however, it is better to have the gasEstimation be almost 0 than almost infinity, as the user will still receive a quote
|
|
164
|
+
if (gasCostInTermsOfQuoteToken === null ||
|
|
165
|
+
syntheticGasCostInTermsOfQuoteToken.lessThan(gasCostInTermsOfQuoteToken.asFraction)) {
|
|
166
|
+
log.info({
|
|
167
|
+
nativeAmountTokenPrice: nativeAmountTokenPrice.toSignificant(6),
|
|
168
|
+
gasCostInTermsOfQuoteToken: gasCostInTermsOfQuoteToken
|
|
169
|
+
? gasCostInTermsOfQuoteToken.toExact()
|
|
170
|
+
: 0,
|
|
171
|
+
gasCostInTermsOfAmountToken: gasCostInTermsOfAmountToken.toExact(),
|
|
172
|
+
executionPrice: executionPrice.toSignificant(6),
|
|
173
|
+
syntheticGasCostInTermsOfQuoteToken: syntheticGasCostInTermsOfQuoteToken.toSignificant(6),
|
|
174
|
+
}, 'New gasCostInTermsOfQuoteToken calculated with synthetic quote token price is less than original');
|
|
175
|
+
gasCostInTermsOfQuoteToken = syntheticGasCostInTermsOfQuoteToken;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// true if token0 is the native currency
|
|
179
|
+
const token0USDPool = usdPool.token0.address == nativeCurrency.address;
|
|
180
|
+
// gets the mid price of the pool in terms of the native token
|
|
181
|
+
const nativeTokenPriceUSDPool = token0USDPool
|
|
182
|
+
? usdPool.token0Price
|
|
183
|
+
: usdPool.token1Price;
|
|
184
|
+
let gasCostInTermsOfUSD;
|
|
185
|
+
try {
|
|
186
|
+
gasCostInTermsOfUSD = nativeTokenPriceUSDPool.quote(totalGasCostNativeCurrency);
|
|
187
|
+
}
|
|
188
|
+
catch (err) {
|
|
189
|
+
log.info({
|
|
190
|
+
usdT1: usdPool.token0.symbol,
|
|
191
|
+
usdT2: usdPool.token1.symbol,
|
|
192
|
+
gasCostInNativeToken: totalGasCostNativeCurrency.currency.symbol,
|
|
193
|
+
}, 'Failed to compute USD gas price');
|
|
194
|
+
throw err;
|
|
195
|
+
}
|
|
196
|
+
// If gasCostInTermsOfQuoteToken is null, both attempts to calculate gasCostInTermsOfQuoteToken failed (nativePool and amountNativePool)
|
|
197
|
+
if (gasCostInTermsOfQuoteToken === null) {
|
|
198
|
+
log.info(`Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol}, or amount Token, ${amountToken.symbol} to produce gas adjusted costs. Route will not account for gas.`);
|
|
199
|
+
return {
|
|
200
|
+
gasEstimate: baseGasUse,
|
|
201
|
+
gasCostInToken: CurrencyAmount.fromRawAmount(quoteToken, 0),
|
|
202
|
+
gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
gasEstimate: baseGasUse,
|
|
207
|
+
gasCostInToken: gasCostInTermsOfQuoteToken,
|
|
208
|
+
gasCostInUSD: gasCostInTermsOfUSD,
|
|
209
|
+
};
|
|
210
|
+
};
|
|
211
|
+
return {
|
|
212
|
+
estimateGasCost: estimateGasCost.bind(this),
|
|
213
|
+
calculateL1GasFees,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
estimateGas(routeWithValidQuote, gasPriceWei, chainId) {
|
|
217
|
+
const totalInitializedTicksCrossed = BigNumber.from(Math.max(1, _.sum(routeWithValidQuote.initializedTicksCrossedList)));
|
|
218
|
+
const totalHops = BigNumber.from(routeWithValidQuote.route.pools.length);
|
|
219
|
+
const hopsGasUse = COST_PER_HOP(chainId).mul(totalHops);
|
|
220
|
+
const tickGasUse = COST_PER_INIT_TICK(chainId).mul(totalInitializedTicksCrossed);
|
|
221
|
+
const uninitializedTickGasUse = COST_PER_UNINIT_TICK.mul(0);
|
|
222
|
+
// base estimate gas used based on chainId estimates for hops and ticks gas useage
|
|
223
|
+
const baseGasUse = BASE_SWAP_COST(chainId)
|
|
224
|
+
.add(hopsGasUse)
|
|
225
|
+
.add(tickGasUse)
|
|
226
|
+
.add(uninitializedTickGasUse);
|
|
227
|
+
const baseGasCostWei = gasPriceWei.mul(baseGasUse);
|
|
228
|
+
const wrappedCurrency = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
229
|
+
const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(wrappedCurrency, baseGasCostWei.toString());
|
|
230
|
+
return {
|
|
231
|
+
totalGasCostNativeCurrency,
|
|
232
|
+
totalInitializedTicksCrossed,
|
|
233
|
+
baseGasUse,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* To avoid having a call to optimism's L1 security fee contract for every route and amount combination,
|
|
238
|
+
* we replicate the gas cost accounting here.
|
|
239
|
+
*/
|
|
240
|
+
calculateOptimismToL1SecurityFee(routes, swapConfig, gasData) {
|
|
241
|
+
const { l1BaseFee, scalar, decimals, overhead } = gasData;
|
|
242
|
+
const route = routes[0];
|
|
243
|
+
const amountToken = route.tradeType == TradeType.EXACT_INPUT
|
|
244
|
+
? route.amount.currency
|
|
245
|
+
: route.quote.currency;
|
|
246
|
+
const outputToken = route.tradeType == TradeType.EXACT_INPUT
|
|
247
|
+
? route.quote.currency
|
|
248
|
+
: route.amount.currency;
|
|
249
|
+
// build trade for swap calldata
|
|
250
|
+
const trade = buildTrade(amountToken, outputToken, route.tradeType, routes);
|
|
251
|
+
const data = buildSwapMethodParameters(trade, swapConfig, ChainId.OPTIMISM).calldata;
|
|
252
|
+
const l1GasUsed = getL2ToL1GasUsed(data, overhead);
|
|
253
|
+
// l1BaseFee is L1 Gas Price on etherscan
|
|
254
|
+
const l1Fee = l1GasUsed.mul(l1BaseFee);
|
|
255
|
+
const unscaled = l1Fee.mul(scalar);
|
|
256
|
+
// scaled = unscaled / (10 ** decimals)
|
|
257
|
+
const scaledConversion = BigNumber.from(10).pow(decimals);
|
|
258
|
+
const scaled = unscaled.div(scaledConversion);
|
|
259
|
+
return [l1GasUsed, scaled];
|
|
260
|
+
}
|
|
261
|
+
calculateArbitrumToL1SecurityFee(routes, swapConfig, gasData) {
|
|
262
|
+
const { perL2TxFee, perL1CalldataFee } = gasData;
|
|
263
|
+
const route = routes[0];
|
|
264
|
+
const amountToken = route.tradeType == TradeType.EXACT_INPUT
|
|
265
|
+
? route.amount.currency
|
|
266
|
+
: route.quote.currency;
|
|
267
|
+
const outputToken = route.tradeType == TradeType.EXACT_INPUT
|
|
268
|
+
? route.quote.currency
|
|
269
|
+
: route.amount.currency;
|
|
270
|
+
// build trade for swap calldata
|
|
271
|
+
const trade = buildTrade(amountToken, outputToken, route.tradeType, routes);
|
|
272
|
+
const data = buildSwapMethodParameters(trade, swapConfig, ChainId.ARBITRUM_ONE).calldata;
|
|
273
|
+
// calculates gas amounts based on bytes of calldata, use 0 as overhead.
|
|
274
|
+
const l1GasUsed = getL2ToL1GasUsed(data, BigNumber.from(0));
|
|
275
|
+
// multiply by the fee per calldata and add the flat l2 fee
|
|
276
|
+
let l1Fee = l1GasUsed.mul(perL1CalldataFee);
|
|
277
|
+
l1Fee = l1Fee.add(perL2TxFee);
|
|
278
|
+
return [l1GasUsed, l1Fee];
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjMtaGV1cmlzdGljLWdhcy1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yb3V0ZXJzL2FscGhhLXJvdXRlci9nYXMtbW9kZWxzL3YzL3YzLWhldXJpc3RpYy1nYXMtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTlELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUV2QixPQUFPLEVBRUwsUUFBUSxFQUNSLHVCQUF1QixHQUN4QixNQUFNLGFBQWEsQ0FBQztBQUtyQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFDTCwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzVCLGdCQUFnQixHQUNqQixNQUFNLHNDQUFzQyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUMzQyxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLFVBQVUsR0FDWCxNQUFNLG1DQUFtQyxDQUFDO0FBRTNDLE9BQU8sRUFHTCx1QkFBdUIsR0FDeEIsTUFBTSxjQUFjLENBQUM7QUFFdEIsT0FBTyxFQUNMLGNBQWMsRUFDZCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLGFBQWEsQ0FBQztBQUVyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQU8sMEJBQTJCLFNBQVEsdUJBQXVCO0lBQ3JFO1FBQ0UsS0FBSyxFQUFFLENBQUM7SUFDVixDQUFDO0lBRU0sS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUN6QixPQUFPLEVBQ1AsV0FBVyxFQUNY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
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './alpha-router';
|
|
2
|
+
export * from './entities';
|
|
3
|
+
export * from './gas-models';
|
|
4
|
+
export * from './quoters';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcm91dGVycy9hbHBoYS1yb3V0ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLFdBQVcsQ0FBQyJ9
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
+
import { Currency, Token, TradeType } from '@uniswap/sdk-core';
|
|
3
|
+
import { Pair } from '@uniswap/v2-sdk';
|
|
4
|
+
import { Pool } from '@uniswap/v3-sdk';
|
|
5
|
+
import { ITokenListProvider, ITokenProvider, ITokenValidatorProvider, TokenValidationResult } from '../../../providers';
|
|
6
|
+
import { ChainId, CurrencyAmount } from '../../../util';
|
|
7
|
+
import { MixedRoute, V2Route, V3Route } from '../../router';
|
|
8
|
+
import { AlphaRouterConfig } from '../alpha-router';
|
|
9
|
+
import { RouteWithValidQuote } from '../entities/route-with-valid-quote';
|
|
10
|
+
import { CandidatePoolsBySelectionCriteria } from '../functions/get-candidate-pools';
|
|
11
|
+
import { IGasModel } from '../gas-models';
|
|
12
|
+
import { GetQuotesResult, GetRoutesResult } from './model/results';
|
|
13
|
+
/**
|
|
14
|
+
* Interface for a Quoter.
|
|
15
|
+
* Defines the base dependencies, helper methods and interface for how to fetch quotes.
|
|
16
|
+
*
|
|
17
|
+
* @abstract
|
|
18
|
+
* @template Route
|
|
19
|
+
*/
|
|
20
|
+
export declare abstract class BaseQuoter<Route extends V2Route | V3Route | MixedRoute> {
|
|
21
|
+
protected tokenProvider: ITokenProvider;
|
|
22
|
+
protected chainId: ChainId;
|
|
23
|
+
protected blockedTokenListProvider?: ITokenListProvider;
|
|
24
|
+
protected tokenValidatorProvider?: ITokenValidatorProvider;
|
|
25
|
+
constructor(tokenProvider: ITokenProvider, chainId: ChainId, blockedTokenListProvider?: ITokenListProvider, tokenValidatorProvider?: ITokenValidatorProvider);
|
|
26
|
+
/**
|
|
27
|
+
* Protected method in charge of fetching the routes for the tokenIn/tokenOut pair.
|
|
28
|
+
*
|
|
29
|
+
* @protected
|
|
30
|
+
* @abstract
|
|
31
|
+
* @param tokenIn The token that the user wants to provide
|
|
32
|
+
* @param tokenOut The token that the usaw wants to receive
|
|
33
|
+
* @param tradeType The type of quote the user wants. He could want to provide exactly X tokenIn or receive exactly X tokenOut
|
|
34
|
+
* @param routingConfig
|
|
35
|
+
* @returns Promise<GetRoutesResult<Route>>
|
|
36
|
+
*/
|
|
37
|
+
protected abstract getRoutes(tokenIn: Token, tokenOut: Token, tradeType: TradeType, routingConfig: AlphaRouterConfig): Promise<GetRoutesResult<Route>>;
|
|
38
|
+
/**
|
|
39
|
+
* Public method that will fetch quotes for the combination of every route and every amount.
|
|
40
|
+
*
|
|
41
|
+
* @param routes the list of route that can be used to fetch a quote.
|
|
42
|
+
* @param amounts the list of amounts to query for EACH route.
|
|
43
|
+
* @param percents the percentage of each amount.
|
|
44
|
+
* @param quoteToken
|
|
45
|
+
* @param tradeType
|
|
46
|
+
* @param routingConfig
|
|
47
|
+
* @param candidatePools the candidate pools that were used to generate the routes
|
|
48
|
+
* @param gasModel the gasModel to be used for estimating gas cost
|
|
49
|
+
* @param gasPriceWei instead of passing gasModel, gasPriceWei is used to generate a gasModel
|
|
50
|
+
* @returns Promise<GetQuotesResult<Route>>
|
|
51
|
+
*/
|
|
52
|
+
abstract getQuotes(routes: Route[], amounts: CurrencyAmount[], percents: number[], quoteToken: Token, tradeType: TradeType, routingConfig: AlphaRouterConfig, candidatePools?: CandidatePoolsBySelectionCriteria, gasModel?: IGasModel<RouteWithValidQuote>, gasPriceWei?: BigNumber): Promise<GetQuotesResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Public method which would first get the routes and then get the quotes.
|
|
55
|
+
*
|
|
56
|
+
* @param tokenIn The token that the user wants to provide
|
|
57
|
+
* @param tokenOut The token that the usaw wants to receive
|
|
58
|
+
* @param amounts the list of amounts to query for EACH route.
|
|
59
|
+
* @param percents the percentage of each amount.
|
|
60
|
+
* @param quoteToken
|
|
61
|
+
* @param tradeType
|
|
62
|
+
* @param routingConfig
|
|
63
|
+
* @param gasModel the gasModel to be used for estimating gas cost
|
|
64
|
+
* @param gasPriceWei instead of passing gasModel, gasPriceWei is used to generate a gasModel
|
|
65
|
+
*/
|
|
66
|
+
getRoutesThenQuotes(tokenIn: Token, tokenOut: Token, amounts: CurrencyAmount[], percents: number[], quoteToken: Token, tradeType: TradeType, routingConfig: AlphaRouterConfig, gasModel?: IGasModel<RouteWithValidQuote>, gasPriceWei?: BigNumber): Promise<GetQuotesResult>;
|
|
67
|
+
protected applyTokenValidatorToPools<T extends Pool | Pair>(pools: T[], isInvalidFn: (token: Currency, tokenValidation: TokenValidationResult | undefined) => boolean): Promise<T[]>;
|
|
68
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import _ from 'lodash';
|
|
2
|
+
import { log, poolToString } from '../../../util';
|
|
3
|
+
/**
|
|
4
|
+
* Interface for a Quoter.
|
|
5
|
+
* Defines the base dependencies, helper methods and interface for how to fetch quotes.
|
|
6
|
+
*
|
|
7
|
+
* @abstract
|
|
8
|
+
* @template Route
|
|
9
|
+
*/
|
|
10
|
+
export class BaseQuoter {
|
|
11
|
+
constructor(tokenProvider, chainId, blockedTokenListProvider, tokenValidatorProvider) {
|
|
12
|
+
this.tokenProvider = tokenProvider;
|
|
13
|
+
this.chainId = chainId;
|
|
14
|
+
this.blockedTokenListProvider = blockedTokenListProvider;
|
|
15
|
+
this.tokenValidatorProvider = tokenValidatorProvider;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Public method which would first get the routes and then get the quotes.
|
|
19
|
+
*
|
|
20
|
+
* @param tokenIn The token that the user wants to provide
|
|
21
|
+
* @param tokenOut The token that the usaw wants to receive
|
|
22
|
+
* @param amounts the list of amounts to query for EACH route.
|
|
23
|
+
* @param percents the percentage of each amount.
|
|
24
|
+
* @param quoteToken
|
|
25
|
+
* @param tradeType
|
|
26
|
+
* @param routingConfig
|
|
27
|
+
* @param gasModel the gasModel to be used for estimating gas cost
|
|
28
|
+
* @param gasPriceWei instead of passing gasModel, gasPriceWei is used to generate a gasModel
|
|
29
|
+
*/
|
|
30
|
+
getRoutesThenQuotes(tokenIn, tokenOut, amounts, percents, quoteToken, tradeType, routingConfig, gasModel, gasPriceWei) {
|
|
31
|
+
return this.getRoutes(tokenIn, tokenOut, tradeType, routingConfig)
|
|
32
|
+
.then((routesResult) => this.getQuotes(routesResult.routes, amounts, percents, quoteToken, tradeType, routingConfig, routesResult.candidatePools, gasModel, gasPriceWei));
|
|
33
|
+
}
|
|
34
|
+
async applyTokenValidatorToPools(pools, isInvalidFn) {
|
|
35
|
+
if (!this.tokenValidatorProvider) {
|
|
36
|
+
return pools;
|
|
37
|
+
}
|
|
38
|
+
log.info(`Running token validator on ${pools.length} pools`);
|
|
39
|
+
const tokens = _.flatMap(pools, (pool) => [pool.token0, pool.token1]);
|
|
40
|
+
const tokenValidationResults = await this.tokenValidatorProvider.validateTokens(tokens);
|
|
41
|
+
const poolsFiltered = _.filter(pools, (pool) => {
|
|
42
|
+
const token0Validation = tokenValidationResults.getValidationByToken(pool.token0);
|
|
43
|
+
const token1Validation = tokenValidationResults.getValidationByToken(pool.token1);
|
|
44
|
+
const token0Invalid = isInvalidFn(pool.token0, token0Validation);
|
|
45
|
+
const token1Invalid = isInvalidFn(pool.token1, token1Validation);
|
|
46
|
+
if (token0Invalid || token1Invalid) {
|
|
47
|
+
log.info(`Dropping pool ${poolToString(pool)} because token is invalid. ${pool.token0.symbol}: ${token0Validation}, ${pool.token1.symbol}: ${token1Validation}`);
|
|
48
|
+
}
|
|
49
|
+
return !token0Invalid && !token1Invalid;
|
|
50
|
+
});
|
|
51
|
+
return poolsFiltered;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1xdW90ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcm91dGVycy9hbHBoYS1yb3V0ZXIvcXVvdGVycy9iYXNlLXF1b3Rlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFHdkIsT0FBTyxFQUEyQixHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBUzNFOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBZ0IsVUFBVTtJQU05QixZQUNFLGFBQTZCLEVBQzdCLE9BQWdCLEVBQ2hCLHdCQUE2QyxFQUM3QyxzQkFBZ0Q7UUFFaEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLHdCQUF3QixHQUFHLHdCQUF3QixDQUFDO1FBQ3pELElBQUksQ0FBQyxzQkFBc0IsR0FBRyxzQkFBc0IsQ0FBQztJQUN2RCxDQUFDO0lBOENEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNJLG1CQUFtQixDQUN4QixPQUFjLEVBQ2QsUUFBZSxFQUNmLE9BQXlCLEVBQ3pCLFFBQWtCLEVBQ2xCLFVBQWlCLEVBQ2pCLFNBQW9CLEVBQ3BCLGFBQWdDLEVBQ2hDLFFBQXlDLEVBQ3pDLFdBQXVCO1FBRXZCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxhQUFhLENBQUM7YUFDL0QsSUFBSSxDQUFDLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FDckIsSUFBSSxDQUFDLFNBQVMsQ0FDWixZQUFZLENBQUMsTUFBTSxFQUNuQixPQUFPLEVBQ1AsUUFBUSxFQUNSLFVBQVUsRUFDVixTQUFTLEVBQ1QsYUFBYSxFQUNiLFlBQVksQ0FBQyxjQUFjLEVBQzNCLFFBQVEsRUFDUixXQUFXLENBQ1osQ0FDRixDQUFDO0lBQ04sQ0FBQztJQUVTLEtBQUssQ0FBQywwQkFBMEIsQ0FDeEMsS0FBVSxFQUNWLFdBR1k7UUFFWixJQUFJLENBQUMsSUFBSSxDQUFDLHNCQUFzQixFQUFFO1lBQ2hDLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFFRCxHQUFHLENBQUMsSUFBSSxDQUFDLDhCQUE4QixLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQztRQUU3RCxNQUFNLE1BQU0sR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBRXRFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXhGLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBTyxFQUFFLEVBQUU7WUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FDbEUsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO1lBQ0YsTUFBTSxnQkFBZ0IsR0FBRyxzQkFBc0IsQ0FBQyxvQkFBb0IsQ0FDbEUsSUFBSSxDQUFDLE1BQU0sQ0FDWixDQUFDO1lBRUYsTUFBTSxhQUFhLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztZQUNqRSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBRWpFLElBQUksYUFBYSxJQUFJLGFBQWEsRUFBRTtnQkFDbEMsR0FBRyxDQUFDLElBQUksQ0FDTixpQkFBaUIsWUFBWSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUM3RSxLQUFLLGdCQUFnQixLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLGdCQUFnQixFQUFFLENBQ3BFLENBQUM7YUFDSDtZQUVELE9BQU8sQ0FBQyxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLGFBQWEsQ0FBQztJQUN2QixDQUFDO0NBQ0YifQ==
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from './model/';
|
|
2
|
+
export * from './base-quoter';
|
|
3
|
+
export * from './v2-quoter';
|
|
4
|
+
export * from './v3-quoter';
|
|
5
|
+
export * from './mixed-quoter';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcm91dGVycy9hbHBoYS1yb3V0ZXIvcXVvdGVycy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGFBQWEsQ0FBQztBQUM1QixjQUFjLGdCQUFnQixDQUFDIn0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Token, TradeType } from '@uniswap/sdk-core';
|
|
2
|
+
import { IOnChainQuoteProvider, ITokenListProvider, ITokenProvider, ITokenValidatorProvider, IV2PoolProvider, IV2SubgraphProvider, IV3PoolProvider, IV3SubgraphProvider } from '../../../providers';
|
|
3
|
+
import { ChainId, CurrencyAmount } from '../../../util';
|
|
4
|
+
import { MixedRoute } from '../../router';
|
|
5
|
+
import { AlphaRouterConfig } from '../alpha-router';
|
|
6
|
+
import { MixedRouteWithValidQuote } from '../entities';
|
|
7
|
+
import { CandidatePoolsBySelectionCriteria } from '../functions/get-candidate-pools';
|
|
8
|
+
import { IGasModel } from '../gas-models';
|
|
9
|
+
import { BaseQuoter } from './base-quoter';
|
|
10
|
+
import { GetQuotesResult, GetRoutesResult } from './model';
|
|
11
|
+
export declare class MixedQuoter extends BaseQuoter<MixedRoute> {
|
|
12
|
+
protected v3SubgraphProvider: IV3SubgraphProvider;
|
|
13
|
+
protected v3PoolProvider: IV3PoolProvider;
|
|
14
|
+
protected v2SubgraphProvider: IV2SubgraphProvider;
|
|
15
|
+
protected v2PoolProvider: IV2PoolProvider;
|
|
16
|
+
protected onChainQuoteProvider: IOnChainQuoteProvider;
|
|
17
|
+
constructor(v3SubgraphProvider: IV3SubgraphProvider, v3PoolProvider: IV3PoolProvider, v2SubgraphProvider: IV2SubgraphProvider, v2PoolProvider: IV2PoolProvider, onChainQuoteProvider: IOnChainQuoteProvider, tokenProvider: ITokenProvider, chainId: ChainId, blockedTokenListProvider?: ITokenListProvider, tokenValidatorProvider?: ITokenValidatorProvider);
|
|
18
|
+
protected getRoutes(tokenIn: Token, tokenOut: Token, tradeType: TradeType, routingConfig: AlphaRouterConfig): Promise<GetRoutesResult<MixedRoute>>;
|
|
19
|
+
getQuotes(routes: MixedRoute[], amounts: CurrencyAmount[], percents: number[], quoteToken: Token, tradeType: TradeType, routingConfig: AlphaRouterConfig, candidatePools?: CandidatePoolsBySelectionCriteria, gasModel?: IGasModel<MixedRouteWithValidQuote>): Promise<GetQuotesResult>;
|
|
20
|
+
}
|