Two years ago, I walked into my first ever crypto event as a complete outsider. When the presenter asked a question, I raised my hand. Boom $3 straight to my wallet for a correct answer. I was genuinely excited. Real digital money I could actually spend, right? Wrong. What followed was a painful lesson in crypto's biggest UX flaw: I needed to buy a completely different token just to move the money I'd earned. Standing there confused, holding dollars I couldn't spend without SOL I didn't have, I thought exactly what millions of first-time users think: this whole thing is a scam.
That frustration stuck with me. Not because I'm bitter about three dollars, but because I realized this broken experience is repeated thousands of times daily across the ecosystem. Kora is built to remove that friction. To see how it does it, we need to first understand why this point of friction even exists in the first place.
How Solana Transactions Normally Work
Every interaction on Solana runs through a transaction. A transaction is nothing more than a container of instructions, each telling an on-chain program what to do. Those programs define the rules, what operations are valid, how accounts are updated, and what conditions must be met. Think of an instruction as a function call to an on-chain program, telling it to perform a particular task and on the other hand a transaction is just a package of one or more instructions. Transactions on Solana are by default atomic in nature—either all instructions succeed or the whole transaction fails
Sounds clean. But here's the catch: every transaction needs SOL. Always.
Example: David Sends SOL to Samuel.
-
Account Structure: Both wallets (David and Samuel) are accounts owned by the System Program
- Each account maintains:
- Lamports (SOL balance): 1 SOL = 1 billion lamports
- Owner (System Program for wallets)
- Data (usually empty for wallets)
- Executable flag (false for wallets)
- Each account maintains:
-
Transaction Construction and Signing
- David constructs a transaction with a SystemProgram.transfer instruction
- He signs the transaction and submits it to the network
-
Validator Processing
- The validator simulates and executes the transaction
- Upon execution, the System Program, since it owns both accounts deducts lamports from David and credits Samuel
The sender account (David) must sign (is_signer) the transaction to authorize the System Program to deduct from its lamports balance. Both sender and recipient accounts must be writable (is_writable) since their balances change during the transfer.
In practice this is how to send a transaction that transfers SOL from one account to another:
use anyhow::Result;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_sdk::{
commitment_config::CommitmentConfig, native_token::LAMPORTS_PER_SOL,
signature::Signer,
signer::keypair::Keypair, system_instruction, transaction::Transaction,
};
#[tokio::main]
async fn main() -> Result<()> {
// Create a connection to cluster
let connection = RpcClient::new_with_commitment(
"http://localhost:8899".to_string(),
CommitmentConfig::confirmed(),
);
// Generate sender and recipient keypairs
let sender = Keypair::new();
let recipient = Keypair::new();
// Fund sender with airdrop
let airdrop_signature = connection
.request_airdrop(&sender.pubkey(), LAMPORTS_PER_SOL)
.await?;
loop {
let confirmed = connection.confirm_transaction(&airdrop_signature).await?;
if confirmed {
break;
}
}
// Check balance before transfer
let pre_balance1 = connection.get_balance(&sender.pubkey()).await?;
let pre_balance2 = connection.get_balance(&recipient.pubkey()).await?;
// Define the amount to transfer
let transfer_amount = LAMPORTS_PER_SOL / 100; // 0.01 SOL
// Create a transfer instruction for transferring SOL from sender to recipient
let transfer_instruction =
system_instruction::transfer(&sender.pubkey(), &recipient.pubkey(), transfer_amount);
// Add the transfer instruction to a new transaction
let mut transaction =
Transaction::new_with_payer(&[transfer_instruction], Some(&sender.pubkey()));
let blockhash = connection.get_latest_blockhash().await?;
transaction.sign(&[&sender], blockhash);
// Send the transaction to the network
let transaction_signature = connection
.send_and_confirm_transaction(&transaction)
.await?;
// Check balance after transfer
let post_balance1 = connection.get_balance(&sender.pubkey()).await?;
let post_balance2 = connection.get_balance(&recipient.pubkey()).await?;
println!(
"Sender prebalance: {}",
pre_balance1 as f64 / LAMPORTS_PER_SOL as f64
);
println!(
"Recipient prebalance: {}",
pre_balance2 as f64 / LAMPORTS_PER_SOL as f64
);
println!(
"Sender postbalance: {}",
post_balance1 as f64 / LAMPORTS_PER_SOL as f64
);
println!(
"Recipient postbalance: {}",
post_balance2 as f64 / LAMPORTS_PER_SOL as f64
);
println!("Transaction Signature: {}", transaction_signature);
Ok(())
}
Why SOL Is Always Required for Gas
- Network Protection: Fees prevent spam and misuse of validator resources
- Validator Compensation: Minimum charge is 5,000 lamports per signature. Half is burned; the other half compensates the validator for processing the transaction
- Why SOL Only? Validators rely on SOL as the native, consistently valued token. Accepting other tokens would break consensus, as validators cannot universally verify their value or convert them consistently
Kora's Core Innovation
At its core, Kora is a relayer that removes the strict dependency on users to hold SOL for every transaction. Instead of forcing users to hold SOL, Kora steps in as the fee payer. Validators still get paid in SOL, but users reimburse the Kora operator in the token they already hold USDC, BONK, or any other SPL token.
The result is "gasless." Not because the fees vanish, but because the complexity of handling SOL is abstracted away from the user. From the user's perspective, they sign one transaction, in one token, and it just works.
Building on our previous SOL transfer example, let's see how Kora transforms the Solana transaction flow to eliminate the SOL requirement for end users.
Kora Transaction Flow: From Friction to Seamless
Here's how Kora handles a BONK token transfer from David to Samuel, with David paying fees in BONK rather than SOL:
- User Interaction: The user interacts with a dApp that utilizes Kora
- Transaction Construction: The application constructs the Solana transaction to transfer BONK from David to Samuel, and includes a token payment instruction to the Kora node operator as part of this transaction
- User Authorization: The user signs their portion of the transaction using their wallet
- Kora Routing: Instead of sending directly to the Solana network, the application forwards the partially signed transaction to the configured Kora RPC endpoint
-
Validation Process: The Kora node thoroughly validates the transaction against its configured rules defined in the kora.toml file:
- Are the included instructions valid?
- Is the SPL token payment adequate to cover current SOL fees (based on Oracle price feed)?
- Is this transaction allowed under the node's security policies (allowed programs/tokens)?
- Co-signing: If valid, Kora co-signs as the fee payer, covering the actual SOL network fees and returns the signed transaction to the app
- Network Submission: Application forwards the Kora-signed transaction to Solana for processing
- Execution: Solana executes the transaction. The SPL tokens transfer to the Kora node operator, the actual SOL fees are paid by the Kora node, and the user's intended transaction processes
- Completion: The application monitors transaction status and notifies the user upon successful completion
The user successfully completes their transaction using only SPL tokens, while Kora handles all SOL-denominated network fees behind the scenes, making the experience truly "gasless." Because Solana transactions are atomic, if the fee payment to the Kora node fails, or if any other instruction within the bundled transaction fails, the entire operation reverts. The fee conversion from SPL tokens to SOL is handled entirely by the Kora node operator, making it invisible and seamless to the end user.
sequenceDiagram
participant User
participant dApp
participant KoraNode
participant SolanaNetwork
User->>dApp: Initiates transfer (BONK from David → Samuel)
dApp->>dApp: Build transaction\n+ Token payment instruction to Kora node
dApp->>User: Request signature
User->>dApp: Signs transaction
dApp->>KoraNode: Sends partially signed transaction
KoraNode->>KoraNode: Validate transaction\n- Valid instructions?\nAdequate SPL token payment?\n- Allowed under policies?
alt Transaction invalid
KoraNode-->>dApp: Reject transaction
else Transaction valid
KoraNode->>dApp: Co-signs as fee payer\n(Covers SOL fees)
dApp->>SolanaNetwork: Forwards fully signed transaction
SolanaNetwork->>SolanaNetwork: Executes transaction\n- Transfers SPL tokens to Kora node\n- Pays SOL fees from Kora node\n- Processes user's transfer
SolanaNetwork->>dApp: Confirmation
dApp->>User: Notify success
end
This flow demonstrates how Kora abstracts away the underlying complexity while maintaining the security and atomicity guarantees of Solana transactions. Now let's examine the technical architecture that makes this possible.
Kora's Technical Architecture
The seamless user experience Kora enables even though it sounds magical is not magic it is the product of a meticulously engineered system where each component plays a critical, interdependent role. This architecture is designed not just to abstract gas fees, but to do so securely, scalably, and in a way that empowers developers rather than constraining them
The Four Pillars of Kora's architecture
-
Rust Core Library:
this is the deterministic rulebook and execution engine for the Kora protocol, this library processes every incoming transaction to execute a series validations defined in the node's kora.toml configuration file. Its function is threefold: it first validates all transaction instructions for correctness against their associated Solana programs; it then performs a check, using a price oracle to verify the proffered SPL token fee adequately covers the network cost in SOL plus any margin; and finally, it enforces security policy by whitelisting allowed programs and tokens while blacklisting malicious accounts. This process is the critical gatekeeper, ensuring only valid transactions are co-signed, thereby protecting the node operator's SOL funds from exploitation and transforming their wallet into a secure, programmable asset. -
TypeScript SDK:
The TypeScript SDK is the developer-facing gateway to the Kora protocol, providing a streamlined interface for integrating gasless transactions into applications. Its primary purpose is to abstract the underlying complexity of constructing, signing, and relaying transactions to a Kora node. The SDK handles the entire client-side workflow: it bundles the user's intended instructions with a necessary fee payment instruction to the Kora operator, manages the serialization and deserialization of transactions, and facilitates all communication with the Kora RPC server via a defined API. By offering a clean, well-documented API with comprehensive code examples for common actions like token transfers and swaps, it allows developers to implement a gasless user experience with minimal code, focusing on their application logic rather than the low-level intricacies of transaction management. -
JSON-RPC Server:
The JSON-RPC Server operates as the central hub for the Kora network, providing the primary interface that applications use to access its gasless functionality. This server delivers a standardized HTTP API which runs onhttp://localhost:8080by default, enabling consistent communication regardless of the client's programming language. It exposes several critical endpoints that manage the gasless transaction lifecycle:- estimate_transaction_fee: This endpoint allows applications to calculate the exact cost of a transaction before it is submitted. A client provides a simulation of the transaction, and the server returns a quote denominated in the user's chosen SPL token. This quote is calculated using a price oracle to convert the network fee (in SOL) into the equivalent amount of the specified token, including any margin configured by the node operator. This provides essential cost certainty for the end-user.
- get_supported_tokens: This method returns a list of token mints that the node operator has configured as acceptable forms of payment for transaction fees. This list is defined in the kora.toml file under allowed_spl_paid_tokens. Applications can call this endpoint to dynamically populate a UI, showing users which tokens they can use to pay for gas on that particular node.
- sign_and_send_transaction: This is the primary endpoint for processing gasless transactions. A client submits a partially-signed transaction bundle that includes both the user's intended instructions and a fee payment instruction. The server performs several actions: it validates the request, delegates the transaction to the core library for security and economic checks, appends the node's signature as the fee payer if validation passes, and finally submits the fully-signed transaction to the Solana network. It then returns the resulting transaction signature to the client for confirmation.
-
CLI Tool:
The CLI Tool is the operational control panel for the node operator, providing the necessary commands to deploy, configure, and monitor a Kora node. Its purpose is to grant the operator direct management capabilities over the node's behavior and health outside of the real-time transaction flow. This tool is used to edit the kora.toml configuration file defining security policies, economic parameters, and authentication secrets—and to start the service with specific runtime flags. It also provides commands for real-time monitoring of node status, checking signer wallet balances, and viewing logs for debugging. By offering a direct command line interface, the CLI ensures that node operators, particularly DevOps and infrastructure teams, have the precise control required to maintain a secure, efficient, and profitable Kora service in a production environment
With the four pillars of the architecture establishing how a transaction is processed, the next critical consideration is who authorizes the payment of SOL and how that authority is secured. This brings us to the core of operational security.
Signer Options
1. Solana Private Key (Self-Managed)
- Best for: Development environments and small-scale deployments
-
Setup Options:
- Environment variables
- CLI flags
- JSON file path
-
Supported Formats:
- Base58 (default)
- U8Array
- JSON file
- Generate New Keypair: Use Solana CLI tools
2. Turnkey Integration (Enterprise)
- Best for: Production deployments requiring maximum security
- Benefits: Hardware Security Modules (HSMs) and granular policy controls
-
Requirements:
- Turnkey account setup
- Environment variables: Organization ID, API keys, Private Key ID
- Start with
--with-turnkey-signerflag
3. Privy Integration (Web3 Apps)
- Best for: Applications with embedded wallet infrastructure
-
Requirements:
- Privy account configuration
- Environment variables: App ID, App Secret, Wallet ID
- Start with
--with-privy-signerflag
The choice of signer integration directly impacts both security posture and operational complexity. Enterprise deployments should prioritize HSM-backed solutions, while development environments can use simpler key management approaches. However, regardless of the signer chosen, proper authentication is essential to prevent unauthorized access.
Authentication: Securing Your RPC Endpoint
Without authentication, anyone who discovers your endpoint can submit transactions and drain your SOL balance. Kora provides two complementary authentication methods that can be used individually or combined for maximum security.
Method 1: API Key Authentication
- How it Works: Simple shared secret transmitted in HTTP headers
-
Setup Process:
- Add API key to .env file or kora.toml configuration
- Clients include key in x-api-key header with every request
- Security Level: Basic protection suitable for internal applications or trusted clients
- Risk Consideration: If intercepted, acts like a password that grants full access
Method 2: HMAC Authentication
- How it Works: Creates unique cryptographic signature for each request
-
Setup Process:
- Add KORA_HMAC_SECRET (minimum 32 characters) to configuration
- Client Process:
- Combine
{timestamp}{request_body} - Sign with HMAC-SHA256 using shared secret
- Send headers: x-timestamp and x-hmac-signature
- Server Validation: Validates signature and timestamp with 5-minute expiry window
- Security Level: High-grade protection suitable for public APIs or untrusted networks
- Key Benefit: Secret never travels over the network, preventing interception attacks
For production deployments, we recommend enabling both authentication methods simultaneously. This layered approach provides defense in depth, ensuring that even if one authentication method is compromised, the secondary method provides continued protection.
Now that we've covered security fundamentals, let's examine how to configure Kora nodes to meet specific business requirements and operational constraints.
Configuration Management
The kora.toml file serves as the control center for a Kora node's behavior, allowing operators to define business requirements and security policies for transaction processing. It should be located in the deployment directory or specified via the --config flag when starting the server.
Key Configuration Sections
Kora Core Policies
Configures fundamental server behavior including rate limiting (requests per second) and global authentication policies for api_key and hmac_secret. These settings form the baseline security and performance profile for your node.Kora Enabled Methods
Controls which RPC methods (e.g., sign_transaction, get_supported_tokens) are enabled or disabled. By default, all methods are enabled unless this section is explicitly configured, giving operators granular control over node functionality.Validation Policies
Defines Solana-related security rules and transaction limits:- max_allowed_lamports: Limits the maximum SOL amount a Kora node will pay per transaction, providing crucial cost controls
- max_signatures: Sets the maximum number of signatures per transaction to prevent excessive SOL spending on complex transactions
- price_source: Specifies the oracle for token price data—"Jupiter" for production environments or "Mock" for testing scenarios
- allowed_programs: Whitelists Solana programs that transactions can interact with, creating a secure "walled garden" environment
- allowed_tokens and allowed_spl_paid_tokens: Whitelist token mints that can be used in transactions or accepted as payment for fees
- disallowed_accounts: Blacklists accounts explicitly blocked from all transactions
Fee Payer Policy
Restricts what the Kora node's fee payer wallet can do, preventing unexpected behavior or unauthorized transfers. Security best practice recommends setting all options (like allow_sol_transfers, allow_spl_transfers) to false by default and enabling only as specifically needed.Price Configuration
Defines how transaction fees are calculated, offering three distinct business models:- Margin Pricing: Adds a percentage margin on top of actual network fees (default margin is 0.0%). This ensures SOL costs are covered while generating profit margins for node operators.
- Fixed Pricing: Charges a fixed amount in a specific token regardless of fluctuating network fees. This provides predictable costs for users but transfers fee volatility risk to node operators.
- Free Pricing: Sponsors all transaction fees, charging nothing to users. This powerful tool for user acquisition and growth is often used for subsidized onboarding campaigns.
Getting Started with Kora
To begin developing with Kora, you'll establish a local development environment. This involves installing the Kora RPC server, configuring it to accept SPL token payments, and running a client demonstration to witness fee abstraction in action.Prerequisites
- Solana CLI v2.2.x or newer
- Rust programming environment
- Node.js v24 or later
Step 1: Install the Kora RPC Server
cargo install kora-rpc
Step 2: Clone the Demo Project
git clone https://github.com/solana-foundation/kora.git
cd kora/demo
Understanding the Demo Structure:
-
client/src/
-
setup.ts– Local environment initialization, including generating keypairs, airdropping SOL, and initializing test tokens -
main.ts– Runs the demonstration transaction using token-based fees -
client.ts– Kora client factory for RPC communication -
types.ts– TypeScript definitions for Kora RPC request/response types
-
-
server/
-
kora.toml– Kora node configuration defining security rules, allowed tokens, and fee parameters
-
- demo/.env – Created by setup.ts, containing keypairs and mint addresses
Step 3: Install Client Dependencies
cd client
npm install
cd ..
Step 4: Initialize the Local Environment
Run the setup script to prepare your development environment:npm tsx client/src/setup.ts
- Generate development keypairs and write them to demo/.env
- Airdrop SOL to test accounts (for local validator compatibility)
- Create a USDC test token mint and fund test accounts
- Display the USDC mint public key for configuration
Step 5: Configure kora.toml
Open `server/kora.toml` and whitelist your test token so Kora accepts it as a payment method. In the `[validation]` section, configure:# Replace with your actual USDC mint from setup output
allowed_tokens = ["<USDC_TOKEN_MINT_PUBKEY>"]
allowed_spl_paid_tokens = ["<USDC_TOKEN_MINT_PUBKEY>"]
Additional Configuration Options (adjust as needed):
- max_allowed_lamports – Cap the SOL your node will sponsor per transaction
- max_signatures – Limit Solana base-fee exposure (fees scale with signature count)
- price_source – Token pricing source ("Mock" for local development, "Jupiter" for production)
- allowed_programs – Whitelist program IDs users can invoke
- disallowed_accounts – Explicit account blocklist
- api_key, hmac_secret – Enable authentication (strongly recommended for production)
Step 6: Start Services (Multi-Terminal Setup)
You'll need four terminals to run the complete demo environment:Terminal 1: Start Local Test Validator
# From project root or anywhere
solana-test-validator -r
Terminal 2: Initialize Environment
# From ./client directory
npm init-env
- Generate keypairs and save them to .env
- Airdrop SOL to test accounts for transaction fees
- Create and initialize a local USDC token
- Fund test accounts with both SOL and tokens
allowed_tokens = [
"YOUR_USDC_LOCAL_PUBLIC_KEY" # Update with USDC_LOCAL_KEY public key from .env
]
allowed_spl_paid_tokens = [
"YOUR_USDC_LOCAL_PUBLIC_KEY" # Update with USDC_LOCAL_KEY public key from .env
]
Terminal 3: Start Kora RPC Server
# From ./server directory
kora-rpc
Terminal 4: Run Client Demo
# From ./client directory
npm start
Expected Output:
Kora Config: {
fee_payer: 'Df2UmGQH86TBDsub7XZoSAo7KZa1ZJZr2w1PL1APUjjU',
validation_config: {
max_allowed_lamports: 1000000,
max_signatures: 10,
allowed_programs: [
'11111111111111111111111111111111',
'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'
],
allowed_tokens: [
'usdCAEFbouFGxdkbHCRtMTcN7DJHd3aCmP9vqjLgmAp'
],
allowed_spl_paid_tokens: [
'usdCAEFbouFGxdkbHCRtMTcN7DJHd3aCmP9vqjLgmAp'
],
disallowed_accounts: [],
price_source: 'Mock'
}
}
Blockhash: C8W8d5w2H4jKXyFg5CEBoiaPvEpJ1am7xLxZ3fym4a2g
This output confirms your Kora server is running and properly configured for development. You're now ready to experience gasless transactions firsthand and begin building applications that leverage Kora's fee abstraction capabilities.
With your development environment established, the next consideration is how to scale and secure these capabilities for production deployment.
Production Deployment and Infrastructure Management
Operating a Kora node requires a strategic approach to deployment and robust infrastructure management. As a paymaster service handling user transactions and managing significant SOL funds, infrastructure choices and operational practices are paramount to success.
Deployment Options: Self-Host vs. Cloud
Kora offers flexible deployment across various environments to match different operational requirements and technical constraints.
Local Development:
Run Kora nodes locally for rapid testing and development iteration. This approach provides full control and immediate feedback during the development process.Production Environments:
Kora supports deployment via Docker containers or direct installation on any cloud platform. The kora-rpc crate is distributed as a standalone executable that can be installed globally or deployed in containerized environments.Railway Integration:
Railway provides streamlined deployment experience for Kora nodes, including automatic SSL certificate management, domain configuration, and built-in monitoring capabilities. This managed approach reduces operational overhead while maintaining security standards.Scaling Considerations
Traffic Management:
Kora allows node operators to implement global, per-second rate limiting configurable via the rate_limit option in kora.toml. This prevents abuse and ensures consistent performance under varying load conditions.Capacity Planning:
Node operators must plan for expected use cases and user volume. Consider factors like peak transaction times, seasonal usage patterns, and growth projections when sizing infrastructure.RPC Endpoint Strategy:
Kora requires a Solana RPC endpoint specified via the--rpc-url flag or RPC_URL environment variable. For higher transaction volumes, external scalable RPC services can handle increased demand while maintaining performance standards.
These infrastructure considerations directly impact security requirements, which represent the most critical aspect of production Kora node operations.
Security Best Practices
Security is paramount for Kora node operators, as the node's signer key has direct access to SOL funds used for fee payments. Kora provides multiple layers of protection to safeguard operations and user funds.Authentication Security
Dual Authentication Approach:
Kora supports two optional authentication methods that can be used individually or combined for maximum protection:- API Key Authentication: Basic security using shared secrets in HTTP headers via x-api-key. Suitable for internal applications or trusted clients, but vulnerable if intercepted.
- HMAC Authentication: Advanced security creating unique cryptographic signatures for each request. Each signature includes timestamps that expire after 5 minutes, preventing replay attacks. Attackers cannot create valid requests without the shared secret key.
- Combined Authentication: For maximum security, both methods can be enabled simultaneously, requiring clients to provide x-api-key, x-timestamp, and x-hmac-signature headers.
Signer Key Security
The signer keypair controls your SOL funds and requires the highest level of protection:Operational Security Practices:
- Dedicated Keypairs: Use keypairs exclusively for your Kora node, avoiding reuse of personal wallets
- Minimal Funding: Only fund signer wallets with SOL amounts you're prepared to spend on transaction fees
- Secure Storage: Never hardcode private keys or API keys in source code or logs. Use environment variables or dedicated secrets management systems
- Regular Rotation: Rotate authentication keys periodically (monthly or quarterly schedules)
Enterprise Key Management:
For production-grade applications, Kora integrates with enterprise key management services:- Turnkey Integration: Provides Hardware Security Modules (HSMs) and policy controls for maximum security
- Privy Integration: Offers embedded wallet infrastructure with institutional-grade protection
Monitoring and Alerting: Implement comprehensive monitoring for:
- Low SOL balance alerts to prevent service interruption
- Unusual transaction patterns that might indicate compromise
- Authentication failures and security events
These security measures provide the foundation for reliable, secure Kora node operations. However, understanding the broader impact and applications of this technology reveals why Kora represents a fundamental shift in blockchain user experience.
Real-World Impact: Emerging Markets
In regions like Africa, where blockchain adoption is accelerating rapidly, Kora's fee abstraction becomes even more transformative. Consider these scenarios where Kora can deliver immediate impact:
Mobile Money Integration: In countries like Sierra Leone, Nigeria, and Kenya, where mobile money dominates financial transactions, users are already comfortable with digital payments. Kora enables seamless bridges between local mobile money systems and Solana dApps, allowing users to pay transaction fees with familiar stablecoin equivalents without ever touching SOL.
Remittances and Cross-Border Payments: Family members sending money across African borders can use stablecoin-powered applications that leverage Kora for gasless transactions. Recipients can receive and transact immediately without needing to acquire SOL first—a crucial advantage in regions where cryptocurrency exchanges may be limited or expensive.
Merchant Adoption: Small businesses and market vendors can accept cryptocurrency payments through Kora-powered point-of-sale systems, with transaction fees handled transparently in the background using the same currency they're receiving as payment.
Building the Future
Whether you're developing stablecoin-first applications for emerging markets, building gaming experiences that need frictionless microtransactions, or creating any dApp where user experience supersedes technical complexity, Kora provides the infrastructure to make "gasless" transactions a reality.
The future of blockchain adoption lies not in asking users to understand our technical constraints, but in building infrastructure that adapts to their needs. With Kora, that future begins now.
Ready to Start Building?
Explore the GitHub repository: github.com/solana-foundation/kora
Top comments (0)