import { Address, EcdsaSigInner, Hex, HexBigInt, HexChainId, PreparedCall_Authorization, PreparedCall_UserOpV060, PreparedCall_UserOpV070, TypedDataDefinition, TypedDataSignatureRequest, } from "./schemas.js"; import { PrepareCallsCapabilities } from "./capabilities/index.js"; import { PreparedCall_SolanaV0, SolanaPrepareCallsParams } from "./solana.js"; import { object, withMetadata, z } from "./zod.js"; const Call = object({ to: Address(), data: Hex().optional(), value: HexBigInt().optional(), }); export const PrepareCallsParams = object({ calls: z.array(Call).optional(), from: Address(), chainId: HexChainId(), capabilities: PrepareCallsCapabilities.optional(), paymasterPermitSignature: EcdsaSigInner.optional(), }); export type PrepareCallsParams = z.input; export const PrepareCallsRequestType = object({ method: z.literal("wallet_prepareCalls"), params: z.tuple([ z.union([ PrepareCallsParams.describe("EVM request"), SolanaPrepareCallsParams.describe("Solana request"), ]), ]), }); export const PreparedCall_Permit = object( { type: z.literal("paymaster-permit").meta({ description: "ERC-7597 Permit Signature Request for the paymaster", }), modifiedRequest: PrepareCallsParams, data: TypedDataDefinition, signatureRequest: TypedDataSignatureRequest, }, { description: "Paymaster permit. Returned when the account's paymaster policy requires an ERC-20 token permit signature. The client must sign the permit and resubmit the request with the permit signature before the user operation can be prepared.", }, ); export type PreparedCall_Permit = z.input; const PreparedCall_Array = object( { type: z.literal("array"), data: z.array( z.discriminatedUnion("type", [ PreparedCall_UserOpV060, PreparedCall_UserOpV070, PreparedCall_Authorization, ]), ), }, { description: "Array of Prepared Calls. Returned for EIP-7702 accounts that require both an authorization signature and a user operation.", }, ); const PrepareCallsDetails = object({ details: object({ type: z.literal("user-operation"), data: object({ hash: Hex(), calls: z.array(Call), }), }).optional(), }); export const EvmPrepareCallsReturnType = z.intersection( z.discriminatedUnion("type", [ PreparedCall_Array, PreparedCall_UserOpV060, PreparedCall_UserOpV070, PreparedCall_Authorization, PreparedCall_Permit, ]), PrepareCallsDetails, ); export const PrepareCallsReturnType = z.union([ EvmPrepareCallsReturnType.describe("EVM response"), PreparedCall_SolanaV0, ]); export type PrepareCallsReturnType = z.input; export const PrepareCallsReturnTypeWithoutChainId = z.intersection( z.discriminatedUnion("type", [ PreparedCall_Array, PreparedCall_UserOpV060.omit({ chainId: true }), PreparedCall_UserOpV070.omit({ chainId: true }), PreparedCall_Authorization.omit({ chainId: true }), PreparedCall_Permit, ]), PrepareCallsDetails, ); export const PreparedCallsUserOperationData = object({ callId: Hex(), hash: Hex(), calls: z.array(Call).optional(), }); export const PreparedCallsUserOperationDataWithoutCallId = withMetadata( PreparedCallsUserOperationData.omit({ callId: true }), {}, ); export type PreparedCallsUserOperationData = z.input< typeof PreparedCallsUserOperationData >;