import { EvmBlockHeader, EvmLog, EvmStateDiff, EvmStateDiffBase, EvmTraceBase, EvmTraceCallAction, EvmTraceCallResult, EvmTraceCreateAction, EvmTraceCreateResult, EvmTraceRewardAction, EvmTraceSuicideAction, EvmTransaction } from './evm' type Simplify = { [K in keyof T]: T[K] } & {} type Selector = { [P in Exclude]?: boolean } type AddPrefix = `${Prefix}${Capitalize}` export type BlockRequiredFields = 'height' | 'hash' | 'parentHash' export type TransactionRequiredFields = 'transactionIndex' export type LogRequiredFields = 'logIndex' | 'transactionIndex' export type TraceRequiredFields = 'transactionIndex' | 'traceAddress' | 'type' export type StateDiffRequiredFields = 'transactionIndex' | 'address' | 'key' export interface FieldSelection { block?: Selector transaction?: Selector log?: Selector trace?: Selector< keyof EvmTraceBase | AddPrefix<'create', keyof EvmTraceCreateAction> | AddPrefix<'createResult', keyof EvmTraceCreateResult> | AddPrefix<'call', keyof EvmTraceCallAction> | AddPrefix<'callResult', keyof EvmTraceCallResult> | AddPrefix<'suicide', keyof EvmTraceSuicideAction> | AddPrefix<'reward', keyof EvmTraceRewardAction>, TraceRequiredFields > stateDiff?: Selector } export const DEFAULT_FIELDS = { block: { timestamp: true }, log: { address: true, topics: true, data: true }, transaction: { from: true, to: true, hash: true }, trace: { error: true }, stateDiff: { kind: true, next: true, prev: true } } as const type DefaultFields = typeof DEFAULT_FIELDS type ExcludeUndefined = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] } & {} type MergeDefault = Simplify< undefined extends T ? D : Omit> & ExcludeUndefined > type TrueFields = keyof { [K in keyof F as true extends F[K] ? K : never]: true } type GetFields = TrueFields> type Select = T extends any ? Simplify>> : never export type BlockHeader = Simplify< {id: string} & Pick & Select> > export type Transaction = Simplify< {id: string} & Pick & Select> & { block: BlockHeader logs: Log[] traces: Trace[] stateDiffs: StateDiff[] } > export type Log = Simplify< {id: string} & Pick & Select> & { block: BlockHeader, transaction?: Transaction getTransaction(): Transaction } > type RemovePrefix = T extends `${Prefix}${infer S}` ? Uncapitalize : never export type TraceCreateAction = Select< EvmTraceCreateAction, RemovePrefix<'create', GetFields> > export type TraceCreateResult = Select< EvmTraceCreateResult, RemovePrefix<'createResult', GetFields> > export type TraceCallAction = Select< EvmTraceCallAction, RemovePrefix<'call', GetFields> > export type TraceCallResult = Select< EvmTraceCallResult, RemovePrefix<'callResult', GetFields> > export type TraceSuicideAction = Select< EvmTraceSuicideAction, RemovePrefix<'suicide', GetFields> > export type TraceRewardAction = Select< EvmTraceRewardAction, RemovePrefix<'reward', GetFields> > type TraceBase = Pick> & Select> & { block: BlockHeader, transaction?: Transaction getTransaction(): Transaction parent?: Trace getParent(): Trace children: Trace[] } type RemoveEmptyObjects = { [K in keyof T as {} extends T[K] ? never : K]: T[K] } export type TraceCreate = Simplify< TraceBase & {type: 'create'} & RemoveEmptyObjects<{action: TraceCreateAction, result?: TraceCreateResult}> > export type TraceCall = Simplify< TraceBase & {type: 'call'} & RemoveEmptyObjects<{action: TraceCallAction, result?: TraceCallResult}> > export type TraceSuicide = Simplify< TraceBase & {type: 'suicide'} & RemoveEmptyObjects<{action: TraceSuicideAction}> > export type TraceReward = Simplify< TraceBase & {type: 'reward'} & RemoveEmptyObjects<{action: TraceRewardAction}> > export type Trace = TraceCreate | TraceCall | TraceSuicide | TraceReward export type StateDiff = Simplify< EvmStateDiffBase & Select> & { block: BlockHeader transaction?: Transaction getTransaction(): Transaction } > export type BlockData = { header: BlockHeader transactions: Transaction[] logs: Log[] traces: Trace[] stateDiffs: StateDiff[] } export type AllFields = { block: Trues transaction: Trues log: Trues trace: Trues stateDiff: Trues } type Trues = { [K in keyof Exclude]-?: true }