import type { SmartAccount } from "permissionless/accounts" import type { EntryPoint, GetEntryPointVersion, UserOperation } from "permissionless/types" import { deepHexlify } from "permissionless/utils" import type { Address, Chain, Client, Transport } from "viem" import type { CabPaymasterRpcScheme, RepayTokenInfo, SponsorTokenInfo, SwapTokenInfo, UserOperationWithBigIntAsHex } from "../../types" import { cabPaymasterAddress } from "../../utils" export type GetCabPaymasterSponsorTokensParameters< TEntryPoint extends EntryPoint > = { userOperation: UserOperation> entryPoint: TEntryPoint sponsorChain: Chain cabPaymasterAddress?: Address } export type GetCabPaymasterSponsorTokensReturnType = { paymaster: Address sponsorTokensInfo: SponsorTokenInfo[] swapTokensInfo: SwapTokenInfo[] repayTokensInfo: RepayTokenInfo[] } export async function getCabPaymasterSponsorTokens< TEntryPoint extends EntryPoint, TChain extends Chain | undefined, TTransport extends Transport = Transport, TSmartAccount extends | SmartAccount | undefined = | SmartAccount | undefined >( client: Client< TTransport, TChain, TSmartAccount, CabPaymasterRpcScheme >, { userOperation, entryPoint, sponsorChain, cabPaymasterAddress: cabPaymasterAddress_ }: GetCabPaymasterSponsorTokensParameters ): Promise { const paymasterAddress = cabPaymasterAddress_ ?? cabPaymasterAddress const params: [ UserOperationWithBigIntAsHex>, TEntryPoint, number, Address ] = [ deepHexlify(userOperation) as UserOperationWithBigIntAsHex< GetEntryPointVersion >, entryPoint, sponsorChain.id, paymasterAddress ] const response = await client.request({ method: "pm_getCabPaymasterSponsorTokens", params }) return { paymaster: response.paymaster, sponsorTokensInfo: response.sponsorTokensInfo, swapTokensInfo: response.swapTokensInfo, repayTokensInfo: response.repayTokensInfo } }