From f59f66c63ddabc1b0fa4538b57970c419f03702a Mon Sep 17 00:00:00 2001 From: rouzwelt Date: Fri, 10 May 2024 01:08:49 +0000 Subject: [PATCH] init --- packages/sushi/src/router/data-fetcher.ts | 13 ++- packages/sushi/src/router/index.ts | 1 + .../liquidity-providers/CurveProvider.ts | 18 ++-- .../src/router/liquidity-providers/Trident.ts | 87 ++++++++++--------- .../liquidity-providers/UniswapV2Base.ts | 23 +++-- .../liquidity-providers/UniswapV3Base.ts | 39 ++++----- .../src/router/static-pool-fetcher/Trident.ts | 17 ++-- 7 files changed, 99 insertions(+), 99 deletions(-) diff --git a/packages/sushi/src/router/data-fetcher.ts b/packages/sushi/src/router/data-fetcher.ts index e5c76bcbd9..7747e95dc5 100644 --- a/packages/sushi/src/router/data-fetcher.ts +++ b/packages/sushi/src/router/data-fetcher.ts @@ -1,4 +1,9 @@ -import { http, PublicClient, createPublicClient } from 'viem' +import { + http, + MulticallParameters, + PublicClient, + createPublicClient, +} from 'viem' import { ChainId, TestnetChainId } from '../chain/index.js' import { publicClientConfig } from '../config/index.js' import { Type } from '../currency/index.js' @@ -60,8 +65,10 @@ export type DataFetcherOptions = { * price, etc of a certain block */ blockNumber?: bigint - /** Determines if memoizer should be used or not */ - memoize?: boolean + /** The multicall memoizer function, must be initiated from a viem client multicall method */ + multicallMemoizer?: ( + args: MulticallParameters, + ) => Promise> /** Determines a timeout (in ms) for fetching pools for a token pair */ fetchPoolsTimeout?: number } diff --git a/packages/sushi/src/router/index.ts b/packages/sushi/src/router/index.ts index b932bd8576..bb1cff0a3c 100644 --- a/packages/sushi/src/router/index.ts +++ b/packages/sushi/src/router/index.ts @@ -9,3 +9,4 @@ export * from './tines-to-route-processor-2.js' export * from './tines-to-route-processor-4.js' export * from './PoolBinarySerialization.js' export * from './Sankey.AnyChart.js' +export * from './memoizer.js' diff --git a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts index 4c80ac4bec..c87e6126b3 100644 --- a/packages/sushi/src/router/liquidity-providers/CurveProvider.ts +++ b/packages/sushi/src/router/liquidity-providers/CurveProvider.ts @@ -20,7 +20,6 @@ import { Native, Token, Type } from '../../currency/index.js' import { RToken, createCurvePoolsForMultipool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { CurvePoolCode } from '../pool-codes/CurvePool.js' import { PoolCode } from '../pool-codes/PoolCode.js' import { LiquidityProvider, LiquidityProviders } from './LiquidityProvider.js' @@ -386,8 +385,6 @@ export class CurveProvider extends LiquidityProvider { const pools: Map = new Map() let currencyCombinations = getCurrencyCombinations(this.chainId, t0, t1) - const multicallMemoize = await memoizer.fn(this.client.multicall) - for (let i = 0; currencyCombinations.length > 0; ++i) { const calls = (CURVE_FACTORY_ADDRESSES[this.chainId] ?? []).flatMap( (factory) => @@ -421,8 +418,8 @@ export class CurveProvider extends LiquidityProvider { result?: undefined status: 'failure' } - )[] = options?.memoize - ? ((await multicallMemoize(newfoundPoolsData)) as any) + )[] = options?.multicallMemoizer + ? ((await options.multicallMemoizer(newfoundPoolsData)) as any) : await this.client.multicall(newfoundPoolsData) newFoundPools.forEach((pool, i) => { @@ -454,8 +451,6 @@ export class CurveProvider extends LiquidityProvider { options?: DataFetcherOptions, ): Promise<(number[] | undefined)[]> { if (this.chainId === ChainId.ETHEREUM) { - const multicallMemoize = await memoizer.fn(this.client.multicall) - const ratiosData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', @@ -494,8 +489,8 @@ export class CurveProvider extends LiquidityProvider { }, ], } as any - const ratios = options?.memoize - ? ((await multicallMemoize(ratiosData)) as any) + const ratios = options?.multicallMemoizer + ? ((await options.multicallMemoizer(ratiosData)) as any) : await this.client.multicall(ratiosData) return pools.map(([poolAddress]) => { @@ -543,7 +538,6 @@ export class CurveProvider extends LiquidityProvider { T >['args'], ) => { - const multicallMemoize = await memoizer.fn(this.client.multicall) const data = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as '0x${string}', @@ -557,8 +551,8 @@ export class CurveProvider extends LiquidityProvider { args, })) as any, } as any - return options?.memoize - ? (multicallMemoize(data) as any) + return options?.multicallMemoizer + ? (options.multicallMemoizer(data) as any) : this.client.multicall(data) } // const poolContract = getContract({ diff --git a/packages/sushi/src/router/liquidity-providers/Trident.ts b/packages/sushi/src/router/liquidity-providers/Trident.ts index 267b3ecb2c..6f7c3d06fa 100644 --- a/packages/sushi/src/router/liquidity-providers/Trident.ts +++ b/packages/sushi/src/router/liquidity-providers/Trident.ts @@ -30,7 +30,6 @@ import { filterTopPools, mapToken, } from '../lib/api.js' -import { memoizer } from '../memoizer.js' import { BentoBridgePoolCode, BentoPoolCode, @@ -727,8 +726,6 @@ export class TridentProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall) - const classicReservesPromiseData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -744,17 +741,17 @@ export class TridentProvider extends LiquidityProvider { }) as const, ), } - const classicReservePromise = options?.memoize - ? (multicallMemoize(classicReservesPromiseData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, - ) + const classicReservePromise = options?.multicallMemoizer + ? ( + options.multicallMemoizer(classicReservesPromiseData) as Promise + ).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) : this.client.multicall(classicReservesPromiseData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -779,17 +776,17 @@ export class TridentProvider extends LiquidityProvider { }) as const, ), } - const stableReservePromise = options?.memoize - ? (multicallMemoize(stableReservePromiseData) as Promise).catch( - (e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }, - ) + const stableReservePromise = options?.multicallMemoizer + ? ( + options.multicallMemoizer(stableReservePromiseData) as Promise + ).catch((e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }) : this.client.multicall(stableReservePromiseData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -815,15 +812,17 @@ export class TridentProvider extends LiquidityProvider { }) as const, ), } - const totalsPromise = options?.memoize - ? (multicallMemoize(totalsPromiseData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const totalsPromise = options?.multicallMemoizer + ? (options.multicallMemoizer(totalsPromiseData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, + ) : this.client.multicall(totalsPromiseData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ @@ -849,15 +848,17 @@ export class TridentProvider extends LiquidityProvider { }) as const, ), } - const balancesPromise = options?.memoize - ? (multicallMemoize(balancesPromiseData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const balancesPromise = options?.multicallMemoizer + ? (options.multicallMemoizer(balancesPromiseData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, + ) : this.client.multicall(balancesPromiseData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: multicall failed, message: ${ diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts index 2c532e5b67..048223795b 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV2Base.ts @@ -17,7 +17,6 @@ import { filterTopPools, mapToken, } from '../lib/api.js' -import { memoizer } from '../memoizer.js' import { ConstantProductPoolCode, type PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' @@ -223,8 +222,6 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { } }) - const multicallMemoize = await memoizer.fn(this.client.multicall) - const multicallData = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -240,15 +237,17 @@ export abstract class UniswapV2BaseProvider extends LiquidityProvider { }) as const, ), } - const reserves = options?.memoize - ? await (multicallMemoize(multicallData) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const reserves = options?.multicallMemoizer + ? await (options.multicallMemoizer(multicallData) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, + ) : await this.client.multicall(multicallData).catch((e) => { console.warn( `${this.getLogPrefix()} - UPDATE: on-demand pools multicall failed, message: ${ diff --git a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts index fa356b5436..35bc70dab5 100644 --- a/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts +++ b/packages/sushi/src/router/liquidity-providers/UniswapV3Base.ts @@ -7,7 +7,6 @@ import { computeSushiSwapV3PoolAddress } from '../../pool/index.js' import { RToken, UniV3Pool } from '../../tines/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' import { type PoolCode, UniV3PoolCode } from '../pool-codes/index.js' import { LiquidityProvider } from './LiquidityProvider.js' @@ -86,8 +85,6 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { if (excludePools) staticPools = staticPools.filter((p) => !excludePools.has(p.address)) - const multicallMemoize = await memoizer.fn(this.client.multicall) - const slot0Data = { multicallAddress: this.client.chain?.contracts?.multicall3 ?.address as Address, @@ -139,15 +136,17 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { }) as const, ), } - const slot0 = options?.memoize - ? await (multicallMemoize(slot0Data) as Promise).catch((e) => { - console.warn( - `${this.getLogPrefix()} - INIT: multicall failed, message: ${ - e.message - }`, - ) - return undefined - }) + const slot0 = options?.multicallMemoizer + ? await (options.multicallMemoizer(slot0Data) as Promise).catch( + (e) => { + console.warn( + `${this.getLogPrefix()} - INIT: multicall failed, message: ${ + e.message + }`, + ) + return undefined + }, + ) : await this.client.multicall(slot0Data).catch((e) => { console.warn( `${this.getLogPrefix()} - INIT: multicall failed, message: ${ @@ -214,8 +213,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { status: 'failure' } )[] - > = options?.memoize - ? (multicallMemoize(liquidityContractsData) as Promise) + > = options?.multicallMemoizer + ? (options.multicallMemoizer(liquidityContractsData) as Promise) : this.client.multicall(liquidityContractsData) const token0ContractsData = { @@ -247,8 +246,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { status: 'success' } )[] - > = options?.memoize - ? (multicallMemoize(token0ContractsData) as Promise) + > = options?.multicallMemoizer + ? (options.multicallMemoizer(token0ContractsData) as Promise) : this.client.multicall(token0ContractsData) const token1ContractsData = { @@ -280,8 +279,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { status: 'failure' } )[] - > = options?.memoize - ? (multicallMemoize(token1ContractsData) as Promise) + > = options?.multicallMemoizer + ? (options.multicallMemoizer(token1ContractsData) as Promise) : this.client.multicall(token1ContractsData) const minIndexes = existingPools.map((pool) => @@ -341,8 +340,8 @@ export abstract class UniswapV3BaseProvider extends LiquidityProvider { status: 'failure' } )[] - > = options?.memoize - ? (multicallMemoize(ticksContractsData) as Promise) + > = options?.multicallMemoizer + ? (options.multicallMemoizer(ticksContractsData) as Promise) : this.client.multicall(ticksContractsData) const [liquidityResults, token0Balances, token1Balances, tickResults] = diff --git a/packages/sushi/src/router/static-pool-fetcher/Trident.ts b/packages/sushi/src/router/static-pool-fetcher/Trident.ts index 80dd95d61a..3a32ad6107 100644 --- a/packages/sushi/src/router/static-pool-fetcher/Trident.ts +++ b/packages/sushi/src/router/static-pool-fetcher/Trident.ts @@ -13,7 +13,6 @@ import { import { Currency, Token } from '../../currency/index.js' import { DataFetcherOptions } from '../data-fetcher.js' import { getCurrencyCombinations } from '../get-currency-combinations.js' -import { memoizer } from '../memoizer.js' export interface TridentStaticPool { address: Address @@ -63,8 +62,6 @@ export class TridentStaticPoolFetcher { chainId as TridentChainId ] as Address) - const multicallMemoize = await memoizer.fn(client.multicall) - const callStatePoolsCountData = { multicallAddress: client.chain?.contracts?.multicall3?.address as Address, allowFailure: true, @@ -91,8 +88,10 @@ export class TridentStaticPoolFetcher { result?: undefined status: 'failure' } - )[] = options?.memoize - ? await (multicallMemoize(callStatePoolsCountData) as Promise) + )[] = options?.multicallMemoizer + ? await (options.multicallMemoizer( + callStatePoolsCountData, + ) as Promise) : await client.multicall(callStatePoolsCountData) const callStatePoolsCountProcessed = callStatePoolsCount @@ -151,8 +150,8 @@ export class TridentStaticPoolFetcher { result?: undefined status: 'failure' } - )[] = options?.memoize - ? await (multicallMemoize(callStatePoolsData) as Promise) + )[] = options?.multicallMemoizer + ? await (options.multicallMemoizer(callStatePoolsData) as Promise) : await client.multicall(callStatePoolsData) const pools: TridentStaticPool[] = [] @@ -195,8 +194,8 @@ export class TridentStaticPoolFetcher { result?: undefined status: 'failure' } - )[] = options?.memoize - ? await (multicallMemoize(feesData) as Promise) + )[] = options?.multicallMemoizer + ? await (options.multicallMemoizer(feesData) as Promise) : await client.multicall(feesData) const results: TridentStaticPool[] = []