import { Interface, Result } from '@ethersproject/abi'; import { Logger } from 'log4js'; import { DeepReadonly } from 'ts-essentials'; import { IDexHelper } from '../../../dex-helper/idex-helper'; import { StatefulEventSubscriber } from '../../../stateful-event-subscriber'; import { BlockHeader, Log } from '../../../types'; import { PoolKey, PoolTypeConfig, SwappedEvent } from './utils'; import { EventSubscriber } from '../../../dex-helper'; export type Quote = { consumedAmount: bigint; calculatedAmount: bigint; gasConsumed: number; skipAhead: number; } & (StateAfter extends undefined ? {} : { stateAfter: StateAfter; }); export interface IEkuboPool extends EventSubscriber { key: PoolKey; initializationBlockNumber(): number; quote(amount: bigint, token: bigint, blockNumber: number): Quote; updateState(blockNumber: number): Promise; computeTvl(): [bigint, bigint]; } export type NamedEventHandler = (args: Result, oldState: DeepReadonly, blockHeader: Readonly) => DeepReadonly | null; export type AnonymousEventHandler = (data: string, oldState: DeepReadonly, blockHeader: Readonly) => DeepReadonly | null; export declare class NamedEventHandlers { readonly iface: Interface; readonly handlers: Record>; constructor(iface: Interface, handlers: Record>); parseLog(log: Readonly, oldState: DeepReadonly, blockHeader: Readonly): DeepReadonly | null; } export declare abstract class EkuboPool extends StatefulEventSubscriber implements IEkuboPool { private readonly initBlockNumber; readonly key: PoolKey; protected constructor(parentName: string, dexHelper: IDexHelper, logger: Logger, initBlockNumber: number, key: PoolKey, coreAddress: string, coreIface: Interface, extraNamedEventHandlers?: Record>, extraAnonymousEventHandlers?: Record>); private readonly namedEventHandlers; private readonly anonymousEventHandlers; initializationBlockNumber(): number; updateState(blockNumber: number): Promise; quote(amount: bigint, token: bigint, blockNumber: number): Quote; computeTvl(): [bigint, bigint]; /** * The function is called every time any of the subscribed * addresses release log. The function accepts the current * state, updates the state according to the log, and returns * the updated state. * @param state - Current state of event subscriber * @param log - Log released by one of the subscribed addresses * @returns Updates state of the event subscriber after the log */ protected processLog(state: DeepReadonly, log: Readonly, blockHeader: Readonly): DeepReadonly | null; protected abstract _quote(amount: bigint, isToken1: boolean, state: DeepReadonly, sqrtRatioLimit?: bigint): Quote; protected abstract _computeTvl(state: DeepReadonly): [bigint, bigint]; protected abstract handlePositionUpdated(args: Result, oldState: DeepReadonly): DeepReadonly | null; protected abstract handleSwappedEvent(ev: SwappedEvent, oldState: DeepReadonly): DeepReadonly | null; }