import { type Address, encodeFunctionData, isAddressEqual } from "viem" import { invoiceManagerAbi } from "../abis/invoiceManagerAbi" import { invoiceManagerAbi as invoiceManagerAbiNonSocket } from "../abis/invoiceManagerNonSocketAbi" import type { RepayTokenInfo } from "../types" import type { Call } from "../types" import { getInvoiceManagerAddress } from "./constants" import { getInvoiceId } from "./getInvoiceId" export const createInvoiceCallNonSokcet = ({ chainId, account, paymaster, nonce, repayTokensInfo }: { chainId: number account: Address paymaster: Address nonce: bigint repayTokensInfo: RepayTokenInfo[] }): Call => { const invoiceId = getInvoiceId( account, paymaster, nonce, BigInt(chainId), repayTokensInfo ) const invoiceManagerAddress = getInvoiceManagerAddress({ cabPaymasterAddress: paymaster }) return { to: invoiceManagerAddress, data: encodeFunctionData({ abi: invoiceManagerAbiNonSocket, functionName: "createInvoice", args: [nonce, paymaster, invoiceId] }), value: 0n } } export const createInvoiceCallSocket = ({ chainId, account, paymaster, nonce, repayTokensInfo }: { chainId: number account: Address paymaster: Address nonce: bigint repayTokensInfo: RepayTokenInfo[] }): Call => { const invoiceManagerAddress = getInvoiceManagerAddress({ cabPaymasterAddress: paymaster }) return { to: invoiceManagerAddress, data: encodeFunctionData({ abi: invoiceManagerAbi, functionName: "createInvoice", args: [ { account, nonce, paymaster, sponsorChainId: BigInt(chainId), repayTokenInfos: repayTokensInfo.map((token) => ({ ...token, chainId: BigInt(token.chainId) })) } ] }), value: 0n } } export const createInvoiceCall = ({ chainId, account, paymaster, nonce, repayTokensInfo }: { chainId: number account: Address paymaster: Address nonce: bigint repayTokensInfo: RepayTokenInfo[] }): Call => { if ( isAddressEqual(paymaster, "0xB4Aa062cC685e7e2B6881ED57FB830Cd7D4bCf25") ) { return createInvoiceCallNonSokcet({ chainId, account, paymaster, nonce, repayTokensInfo }) } return createInvoiceCallSocket({ chainId, account, paymaster, nonce, repayTokensInfo }) }