import { MainnetV4GetterABI } from '../abi/mainnet/v4/getter'; import { MainnetV4SetterABI } from '../abi/mainnet/v4/setter'; import { BAppABI } from '../abi/b-app'; import { TokenABI } from '../abi/token'; import { AbiInputsToParams } from '../types/contract-interactions'; import { Prettify } from '../types/utils'; import { Abi, Address, ExtractAbiFunctions } from 'abitype'; import { ContractFunctionArgs, ContractFunctionName, DecodeEventLogReturnType, Hash, PublicClient, ReadContractReturnType, SimulateContractParameters, SimulateContractReturnType, WaitForTransactionReceiptReturnType, WalletClient } from 'viem'; export type SupportedAbis = typeof TokenABI | typeof MainnetV4GetterABI | typeof MainnetV4SetterABI | typeof BAppABI; export type TokenEvents = DecodeEventLogReturnType; export type MainnetEvents = DecodeEventLogReturnType; export type SupportedEvents = TokenEvents | MainnetEvents; export type Contracts = { setter: { events: MainnetEvents | TokenEvents; abi: typeof MainnetV4SetterABI; writeFnNames: ContractFunctionName; writeFunctions: ExtractAbiFunctions; readFnNames: ContractFunctionName; readFunctions: ExtractAbiFunctions; }; getter: { events: MainnetEvents | TokenEvents; abi: typeof MainnetV4GetterABI; writeFnNames: ContractFunctionName; writeFunctions: ExtractAbiFunctions; readFnNames: ContractFunctionName; readFunctions: ExtractAbiFunctions; }; token: { events: TokenEvents; abi: typeof TokenABI; writeFnNames: ContractFunctionName; writeFunctions: ExtractAbiFunctions; readFnNames: ContractFunctionName; readFunctions: ExtractAbiFunctions; }; bapp: { events: MainnetEvents | TokenEvents; abi: typeof BAppABI; writeFnNames: ContractFunctionName; writeFunctions: ExtractAbiFunctions; readFnNames: ContractFunctionName; readFunctions: ExtractAbiFunctions; }; }; export type WriteFns = Contracts[keyof Contracts]['writeFunctions']; export type WriteFnNames = Contracts[keyof Contracts]['writeFnNames']; export type WriteReturnType = Promise<{ hash: Hash; wait: () => Promise; }>; export type WriteOptions = Omit, 'chain' | 'args' | 'value' | 'abi' | 'functionName' | 'address' | 'account' | 'value'>; export type SmartFnWriteOptions> = Omit & { args: K; }; export type WriteProps = { abi: Abi; publicClient: PublicClient; walletClient: WalletClient; contractAddress: Address; }; export type ReadProps = { abi: SupportedAbis; publicClient: PublicClient; contractAddress: Address; }; export type ContractNames = Prettify; export type WriterFunctions = { [K in Fns as K['name']]: K['inputs'] extends readonly [] ? { (props?: Prettify<(K['stateMutability'] extends 'payable' ? { value?: bigint; } : object) & WriteOptions>): WriteReturnType; simulate: (props?: Prettify<(K['stateMutability'] extends 'payable' ? { value?: bigint; } : object) & WriteOptions>) => SimulateContractReturnType; } : { (props: Prettify<((K['stateMutability'] extends 'payable' ? { value?: bigint; } : object) & (K['inputs'] extends readonly [] ? object : { args: Prettify>; })) & WriteOptions>): WriteReturnType; simulate: (props: Prettify<((K['stateMutability'] extends 'payable' ? { value?: bigint; } : object) & (K['inputs'] extends readonly [] ? object : { args: Prettify>; })) & WriteOptions>) => SimulateContractReturnType; }; }; export type ReaderFunctions = { [K in Fns as K['name']]: K['inputs'] extends readonly [] ? () => Promise>> : (args: Prettify>) => Promise>>; }; export type ContractInteractions = { write: WriterFunctions; read: ReaderFunctions; address: Address; };