import {
  bsc,
  base,
  mode,
  blast,
  linea,
  scroll,
  mantle,
  mainnet,
  polygon,
  arbitrum,
  optimism,
  avalanche,
  worldchain,
  berachain,
  unichain,
} from "viem/chains";

import type {
  Hex,
  Hash,
  Chain,
  Address,
  Transport,
  PublicClient,
  TransactionReceipt,
} from "viem";

export type SupportedChainId =
  | typeof bsc.id
  | typeof base.id
  | typeof mode.id
  | typeof blast.id
  | typeof linea.id
  | typeof scroll.id
  | typeof mantle.id
  | typeof mainnet.id
  | typeof polygon.id
  | typeof arbitrum.id
  | typeof unichain.id
  | typeof optimism.id
  | typeof avalanche.id
  | typeof berachain.id
  | typeof worldchain.id;

export interface EnrichLogsArgs {
  transactionReceipt: TransactionReceipt;
  publicClient: PublicClient<Transport, Chain>;
}
export interface EnrichedLog {
  to: Address;
  from: Address;
  symbol: string;
  amount: string;
  address: Address;
  decimals: number;
  amountRaw: bigint;
}

export interface Trace {
  to: Address;
  from: Address;
  gas: Hex;
  gasUsed: Hex;
  input: "Hash";
  output: Hash;
  calls: Trace[];
  value: Hex;
  type: "CALL" | "STATICCALL" | "DELEGATECALL" | "CREATE" | "CREATE2";
}

export type TraceTransactionSchema = {
  Parameters: [
    hash: Hash,
    options:
      | {
          disableStorage?: boolean;
          disableStack?: boolean;
          enableMemory?: boolean;
          enableReturnData?: boolean;
          tracer?: string;
        }
      | {
          timeout?: string;
          tracerConfig?: {
            onlyTopCall?: boolean;
            withLog?: boolean;
          };
        }
      | undefined
  ];
  ReturnType: Trace;
};
