import { AsyncOrSync } from 'ts-essentials'; import { Address, SimpleExchangeParam, AdapterExchangeParam, DexExchangeParam, TxInfo, NumberAsString, Token, ExchangePrices, PoolPrices, PoolLiquidity, OptimalSwapExchange, ExchangeTxInfo, PreprocessTransactionOptions, TransferFeeParams, Config } from '../types'; import { SwapSide, Network } from '../constants'; import { IDexHelper } from '../dex-helper/idex-helper'; import { OptimalRate, OptimalSwap } from '@paraswap/core'; export type Context = { isGlobalSrcToken: boolean; isGlobalDestToken: boolean; }; export type NeedWrapNativeFunc = (priceRoute: OptimalRate, swap: OptimalSwap, se: OptimalSwapExchange) => boolean; export interface IDexTxBuilderV5 { getAdapterParam(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, // required for buy case data: ExchangeData, side: SwapSide): AdapterExchangeParam; getSimpleParam?(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, data: ExchangeData, side: SwapSide): AsyncOrSync; getDirectParam?(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, expectedAmount: NumberAsString, data: ExchangeData, side: SwapSide, permit: string, uuid: string, feePercent: NumberAsString, deadline: NumberAsString, partner: string, beneficiary: string, contractMethod: string): TxInfo; } export interface IDexTxBuilderV6 { getDexParam?(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, recipient: Address, data: ExchangeData, side: SwapSide, context: Context, executorAddress: Address): AsyncOrSync; getDirectParamV6?(srcToken: Address, destToken: Address, fromAmount: NumberAsString, toAmount: NumberAsString, quotedAmount: NumberAsString, data: ExchangeData, side: SwapSide, permit: string, uuid: string, partnerAndFee: string, beneficiary: string, blockNumber: number, contractMethod: string): TxInfo; } export interface IDexTxBuilder extends IDexTxBuilderV5, IDexTxBuilderV6 { needWrapNative: boolean | NeedWrapNativeFunc; needsSequentialPreprocessing?: boolean; getNetworkFee?(srcToken: Address, destToken: Address, srcAmount: NumberAsString, destAmount: NumberAsString, data: ExchangeData, side: SwapSide): NumberAsString; preProcessTransaction?(optimalSwapExchange: OptimalSwapExchange, srcToken: Token, destToken: Token, side: SwapSide, options: PreprocessTransactionOptions): AsyncOrSync<[OptimalSwapExchange, ExchangeTxInfo]>; } export interface IDexWithBlacklist { hasBlacklist(): this is IDexWithBlacklist; isBlacklisted(address: string): Promise; getBlacklistedCacheKey(address: string): string; } export interface IDexWithRestriction { hasDexRestriction(): this is IDexWithRestriction; isRestricted(): Promise; getRestrictedCacheKey(): string; } export interface IDexWithPairRestriction { hasPairRestriction(): this is IDexWithPairRestriction; isRestrictedPair(token0: string, token1: string): Promise; getRestrictedPairCacheKey(token0: string, token1: string): string; } export interface IDexPricing { readonly dexKey: string; readonly hasConstantPriceLargeAmounts: boolean; readonly isFeeOnTransferSupported: boolean; readonly cacheStateKey: string; readonly isStatePollingDex?: boolean; getPoolIdentifiers(srcToken: Token, destToken: Token, side: SwapSide, blockNumber: number): Promise; getPricesVolume(srcToken: Token, destToken: Token, amounts: bigint[], side: SwapSide, blockNumber: number, limitPools?: string[], transferFees?: TransferFeeParams, isFirstSwap?: boolean): Promise | null>; getCalldataGasCost(poolPrices: PoolPrices): number | number[]; initializePricing?(blockNumber: number): AsyncOrSync; getAdapters(side: SwapSide): { name: string; index: number; }[] | null; releaseResources?(): AsyncOrSync; addMasterPool?(poolKey: string, blockNumber: number): AsyncOrSync; hasDexRestriction?(): this is IDexWithRestriction; hasPairRestriction?(): this is IDexWithPairRestriction; hasBlacklist?(): this is IDexWithBlacklist; minUsdTradeValue?(): number | null; } export interface IDexPooltracker { updatePoolState?(): AsyncOrSync; getTopPoolsForToken(tokenAddress: Address, limit: number): AsyncOrSync; } export interface IDex extends IDexTxBuilder, IDexPricing, IDexPooltracker { } export interface DexConstructor { new (network: Network, dexKey: string, dexHelper: IDexHelper): IDex; dexKeysWithNetwork?: { key: string; networks: Network[]; }[]; builderDexKeysWithNetwork?(dexHelper: Config): void; } export type IRouteOptimizer = (formaterRate: T) => T;