Skip to main content

Introduction

A paymaster pays a transaction’s Solana fee on behalf of your user. Use it when your application should cover fees so the user can transact without holding SOL for gas. Your user still authorizes the wallet operation.

SDK examples

Use the clients from Client setup. Rust uses separate WalletClient and PaymasterClient instances on the same network.

Check paymaster funding

Use getIdpBalance() / get_idp_balance() for IdP funding. TypeScript/Python resolve network from the call, then client, then mainnet for paymaster calls. Rust always uses its configured network. For TypeScript/Python, signedBase64Transaction / signed_base64_transaction is your already-signed preparation. Rust’s sign_transaction is an application-owned async helper following Signing.
The result contains the request ID, submitted signature, and paymaster spend. RPC acceptance is not confirmation; track confirmation or finality separately. Rust returns a native Signature; spent_by_paymaster is an i64 and may be negative. Use an ordered bundle for one to five signed transactions that must land together. Bundles are mainnet-only. Before collecting signatures:
  • Include transfers totaling at least 1,000 lamports from the API paymaster to backend-recognized Jito tip accounts.
  • Keep tip destinations in static account keys, outside lookup tables.
  • Keep the paymaster out of every other instruction’s account list, including read-only accounts. The SDK does not add the tip for you.
The response preserves signature order. A bundleId means acceptance by Jito, not confirmation; estimatedSpentByPaymaster is an estimate, not a settled charge. The same transaction-and-key retry rules apply.

Check IdP funding

Query the separate IdP paymaster when your integration sponsors IdP operations.

Flow

Input

Use the API paymaster’s returned address as feePayer / fee_payer during preparation. Complete participant approval and embedded signatures, then every required application-owned Solana signature. Sponsorship adds the paymaster’s signature; it does not replace the other signers. Keep the same signed transaction and key on retry. A matching retry returns the original result without another spend. Resolve an uncertain attempt before starting another. In Rust, Some(nonempty_key) enables eligible retries; None or an empty key disables them.

Output

The balance read returns the following fields. Python uses snake_case attributes. Rust returns PaymasterBalance with a Pubkey address and u64 lamport balance. It has no configured field. Each admitted balance call consumes one API request, including retries and admitted errors. Reading funding does not spend the sponsorship budget.

Errors