import { Transport, Chain, PrepareTransactionRequestReturnType, PublicClient, Address } from 'viem'; import { sequencerInboxReadContract, SequencerInboxReadContractParameters, SequencerInboxReadContractReturnType, } from '../sequencerInboxReadContract'; import { SequencerInboxFunctionName, sequencerInboxPrepareTransactionRequest, SequencerInboxPrepareTransactionRequestParameters, } from '../sequencerInboxPrepareTransactionRequest'; type SequencerInboxReadContractArgs< TSequencerInbox extends Address | undefined, TFunctionName extends SequencerInboxFunctionName, > = TSequencerInbox extends Address ? Omit, 'sequencerInbox'> & { sequencerInbox?: Address; } : SequencerInboxReadContractParameters; type SequencerInboxPrepareTransactionRequestArgs< TSequencerInbox extends Address | undefined, TFunctionName extends SequencerInboxFunctionName, > = TSequencerInbox extends Address ? Omit, 'sequencerInbox'> & { sequencerInbox?: Address; } : SequencerInboxPrepareTransactionRequestParameters; export type SequencerInboxActions< TSequencerInbox extends Address | undefined, TChain extends Chain | undefined = Chain | undefined, > = { sequencerInboxReadContract: ( args: SequencerInboxReadContractArgs, ) => Promise>; sequencerInboxPrepareTransactionRequest: ( args: SequencerInboxPrepareTransactionRequestArgs, ) => Promise & { chainId: number }>; }; /** * Set of actions that can be performed on the sequencerInbox contract through wagmi public client * * @param {Object} sequencerInbox - Address of the sequencerInbox core contract * User can still overrides sequencerInbox address, * by passing it as an argument to sequencerInboxReadContract/sequencerInboxPrepareTransactionRequest calls * * @returns {Function} sequencerInboxActionsWithSequencerInbox - Function passed to client.extends() to extend the public client * * @example * const client = createPublicClient({ * chain: arbitrumOne, * transport: http(), * }).extend(sequencerInboxActions(coreContracts.sequencerInbox)); * * // SequencerInbox is set to `coreContracts.sequencerInbox` for every call * client.sequencerInboxReadContract({ * functionName: 'inboxAccs', * }); * * // Overriding sequencerInbox address for this call only * client.sequencerInboxReadContract({ * functionName: 'inboxAccs', * sequencerInbox: contractAddress.anotherSequencerInbox * }); */ export function sequencerInboxActions< TParams extends { sequencerInbox?: Address }, TTransport extends Transport = Transport, TChain extends Chain | undefined = Chain | undefined, >({ sequencerInbox }: TParams) { return function sequencerInboxActionsWithSequencerInbox( client: PublicClient, ) { const sequencerInboxExtensions: SequencerInboxActions = { sequencerInboxReadContract: ( args: SequencerInboxReadContractArgs, ) => { return sequencerInboxReadContract(client, { ...args, sequencerInbox: args.sequencerInbox || sequencerInbox, } as SequencerInboxReadContractParameters); }, sequencerInboxPrepareTransactionRequest: ( args: SequencerInboxPrepareTransactionRequestArgs, ) => { return sequencerInboxPrepareTransactionRequest(client, { ...args, sequencerInbox: args.sequencerInbox || sequencerInbox, } as SequencerInboxPrepareTransactionRequestParameters); }, }; return sequencerInboxExtensions; }; }