Kora
Pay Solana network fees with any SPL token. Users never need SOL in the wallet.
https://kora.sol.new
KoraDtdfUHJLWGqwBARLsfgXB1j44bpxv3zQWQwFmhz
The problem
Every Solana transaction needs a fee payer with SOL. That kills onboarding for a USDC wallet, a game that only holds BONK, or anyone who has not bought SOL yet.
What this node does
Kora is a paymaster. Your app still builds the user intent. Kora adds a token payment to us, co-signs as fee payer, and pays the real network fee in SOL. The user pays that cost in whatever token they already hold. Jupiter prices the token. We take a 10% margin.
- App builds the transaction (transfer, swap, close account, …).
- Client asks Kora for the fee in the chosen mint (
estimateTransactionFee). - Kora injects an SPL transfer: user token → this fee payer.
- User signs (token authority). They do not pay SOL.
- App POSTs the tx to this RPC.
- Kora checks programs, accounts, and that the token payment covers SOL cost + margin.
- Kora co-signs as
KoraDtdf…mhzand can send (signAndSendTransaction). - On-chain: user intent runs, we receive the token, SOL fees come from the fee payer.
Pay with anything
Fee payment accepts any SPL / Token-2022 mint Jupiter can price (allowed_spl_paid_tokens = All).
The rest of the transaction is still gated. Tokens that may appear in the user intent today: USDC, USDT, wSOL, BONK, JUP, and 8neDcPFw…pump. Programs: System, Token, Token-2022, ATA, ALT, Compute Budget, Memo, Jupiter v6. Ask if an app needs another program (Meteora, LaunchLab, Lighthouse, …).
Pricing
Not free. Jupiter oracle + 10% margin. Cap per tx: 0.001 SOL of network fees. Max 10 signatures. Durable nonces off.
Call it
curl -sS https://kora.sol.new/health
curl -sS -X POST https://kora.sol.new \
-H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"getConfig","params":[]}'
import { KoraClient } from '@solana/kora';
const kora = new KoraClient({ rpcUrl: 'https://kora.sol.new' });
const signed = await kora.signTransaction({ transaction });
// or signAndSendTransaction - Kora broadcasts
On Solana Kit use createKitKoraClient(). It estimates, injects the payment ix, and submits.
JSON-RPC
getConfig · getSupportedTokens · estimateTransactionFee · getPayerSigner · getBlockhash · signTransaction · signAndSendTransaction · transferTransaction · getVersion
POST JSON-RPC to the origin. GET / is this page. GET /health is JSON.
Restrict bad actors
This node will not sign whatever you send. Live controls:
- Program allowlist - unknown programs are rejected. Today: System, Token, Token-2022, ATA, ALT, Compute, Memo, Jupiter v6.
- Intent token allowlist - the user tx can only move listed mints. Fee payment can still be any Jupiter-priced token.
- Spend caps - max 0.001 SOL of network fees per tx, max 10 signatures. Durable nonces off.
- Fee payer policy - this wallet cannot transfer, mint, set authority, or withdraw nonce. It can only create ATAs and pay gas.
- Rate limit - 100 requests/sec.
- Account blocklist - pubkeys in Turso
kora_blocklistare 403 before Kora signs. Instant, no redeploy. Send the pubkey here and we add it. Alsodisallowed_accountsinkora.tomlif it should be baked into the node.
Do not enable gas_swap. Do not widen programs without a reason. Low SOL on the fee payer stops sponsorship until it is topped up.
What it is not
This is not a swap API. The user still does their own instruction. Kora only sponsors gas and collects the fee in tokens. It is not the gas_swap plugin (that shape is token-in + SOL-out only).