import { MerkleTree, MerkleTreeJson } from '../../merkle-tree';
import { AccessTokenEvent } from '../../../types';
import { AbstractSnapshotService, Snapshot } from './AbstractSnapshotService';
import { BlockchainEventEmitter } from './BlockchainEventEmitter';
import { BlockchainEvent } from '../../BlockchainEvent/BlockchainEvent';
export type SenderAddressIndexMapJson = {
    address: string;
    index: number;
}[];
export type AccessTokenSnapshotPayload = {
    readonly merkleTree: MerkleTree<bigint>;
    readonly senderAddresses: string[];
    readonly senderAddressIndexMap: Map<string, number>;
};
export type AccessTokenSerializedSnapshot = {
    latestBlockNumber?: number;
    merkleTree?: MerkleTreeJson;
    senderAddresses?: string[];
    senderAddressIndexMap?: SenderAddressIndexMapJson;
};
export declare abstract class AbstractAccessTokenSnapshotService extends AbstractSnapshotService<AccessTokenEvent<bigint>, AccessTokenSnapshotPayload, AccessTokenSerializedSnapshot> {
    constructor(accessTokenEventFetcher: BlockchainEventEmitter);
    private _merkleTree;
    private _senderAddresses;
    private _senderAddressIndexMap;
    get merkleTree(): MerkleTree<bigint>;
    get senderAddresses(): string[];
    get senderAddressIndexMap(): Map<string, number>;
    protected serializeSnapshot(snapshot: Snapshot<AccessTokenSnapshotPayload>): AccessTokenSerializedSnapshot;
    protected deserializeSnapshot(serializedSnapshot: AccessTokenSerializedSnapshot): Snapshot<AccessTokenSnapshotPayload>;
    protected acceptEvent(event: AccessTokenEvent<bigint>, _blockNumber: number): boolean;
    protected mapEvent(event: BlockchainEvent): AccessTokenEvent<bigint>;
    protected getSnapshotPayload(): AccessTokenSnapshotPayload;
    protected populateSnapshot({ payload: { merkleTree, senderAddresses, senderAddressIndexMap }, }: Snapshot<AccessTokenSnapshotPayload>): void;
}
