import { type Address, createSolanaRpc, type Signature, type TransactionPartialSigner } from '@solana/kit'; import { Method } from 'mppx'; import type { SessionMode, SessionPullVoucherStrategy, SessionSplit } from '../shared/session-types.js'; import { type SessionStore } from './session/store.js'; /** * Creates a Solana `session` MPP method for the server. * * A session opens a payment channel (or delegated-token pull) once, then * accepts off-chain cumulative vouchers for subsequent paid deliveries. * On close, the server settles the highest accepted voucher on-chain and * distributes proceeds to the configured splits. * * Mirrors `SessionServer` in `rust/crates/mpp/src/server/session.rs`. * * @example * ```ts * import { Mppx, session } from '@solana/mpp/server' * * const sess = session({ * operator: OPERATOR, * recipient: RECIPIENT, * signer, // optional: server-side fee payer / merchant signer * cap: 10_000_000n, // 10 USDC default cap * currency: 'USDC', * decimals: 6, * network: 'devnet', * modes: ['push'], * pricing: { perDelivery: 100n }, * rpc: createSolanaRpc('https://api.devnet.solana.com'), * }) * * const mppx = Mppx.create({ methods: [sess] }) * ``` */ export declare function session(parameters: session.Parameters): Method.Server<{ readonly intent: "session"; readonly name: "solana"; readonly schema: { readonly credential: { readonly payload: import("zod/mini").ZodMiniDiscriminatedUnion<[import("zod/mini").ZodMiniObject<{ action: import("zod/mini").ZodMiniLiteral<"open">; approvedAmount: import("zod/mini").ZodMiniOptional>; authorizedSigner: import("zod/mini").ZodMiniString; channelId: import("zod/mini").ZodMiniOptional>; deposit: import("zod/mini").ZodMiniOptional>; gracePeriod: import("zod/mini").ZodMiniOptional>; initMultiDelegateTx: import("zod/mini").ZodMiniOptional>; mint: import("zod/mini").ZodMiniOptional>; mode: import("zod/mini").ZodMiniEnum<{ push: "push"; pull: "pull"; }>; owner: import("zod/mini").ZodMiniOptional>; payee: import("zod/mini").ZodMiniOptional>; payer: import("zod/mini").ZodMiniOptional>; recentSlot: import("zod/mini").ZodMiniOptional, import("zod/mini").ZodMiniNumber]>>; salt: import("zod/mini").ZodMiniOptional, import("zod/mini").ZodMiniNumber]>>; signature: import("zod/mini").ZodMiniString; tokenAccount: import("zod/mini").ZodMiniOptional>; transaction: import("zod/mini").ZodMiniOptional>; updateDelegationTx: import("zod/mini").ZodMiniOptional>; }, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{ action: import("zod/mini").ZodMiniLiteral<"voucher">; voucher: import("zod/mini").ZodMiniObject<{ data: import("zod/mini").ZodMiniObject<{ channelId: import("zod/mini").ZodMiniString; cumulative: import("zod/mini").ZodMiniOptional>; cumulativeAmount: import("zod/mini").ZodMiniOptional>; expiresAt: import("zod/mini").ZodMiniNumber; nonce: import("zod/mini").ZodMiniOptional>; }, import("zod/v4/core").$strip>; signature: import("zod/mini").ZodMiniString; }, import("zod/v4/core").$strip>; }, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{ action: import("zod/mini").ZodMiniLiteral<"commit">; deliveryId: import("zod/mini").ZodMiniString; voucher: import("zod/mini").ZodMiniObject<{ data: import("zod/mini").ZodMiniObject<{ channelId: import("zod/mini").ZodMiniString; cumulative: import("zod/mini").ZodMiniOptional>; cumulativeAmount: import("zod/mini").ZodMiniOptional>; expiresAt: import("zod/mini").ZodMiniNumber; nonce: import("zod/mini").ZodMiniOptional>; }, import("zod/v4/core").$strip>; signature: import("zod/mini").ZodMiniString; }, import("zod/v4/core").$strip>; }, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{ action: import("zod/mini").ZodMiniLiteral<"topUp">; channelId: import("zod/mini").ZodMiniString; newDeposit: import("zod/mini").ZodMiniString; signature: import("zod/mini").ZodMiniString; }, import("zod/v4/core").$strip>, import("zod/mini").ZodMiniObject<{ action: import("zod/mini").ZodMiniLiteral<"close">; channelId: import("zod/mini").ZodMiniString; voucher: import("zod/mini").ZodMiniOptional; cumulative: import("zod/mini").ZodMiniOptional>; cumulativeAmount: import("zod/mini").ZodMiniOptional>; expiresAt: import("zod/mini").ZodMiniNumber; nonce: import("zod/mini").ZodMiniOptional>; }, import("zod/v4/core").$strip>; signature: import("zod/mini").ZodMiniString; }, import("zod/v4/core").$strip>>; }, import("zod/v4/core").$strip>], "action">; }; readonly request: import("zod/mini").ZodMiniObject<{ cap: import("zod/mini").ZodMiniString; currency: import("zod/mini").ZodMiniString; decimals: import("zod/mini").ZodMiniOptional>; description: import("zod/mini").ZodMiniOptional>; externalId: import("zod/mini").ZodMiniOptional>; minVoucherDelta: import("zod/mini").ZodMiniOptional>; modes: import("zod/mini").ZodMiniOptional>>; network: import("zod/mini").ZodMiniOptional>; operator: import("zod/mini").ZodMiniString; programId: import("zod/mini").ZodMiniOptional>; pullVoucherStrategy: import("zod/mini").ZodMiniOptional>; recentBlockhash: import("zod/mini").ZodMiniOptional>; recentSlot: import("zod/mini").ZodMiniOptional, import("zod/mini").ZodMiniNumber]>>; recipient: import("zod/mini").ZodMiniString; splits: import("zod/mini").ZodMiniOptional; recipient: import("zod/mini").ZodMiniString; }, import("zod/v4/core").$strip>>>; }, import("zod/v4/core").$strip>; }; }, { readonly cap: string; readonly currency: string; readonly operator: string; readonly recipient: string; }, undefined>; export declare namespace session { var routes: (parameters: session.Parameters) => session.RoutesHandlers; } /** * RPC client accepted by {@link session}: a full `createSolanaRpc` client or * any object exposing the `getSignatureStatuses` / `sendTransaction` subset * the session lifecycle uses. */ export type RpcLike = ReturnType | SubmitOpenRpc; /** Minimal RPC subset used to verify open transactions. */ export type VerifyOpenRpc = { getSignatureStatuses(signatures: readonly Signature[]): { send(): Promise<{ value: ReadonlyArray<{ err: unknown; } | null>; }>; }; }; /** Minimal RPC subset used to verify and submit open transactions. */ export type SubmitOpenRpc = VerifyOpenRpc & { sendTransaction(wire: string, config?: unknown): { send(): Promise; }; }; export declare namespace session { interface SessionPricing { /** Default delivery price in base units. Optional — callers may price each delivery individually. */ readonly perDelivery?: bigint | undefined; } interface RoutesHandlers { /** POST handler — commit a reserved delivery. */ readonly commit: (request: Request) => Promise; /** POST handler — reserve a metered delivery. */ readonly deliveries: (request: Request) => Promise; } interface Parameters { /** Maximum session cap the server will offer (base units). */ readonly cap: bigint; /** Idle-close delay in ms. 0 (default) disables the watchdog. */ readonly closeDelayMs?: number; /** Currency identifier (e.g. 'USDC' or an SPL mint address). */ readonly currency: string; /** Token decimals (default 6). */ readonly decimals?: number; /** Minimum voucher increment in base units. Defaults to 0. */ readonly minVoucherDelta?: bigint; /** Funding modes. Defaults to ['push']. */ readonly modes?: readonly SessionMode[]; /** Solana network. Defaults to 'mainnet'. */ readonly network?: string; /** Server submits the client's push-mode open tx itself. */ readonly openTxSubmitter?: 'client' | 'server'; /** Operator public key (base58). */ readonly operator: string; /** Signer used when push-mode `openTxSubmitter='server'` requires a fee-payer signer. */ readonly paymentChannelPayerSigner?: TransactionPartialSigner; /** Pricing hints surfaced to clients (Phase F+ will use these). */ readonly pricing: SessionPricing; /** Payment-channels program ID override. */ readonly programId?: Address | string; /** Voucher authority for pull-mode sessions. Required when modes includes 'pull'. */ readonly pullVoucherStrategy?: SessionPullVoucherStrategy; /** Primary recipient (base58). */ readonly recipient: string; /** Optional RPC client used for on-chain checks + transactions. */ readonly rpc?: RpcLike; /** RPC URL for blockhash prefetch. Defaults from `network`. */ readonly rpcUrl?: string; /** * Settlement window in seconds — the forced-close grace period a * non-zero voucher `expiresAt` must outlast. When set, a voucher * whose `expiresAt` falls within `now + settlementWindowSeconds` * is rejected (`expires-within-settlement-window`) so the merchant * can still land an async settle_and_seal before it expires. * A voucher with `expiresAt == 0` never expires and is unaffected. * Defaults to 0 (window check disabled). Typically set to the * channel `gracePeriod`. */ readonly settlementWindowSeconds?: bigint; /** Merchant signer for settle_and_seal + distribute IXs. */ readonly signer?: TransactionPartialSigner; /** Optional basis-point splits distributed at close. Max 8. */ readonly splits?: readonly SessionSplit[]; /** Pluggable session store. Defaults to in-memory. */ readonly store?: SessionStore; /** SPL token program (TOKEN_PROGRAM or TOKEN_2022_PROGRAM). Defaults from currency/network. */ readonly tokenProgram?: string; } } //# sourceMappingURL=Session.d.ts.map