import assert from 'assert'; import { FindConditions, FindManyOptions } from 'typeorm'; import { IndexerInterface, BlockProgressInterface, EventInterface, SyncStatusInterface, ServerConfig as ServerConfigInterface, ValueResult, ContractInterface, IpldStatus as IpldStatusInterface, IPLDBlockInterface } from '@cerc-io/util'; import { EthClient } from '@cerc-io/ipld-eth-client'; import { GetStorageAt, getStorageValue, MappingKey, StorageLayout } from '@cerc-io/solidity-mapper'; export class Indexer implements IndexerInterface { _getStorageAt: GetStorageAt; _storageLayoutMap: Map = new Map() constructor (ethClient: EthClient, storageLayoutMap?: Map) { this._getStorageAt = ethClient.getStorageAt.bind(ethClient); if (storageLayoutMap) { this._storageLayoutMap = storageLayoutMap; } } get serverConfig () { return new ServerConfig(); } get storageLayoutMap (): Map { return this._storageLayoutMap; } async getStorageValue (storageLayout: StorageLayout, blockHash: string, contractAddress: string, variable: string, ...mappingKeys: MappingKey[]): Promise { return getStorageValue( storageLayout, this._getStorageAt, blockHash, contractAddress, variable, ...mappingKeys ); } async getBlockProgress (blockHash: string): Promise { assert(blockHash); return undefined; } async getEvent (id: string): Promise { assert(id); return undefined; } async getSyncStatus (): Promise { return undefined; } async getBlocks (blockFilter: { blockHash?: string, blockNumber?: number }): Promise { assert(blockFilter); return undefined; } async getBlocksAtHeight (height: number, isPruned: boolean): Promise { assert(height); assert(isPruned); return []; } async getBlockEvents (blockHash: string): Promise> { assert(blockHash); return []; } async getAncestorAtDepth (blockHash: string, depth: number): Promise { assert(blockHash); assert(depth); return ''; } async fetchBlockWithEvents (block: BlockProgressInterface): Promise { return block; } async removeUnknownEvents (block: BlockProgressInterface): Promise { assert(block); } async updateBlockProgress (block: BlockProgressInterface, lastProcessedEventIndex: number): Promise { assert(block); assert(lastProcessedEventIndex); return block; } async updateSyncStatusChainHead (blockHash: string, blockNumber: number): Promise { assert(blockHash); assert(blockNumber); return new SyncStatus(); } async updateSyncStatusIndexedBlock (blockHash: string, blockNumber: number, force?: boolean): Promise { assert(blockNumber); assert(blockHash); assert(force); return new SyncStatus(); } async updateSyncStatusCanonicalBlock (blockHash: string, blockNumber: number, force?: boolean): Promise { assert(blockNumber); assert(blockHash); assert(force); return new SyncStatus(); } async markBlocksAsPruned (blocks: BlockProgressInterface[]): Promise { assert(blocks); return undefined; } async createDiffStaged (contractAddress: string, blockHash: string, data: any): Promise { assert(contractAddress); assert(blockHash); assert(data); } getEntityTypesMap (): Map { return new Map(); } async getBlockProgressEntities (where: FindConditions, options: FindManyOptions): Promise { assert(where); assert(options); return []; } async saveEventEntity (dbEvent: EventInterface): Promise { return dbEvent; } async processEvent (event: EventInterface): Promise { assert(event); } isWatchedContract (address : string): ContractInterface | undefined { return undefined; } async processBlock (blockProgress: BlockProgressInterface): Promise { return undefined; } getIPLDData (ipldBlock: IPLDBlockInterface): any { return undefined; } async updateIPLDStatusMap (address: string, ipldStatus: IpldStatusInterface): Promise { return undefined; } } class SyncStatus implements SyncStatusInterface { id: number; chainHeadBlockHash: string; chainHeadBlockNumber: number; latestIndexedBlockHash: string; latestIndexedBlockNumber: number; latestCanonicalBlockHash: string; latestCanonicalBlockNumber: number; initialIndexedBlockHash: string; initialIndexedBlockNumber: number; constructor () { this.id = 0; this.chainHeadBlockHash = '0'; this.chainHeadBlockNumber = 0; this.latestIndexedBlockHash = '0'; this.latestIndexedBlockNumber = 0; this.latestCanonicalBlockHash = '0'; this.latestCanonicalBlockNumber = 0; this.initialIndexedBlockHash = '0'; this.initialIndexedBlockNumber = 0; } } class ServerConfig implements ServerConfigInterface { host: string; port: number; mode: string; kind: string; checkpointing: boolean; checkpointInterval: number; ipfsApiAddr: string; subgraphPath: string; disableSubgraphState: boolean; wasmRestartBlocksInterval: number; filterLogs: boolean; maxEventsBlockRange: number; constructor () { this.host = ''; this.port = 0; this.mode = ''; this.kind = ''; this.checkpointing = false; this.checkpointInterval = 0; this.ipfsApiAddr = ''; this.subgraphPath = ''; this.disableSubgraphState = false; this.wasmRestartBlocksInterval = 0; this.filterLogs = false; this.maxEventsBlockRange = 0; } }