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 } from './utils'; export type Quote = { consumedAmount: bigint; calculatedAmount: bigint; gasConsumed: number; skipAhead: number; } & (StateAfter extends undefined ? {} : { stateAfter: StateAfter; }); export interface PoolKeyed { key: PoolKey; } export interface IEkuboPool extends PoolKeyed { 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 { private readonly iface; private readonly handlers; constructor(iface: Interface, handlers: Record>); parseLog(log: Readonly, oldState: DeepReadonly, blockHeader: Readonly): DeepReadonly | null; } export declare abstract class EkuboPool extends StatefulEventSubscriber implements IEkuboPool { readonly key: PoolKey; private readonly namedEventHandlers; private readonly anonymousEventHandlers; protected constructor(parentName: string, dexHelper: IDexHelper, logger: Logger, key: PoolKey, namedEventHandlers: Record>, anonymousEventHandlers: Record>); updateState(blockNumber: number): Promise; /** * 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; quote(amount: bigint, token: bigint, blockNumber: number): Quote; protected abstract _quote(amount: bigint, isToken1: boolean, state: DeepReadonly, sqrtRatioLimit?: bigint): Quote; computeTvl(): [bigint, bigint]; protected abstract _computeTvl(state: DeepReadonly): [bigint, bigint]; }