@synthra-swap/smart-order-router 3.15.33 → 3.16.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/README.md +21 -21
- package/build/main/providers/caching/route/model/cached-route.d.ts +5 -5
- package/build/main/providers/caching/route/model/cached-routes.d.ts +5 -5
- package/build/main/providers/caching/route/model/cached-routes.js +1 -1
- package/build/main/providers/caching/route/route-caching-provider.d.ts +2 -2
- package/build/main/providers/caching/route/route-caching-provider.js +3 -3
- package/build/main/providers/caching-gas-provider.d.ts +1 -1
- package/build/main/providers/caching-token-list-provider.d.ts +2 -2
- package/build/main/providers/caching-token-list-provider.js +3 -3
- package/build/main/providers/caching-token-provider.d.ts +1 -1
- package/build/main/providers/caching-token-provider.js +34 -34
- package/build/main/providers/eth-estimate-gas-provider.d.ts +2 -4
- package/build/main/providers/eth-estimate-gas-provider.js +4 -5
- package/build/main/providers/index.d.ts +1 -10
- package/build/main/providers/index.js +2 -11
- package/build/main/providers/multicall-uniswap-provider.d.ts +1 -1
- package/build/main/providers/multicall-uniswap-provider.js +2 -2
- package/build/main/providers/on-chain-gas-price-provider.d.ts +1 -1
- package/build/main/providers/on-chain-gas-price-provider.js +5 -5
- package/build/main/providers/on-chain-quote-provider.d.ts +11 -19
- package/build/main/providers/on-chain-quote-provider.js +18 -39
- package/build/main/providers/simulation-provider.d.ts +1 -1
- package/build/main/providers/simulation-provider.js +6 -6
- package/build/main/providers/swap-router-provider.d.ts +2 -2
- package/build/main/providers/tenderly-simulation-provider.d.ts +2 -4
- package/build/main/providers/tenderly-simulation-provider.js +13 -14
- package/build/main/providers/token-provider.d.ts +1 -1
- package/build/main/providers/token-provider.js +112 -112
- package/build/main/providers/token-validator-provider.d.ts +1 -1
- package/build/main/providers/uri-subgraph-provider.d.ts +3 -5
- package/build/main/providers/uri-subgraph-provider.js +2 -3
- package/build/main/providers/v3/caching-pool-provider.d.ts +2 -2
- package/build/main/providers/v3/caching-subgraph-provider.d.ts +1 -1
- package/build/main/providers/v3/gas-data-provider.d.ts +1 -1
- package/build/main/providers/v3/gas-data-provider.js +3 -3
- package/build/main/providers/v3/pool-provider.d.ts +2 -2
- package/build/main/providers/v3/pool-provider.js +15 -7
- package/build/main/providers/v3/static-subgraph-provider.d.ts +1 -1
- package/build/main/providers/v3/static-subgraph-provider.js +48 -47
- package/build/main/providers/v3/subgraph-provider-with-fallback.d.ts +1 -1
- package/build/main/providers/v3/subgraph-provider.d.ts +1 -3
- package/build/main/providers/v3/subgraph-provider.js +12 -14
- package/build/main/routers/alpha-router/alpha-router.d.ts +17 -54
- package/build/main/routers/alpha-router/alpha-router.js +92 -170
- package/build/main/routers/alpha-router/config.d.ts +1 -2
- package/build/main/routers/alpha-router/config.js +11 -39
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.d.ts +5 -93
- package/build/main/routers/alpha-router/entities/route-with-valid-quote.js +5 -93
- package/build/main/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
- package/build/main/routers/alpha-router/functions/best-swap-route.js +12 -39
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.d.ts +1 -1
- package/build/main/routers/alpha-router/functions/calculate-ratio-amount-in.js +3 -3
- package/build/main/routers/alpha-router/functions/compute-all-routes.d.ts +4 -7
- package/build/main/routers/alpha-router/functions/compute-all-routes.js +2 -28
- package/build/main/routers/alpha-router/functions/get-candidate-pools.d.ts +3 -39
- package/build/main/routers/alpha-router/functions/get-candidate-pools.js +28 -433
- package/build/main/routers/alpha-router/gas-models/gas-model.d.ts +8 -29
- package/build/main/routers/alpha-router/gas-models/gas-model.js +28 -39
- package/build/main/routers/alpha-router/gas-models/v3/gas-costs.d.ts +1 -1
- package/build/main/routers/alpha-router/gas-models/v3/gas-costs.js +75 -69
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.d.ts +1 -1
- package/build/main/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +41 -42
- package/build/main/routers/alpha-router/quoters/base-quoter.d.ts +5 -6
- package/build/main/routers/alpha-router/quoters/base-quoter.js +1 -1
- package/build/main/routers/alpha-router/quoters/index.d.ts +1 -3
- package/build/main/routers/alpha-router/quoters/index.js +2 -4
- package/build/main/routers/alpha-router/quoters/model/results/get-routes-result.d.ts +2 -2
- package/build/main/routers/alpha-router/quoters/v3-quoter.d.ts +1 -1
- package/build/main/routers/alpha-router/quoters/v3-quoter.js +3 -3
- package/build/main/routers/index.d.ts +1 -1
- package/build/main/routers/index.js +2 -2
- package/build/main/routers/router.d.ts +4 -11
- package/build/main/routers/router.js +5 -20
- package/build/main/routers/synthra-router/config.d.ts +5 -0
- package/build/main/routers/synthra-router/config.js +30 -0
- package/build/main/routers/synthra-router/index.d.ts +3 -0
- package/build/main/routers/{legacy-router → synthra-router}/index.js +4 -2
- package/build/main/routers/synthra-router/synthra-router.d.ts +31 -0
- package/build/main/routers/synthra-router/synthra-router.js +437 -0
- package/build/main/routers/synthra-router/types.d.ts +158 -0
- package/build/main/routers/synthra-router/types.js +3 -0
- package/build/main/tsconfig.tsbuildinfo +1 -1
- package/build/main/types/v3/factories/{IUniswapV3PoolState__factory.d.ts → ISynthraV3PoolState__factory.d.ts} +4 -4
- package/build/main/types/v3/factories/{IUniswapV3PoolState__factory.js → ISynthraV3PoolState__factory.js} +5 -5
- package/build/main/types/v3/factories/{UniswapInterfaceMulticall__factory.d.ts → SynthraInterfaceMulticall__factory.d.ts} +7 -7
- package/build/main/types/v3/factories/{UniswapInterfaceMulticall__factory.js → SynthraInterfaceMulticall__factory.js} +8 -8
- package/build/main/util/addresses.d.ts +1 -4
- package/build/main/util/addresses.js +29 -53
- package/build/main/util/amounts.d.ts +3 -3
- package/build/main/util/amounts.js +12 -12
- package/build/main/util/chains.d.ts +2 -31
- package/build/main/util/chains.js +83 -511
- package/build/main/util/gas-factory-helpers.d.ts +8 -11
- package/build/main/util/gas-factory-helpers.js +57 -103
- package/build/main/util/index.d.ts +0 -1
- package/build/main/util/index.js +1 -2
- package/build/main/util/methodParameters.d.ts +2 -2
- package/build/main/util/methodParameters.js +10 -57
- package/build/main/util/router-sdk.d.ts +21 -0
- package/build/main/util/router-sdk.js +24 -0
- package/build/main/util/routes.d.ts +4 -5
- package/build/main/util/routes.js +9 -19
- package/build/main/util/token-list.d.ts +28 -0
- package/build/main/util/token-list.js +14 -0
- package/build/module/providers/caching/route/model/cached-route.d.ts +5 -5
- package/build/module/providers/caching/route/model/cached-routes.d.ts +5 -5
- package/build/module/providers/caching/route/model/cached-routes.js +1 -1
- package/build/module/providers/caching/route/route-caching-provider.d.ts +2 -2
- package/build/module/providers/caching/route/route-caching-provider.js +1 -1
- package/build/module/providers/caching-gas-provider.d.ts +1 -1
- package/build/module/providers/caching-token-list-provider.d.ts +2 -2
- package/build/module/providers/caching-token-list-provider.js +2 -2
- package/build/module/providers/caching-token-provider.d.ts +1 -1
- package/build/module/providers/caching-token-provider.js +1 -1
- package/build/module/providers/eth-estimate-gas-provider.d.ts +2 -4
- package/build/module/providers/eth-estimate-gas-provider.js +4 -5
- package/build/module/providers/index.d.ts +1 -10
- package/build/module/providers/index.js +2 -11
- package/build/module/providers/multicall-uniswap-provider.d.ts +1 -1
- package/build/module/providers/multicall-uniswap-provider.js +2 -2
- package/build/module/providers/on-chain-gas-price-provider.d.ts +1 -1
- package/build/module/providers/on-chain-gas-price-provider.js +1 -1
- package/build/module/providers/on-chain-quote-provider.d.ts +11 -19
- package/build/module/providers/on-chain-quote-provider.js +17 -38
- package/build/module/providers/simulation-provider.d.ts +1 -1
- package/build/module/providers/simulation-provider.js +3 -3
- package/build/module/providers/swap-router-provider.d.ts +2 -2
- package/build/module/providers/tenderly-simulation-provider.d.ts +2 -4
- package/build/module/providers/tenderly-simulation-provider.js +6 -7
- package/build/module/providers/token-provider.d.ts +1 -1
- package/build/module/providers/token-provider.js +3 -3
- package/build/module/providers/token-validator-provider.d.ts +1 -1
- package/build/module/providers/uri-subgraph-provider.d.ts +3 -5
- package/build/module/providers/uri-subgraph-provider.js +2 -3
- package/build/module/providers/v3/caching-pool-provider.d.ts +2 -2
- package/build/module/providers/v3/caching-subgraph-provider.d.ts +1 -1
- package/build/module/providers/v3/gas-data-provider.d.ts +1 -1
- package/build/module/providers/v3/gas-data-provider.js +1 -1
- package/build/module/providers/v3/pool-provider.d.ts +2 -2
- package/build/module/providers/v3/pool-provider.js +13 -5
- package/build/module/providers/v3/static-subgraph-provider.d.ts +1 -1
- package/build/module/providers/v3/static-subgraph-provider.js +5 -4
- package/build/module/providers/v3/subgraph-provider-with-fallback.d.ts +1 -1
- package/build/module/providers/v3/subgraph-provider.d.ts +1 -3
- package/build/module/providers/v3/subgraph-provider.js +2 -3
- package/build/module/routers/alpha-router/alpha-router.d.ts +17 -54
- package/build/module/routers/alpha-router/alpha-router.js +74 -145
- package/build/module/routers/alpha-router/config.d.ts +1 -2
- package/build/module/routers/alpha-router/config.js +2 -30
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.d.ts +5 -93
- package/build/module/routers/alpha-router/entities/route-with-valid-quote.js +3 -89
- package/build/module/routers/alpha-router/functions/best-swap-route.d.ts +1 -1
- package/build/module/routers/alpha-router/functions/best-swap-route.js +8 -35
- package/build/module/routers/alpha-router/functions/calculate-ratio-amount-in.d.ts +1 -1
- package/build/module/routers/alpha-router/functions/calculate-ratio-amount-in.js +1 -1
- package/build/module/routers/alpha-router/functions/compute-all-routes.d.ts +4 -7
- package/build/module/routers/alpha-router/functions/compute-all-routes.js +2 -26
- package/build/module/routers/alpha-router/functions/get-candidate-pools.d.ts +3 -39
- package/build/module/routers/alpha-router/functions/get-candidate-pools.js +5 -418
- package/build/module/routers/alpha-router/gas-models/gas-model.d.ts +8 -29
- package/build/module/routers/alpha-router/gas-models/gas-model.js +7 -18
- package/build/module/routers/alpha-router/gas-models/v3/gas-costs.d.ts +1 -1
- package/build/module/routers/alpha-router/gas-models/v3/gas-costs.js +8 -2
- package/build/module/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.d.ts +1 -1
- package/build/module/routers/alpha-router/gas-models/v3/v3-heuristic-gas-model.js +27 -28
- package/build/module/routers/alpha-router/quoters/base-quoter.d.ts +5 -6
- package/build/module/routers/alpha-router/quoters/base-quoter.js +1 -1
- package/build/module/routers/alpha-router/quoters/index.d.ts +1 -3
- package/build/module/routers/alpha-router/quoters/index.js +2 -4
- package/build/module/routers/alpha-router/quoters/model/results/get-routes-result.d.ts +2 -2
- package/build/module/routers/alpha-router/quoters/v3-quoter.d.ts +1 -1
- package/build/module/routers/alpha-router/quoters/v3-quoter.js +1 -1
- package/build/module/routers/index.d.ts +1 -1
- package/build/module/routers/index.js +2 -2
- package/build/module/routers/router.d.ts +4 -11
- package/build/module/routers/router.js +3 -16
- package/build/module/routers/synthra-router/config.d.ts +5 -0
- package/build/module/routers/synthra-router/config.js +27 -0
- package/build/module/routers/synthra-router/index.d.ts +3 -0
- package/build/module/routers/synthra-router/index.js +4 -0
- package/build/module/routers/synthra-router/synthra-router.d.ts +31 -0
- package/build/module/routers/synthra-router/synthra-router.js +447 -0
- package/build/module/routers/synthra-router/types.d.ts +158 -0
- package/build/module/routers/synthra-router/types.js +2 -0
- package/build/module/tsconfig.module.tsbuildinfo +1 -1
- package/build/module/types/v3/factories/{IUniswapV3PoolState__factory.d.ts → ISynthraV3PoolState__factory.d.ts} +4 -4
- package/build/module/types/v3/factories/{IUniswapV3PoolState__factory.js → ISynthraV3PoolState__factory.js} +3 -3
- package/build/module/types/v3/factories/{UniswapInterfaceMulticall__factory.d.ts → SynthraInterfaceMulticall__factory.d.ts} +7 -7
- package/build/module/types/v3/factories/{UniswapInterfaceMulticall__factory.js → SynthraInterfaceMulticall__factory.js} +6 -6
- package/build/module/util/addresses.d.ts +1 -4
- package/build/module/util/addresses.js +7 -82
- package/build/module/util/amounts.d.ts +3 -3
- package/build/module/util/amounts.js +3 -3
- package/build/module/util/chains.d.ts +2 -31
- package/build/module/util/chains.js +3 -435
- package/build/module/util/gas-factory-helpers.d.ts +8 -11
- package/build/module/util/gas-factory-helpers.js +31 -76
- package/build/module/util/index.d.ts +0 -1
- package/build/module/util/index.js +1 -2
- package/build/module/util/methodParameters.d.ts +2 -2
- package/build/module/util/methodParameters.js +7 -54
- package/build/module/util/router-sdk.d.ts +21 -0
- package/build/module/util/router-sdk.js +19 -0
- package/build/module/util/routes.d.ts +4 -5
- package/build/module/util/routes.js +8 -18
- package/build/module/util/token-list.d.ts +28 -0
- package/build/module/util/token-list.js +11 -0
- package/package.json +13 -26
- package/build/main/providers/eth-gas-station-info-gas-price-provider.d.ts +0 -19
- package/build/main/providers/eth-gas-station-info-gas-price-provider.js +0 -37
- package/build/main/providers/v2/caching-pool-provider.d.ts +0 -33
- package/build/main/providers/v2/caching-pool-provider.js +0 -88
- package/build/main/providers/v2/caching-subgraph-provider.d.ts +0 -23
- package/build/main/providers/v2/caching-subgraph-provider.js +0 -34
- package/build/main/providers/v2/pool-provider.d.ts +0 -59
- package/build/main/providers/v2/pool-provider.js +0 -111
- package/build/main/providers/v2/quote-provider.d.ts +0 -33
- package/build/main/providers/v2/quote-provider.js +0 -91
- package/build/main/providers/v2/static-subgraph-provider.d.ts +0 -19
- package/build/main/providers/v2/static-subgraph-provider.js +0 -97
- package/build/main/providers/v2/subgraph-provider-with-fallback.d.ts +0 -19
- package/build/main/providers/v2/subgraph-provider-with-fallback.js +0 -35
- package/build/main/providers/v2/subgraph-provider.d.ts +0 -33
- package/build/main/providers/v2/subgraph-provider.js +0 -134
- package/build/main/providers/v2/uri-subgraph-provider.d.ts +0 -4
- package/build/main/providers/v2/uri-subgraph-provider.js +0 -8
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.d.ts +0 -25
- package/build/main/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +0 -175
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.d.ts +0 -29
- package/build/main/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +0 -167
- package/build/main/routers/alpha-router/quoters/mixed-quoter.d.ts +0 -20
- package/build/main/routers/alpha-router/quoters/mixed-quoter.js +0 -130
- package/build/main/routers/alpha-router/quoters/v2-quoter.d.ts +0 -21
- package/build/main/routers/alpha-router/quoters/v2-quoter.js +0 -122
- package/build/main/routers/legacy-router/bases.d.ts +0 -183
- package/build/main/routers/legacy-router/bases.js +0 -81
- package/build/main/routers/legacy-router/index.d.ts +0 -1
- package/build/main/routers/legacy-router/legacy-router.d.ts +0 -41
- package/build/main/routers/legacy-router/legacy-router.js +0 -289
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.d.ts +0 -41
- package/build/main/types/other/factories/IMixedRouteQuoterV1__factory.js +0 -156
- package/build/main/types/v2/commons.d.ts +0 -16
- package/build/main/types/v2/commons.js +0 -6
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.d.ts +0 -35
- package/build/main/types/v2/factories/IUniswapV2Pair__factory.js +0 -671
- package/build/main/util/protocols.d.ts +0 -2
- package/build/main/util/protocols.js +0 -18
- package/build/main/util/unsupported-tokens.d.ts +0 -37
- package/build/main/util/unsupported-tokens.js +0 -1119
- package/build/module/providers/eth-gas-station-info-gas-price-provider.d.ts +0 -19
- package/build/module/providers/eth-gas-station-info-gas-price-provider.js +0 -30
- package/build/module/providers/v2/caching-pool-provider.d.ts +0 -33
- package/build/module/providers/v2/caching-pool-provider.js +0 -81
- package/build/module/providers/v2/caching-subgraph-provider.d.ts +0 -23
- package/build/module/providers/v2/caching-subgraph-provider.js +0 -30
- package/build/module/providers/v2/pool-provider.d.ts +0 -59
- package/build/module/providers/v2/pool-provider.js +0 -104
- package/build/module/providers/v2/quote-provider.d.ts +0 -33
- package/build/module/providers/v2/quote-provider.js +0 -87
- package/build/module/providers/v2/static-subgraph-provider.d.ts +0 -19
- package/build/module/providers/v2/static-subgraph-provider.js +0 -90
- package/build/module/providers/v2/subgraph-provider-with-fallback.d.ts +0 -19
- package/build/module/providers/v2/subgraph-provider-with-fallback.js +0 -31
- package/build/module/providers/v2/subgraph-provider.d.ts +0 -33
- package/build/module/providers/v2/subgraph-provider.js +0 -135
- package/build/module/providers/v2/uri-subgraph-provider.d.ts +0 -4
- package/build/module/providers/v2/uri-subgraph-provider.js +0 -4
- package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.d.ts +0 -25
- package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js +0 -168
- package/build/module/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.d.ts +0 -29
- package/build/module/routers/alpha-router/gas-models/v2/v2-heuristic-gas-model.js +0 -160
- package/build/module/routers/alpha-router/quoters/mixed-quoter.d.ts +0 -20
- package/build/module/routers/alpha-router/quoters/mixed-quoter.js +0 -123
- package/build/module/routers/alpha-router/quoters/v2-quoter.d.ts +0 -21
- package/build/module/routers/alpha-router/quoters/v2-quoter.js +0 -115
- package/build/module/routers/legacy-router/bases.d.ts +0 -183
- package/build/module/routers/legacy-router/bases.js +0 -87
- package/build/module/routers/legacy-router/index.d.ts +0 -1
- package/build/module/routers/legacy-router/index.js +0 -2
- package/build/module/routers/legacy-router/legacy-router.d.ts +0 -41
- package/build/module/routers/legacy-router/legacy-router.js +0 -290
- package/build/module/types/other/factories/IMixedRouteQuoterV1__factory.d.ts +0 -41
- package/build/module/types/other/factories/IMixedRouteQuoterV1__factory.js +0 -152
- package/build/module/types/v2/commons.d.ts +0 -16
- package/build/module/types/v2/commons.js +0 -5
- package/build/module/types/v2/factories/IUniswapV2Pair__factory.d.ts +0 -35
- package/build/module/types/v2/factories/IUniswapV2Pair__factory.js +0 -667
- package/build/module/util/protocols.d.ts +0 -2
- package/build/module/util/protocols.js +0 -14
- package/build/module/util/unsupported-tokens.d.ts +0 -37
- package/build/module/util/unsupported-tokens.js +0 -1116
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { Token } from '@synthra-swap/sdk-core';
|
|
2
|
-
import { ProviderConfig } from '../provider';
|
|
3
|
-
import { IV2SubgraphProvider, V2SubgraphPool } from './subgraph-provider';
|
|
4
|
-
/**
|
|
5
|
-
* Provider for getting V2 subgraph pools that falls back to a different provider
|
|
6
|
-
* in the event of failure.
|
|
7
|
-
*
|
|
8
|
-
* @export
|
|
9
|
-
* @class V2SubgraphProviderWithFallBacks
|
|
10
|
-
*/
|
|
11
|
-
export declare class V2SubgraphProviderWithFallBacks implements IV2SubgraphProvider {
|
|
12
|
-
private fallbacks;
|
|
13
|
-
/**
|
|
14
|
-
* Creates an instance of V2SubgraphProviderWithFallBacks.
|
|
15
|
-
* @param fallbacks Ordered list of `IV2SubgraphProvider` to try to get pools from.
|
|
16
|
-
*/
|
|
17
|
-
constructor(fallbacks: IV2SubgraphProvider[]);
|
|
18
|
-
getPools(tokenIn?: Token, tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
|
|
19
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { log } from '../../util';
|
|
2
|
-
/**
|
|
3
|
-
* Provider for getting V2 subgraph pools that falls back to a different provider
|
|
4
|
-
* in the event of failure.
|
|
5
|
-
*
|
|
6
|
-
* @export
|
|
7
|
-
* @class V2SubgraphProviderWithFallBacks
|
|
8
|
-
*/
|
|
9
|
-
export class V2SubgraphProviderWithFallBacks {
|
|
10
|
-
/**
|
|
11
|
-
* Creates an instance of V2SubgraphProviderWithFallBacks.
|
|
12
|
-
* @param fallbacks Ordered list of `IV2SubgraphProvider` to try to get pools from.
|
|
13
|
-
*/
|
|
14
|
-
constructor(fallbacks) {
|
|
15
|
-
this.fallbacks = fallbacks;
|
|
16
|
-
}
|
|
17
|
-
async getPools(tokenIn, tokenOut, providerConfig) {
|
|
18
|
-
for (let i = 0; i < this.fallbacks.length; i++) {
|
|
19
|
-
const provider = this.fallbacks[i];
|
|
20
|
-
try {
|
|
21
|
-
const pools = await provider.getPools(tokenIn, tokenOut, providerConfig);
|
|
22
|
-
return pools;
|
|
23
|
-
}
|
|
24
|
-
catch (err) {
|
|
25
|
-
log.info(`Failed to get subgraph pools for V2 from fallback #${i}`);
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
throw new Error('Failed to get subgraph pools from any providers');
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXItd2l0aC1mYWxsYmFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvdjIvc3ViZ3JhcGgtcHJvdmlkZXItd2l0aC1mYWxsYmFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS2pDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTywrQkFBK0I7SUFDMUM7OztPQUdHO0lBQ0gsWUFBb0IsU0FBZ0M7UUFBaEMsY0FBUyxHQUFULFNBQVMsQ0FBdUI7SUFBRyxDQUFDO0lBRWpELEtBQUssQ0FBQyxRQUFRLENBQ25CLE9BQWUsRUFDZixRQUFnQixFQUNoQixjQUErQjtRQUUvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDOUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUUsQ0FBQztZQUNwQyxJQUFJO2dCQUNGLE1BQU0sS0FBSyxHQUFHLE1BQU0sUUFBUSxDQUFDLFFBQVEsQ0FDbkMsT0FBTyxFQUNQLFFBQVEsRUFDUixjQUFjLENBQ2YsQ0FBQztnQkFDRixPQUFPLEtBQUssQ0FBQzthQUNkO1lBQUMsT0FBTyxHQUFHLEVBQUU7Z0JBQ1osR0FBRyxDQUFDLElBQUksQ0FBQyxzREFBc0QsQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUNyRTtTQUNGO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRiJ9
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { ChainId, Token } from '@synthra-swap/sdk-core';
|
|
2
|
-
import { ProviderConfig } from '../provider';
|
|
3
|
-
export interface V2SubgraphPool {
|
|
4
|
-
id: string;
|
|
5
|
-
token0: {
|
|
6
|
-
id: string;
|
|
7
|
-
};
|
|
8
|
-
token1: {
|
|
9
|
-
id: string;
|
|
10
|
-
};
|
|
11
|
-
supply: number;
|
|
12
|
-
reserve: number;
|
|
13
|
-
reserveUSD: number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Provider for getting V2 pools from the Subgraph
|
|
17
|
-
*
|
|
18
|
-
* @export
|
|
19
|
-
* @interface IV2SubgraphProvider
|
|
20
|
-
*/
|
|
21
|
-
export interface IV2SubgraphProvider {
|
|
22
|
-
getPools(tokenIn?: Token, tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
|
|
23
|
-
}
|
|
24
|
-
export declare class V2SubgraphProvider implements IV2SubgraphProvider {
|
|
25
|
-
private chainId;
|
|
26
|
-
private retries;
|
|
27
|
-
private timeout;
|
|
28
|
-
private rollback;
|
|
29
|
-
private pageSize;
|
|
30
|
-
private client;
|
|
31
|
-
constructor(chainId: ChainId, retries?: number, timeout?: number, rollback?: boolean, pageSize?: number);
|
|
32
|
-
getPools(_tokenIn?: Token, _tokenOut?: Token, providerConfig?: ProviderConfig): Promise<V2SubgraphPool[]>;
|
|
33
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import { ChainId } from '@synthra-swap/sdk-core';
|
|
2
|
-
import retry from 'async-retry';
|
|
3
|
-
import Timeout from 'await-timeout';
|
|
4
|
-
import { gql, GraphQLClient } from 'graphql-request';
|
|
5
|
-
import _ from 'lodash';
|
|
6
|
-
import { log } from '../../util/log';
|
|
7
|
-
const SUBGRAPH_URL_BY_CHAIN = {
|
|
8
|
-
[ChainId.MAINNET]: 'https://api.thegraph.com/subgraphs/name/ianlapham/uniswap-v2-dev',
|
|
9
|
-
};
|
|
10
|
-
const threshold = 0.025;
|
|
11
|
-
const PAGE_SIZE = 1000; // 1k is max possible query size from subgraph.
|
|
12
|
-
export class V2SubgraphProvider {
|
|
13
|
-
constructor(chainId, retries = 2, timeout = 360000, rollback = true, pageSize = PAGE_SIZE) {
|
|
14
|
-
this.chainId = chainId;
|
|
15
|
-
this.retries = retries;
|
|
16
|
-
this.timeout = timeout;
|
|
17
|
-
this.rollback = rollback;
|
|
18
|
-
this.pageSize = pageSize;
|
|
19
|
-
const subgraphUrl = SUBGRAPH_URL_BY_CHAIN[this.chainId];
|
|
20
|
-
if (!subgraphUrl) {
|
|
21
|
-
throw new Error(`No subgraph url for chain id: ${this.chainId}`);
|
|
22
|
-
}
|
|
23
|
-
this.client = new GraphQLClient(subgraphUrl);
|
|
24
|
-
}
|
|
25
|
-
async getPools(_tokenIn, _tokenOut, providerConfig) {
|
|
26
|
-
let blockNumber = (providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
27
|
-
? await providerConfig.blockNumber
|
|
28
|
-
: undefined;
|
|
29
|
-
// Due to limitations with the Subgraph API this is the only way to parameterize the query.
|
|
30
|
-
const query2 = gql `
|
|
31
|
-
query getPools($pageSize: Int!, $id: String) {
|
|
32
|
-
pairs(
|
|
33
|
-
first: $pageSize
|
|
34
|
-
${blockNumber ? `block: { number: ${blockNumber} }` : ``}
|
|
35
|
-
where: { id_gt: $id }
|
|
36
|
-
) {
|
|
37
|
-
id
|
|
38
|
-
token0 { id, symbol }
|
|
39
|
-
token1 { id, symbol }
|
|
40
|
-
totalSupply
|
|
41
|
-
trackedReserveETH
|
|
42
|
-
reserveUSD
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
`;
|
|
46
|
-
let pools = [];
|
|
47
|
-
log.info(`Getting V2 pools from the subgraph with page size ${this.pageSize}${(providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber)
|
|
48
|
-
? ` as of block ${providerConfig === null || providerConfig === void 0 ? void 0 : providerConfig.blockNumber}`
|
|
49
|
-
: ''}.`);
|
|
50
|
-
await retry(async () => {
|
|
51
|
-
const timeout = new Timeout();
|
|
52
|
-
const getPools = async () => {
|
|
53
|
-
let lastId = '';
|
|
54
|
-
let pairs = [];
|
|
55
|
-
let pairsPage = [];
|
|
56
|
-
do {
|
|
57
|
-
await retry(async () => {
|
|
58
|
-
const poolsResult = await this.client.request(query2, {
|
|
59
|
-
pageSize: this.pageSize,
|
|
60
|
-
id: lastId,
|
|
61
|
-
});
|
|
62
|
-
pairsPage = poolsResult.pairs;
|
|
63
|
-
pairs = pairs.concat(pairsPage);
|
|
64
|
-
lastId = pairs[pairs.length - 1].id;
|
|
65
|
-
}, {
|
|
66
|
-
retries: this.retries,
|
|
67
|
-
onRetry: (err, retry) => {
|
|
68
|
-
pools = [];
|
|
69
|
-
log.info({ err }, `Failed request for page of pools from subgraph. Retry attempt: ${retry}`);
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
} while (pairsPage.length > 0);
|
|
73
|
-
return pairs;
|
|
74
|
-
};
|
|
75
|
-
/* eslint-disable no-useless-catch */
|
|
76
|
-
try {
|
|
77
|
-
const getPoolsPromise = getPools();
|
|
78
|
-
const timerPromise = timeout.set(this.timeout).then(() => {
|
|
79
|
-
throw new Error(`Timed out getting pools from subgraph: ${this.timeout}`);
|
|
80
|
-
});
|
|
81
|
-
pools = await Promise.race([getPoolsPromise, timerPromise]);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
catch (err) {
|
|
85
|
-
throw err;
|
|
86
|
-
}
|
|
87
|
-
finally {
|
|
88
|
-
timeout.clear();
|
|
89
|
-
}
|
|
90
|
-
/* eslint-enable no-useless-catch */
|
|
91
|
-
}, {
|
|
92
|
-
retries: this.retries,
|
|
93
|
-
onRetry: (err, retry) => {
|
|
94
|
-
if (this.rollback &&
|
|
95
|
-
blockNumber &&
|
|
96
|
-
_.includes(err.message, 'indexed up to')) {
|
|
97
|
-
blockNumber = blockNumber - 10;
|
|
98
|
-
log.info(`Detected subgraph indexing error. Rolled back block number to: ${blockNumber}`);
|
|
99
|
-
}
|
|
100
|
-
pools = [];
|
|
101
|
-
log.info({ err }, `Failed to get pools from subgraph. Retry attempt: ${retry}`);
|
|
102
|
-
},
|
|
103
|
-
});
|
|
104
|
-
// Filter pools that have tracked reserve ETH less than threshold.
|
|
105
|
-
// trackedReserveETH filters pools that do not involve a pool from this allowlist:
|
|
106
|
-
// https://github.com/Uniswap/v2-subgraph/blob/7c82235cad7aee4cfce8ea82f0030af3d224833e/src/mappings/pricing.ts#L43
|
|
107
|
-
// Which helps filter pools with manipulated prices/liquidity.
|
|
108
|
-
// TODO: Remove. Temporary fix to ensure tokens without trackedReserveETH are in the list.
|
|
109
|
-
const FEI = '0x956f47f50a910163d8bf957cf5846d573e7f87ca';
|
|
110
|
-
const poolsSanitized = pools
|
|
111
|
-
.filter((pool) => {
|
|
112
|
-
return (pool.token0.id == FEI ||
|
|
113
|
-
pool.token1.id == FEI ||
|
|
114
|
-
parseFloat(pool.trackedReserveETH) > threshold);
|
|
115
|
-
})
|
|
116
|
-
.map((pool) => {
|
|
117
|
-
return {
|
|
118
|
-
...pool,
|
|
119
|
-
id: pool.id.toLowerCase(),
|
|
120
|
-
token0: {
|
|
121
|
-
id: pool.token0.id.toLowerCase(),
|
|
122
|
-
},
|
|
123
|
-
token1: {
|
|
124
|
-
id: pool.token1.id.toLowerCase(),
|
|
125
|
-
},
|
|
126
|
-
supply: parseFloat(pool.totalSupply),
|
|
127
|
-
reserve: parseFloat(pool.trackedReserveETH),
|
|
128
|
-
reserveUSD: parseFloat(pool.reserveUSD),
|
|
129
|
-
};
|
|
130
|
-
});
|
|
131
|
-
log.info(`Got ${pools.length} V2 pools from the subgraph. ${poolsSanitized.length} after filtering`);
|
|
132
|
-
return poolsSanitized;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViZ3JhcGgtcHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL3YyL3N1YmdyYXBoLXByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssTUFBTSxhQUFhLENBQUM7QUFDaEMsT0FBTyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckQsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQStCckMsTUFBTSxxQkFBcUIsR0FBc0M7SUFDL0QsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQ2Ysa0VBQWtFO0NBQ3JFLENBQUM7QUFFRixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7QUFFeEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLENBQUMsK0NBQStDO0FBZ0J2RSxNQUFNLE9BQU8sa0JBQWtCO0lBRzdCLFlBQ1UsT0FBZ0IsRUFDaEIsVUFBVSxDQUFDLEVBQ1gsVUFBVSxNQUFNLEVBQ2hCLFdBQVcsSUFBSSxFQUNmLFdBQVcsU0FBUztRQUpwQixZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLFlBQU8sR0FBUCxPQUFPLENBQUk7UUFDWCxZQUFPLEdBQVAsT0FBTyxDQUFTO1FBQ2hCLGFBQVEsR0FBUixRQUFRLENBQU87UUFDZixhQUFRLEdBQVIsUUFBUSxDQUFZO1FBRTVCLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FB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
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
import { URISubgraphProvider } from '../uri-subgraph-provider';
|
|
2
|
-
export class V2URISubgraphProvider extends URISubgraphProvider {
|
|
3
|
-
}
|
|
4
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXJpLXN1YmdyYXBoLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Byb3ZpZGVycy92Mi91cmktc3ViZ3JhcGgtcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFJL0QsTUFBTSxPQUFPLHFCQUNYLFNBQVEsbUJBQW1DO0NBQ1YifQ==
|
package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.d.ts
DELETED
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { MixedRouteWithValidQuote } from '../../entities/route-with-valid-quote';
|
|
2
|
-
import { BuildOnChainGasModelFactoryType, IGasModel, IOnChainGasModelFactory } from '../gas-model';
|
|
3
|
-
/**
|
|
4
|
-
* Computes a gas estimate for a mixed route 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 MixedRouteQuoterV1
|
|
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 MixedRouteHeuristicGasModelFactory
|
|
20
|
-
*/
|
|
21
|
-
export declare class MixedRouteHeuristicGasModelFactory extends IOnChainGasModelFactory {
|
|
22
|
-
constructor();
|
|
23
|
-
buildGasModel({ chainId, gasPriceWei, pools, quoteToken, v2poolProvider: V2poolProvider, }: BuildOnChainGasModelFactoryType): Promise<IGasModel<MixedRouteWithValidQuote>>;
|
|
24
|
-
private estimateGas;
|
|
25
|
-
}
|
package/build/module/routers/alpha-router/gas-models/mixedRoute/mixed-route-heuristic-gas-model.js
DELETED
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
-
import { partitionMixedRouteByProtocol } from '@uniswap/router-sdk';
|
|
3
|
-
import { Pair } from '@uniswap/v2-sdk';
|
|
4
|
-
import { Pool } from '@uniswap/v3-sdk';
|
|
5
|
-
import JSBI from 'jsbi';
|
|
6
|
-
import _ from 'lodash';
|
|
7
|
-
import { WRAPPED_NATIVE_CURRENCY } from '../../../..';
|
|
8
|
-
import { log } from '../../../../util';
|
|
9
|
-
import { CurrencyAmount } from '../../../../util/amounts';
|
|
10
|
-
import { getV2NativePool } from '../../../../util/gas-factory-helpers';
|
|
11
|
-
import { IOnChainGasModelFactory, } from '../gas-model';
|
|
12
|
-
import { BASE_SWAP_COST as BASE_SWAP_COST_V2, COST_PER_EXTRA_HOP as COST_PER_EXTRA_HOP_V2, } from '../v2/v2-heuristic-gas-model';
|
|
13
|
-
import { BASE_SWAP_COST, COST_PER_HOP, COST_PER_INIT_TICK, COST_PER_UNINIT_TICK, } from '../v3/gas-costs';
|
|
14
|
-
/**
|
|
15
|
-
* Computes a gas estimate for a mixed route swap using heuristics.
|
|
16
|
-
* Considers number of hops in the route, number of ticks crossed
|
|
17
|
-
* and the typical base cost for a swap.
|
|
18
|
-
*
|
|
19
|
-
* We get the number of ticks crossed in a swap from the MixedRouteQuoterV1
|
|
20
|
-
* contract.
|
|
21
|
-
*
|
|
22
|
-
* We compute gas estimates off-chain because
|
|
23
|
-
* 1/ Calling eth_estimateGas for a swaps requires the caller to have
|
|
24
|
-
* the full balance token being swapped, and approvals.
|
|
25
|
-
* 2/ Tracking gas used using a wrapper contract is not accurate with Multicall
|
|
26
|
-
* due to EIP-2929. We would have to make a request for every swap we wanted to estimate.
|
|
27
|
-
* 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.
|
|
28
|
-
*
|
|
29
|
-
* @export
|
|
30
|
-
* @class MixedRouteHeuristicGasModelFactory
|
|
31
|
-
*/
|
|
32
|
-
export class MixedRouteHeuristicGasModelFactory extends IOnChainGasModelFactory {
|
|
33
|
-
constructor() {
|
|
34
|
-
super();
|
|
35
|
-
}
|
|
36
|
-
async buildGasModel({ chainId, gasPriceWei, pools, quoteToken, v2poolProvider: V2poolProvider, }) {
|
|
37
|
-
const usdPool = pools.usdPool;
|
|
38
|
-
// If our quote token is WETH, we don't need to convert our gas use to be in terms
|
|
39
|
-
// of the quote token in order to produce a gas adjusted amount.
|
|
40
|
-
// We do return a gas use in USD however, so we still convert to usd.
|
|
41
|
-
const nativeCurrency = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
42
|
-
if (quoteToken.equals(nativeCurrency)) {
|
|
43
|
-
const estimateGasCost = (routeWithValidQuote) => {
|
|
44
|
-
const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
45
|
-
const token0 = usdPool.token0.address == nativeCurrency.address;
|
|
46
|
-
const nativeTokenPrice = token0
|
|
47
|
-
? usdPool.token0Price
|
|
48
|
-
: usdPool.token1Price;
|
|
49
|
-
const gasCostInTermsOfUSD = nativeTokenPrice.quote(totalGasCostNativeCurrency);
|
|
50
|
-
return {
|
|
51
|
-
gasEstimate: baseGasUse,
|
|
52
|
-
gasCostInToken: totalGasCostNativeCurrency,
|
|
53
|
-
gasCostInUSD: gasCostInTermsOfUSD,
|
|
54
|
-
};
|
|
55
|
-
};
|
|
56
|
-
return {
|
|
57
|
-
estimateGasCost,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
// If the quote token is not in the native currency, we convert the gas cost to be in terms of the quote token.
|
|
61
|
-
// We do this by getting the highest liquidity <quoteToken>/<nativeCurrency> pool. eg. <quoteToken>/ETH pool.
|
|
62
|
-
const nativeV3Pool = pools.nativeQuoteTokenV3Pool;
|
|
63
|
-
let nativeV2Pool;
|
|
64
|
-
if (V2poolProvider) {
|
|
65
|
-
/// MixedRoutes
|
|
66
|
-
nativeV2Pool = await getV2NativePool(quoteToken, V2poolProvider);
|
|
67
|
-
}
|
|
68
|
-
const usdToken = usdPool.token0.address == nativeCurrency.address
|
|
69
|
-
? usdPool.token1
|
|
70
|
-
: usdPool.token0;
|
|
71
|
-
const estimateGasCost = (routeWithValidQuote) => {
|
|
72
|
-
const { totalGasCostNativeCurrency, baseGasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
73
|
-
if (!nativeV3Pool && !nativeV2Pool) {
|
|
74
|
-
log.info(`Unable to find ${nativeCurrency.symbol} pool with the quote token, ${quoteToken.symbol} to produce gas adjusted costs. Route will not account for gas.`);
|
|
75
|
-
return {
|
|
76
|
-
gasEstimate: baseGasUse,
|
|
77
|
-
gasCostInToken: CurrencyAmount.fromRawAmount(quoteToken, 0),
|
|
78
|
-
gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),
|
|
79
|
-
};
|
|
80
|
-
}
|
|
81
|
-
/// we will use nativeV2Pool for fallback if nativeV3 does not exist or has 0 liquidity
|
|
82
|
-
/// can use ! here because we return above if v3Pool and v2Pool are null
|
|
83
|
-
const nativePool = (!nativeV3Pool || JSBI.equal(nativeV3Pool.liquidity, JSBI.BigInt(0))) &&
|
|
84
|
-
nativeV2Pool
|
|
85
|
-
? nativeV2Pool
|
|
86
|
-
: nativeV3Pool;
|
|
87
|
-
const token0 = nativePool.token0.address == nativeCurrency.address;
|
|
88
|
-
// returns mid price in terms of the native currency (the ratio of quoteToken/nativeToken)
|
|
89
|
-
const nativeTokenPrice = token0
|
|
90
|
-
? nativePool.token0Price
|
|
91
|
-
: nativePool.token1Price;
|
|
92
|
-
let gasCostInTermsOfQuoteToken;
|
|
93
|
-
try {
|
|
94
|
-
// native token is base currency
|
|
95
|
-
gasCostInTermsOfQuoteToken = nativeTokenPrice.quote(totalGasCostNativeCurrency);
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
log.info({
|
|
99
|
-
nativeTokenPriceBase: nativeTokenPrice.baseCurrency,
|
|
100
|
-
nativeTokenPriceQuote: nativeTokenPrice.quoteCurrency,
|
|
101
|
-
gasCostInEth: totalGasCostNativeCurrency.currency,
|
|
102
|
-
}, 'Debug eth price token issue');
|
|
103
|
-
throw err;
|
|
104
|
-
}
|
|
105
|
-
// true if token0 is the native currency
|
|
106
|
-
const token0USDPool = usdPool.token0.address == nativeCurrency.address;
|
|
107
|
-
// gets the mid price of the pool in terms of the native token
|
|
108
|
-
const nativeTokenPriceUSDPool = token0USDPool
|
|
109
|
-
? usdPool.token0Price
|
|
110
|
-
: usdPool.token1Price;
|
|
111
|
-
let gasCostInTermsOfUSD;
|
|
112
|
-
try {
|
|
113
|
-
gasCostInTermsOfUSD = nativeTokenPriceUSDPool.quote(totalGasCostNativeCurrency);
|
|
114
|
-
}
|
|
115
|
-
catch (err) {
|
|
116
|
-
log.info({
|
|
117
|
-
usdT1: usdPool.token0.symbol,
|
|
118
|
-
usdT2: usdPool.token1.symbol,
|
|
119
|
-
gasCostInNativeToken: totalGasCostNativeCurrency.currency.symbol,
|
|
120
|
-
}, 'Failed to compute USD gas price');
|
|
121
|
-
throw err;
|
|
122
|
-
}
|
|
123
|
-
return {
|
|
124
|
-
gasEstimate: baseGasUse,
|
|
125
|
-
gasCostInToken: gasCostInTermsOfQuoteToken,
|
|
126
|
-
gasCostInUSD: gasCostInTermsOfUSD,
|
|
127
|
-
};
|
|
128
|
-
};
|
|
129
|
-
return {
|
|
130
|
-
estimateGasCost: estimateGasCost.bind(this),
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
estimateGas(routeWithValidQuote, gasPriceWei, chainId) {
|
|
134
|
-
const totalInitializedTicksCrossed = BigNumber.from(Math.max(1, _.sum(routeWithValidQuote.initializedTicksCrossedList)));
|
|
135
|
-
/**
|
|
136
|
-
* Since we must make a separate call to multicall for each v3 and v2 section, we will have to
|
|
137
|
-
* add the BASE_SWAP_COST to each section.
|
|
138
|
-
*/
|
|
139
|
-
let baseGasUse = BigNumber.from(0);
|
|
140
|
-
const route = routeWithValidQuote.route;
|
|
141
|
-
const res = partitionMixedRouteByProtocol(route);
|
|
142
|
-
res.map((section) => {
|
|
143
|
-
if (section.every((pool) => pool instanceof Pool)) {
|
|
144
|
-
baseGasUse = baseGasUse.add(BASE_SWAP_COST(chainId));
|
|
145
|
-
baseGasUse = baseGasUse.add(COST_PER_HOP(chainId).mul(section.length));
|
|
146
|
-
}
|
|
147
|
-
else if (section.every((pool) => pool instanceof Pair)) {
|
|
148
|
-
baseGasUse = baseGasUse.add(BASE_SWAP_COST_V2);
|
|
149
|
-
baseGasUse = baseGasUse.add(
|
|
150
|
-
/// same behavior in v2 heuristic gas model factory
|
|
151
|
-
COST_PER_EXTRA_HOP_V2.mul(section.length - 1));
|
|
152
|
-
}
|
|
153
|
-
});
|
|
154
|
-
const tickGasUse = COST_PER_INIT_TICK(chainId).mul(totalInitializedTicksCrossed);
|
|
155
|
-
const uninitializedTickGasUse = COST_PER_UNINIT_TICK.mul(0);
|
|
156
|
-
// base estimate gas used based on chainId estimates for hops and ticks gas useage
|
|
157
|
-
baseGasUse = baseGasUse.add(tickGasUse).add(uninitializedTickGasUse);
|
|
158
|
-
const baseGasCostWei = gasPriceWei.mul(baseGasUse);
|
|
159
|
-
const wrappedCurrency = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
160
|
-
const totalGasCostNativeCurrency = CurrencyAmount.fromRawAmount(wrappedCurrency, baseGasCostWei.toString());
|
|
161
|
-
return {
|
|
162
|
-
totalGasCostNativeCurrency,
|
|
163
|
-
totalInitializedTicksCrossed,
|
|
164
|
-
baseGasUse,
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWl4ZWQtcm91dGUtaGV1cmlzdGljLWdhcy1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yb3V0ZXJzL2FscGhhLXJvdXRlci9nYXMtbW9kZWxzL21peGVkUm91dGUvbWl4ZWQtcm91dGUtaGV1cmlzdGljLWdhcy1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFckQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxDQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXZCLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUV2RSxPQUFPLEVBR0wsdUJBQXVCLEdBQ3hCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCxjQUFjLElBQUksaUJBQWlCLEVBQ25DLGtCQUFrQixJQUFJLHFCQUFxQixHQUM1QyxNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFDTCxjQUFjLEVBQ2QsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixvQkFBb0IsR0FDckIsTUFBTSxpQkFBaUIsQ0FBQztBQUV6Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQU8sa0NBQW1DLFNBQVEsdUJBQXVCO0lBQzdFO1FBQ0UsS0FBSyxF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
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
-
import { V2RouteWithValidQuote } from '../../entities/route-with-valid-quote';
|
|
3
|
-
import { BuildV2GasModelFactoryType, IGasModel, IV2GasModelFactory } from '../gas-model';
|
|
4
|
-
export declare const BASE_SWAP_COST: BigNumber;
|
|
5
|
-
export declare const COST_PER_EXTRA_HOP: BigNumber;
|
|
6
|
-
/**
|
|
7
|
-
* Computes a gas estimate for a V2 swap using heuristics.
|
|
8
|
-
* Considers number of hops in the route and the typical base cost for a swap.
|
|
9
|
-
*
|
|
10
|
-
* We compute gas estimates off-chain because
|
|
11
|
-
* 1/ Calling eth_estimateGas for a swaps requires the caller to have
|
|
12
|
-
* the full balance token being swapped, and approvals.
|
|
13
|
-
* 2/ Tracking gas used using a wrapper contract is not accurate with Multicall
|
|
14
|
-
* due to EIP-2929. We would have to make a request for every swap we wanted to estimate.
|
|
15
|
-
* 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.
|
|
16
|
-
*
|
|
17
|
-
* Note, certain tokens e.g. rebasing/fee-on-transfer, may incur higher gas costs than
|
|
18
|
-
* what we estimate here. This is because they run extra logic on token transfer.
|
|
19
|
-
*
|
|
20
|
-
* @export
|
|
21
|
-
* @class V2HeuristicGasModelFactory
|
|
22
|
-
*/
|
|
23
|
-
export declare class V2HeuristicGasModelFactory extends IV2GasModelFactory {
|
|
24
|
-
constructor();
|
|
25
|
-
buildGasModel({ chainId, gasPriceWei, poolProvider, token, }: BuildV2GasModelFactoryType): Promise<IGasModel<V2RouteWithValidQuote>>;
|
|
26
|
-
private estimateGas;
|
|
27
|
-
private getEthPool;
|
|
28
|
-
private getHighestLiquidityUSDPool;
|
|
29
|
-
}
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
import { BigNumber } from '@ethersproject/bignumber';
|
|
2
|
-
import _ from 'lodash';
|
|
3
|
-
import { log, WRAPPED_NATIVE_CURRENCY } from '../../../../util';
|
|
4
|
-
import { CurrencyAmount } from '../../../../util/amounts';
|
|
5
|
-
import { IV2GasModelFactory, usdGasTokensByChain, } from '../gas-model';
|
|
6
|
-
// Constant cost for doing any swap regardless of pools.
|
|
7
|
-
export const BASE_SWAP_COST = BigNumber.from(135000); // 115000, bumped up by 20_000 @eric 7/8/2022
|
|
8
|
-
// Constant per extra hop in the route.
|
|
9
|
-
export const COST_PER_EXTRA_HOP = BigNumber.from(50000); // 20000, bumped up by 30_000 @eric 7/8/2022
|
|
10
|
-
/**
|
|
11
|
-
* Computes a gas estimate for a V2 swap using heuristics.
|
|
12
|
-
* Considers number of hops in the route and the typical base cost for a swap.
|
|
13
|
-
*
|
|
14
|
-
* We compute gas estimates off-chain because
|
|
15
|
-
* 1/ Calling eth_estimateGas for a swaps requires the caller to have
|
|
16
|
-
* the full balance token being swapped, and approvals.
|
|
17
|
-
* 2/ Tracking gas used using a wrapper contract is not accurate with Multicall
|
|
18
|
-
* due to EIP-2929. We would have to make a request for every swap we wanted to estimate.
|
|
19
|
-
* 3/ For V2 we simulate all our swaps off-chain so have no way to track gas used.
|
|
20
|
-
*
|
|
21
|
-
* Note, certain tokens e.g. rebasing/fee-on-transfer, may incur higher gas costs than
|
|
22
|
-
* what we estimate here. This is because they run extra logic on token transfer.
|
|
23
|
-
*
|
|
24
|
-
* @export
|
|
25
|
-
* @class V2HeuristicGasModelFactory
|
|
26
|
-
*/
|
|
27
|
-
export class V2HeuristicGasModelFactory extends IV2GasModelFactory {
|
|
28
|
-
constructor() {
|
|
29
|
-
super();
|
|
30
|
-
}
|
|
31
|
-
async buildGasModel({ chainId, gasPriceWei, poolProvider, token, }) {
|
|
32
|
-
if (token.equals(WRAPPED_NATIVE_CURRENCY[chainId])) {
|
|
33
|
-
const usdPool = await this.getHighestLiquidityUSDPool(chainId, poolProvider);
|
|
34
|
-
return {
|
|
35
|
-
estimateGasCost: (routeWithValidQuote) => {
|
|
36
|
-
const { gasCostInEth, gasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
37
|
-
const ethToken0 = usdPool.token0.address == WRAPPED_NATIVE_CURRENCY[chainId].address;
|
|
38
|
-
const ethTokenPrice = ethToken0
|
|
39
|
-
? usdPool.token0Price
|
|
40
|
-
: usdPool.token1Price;
|
|
41
|
-
const gasCostInTermsOfUSD = ethTokenPrice.quote(gasCostInEth);
|
|
42
|
-
return {
|
|
43
|
-
gasEstimate: gasUse,
|
|
44
|
-
gasCostInToken: gasCostInEth,
|
|
45
|
-
gasCostInUSD: gasCostInTermsOfUSD,
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
// If the quote token is not WETH, we convert the gas cost to be in terms of the quote token.
|
|
51
|
-
// We do this by getting the highest liquidity <token>/ETH pool.
|
|
52
|
-
const ethPool = await this.getEthPool(chainId, token, poolProvider);
|
|
53
|
-
if (!ethPool) {
|
|
54
|
-
log.info('Unable to find ETH pool with the quote token to produce gas adjusted costs. Route will not account for gas.');
|
|
55
|
-
}
|
|
56
|
-
const usdPool = await this.getHighestLiquidityUSDPool(chainId, poolProvider);
|
|
57
|
-
return {
|
|
58
|
-
estimateGasCost: (routeWithValidQuote) => {
|
|
59
|
-
const usdToken = usdPool.token0.address == WRAPPED_NATIVE_CURRENCY[chainId].address
|
|
60
|
-
? usdPool.token1
|
|
61
|
-
: usdPool.token0;
|
|
62
|
-
const { gasCostInEth, gasUse } = this.estimateGas(routeWithValidQuote, gasPriceWei, chainId);
|
|
63
|
-
if (!ethPool) {
|
|
64
|
-
return {
|
|
65
|
-
gasEstimate: gasUse,
|
|
66
|
-
gasCostInToken: CurrencyAmount.fromRawAmount(token, 0),
|
|
67
|
-
gasCostInUSD: CurrencyAmount.fromRawAmount(usdToken, 0),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
const ethToken0 = ethPool.token0.address == WRAPPED_NATIVE_CURRENCY[chainId].address;
|
|
71
|
-
const ethTokenPrice = ethToken0
|
|
72
|
-
? ethPool.token0Price
|
|
73
|
-
: ethPool.token1Price;
|
|
74
|
-
let gasCostInTermsOfQuoteToken;
|
|
75
|
-
try {
|
|
76
|
-
gasCostInTermsOfQuoteToken = ethTokenPrice.quote(gasCostInEth);
|
|
77
|
-
}
|
|
78
|
-
catch (err) {
|
|
79
|
-
log.error({
|
|
80
|
-
ethTokenPriceBase: ethTokenPrice.baseCurrency,
|
|
81
|
-
ethTokenPriceQuote: ethTokenPrice.quoteCurrency,
|
|
82
|
-
gasCostInEth: gasCostInEth.currency,
|
|
83
|
-
}, 'Debug eth price token issue');
|
|
84
|
-
throw err;
|
|
85
|
-
}
|
|
86
|
-
const ethToken0USDPool = usdPool.token0.address == WRAPPED_NATIVE_CURRENCY[chainId].address;
|
|
87
|
-
const ethTokenPriceUSDPool = ethToken0USDPool
|
|
88
|
-
? usdPool.token0Price
|
|
89
|
-
: usdPool.token1Price;
|
|
90
|
-
let gasCostInTermsOfUSD;
|
|
91
|
-
try {
|
|
92
|
-
gasCostInTermsOfUSD = ethTokenPriceUSDPool.quote(gasCostInEth);
|
|
93
|
-
}
|
|
94
|
-
catch (err) {
|
|
95
|
-
log.error({
|
|
96
|
-
usdT1: usdPool.token0.symbol,
|
|
97
|
-
usdT2: usdPool.token1.symbol,
|
|
98
|
-
gasCostInEthToken: gasCostInEth.currency.symbol,
|
|
99
|
-
}, 'Failed to compute USD gas price');
|
|
100
|
-
throw err;
|
|
101
|
-
}
|
|
102
|
-
return {
|
|
103
|
-
gasEstimate: gasUse,
|
|
104
|
-
gasCostInToken: gasCostInTermsOfQuoteToken,
|
|
105
|
-
gasCostInUSD: gasCostInTermsOfUSD,
|
|
106
|
-
};
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
estimateGas(routeWithValidQuote, gasPriceWei, chainId) {
|
|
111
|
-
const hops = routeWithValidQuote.route.pairs.length;
|
|
112
|
-
const gasUse = BASE_SWAP_COST.add(COST_PER_EXTRA_HOP.mul(hops - 1));
|
|
113
|
-
const totalGasCostWei = gasPriceWei.mul(gasUse);
|
|
114
|
-
const weth = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
115
|
-
const gasCostInEth = CurrencyAmount.fromRawAmount(weth, totalGasCostWei.toString());
|
|
116
|
-
return { gasCostInEth, gasUse };
|
|
117
|
-
}
|
|
118
|
-
async getEthPool(chainId, token, poolProvider) {
|
|
119
|
-
const weth = WRAPPED_NATIVE_CURRENCY[chainId];
|
|
120
|
-
const poolAccessor = await poolProvider.getPools([[weth, token]]);
|
|
121
|
-
const pool = poolAccessor.getPool(weth, token);
|
|
122
|
-
if (!pool || pool.reserve0.equalTo(0) || pool.reserve1.equalTo(0)) {
|
|
123
|
-
log.error({
|
|
124
|
-
weth,
|
|
125
|
-
token,
|
|
126
|
-
reserve0: pool === null || pool === void 0 ? void 0 : pool.reserve0.toExact(),
|
|
127
|
-
reserve1: pool === null || pool === void 0 ? void 0 : pool.reserve1.toExact(),
|
|
128
|
-
}, `Could not find a valid WETH pool with ${token.symbol} for computing gas costs.`);
|
|
129
|
-
return null;
|
|
130
|
-
}
|
|
131
|
-
return pool;
|
|
132
|
-
}
|
|
133
|
-
async getHighestLiquidityUSDPool(chainId, poolProvider) {
|
|
134
|
-
const usdTokens = usdGasTokensByChain[chainId];
|
|
135
|
-
if (!usdTokens) {
|
|
136
|
-
throw new Error(`Could not find a USD token for computing gas costs on ${chainId}`);
|
|
137
|
-
}
|
|
138
|
-
const usdPools = _.map(usdTokens, (usdToken) => [
|
|
139
|
-
usdToken,
|
|
140
|
-
WRAPPED_NATIVE_CURRENCY[chainId],
|
|
141
|
-
]);
|
|
142
|
-
const poolAccessor = await poolProvider.getPools(usdPools);
|
|
143
|
-
const poolsRaw = poolAccessor.getAllPools();
|
|
144
|
-
const pools = _.filter(poolsRaw, (pool) => pool.reserve0.greaterThan(0) && pool.reserve1.greaterThan(0));
|
|
145
|
-
if (pools.length == 0) {
|
|
146
|
-
log.error({ pools }, `Could not find a USD/WETH pool for computing gas costs.`);
|
|
147
|
-
throw new Error(`Can't find USD/WETH pool for computing gas costs.`);
|
|
148
|
-
}
|
|
149
|
-
const maxPool = _.maxBy(pools, (pool) => {
|
|
150
|
-
if (pool.token0.equals(WRAPPED_NATIVE_CURRENCY[chainId])) {
|
|
151
|
-
return parseFloat(pool.reserve0.toSignificant(2));
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
return parseFloat(pool.reserve1.toSignificant(2));
|
|
155
|
-
}
|
|
156
|
-
});
|
|
157
|
-
return maxPool;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidjItaGV1cmlzdGljLWdhcy1tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9yb3V0ZXJzL2FscGhhLXJvdXRlci9nYXMtbW9kZWxzL3YyL3YyLWhldXJpc3RpYy1nYXMtbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBR3JELE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUd2QixPQUFPLEVBQUUsR0FBRyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRTFELE9BQU8sRUFHTCxrQkFBa0IsRUFDbEIsbUJBQW1CLEdBQ3BCLE1BQU0sY0FBYyxDQUFDO0FBRXRCLHdEQUF3RDtBQUN4RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLDZDQUE2QztBQUVuRyx1Q0FBdUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLDRDQUE0QztBQUVyRzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQU0sT0FBTywwQkFBMkIsU0FBUSxrQkFBa0I7SUFDaEU7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYSxDQUFDLEVBQ3pCLE9BQU8sRUFDUCxXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssR0FDc0I7UUFDM0IsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLE9BQU8sQ0FBRSxDQUFDLEVBQUU7WUFDbkQsTUFBTSxPQUFPLEdBQVMsTUFBTSxJQUFJLENBQUMsMEJBQTBCLENBQ3pELE9BQU8sRUFDUCxZQUFZLENBQ2IsQ0FB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
|