import type { Account, Chain, Client, Transport } from 'viem' import type { WalletActionsL2 as OpWalletActionsL2 } from 'viem/op-stack' import { walletActionsL2 as opWalletActionsL2 } from 'viem/op-stack' import type { RelayCrossDomainMessageParameters, RelayCrossDomainMessageReturnType, SendCrossDomainMessageParameters, SendCrossDomainMessageReturnType, SendETHContractReturnType, SendETHParameters, SendSuperchainERC20Parameters, SendSuperchainERC20ReturnType, } from '@/actions/interop/index.js' import { relayCrossDomainMessage, sendCrossDomainMessage, sendETH, sendSuperchainERC20, } from '@/actions/interop/index.js' export type WalletInteropActionsL2< TChain extends Chain | undefined = Chain | undefined, TAccount extends Account | undefined = Account | undefined, > = { sendCrossDomainMessage: ( parameters: SendCrossDomainMessageParameters< TChain, TAccount, chainOverride >, ) => Promise relayCrossDomainMessage: < chainOverride extends Chain | undefined = undefined, >( parameters: RelayCrossDomainMessageParameters< TChain, TAccount, chainOverride >, ) => Promise sendSuperchainERC20: ( parameters: SendSuperchainERC20Parameters, ) => Promise sendETH: ( parameters: SendETHParameters, ) => Promise } export type WalletActionsL2< chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, > = OpWalletActionsL2 & { /** interop actions scoped under this member */ interop: WalletInteropActionsL2 } export function walletActionsL2() { return < transport extends Transport, chain extends Chain | undefined = Chain | undefined, account extends Account | undefined = Account | undefined, >( client: Client, ): WalletActionsL2 => { return { ...opWalletActionsL2(), interop: { sendCrossDomainMessage: (args) => sendCrossDomainMessage(client, args), relayCrossDomainMessage: (args) => relayCrossDomainMessage(client, args), sendSuperchainERC20: (args) => sendSuperchainERC20(client, args), sendETH: (args) => sendETH(client, args), }, } as WalletActionsL2 } }